From d63b8aa5f077ed0139a9a4180f4a7d35077a088f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 27 Jun 2016 07:12:06 +0200 Subject: [PATCH] news: De-duplicate the loop over news items 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 --- src/lib/commands/news.c | 50 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/lib/commands/news.c b/src/lib/commands/news.c index 0d53f7ca..697a2d2e 100644 --- a/src/lib/commands/news.c +++ b/src/lib/commands/news.c @@ -27,7 +27,7 @@ * news.c: Show current Empire news * * Known contributors to this file: - * Markus Armbruster, 2006-2012 + * Markus Armbruster, 2006-2016 */ #include @@ -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