Annotation of 43BSDTahoe/new/rn/bits.c, revision 1.1

1.1     ! root        1: /* $Header: bits.c,v 4.3.1.4 86/10/31 15:23:53 lwall Exp $
        !             2:  *
        !             3:  * $Log:       bits.c,v $
        !             4:  * Revision 4.3.1.4  86/10/31  15:23:53  lwall
        !             5:  * Separated firstart into two variables so KILL on new articles won't
        !             6:  * accidentally mark articles read.
        !             7:  * 
        !             8:  * Revision 4.3.1.3  86/09/09  16:01:43  lwall
        !             9:  * Fixed 'n more articles' bug.
        !            10:  * 
        !            11:  * Revision 4.3.1.2  86/07/24  14:40:23  lwall
        !            12:  * Gets host name from path instead of relay-version for news 2.10.3.
        !            13:  *
        !            14:  * Revision 4.3.1.1  85/05/10  11:31:41  lwall
        !            15:  * Branch for patches.
        !            16:  *
        !            17:  * Revision 4.3  85/05/01  11:36:15  lwall
        !            18:  * Baseline for release with 4.3bsd.
        !            19:  * 
        !            20:  */
        !            21: 
        !            22: #include "EXTERN.h"
        !            23: #include "common.h"
        !            24: #include "rcstuff.h"
        !            25: #include "head.h"
        !            26: #include "util.h"
        !            27: #include "final.h"
        !            28: #include "rn.h"
        !            29: #include "cheat.h"
        !            30: #include "ng.h"
        !            31: #include "artio.h"
        !            32: #include "intrp.h"
        !            33: #include "ngdata.h"
        !            34: #include "rcln.h"
        !            35: #include "kfile.h"
        !            36: #include "INTERN.h"
        !            37: #include "bits.h"
        !            38: 
        !            39: #ifdef DBM
        !            40: #    ifdef NULL
        !            41: #      undef NULL
        !            42: #    endif NULL
        !            43: #    include <dbm.h>
        !            44: #endif DBM
        !            45: MEM_SIZE ctlsize;                      /* size of bitmap in bytes */
        !            46: 
        !            47: void
        !            48: bits_init()
        !            49: {
        !            50: #ifdef DELAYMARK
        !            51:     dmname = savestr(filexp(RNDELNAME));
        !            52: #else
        !            53:     ;
        !            54: #endif
        !            55: }
        !            56: 
        !            57: /* checkpoint the .newsrc */
        !            58: 
        !            59: void
        !            60: checkpoint_rc()
        !            61: {
        !            62: #ifdef DEBUGGING
        !            63:     if (debug & DEB_CHECKPOINTING) {
        !            64:        fputs("(ckpt)",stdout);
        !            65:        fflush(stdout);
        !            66:     }
        !            67: #endif
        !            68:     if (doing_ng)
        !            69:        restore_ng();                   /* do not restore M articles */
        !            70:     if (rc_changed)
        !            71:        write_rc();
        !            72: #ifdef DEBUGGING
        !            73:     if (debug & DEB_CHECKPOINTING) {
        !            74:        fputs("(done)",stdout);
        !            75:        fflush(stdout);
        !            76:     }
        !            77: #endif
        !            78: }
        !            79: 
        !            80: /* reconstruct the .newsrc line in a human readable form */
        !            81: 
        !            82: void
        !            83: restore_ng()
        !            84: {
        !            85:     register char *s, *mybuf = buf;
        !            86:     register ART_NUM i;
        !            87:     ART_NUM count=0;
        !            88:     int safelen = LBUFLEN - 16;
        !            89: 
        !            90:     strcpy(buf,rcline[ng]);            /* start with the newsgroup name */
        !            91:     s = buf + rcnums[ng] - 1;          /* use s for buffer pointer */
        !            92:     *s++ = rcchar[ng];                 /* put the requisite : or !*/
        !            93:     *s++ = ' ';                                /* put the not-so-requisite space */
        !            94:     for (i=1; i<=lastart; i++) {       /* for each article in newsgroup */
        !            95:        if (s-mybuf > safelen) {        /* running out of room? */
        !            96:            safelen *= 2;
        !            97:            if (mybuf == buf) {         /* currently static? */
        !            98:                *s = '\0';
        !            99:                mybuf = safemalloc((MEM_SIZE)safelen + 16);
        !           100:                strcpy(mybuf,buf);      /* so we must copy it */
        !           101:                s = mybuf + (s-buf);
        !           102:                                        /* fix the pointer, too */
        !           103:            }
        !           104:            else {                      /* just grow in place, if possible */
        !           105:                char *newbuf;
        !           106: 
        !           107:                newbuf = saferealloc(mybuf,(MEM_SIZE)safelen + 16);
        !           108:                s = newbuf + (s-mybuf);
        !           109:                mybuf = newbuf;
        !           110:            }
        !           111:        }
        !           112:        if (!was_read(i))               /* still unread? */
        !           113:            count++;                    /* then count it */
        !           114:        else {                          /* article was read */
        !           115:            ART_NUM oldi;
        !           116: 
        !           117:            sprintf(s,"%ld",(long)i);   /* put out the min of the range */
        !           118:            s += strlen(s);             /* keeping house */
        !           119:            oldi = i;                   /* remember this spot */
        !           120:            do i++; while (i <= lastart && was_read(i));
        !           121:                                        /* find 1st unread article or end */
        !           122:            i--;                        /* backup to last read article */
        !           123:            if (i > oldi) {             /* range of more than 1? */
        !           124:                sprintf(s,"-%ld,",(long)i);
        !           125:                                        /* then it out as a range */
        !           126:                s += strlen(s);         /* and housekeep */
        !           127:            }
        !           128:            else
        !           129:                *s++ = ',';             /* otherwise, just a comma will do */
        !           130:        }
        !           131:     }
        !           132:     if (*(s-1) == ',')                 /* is there a final ','? */
        !           133:        s--;                            /* take it back */
        !           134:     *s++ = '\0';                       /* and terminate string */
        !           135: #ifdef DEBUGGING
        !           136:     if (debug & DEB_NEWSRC_LINE && !panic) {
        !           137:        printf("%s: %s\n",rcline[ng],rcline[ng]+rcnums[ng]) FLUSH;
        !           138:        printf("%s\n",mybuf) FLUSH;
        !           139:     }
        !           140: #endif
        !           141:     free(rcline[ng]);                  /* return old rc line */
        !           142:     if (mybuf == buf) {
        !           143:        rcline[ng] = safemalloc((MEM_SIZE)(s-buf)+1);
        !           144:                                        /* grab a new rc line */
        !           145:        strcpy(rcline[ng], buf);        /* and load it */
        !           146:     }
        !           147:     else {
        !           148:        mybuf = saferealloc(mybuf,(MEM_SIZE)(s-mybuf)+1);
        !           149:                                        /* be nice to the heap */
        !           150:        rcline[ng] = mybuf;
        !           151:     }
        !           152:     *(rcline[ng] + rcnums[ng] - 1) = '\0';
        !           153:     if (rcchar[ng] == NEGCHAR) {       /* did they unsubscribe? */
        !           154:        printf(unsubto,ngname) FLUSH;
        !           155:        toread[ng] = TR_UNSUB;          /* make line invisible */
        !           156:     }
        !           157:     else
        !           158:        /*NOSTRICT*/
        !           159:        toread[ng] = (ART_UNREAD)count;         /* remember how many unread there are */
        !           160: }
        !           161: 
        !           162: /* mark an article unread, keeping track of toread[] */
        !           163: 
        !           164: void
        !           165: onemore(artnum)
        !           166: ART_NUM artnum;
        !           167: {
        !           168: #ifdef DEBUGGING
        !           169:     if (debug && artnum < firstbit) {
        !           170:        printf("onemore: %d < %d\n",artnum,firstbit) FLUSH;
        !           171:        return;
        !           172:     }
        !           173: #endif
        !           174:     if (ctl_read(artnum)) {
        !           175:        ctl_clear(artnum);
        !           176:        ++toread[ng];
        !           177:     }
        !           178: }
        !           179: 
        !           180: /* mark an article read, keeping track of toread[] */
        !           181: 
        !           182: void
        !           183: oneless(artnum)
        !           184: ART_NUM artnum;
        !           185: {
        !           186: #ifdef DEBUGGING
        !           187:     if (debug && artnum < firstbit) {
        !           188:        printf("oneless: %d < %d\n",artnum,firstbit) FLUSH;
        !           189:        return;
        !           190:     }
        !           191: #endif
        !           192:     if (!ctl_read(artnum)) {
        !           193:        ctl_set(artnum);
        !           194:        if (toread[ng] > TR_NONE)
        !           195:            --toread[ng];
        !           196:     }
        !           197: }
        !           198: 
        !           199: /* mark an article as unread, making sure that firstbit is properly handled */
        !           200: /* cross-references are left as read in the other newsgroups */
        !           201: 
        !           202: void
        !           203: unmark_as_read(artnum)
        !           204: ART_NUM artnum;
        !           205: {
        !           206:     check_first(artnum);
        !           207:     onemore(artnum);
        !           208: #ifdef MCHASE
        !           209:     if (!parse_maybe(artnum))
        !           210:        chase_xrefs(artnum,FALSE);
        !           211: #endif
        !           212: }
        !           213: 
        !           214: #ifdef DELAYMARK
        !           215: /* temporarily mark article as read.  When newsgroup is exited, articles */
        !           216: /* will be marked as unread.  Called via M command */
        !           217: 
        !           218: void
        !           219: delay_unmark(artnum)
        !           220: ART_NUM artnum;
        !           221: {
        !           222:     if (dmfp == Nullfp) {
        !           223:        dmfp = fopen(dmname,"w");
        !           224:        if (dmfp == Nullfp) {
        !           225:            printf(cantcreate,dmname) FLUSH;
        !           226:            sig_catcher(0);
        !           227:        }
        !           228:     }
        !           229:     oneless(artnum);                   /* set the correct bit */
        !           230:     dmcount++;
        !           231:     fprintf(dmfp,"%ld\n",(long)artnum);
        !           232: }
        !           233: #endif
        !           234: 
        !           235: /* mark article as read.  If article is cross referenced to other */
        !           236: /* newsgroups, mark them read there also. */
        !           237: 
        !           238: void
        !           239: mark_as_read(artnum)
        !           240: ART_NUM artnum;
        !           241: {
        !           242:     oneless(artnum);                   /* set the correct bit */
        !           243:     checkcount++;                      /* get more worried about crashes */
        !           244:     chase_xrefs(artnum,TRUE);
        !           245: }
        !           246: 
        !           247: /* make sure we have bits set correctly down to firstbit */
        !           248: 
        !           249: void
        !           250: check_first(min)
        !           251: ART_NUM min;
        !           252: {
        !           253:     register ART_NUM i = firstbit;
        !           254: 
        !           255:     if (min < absfirst)
        !           256:        min = absfirst;
        !           257:     if (min < i) {
        !           258:        for (i--; i>=min; i--)
        !           259:            ctl_set(i);         /* mark as read */
        !           260:        firstart = firstbit = min;
        !           261:     }
        !           262: }
        !           263: 
        !           264: /* bring back articles marked with M */
        !           265: 
        !           266: #ifdef DELAYMARK
        !           267: void
        !           268: yankback()
        !           269: {
        !           270:     register ART_NUM anum;
        !           271: 
        !           272:     if (dmfp) {                        /* delayed unmarks pending? */
        !           273: #ifdef VERBOSE
        !           274:        printf("\nReturning %ld Marked article%s...\n",(long)dmcount,
        !           275:            dmcount == 1 ? nullstr : "s") FLUSH;
        !           276: #endif
        !           277:        fclose(dmfp);
        !           278:        if (dmfp = fopen(dmname,"r")) {
        !           279:            while (fgets(buf,sizeof buf,dmfp) != Nullch) {
        !           280:                anum = (ART_NUM)atol(buf);
        !           281:                /*NOSTRICT*/
        !           282:                onemore(anum);             /* then unmark them */
        !           283: #ifdef MCHASE
        !           284:                chase_xrefs(anum,FALSE);
        !           285: #endif
        !           286:            }
        !           287:            fclose(dmfp);
        !           288:            dmfp = Nullfp;
        !           289:            UNLINK(dmname);             /* and be tidy */
        !           290:        }
        !           291:        else {
        !           292:            printf(cantopen,dmname) FLUSH;
        !           293:            sig_catcher(0);
        !           294:        }
        !           295:     }
        !           296:     dmcount = 0;
        !           297: }
        !           298: #endif
        !           299:     
        !           300: /* run down xref list and mark as read or unread */
        !           301: 
        !           302: int
        !           303: chase_xrefs(artnum,markread)
        !           304: ART_NUM artnum;
        !           305: int markread;
        !           306: {
        !           307: #ifdef ASYNC_PARSE
        !           308:     if (parse_maybe(artnum))           /* make sure we have right header */
        !           309:        return -1;
        !           310: #endif
        !           311: #ifdef DBM
        !           312:     {
        !           313:        datum lhs, rhs;
        !           314:        datum fetch();
        !           315:        register char *idp;
        !           316:        char *ident_buf;
        !           317:        static FILE * hist_file = Nullfp;
        !           318: #else
        !           319:     if (
        !           320: #ifdef DEBUGGING
        !           321:        debug & DEB_FEED_XREF ||
        !           322: #endif
        !           323:        htype[XREF_LINE].ht_minpos >= 0) {
        !           324:                                        /* are there article# xrefs? */
        !           325: #endif DBM
        !           326:        char *xref_buf, *curxref;
        !           327:        register char *xartnum;
        !           328:        char *rver_buf = Nullch;
        !           329:        static char *inews_site = Nullch;
        !           330:        register ART_NUM x;
        !           331:        char tmpbuf[128];
        !           332: 
        !           333: #ifdef DBM
        !           334:        rver_buf = fetchlines(artnum,NGS_LINE);
        !           335:                                        /* get Newsgroups */
        !           336:        if (!index(rver_buf,','))       /* if no comma, no Xref! */
        !           337:            return 0;
        !           338:        if (hist_file == Nullfp) {      /* Init. file accesses */
        !           339: #ifdef DEBUGGING
        !           340:            if (debug)
        !           341:                printf ("chase_xref: opening files\n");
        !           342: #endif
        !           343:            dbminit(filexp(ARTFILE));
        !           344:            if ((hist_file = fopen (filexp(ARTFILE), "r")) == Nullfp)
        !           345:                return 0;
        !           346:        }
        !           347:        xref_buf = safemalloc((MEM_SIZE)BUFSIZ);
        !           348:        ident_buf = fetchlines(artnum,MESSID_LINE);
        !           349:                                        /* get Message-ID */
        !           350: #ifdef DEBUGGING
        !           351:        if (debug)
        !           352:            printf ("chase_xref: Message-ID: %s\n", ident_buf);
        !           353: #endif
        !           354:        idp = ident_buf;
        !           355:        while (*++idp)                  /* make message-id case insensitive */
        !           356:            if (isupper(*idp))
        !           357:                *idp = tolower (*idp);
        !           358:        lhs.dptr = ident_buf;           /* look up article by id */
        !           359:        lhs.dsize = strlen(lhs.dptr) + 1;
        !           360:        rhs = fetch(lhs);               /* fetch the record */
        !           361:        if (rhs.dptr == NULL)           /* if null, nothing there */
        !           362:            goto wild_goose;
        !           363:        fseek (hist_file, *((long *)rhs.dptr), 0);
        !           364:                                        /* datum returned is position in hist file */
        !           365:        fgets (xref_buf, BUFSIZ, hist_file);
        !           366: #ifdef DEBUGGING
        !           367:        if (debug)
        !           368:            printf ("Xref from history: %s\n", xref_buf);
        !           369: #endif
        !           370:        curxref = cpytill(tmpbuf, xref_buf, '\t') + 1;
        !           371:        curxref = cpytill(tmpbuf, curxref, '\t') + 1;
        !           372: #ifdef DEBUGGING
        !           373:        if (debug)
        !           374:            printf ("chase_xref: curxref: %s\n", curxref);
        !           375: #endif
        !           376: #else !DBM
        !           377: #ifdef DEBUGGING
        !           378:        if (htype[XREF_LINE].ht_minpos >= 0)
        !           379: #endif
        !           380:            xref_buf = fetchlines(artnum,XREF_LINE);
        !           381:                                        /* get xrefs list */
        !           382: #ifdef DEBUGGING
        !           383:        else {
        !           384:            xref_buf = safemalloc((MEM_SIZE)100);
        !           385:            printf("Give Xref: ") FLUSH;
        !           386:            gets(xref_buf);
        !           387:        }
        !           388: #endif
        !           389: #ifdef DEBUGGING
        !           390:        if (debug & DEB_XREF_MARKER)
        !           391:            printf("Xref: %s\n",xref_buf) FLUSH;
        !           392: #endif
        !           393:        curxref = cpytill(tmpbuf,xref_buf,' ') + 1;
        !           394: 
        !           395:        /* Make sure site name on Xref matches what inews thinks site is.
        !           396:         * Check first against last inews_site.  If it matches, fine.
        !           397:         * If not, fetch inews_site from current Relay-Version line and
        !           398:         * check again.  This is so that if the new administrator decides
        !           399:         * to change the system name as known to inews, rn will still do
        !           400:         * Xrefs correctly--each article need only match itself to be valid.
        !           401:         */ 
        !           402:        if (inews_site == Nullch || strNE(tmpbuf,inews_site)) {
        !           403:            char *t;
        !           404: 
        !           405:            if (inews_site != Nullch)
        !           406:                free(inews_site);
        !           407: #ifndef NORELAY
        !           408:            rver_buf = fetchlines(artnum,RVER_LINE);
        !           409:            if ((t = instr(rver_buf,"; site ")) == Nullch)
        !           410: #else NORELAY
        !           411:           /* In version 2.10.3 of news or afterwards, the Relay-Version
        !           412:            * and Posting-Version header lines have been removed.  For
        !           413:            * the code below to work as intended, I have modified it to
        !           414:            * extract the first component of the Path header line.  This
        !           415:            * should give the same effect as did the old code with respect
        !           416:            * to the use of the Relay-Version site name.
        !           417:            */
        !           418:           rver_buf = fetchlines(artnum,PATH_LINE);
        !           419:           if ((t = instr(rver_buf,"!")) == Nullch)
        !           420: #endif NORELAY
        !           421:                inews_site = savestr(nullstr);
        !           422:            else {
        !           423:                char new_site[128];
        !           424: 
        !           425: #ifndef NORELAY
        !           426:                cpytill(new_site,t + 7,'.');
        !           427: #else NORELAY
        !           428:               cpytill(new_site,rver_buf,'!');
        !           429: #endif NORELAY
        !           430:                inews_site = savestr(new_site);
        !           431:            }
        !           432:            if (strNE(tmpbuf,inews_site)) {
        !           433: #ifdef DEBUGGING
        !           434:                if (debug)
        !           435:                    printf("Xref not from %s--ignoring\n",inews_site) FLUSH;
        !           436: #endif
        !           437:                goto wild_goose;
        !           438:            }
        !           439:        }
        !           440: #endif DBM
        !           441:        while (*curxref) {
        !           442:                                        /* for each newsgroup */
        !           443:            curxref = cpytill(tmpbuf,curxref,' ');
        !           444: #ifdef DBM
        !           445:            xartnum = index(tmpbuf,'/');
        !           446: #else
        !           447:            xartnum = index(tmpbuf,':');
        !           448: #endif DBM
        !           449:            if (!xartnum)               /* probably an old-style Xref */
        !           450:                break;
        !           451:            *xartnum++ = '\0';
        !           452:            if (strNE(tmpbuf,ngname)) {/* not the current newsgroup? */
        !           453:                x = atol(xartnum);
        !           454:                if (x)
        !           455:                    if (markread) {
        !           456:                        if (addartnum(x,tmpbuf))
        !           457:                            goto wild_goose;
        !           458:                    }
        !           459: #ifdef MCHASE
        !           460:                    else
        !           461:                        subartnum(x,tmpbuf);
        !           462: #endif
        !           463:            }
        !           464:            while (*curxref && isspace(*curxref))
        !           465:                curxref++;
        !           466:        }
        !           467:       wild_goose:
        !           468:        free(xref_buf);
        !           469: #ifdef DBM
        !           470:        free(ident_buf);
        !           471: #endif DBM
        !           472:        if (rver_buf != Nullch)
        !           473:            free(rver_buf);
        !           474:     }
        !           475:     return 0;
        !           476: }
        !           477: 
        !           478: int
        !           479: initctl()
        !           480: {
        !           481:     char *mybuf = buf;                 /* place to decode rc line */
        !           482:     register char *s, *c, *h;
        !           483:     register long i;
        !           484:     register ART_NUM unread;
        !           485:     
        !           486: #ifdef DELAYMARK
        !           487:     dmcount = 0;
        !           488: #endif
        !           489:     if ((lastart = getngsize(ng)) < 0) /* this cannot happen (laugh here) */
        !           490:        return -1;
        !           491: 
        !           492:     absfirst = getabsfirst(ng,lastart);        /* remember first existing article */
        !           493:     if (!absfirst)                     /* no articles at all? */
        !           494:        absfirst = 1;                   /* pretend there is one */
        !           495: #ifndef lint
        !           496:     ctlsize = (MEM_SIZE)(OFFSET(lastart)/BITSPERBYTE+20);
        !           497: #endif lint
        !           498:     ctlarea = safemalloc(ctlsize);     /* allocate control area */
        !           499: 
        !           500:     /* now modify ctlarea to reflect what has already been read */
        !           501: 
        !           502:     for (s = rcline[ng] + rcnums[ng]; *s == ' '; s++) ;
        !           503:                                        /* find numbers in rc line */
        !           504:     i = strlen(s);
        !           505: #ifndef lint
        !           506:     if (i >= LBUFLEN-2)                        /* bigger than buf? */
        !           507:        mybuf = safemalloc((MEM_SIZE)(i+2));
        !           508: #endif lint
        !           509:     strcpy(mybuf,s);                   /* make scratch copy of line */
        !           510:     mybuf[i++] = ',';                  /* put extra comma on the end */
        !           511:     mybuf[i] = '\0';
        !           512:     s = mybuf;                         /* initialize the for loop below */
        !           513:     if (strnEQ(s,"1-",2)) {            /* can we save some time here? */
        !           514:        firstbit = atol(s+2)+1;         /* ignore first range thusly */
        !           515:        s=index(s,',') + 1;
        !           516:     }
        !           517:     else
        !           518:        firstbit = 1;                   /* all the bits are valid for now */
        !           519:     if (absfirst > firstbit) {         /* do we know already? */
        !           520:        firstbit = absfirst;            /* no point calling getngmin again */
        !           521:     }
        !           522:     else if (artopen(firstbit) == Nullfp) {
        !           523:                                        /* first unread article missing? */
        !           524:        i = getngmin(".",firstbit);     /* see if expire has been busy */
        !           525:        if (i) {                        /* avoid a bunch of extra opens */
        !           526:            firstbit = i;
        !           527:        }
        !           528:     }
        !           529:     firstart = firstbit;               /* firstart > firstbit in KILL */
        !           530: #ifdef PENDING
        !           531: #   ifdef CACHESUBJ
        !           532:        subj_to_get = firstbit;
        !           533: #   endif
        !           534: #endif
        !           535:     unread = lastart - firstbit + 1;   /* assume this range unread */
        !           536:     for (i=OFFSET(firstbit)/BITSPERBYTE; i<ctlsize; i++)
        !           537:        ctlarea[i] = 0;                 /* assume unread */
        !           538: #ifdef DEBUGGING
        !           539:     if (debug & DEB_CTLAREA_BITMAP) {
        !           540:        printf("\n%s\n",mybuf) FLUSH;
        !           541:        for (i=1; i <= lastart; i++)
        !           542:            if (! was_read(i))
        !           543:                printf("%ld ",(long)i) FLUSH;
        !           544:     }
        !           545: #endif
        !           546:     for ( ; (c = index(s,',')) != Nullch; s = ++c) {
        !           547:                                        /* for each range */
        !           548:        ART_NUM min, max;
        !           549: 
        !           550:        *c = '\0';                      /* do not let index see past comma */
        !           551:        if ((h = index(s,'-')) != Nullch) {     /* is there a -? */
        !           552:            min = atol(s);
        !           553:            max = atol(h+1);
        !           554:            if (min < firstbit)         /* make sure range is in range */
        !           555:                min = firstbit;
        !           556:            if (max > lastart)
        !           557:                max = lastart;
        !           558:            if (min <= max)             /* non-null range? */
        !           559:                unread -= max - min + 1;/* adjust unread count */
        !           560:            for (i=min; i<=max; i++)    /* for all articles in range */
        !           561:                ctl_set(i);             /* mark them read */
        !           562:        }
        !           563:        else if ((i = atol(s)) >= firstbit && i <= lastart) {
        !           564:                                        /* is single number reasonable? */
        !           565:            ctl_set(i);                 /* mark it read */
        !           566:            unread--;                   /* decrement articles to read */
        !           567:        }
        !           568: #ifdef DEBUGGING
        !           569:        if (debug & DEB_CTLAREA_BITMAP) {
        !           570:            printf("\n%s\n",s) FLUSH;
        !           571:            for (i=1; i <= lastart; i++)
        !           572:                if (! was_read(i))
        !           573:                    printf("%ld ",(long)i) FLUSH;
        !           574:        }
        !           575: #endif
        !           576:     }
        !           577: #ifdef DEBUGGING
        !           578:     if (debug & DEB_CTLAREA_BITMAP) {
        !           579:        fputs("\n(hit CR)",stdout) FLUSH;
        !           580:        gets(cmd_buf);
        !           581:     }
        !           582: #endif
        !           583:     if (mybuf != buf)
        !           584:        free(mybuf);
        !           585:     toread[ng] = unread;
        !           586:     return 0;
        !           587: }
        !           588: 
        !           589: void
        !           590: grow_ctl()
        !           591: {
        !           592:     ART_NUM newlast;
        !           593:     ART_NUM tmpfirst;
        !           594:     MEM_SIZE newsize;
        !           595:     register ART_NUM i;
        !           596: 
        !           597:     forcegrow = FALSE;
        !           598:     newlast = getngsize(ng);
        !           599:     if (newlast > lastart) {
        !           600:        ART_NUM tmpart = art;
        !           601: #ifndef lint
        !           602:        newsize = (MEM_SIZE)(OFFSET(newlast)/BITSPERBYTE+2);
        !           603: #else
        !           604:        newsize = Null(MEM_SIZE);
        !           605: #endif lint
        !           606:        if (newsize > ctlsize) {
        !           607:            newsize += 20;
        !           608:            ctlarea = saferealloc(ctlarea,newsize);
        !           609:            ctlsize = newsize;
        !           610:        }
        !           611:        toread[ng] += (ART_UNREAD)(newlast-lastart);
        !           612:        for (i=lastart+1; i<=newlast; i++)
        !           613:            ctl_clear(i);       /* these articles are unread */
        !           614: #ifdef CACHESUBJ
        !           615:        if (subj_list != Null(char**)) {
        !           616: #ifndef lint
        !           617:            subj_list = (char**)saferealloc((char*)subj_list,
        !           618:                  (MEM_SIZE)((OFFSET(newlast)+2)*sizeof(char *)) );
        !           619: #endif lint
        !           620:            for (i=lastart+1; i<=newlast; i++)
        !           621:                subj_list[OFFSET(i)] = Nullch;
        !           622:        }
        !           623: #endif
        !           624:        tmpfirst = lastart+1;
        !           625:        lastart = newlast;
        !           626: #ifdef KILLFILES
        !           627: #ifdef VERBOSE
        !           628:        IF(verbose)
        !           629:            sprintf(buf,
        !           630:                "%ld more article%s arrived--looking for more to kill...\n\n",
        !           631:                (long)(lastart - tmpfirst + 1),
        !           632:                (lastart > tmpfirst ? "s have" : " has" ) );
        !           633:        ELSE                    /* my, my, how clever we are */
        !           634: #endif
        !           635: #ifdef TERSE
        !           636:            strcpy(buf, "More news--killing...\n\n");
        !           637: #endif
        !           638:        kill_unwanted(tmpfirst,buf,TRUE);
        !           639: #endif
        !           640:        art = tmpart;
        !           641:     }
        !           642: }
        !           643: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.