int main() { assert (NTEST (int)); assert (NTEST (void)); assert (NTEST (A)); assert (NTEST (B)); assert (PTEST (C)); assert (NTEST (C[])); assert (NTEST (U)); return 0; }
int main() { assert (PTEST (int)); assert (NTEST (int (int))); assert (NTEST (void)); assert (PTEST (A)); assert (PTEST (U)); assert (NTEST (B)); assert (NTEST (C)); assert (PTEST (D)); assert (PTEST (D[])); assert (PTEST (E)); assert (NTEST (F)); return 0; }
int main() { assert (PTEST (int)); assert (NTEST (int (int))); assert (NTEST (void)); assert (PTEST (A)); assert (PTEST (B)); assert (PTEST (C)); assert (PTEST (C[])); assert (PTEST (D)); assert (NTEST (E)); assert (NTEST (E1)); assert (PTEST (F)); assert (PTEST (G)); assert (NTEST (H)); assert (NTEST (H1)); assert (NTEST (I)); assert (NTEST (I1)); assert (PTEST (J)); assert (NTEST (const K)); assert (NTEST (const L)); return 0; }
static void print_bitmap_seq( FILE *fp, struct t_group *group) { long artnum; long i, last; t_bool flag = FALSE; #ifdef DEBUG_NEWSRC debug_print_comment("print_bitmap_seq()"); debug_print_bitmap(group, NULL); #endif /* DEBUG_NEWSRC */ if (group->count == 0 || group->xmin > group->xmax) { if (group->newsrc.xmax > 1) fprintf(fp, "1-%ld", group->newsrc.xmax); fprintf(fp, "\n"); fflush(fp); #ifdef DEBUG_NEWSRC debug_print_comment("print_bitmap_seq(): group->count == 0"); #endif /* DEBUG_NEWSRC */ return; } for (i = group->newsrc.xmin; i <= group->newsrc.xmax; i++) { if (group->newsrc.xbitmap && NTEST(group->newsrc.xbitmap, i - group->newsrc.xmin) == ART_READ) { if (flag) { artnum = i; fprintf(fp, ",%ld", i); } else { artnum = 1; flag = TRUE; fprintf(fp, "1"); } i++; while (i <= group->newsrc.xmax && NTEST(group->newsrc.xbitmap, i - group->newsrc.xmin) == ART_READ) i++; last = i - 1; if (artnum != last) fprintf(fp, "-%ld", last); } else if (!flag) { flag = TRUE; if (group->newsrc.xmin > 1) { fprintf(fp, "1"); if (group->newsrc.xmin > 2) fprintf(fp, "-%ld", group->newsrc.xmin - 1); } } } if (!flag && group->newsrc.xmin > 1) { fprintf(fp, "1"); if (group->newsrc.xmin > 2) fprintf(fp, "-%ld", group->newsrc.xmin - 1); #ifdef DEBUG_NEWSRC debug_print_comment("print_bitmap_seq(): !flag && group->newsrc.xmin > 1"); #endif /* DEBUG_NEWSRC */ } fprintf(fp, "\n"); fflush(fp); }
/* * Loop thru arts[] array marking state of each article READ/UNREAD */ void parse_unread_arts( struct t_group *group) { int i; long unread = 0; long bitmin, bitmax; t_bitmap *newbitmap = (t_bitmap *) 0; bitmin = group->newsrc.xmin; bitmax = group->newsrc.xmax; /* * TODO * what about group->newsrc.xmax > group->xmax? * that should indicate an artnum 'reset' on the server * (or using the "wrong" newsrc for that server) */ if (group->xmax > group->newsrc.xmax) group->newsrc.xmax = group->xmax; if (group->newsrc.xmax >= bitmin) { newbitmap = my_malloc(BITS_TO_BYTES(group->newsrc.xmax - bitmin + 1)); NSETRNG0(newbitmap, 0L, group->newsrc.xmax - bitmin); } for_each_art(i) { if (arts[i].artnum < bitmin) arts[i].status = ART_READ; else if (arts[i].artnum > bitmax) arts[i].status = ART_UNREAD; else if (NTEST(group->newsrc.xbitmap, arts[i].artnum - bitmin) == ART_READ) arts[i].status = ART_READ; else arts[i].status = ART_UNREAD; /* TODO: logic correct? */ if (newbitmap != NULL && arts[i].status == ART_UNREAD && arts[i].artnum >= bitmin) { #if 0 /* * check for wrong article numbers in the overview * * TODO: check disabled as we currently catch the artnum > high_mark * case in read_nov_file() where we might be able to * fix the broken artnum (via xref:-parsing). currently * we just skip the art there. */ if (arts[i].artnum <= group->xmax) #endif /* 0 */ NSET1(newbitmap, arts[i].artnum - bitmin); unread++; } } group->newsrc.xbitlen = group->newsrc.xmax - bitmin + 1; FreeIfNeeded(group->newsrc.xbitmap); group->newsrc.xbitmap = newbitmap; group->newsrc.num_unread = unread; }
/* * expand group->newsrc information if group->xmax is larger than * group->newsrc.xmax or min is smaller than group->newsrc.xmin. */ void expand_bitmap( struct t_group *group, long min) { long bitlen; long first; long tmp; long max; t_bool need_full_copy = FALSE; /* calculate new max */ if (group->newsrc.xmax > group->xmax) max = group->newsrc.xmax; else max = group->xmax; /* adjust min */ if (!min) min = group->newsrc.xmin; /* calculate first */ if (min >= group->newsrc.xmin) first = group->newsrc.xmin; else first = group->newsrc.xmin - ((group->newsrc.xmin - min + (NBITS - 1)) & ~(NBITS - 1)); /* adjust first */ if (first > group->newsrc.xmax + 1) first = first - ((first - (group->newsrc.xmax + 1) + (NBITS - 1)) & ~(NBITS - 1)); /* check first */ if (first < 1) { need_full_copy = TRUE; first = 1; } bitlen = max - first + 1; if (bitlen <= 0) { bitlen = 0; FreeIfNeeded(group->newsrc.xbitmap); group->newsrc.xbitmap = (t_bitmap *) 0; #ifdef DEBUG_NEWSRC debug_print_comment("expand_bitmap: group->newsrc.bitlen == 0"); #endif /* DEBUG_NEWSRC */ } else if (group->newsrc.xbitmap == NULL) { group->newsrc.xbitmap = my_malloc(BITS_TO_BYTES(bitlen)); if (group->newsrc.xmin > first) NSETRNG0(group->newsrc.xbitmap, 0L, group->newsrc.xmin - first - 1L); if (bitlen > group->newsrc.xmin - first) NSETRNG1(group->newsrc.xbitmap, group->newsrc.xmin - first, bitlen - 1); #ifdef DEBUG_NEWSRC debug_print_comment("expand_bitmap: group->newsrc.xbitmap == NULL"); #endif /* DEBUG_NEWSRC */ } else if (need_full_copy) { t_bitmap *newbitmap; newbitmap = my_malloc(BITS_TO_BYTES(bitlen)); /* Copy over old bitmap */ /* TODO: change to use shift */ for (tmp = group->newsrc.xmin; tmp <= group->newsrc.xmax; tmp++) { if (NTEST(group->newsrc.xbitmap, tmp - group->newsrc.xmin)) NSET1(newbitmap, tmp - first); else NSET0(newbitmap, tmp - first); } /* Mark earlier articles as read, updating num_unread */ if (first < group->newsrc.xmin) { NSETRNG0(newbitmap, 0L, group->newsrc.xmin - first - 1L); } { long i; for (i = group->newsrc.xmin; i < min; i++) { if (NTEST(newbitmap, i - first) != ART_READ) { NSET0(newbitmap, i - first); if (group->newsrc.num_unread) group->newsrc.num_unread--; } } } /* Mark high numbered articles as unread */ if (group->newsrc.xmin - first + group->newsrc.xbitlen < bitlen) { tmp = group->newsrc.xmin - first + group->newsrc.xbitlen; NSETRNG1(newbitmap, tmp, bitlen - 1); } free(group->newsrc.xbitmap); group->newsrc.xbitmap = newbitmap; #ifdef DEBUG_NEWSRC debug_print_comment("expand_bitmap: group->newsrc.bitlen != (group->max-group->min)+1 and need full copy"); #endif /* DEBUG_NEWSRC */ } else if (max != group->newsrc.xmax || first != group->newsrc.xmin) { t_bitmap *newbitmap; newbitmap = my_malloc(BITS_TO_BYTES(bitlen)); /* Copy over old bitmap */ assert((group->newsrc.xmin - first) / NBITS + BITS_TO_BYTES(group->newsrc.xbitlen) <= BITS_TO_BYTES(bitlen)); memcpy(newbitmap + (group->newsrc.xmin - first) / NBITS, group->newsrc.xbitmap, BITS_TO_BYTES(group->newsrc.xbitlen)); /* Mark earlier articles as read, updating num_unread */ if (first < group->newsrc.xmin) { NSETRNG0(newbitmap, 0L, group->newsrc.xmin - first - 1L); } { long i; for (i = group->newsrc.xmin; i < min; i++) { if (NTEST(newbitmap, i - first) != ART_READ) { NSET0(newbitmap, i - first); if (group->newsrc.num_unread) group->newsrc.num_unread--; } } } /* Mark high numbered articles as unread */ if (group->newsrc.xmin - first + group->newsrc.xbitlen < bitlen) { tmp = group->newsrc.xmin - first + group->newsrc.xbitlen; NSETRNG1(newbitmap, tmp, bitlen - 1); } free(group->newsrc.xbitmap); group->newsrc.xbitmap = newbitmap; #ifdef DEBUG_NEWSRC debug_print_comment("expand_bitmap: group->newsrc.bitlen != (group->max-group->min)+1"); #endif /* DEBUG_NEWSRC */ } group->newsrc.xmin = first; if (group->newsrc.xmax < max) group->newsrc.num_unread += max - group->newsrc.xmax; group->newsrc.xmax = max; group->newsrc.xbitlen = bitlen; group->newsrc.present = TRUE; }