]> git.pond.sub.org Git - empserver/commitdiff
news: De-duplicate the loop over news items
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 27 Jun 2016 05:12:06 +0000 (07:12 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 6 Aug 2017 18:09:17 +0000 (20:09 +0200)
Duplicated to detect empty pages in Empire 2.  Easy enough to fold
into the other loop, so do that.

While there, oops on invalid struct nwsstr member nws_ntm.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
src/lib/commands/news.c

index 0d53f7caf32b2300dc26c04d9d4eaf59116a4449..697a2d2e556f8826b8f83d3cc573ce94aa5544ba 100644 (file)
@@ -27,7 +27,7 @@
  *  news.c: Show current Empire news
  *
  *  Known contributors to this file:
- *     Markus Armbruster, 2006-2012
+ *     Markus Armbruster, 2006-2016
  */
 
 #include <config.h>
@@ -44,13 +44,12 @@ news(void)
 {
     struct natstr *natp;
     time_t now;
-    int page;
+    int heading, page;
     time_t then;
     time_t delta;
     struct nwsstr nws;
     struct nstr_item nstr;
     int page_has_news[N_MAX_PAGE + 1];
-    int there_is_news = 0;
     short sectors_taken[MAXNOC][MAXNOC];
     short sectors_delta;
     short max_delta = -1;
@@ -63,7 +62,6 @@ news(void)
 
     if (!snxtitem(&nstr, EF_NEWS, "*", NULL))
        return RET_SYN;
-    memset(page_has_news, 0, sizeof(page_has_news));
     memset(sectors_taken, 0, sizeof(sectors_taken));
     (void)time(&now);
     natp = getnatp(player->cnum);
@@ -84,33 +82,21 @@ news(void)
     natp->nat_newstim = now;
     head();
     pr("\nThe details of Empire news since %s", ctime(&then));
-    while (nxtitem(&nstr, &nws)) {
-       if (!nws.nws_vrb || CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB))
-           continue;
-       if (nws.nws_when < then)
-           continue;
-       if (opt_HIDDEN) {
-           if (!player->god &&
-               !(getcontact(getnatp(player->cnum), nws.nws_ano) &&
-                 getcontact(getnatp(player->cnum), nws.nws_vno)))
-               continue;
-       }
-       ++page_has_news[rpt[(int)nws.nws_vrb].r_newspage];
-       ++there_is_news;
-    }
-    for (page = 1; page <= N_MAX_PAGE; page++) {
+
+    heading = 0;
+    memset(page_has_news, 0, sizeof(page_has_news));
+    page_has_news[0] = 1;
+
+    for (page = 0; page <= N_MAX_PAGE; page++) {
        if (!page_has_news[page])
            continue;
-       pr("\n\t ===  %s  ===\n", page_headings[page].name);
        snxtitem_rewind(&nstr);
        while (nxtitem(&nstr, &nws)) {
            if (CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB))
                continue;
-           if (rpt[(int)nws.nws_vrb].r_newspage != page)
-               continue;
            if (nws.nws_when < then)
                continue;
-           if (nws.nws_ntm == 0)
+           if (CANT_HAPPEN(nws.nws_ntm <= 0))
                nws.nws_ntm = 1;
            if (opt_HIDDEN) {
                if (!player->god &&
@@ -118,6 +104,13 @@ news(void)
                      getcontact(getnatp(player->cnum), nws.nws_vno)))
                    continue;
            }
+           page_has_news[rpt[nws.nws_vrb].r_newspage] = 1;
+           if (rpt[nws.nws_vrb].r_newspage != page)
+               continue;
+           if (heading != page) {
+               pr("\n\t ===  %s  ===\n", page_headings[page].name);
+               heading = page;
+           }
            if (page == N_FRONT &&
                (nws.nws_vrb == N_WON_SECT ||
                 nws.nws_vrb == N_AWON_SECT ||
@@ -128,6 +121,12 @@ news(void)
            preport(&nws);
        }
     }
+
+    if (!heading) {
+       pr("\nNo news at the moment...\n");
+       return RET_OK;
+    }
+
     if (sectors_were_taken) {
        for (i = 0; i < MAXNOC; ++i) {
            for (j = 0; j < i; ++j) {
@@ -166,9 +165,8 @@ news(void)
            }
        }
     }
-    if (!there_is_news)
-       pr("\nNo news at the moment...\n");
-    return 0;
+
+    return RET_OK;
 }
 
 static void