Annotation of researchv9/X11/src/X.V11R1/clients/xmh/tocutil.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char rcs_id[] = "$Header: tocutil.c,v 1.14 87/09/11 08:19:27 toddb Exp $";
                      3: #endif lint
                      4: /*
                      5:  *                       COPYRIGHT 1987
                      6:  *                DIGITAL EQUIPMENT CORPORATION
                      7:  *                    MAYNARD, MASSACHUSETTS
                      8:  *                     ALL RIGHTS RESERVED.
                      9:  *
                     10:  * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
                     11:  * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
                     12:  * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
                     13:  * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
                     14:  *
                     15:  * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
                     16:  * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
                     17:  * SET FORTH ABOVE.
                     18:  *
                     19:  *
                     20:  * Permission to use, copy, modify, and distribute this software and its
                     21:  * documentation for any purpose and without fee is hereby granted, provided
                     22:  * that the above copyright notice appear in all copies and that both that
                     23:  * copyright notice and this permission notice appear in supporting documentation,
                     24:  * and that the name of Digital Equipment Corporation not be used in advertising
                     25:  * or publicity pertaining to distribution of the software without specific,
                     26:  * written prior permission.
                     27:  */
                     28: 
                     29: /* tocutil.c -- internal routines for toc stuff. */
                     30: 
                     31: #include "xmh.h"
                     32: #include "toc.h"
                     33: #include "tocutil.h"
                     34: #include "tocintrnl.h"
                     35: #include <sys/file.h>
                     36: 
                     37: Toc TUMalloc()
                     38: {
                     39:     Toc toc;
                     40:     toc = (Toc) XtMalloc(sizeof(TocRec));
                     41:     bzero((char *)toc, (int) sizeof(TocRec));
                     42:     toc->msgs = (Msg *) XtMalloc(1);
                     43:     toc->seqlist = (Sequence *) XtMalloc(1);
                     44:     toc->validity = unknown;
                     45:     return toc;
                     46: }
                     47: 
                     48: 
                     49: /* Returns TRUE if the scan file for the given toc is out of date. */
                     50: 
                     51: int TUScanFileOutOfDate(toc)
                     52:   Toc toc;
                     53: {
                     54:     return LastModifyDate(toc->path) > toc->lastreaddate;
                     55: }
                     56: 
                     57: 
                     58: /* Make sure the shown sequence buttons correspond exactly to the sequences
                     59:    for this toc.  If not, then rebuild the buttonbox. */
                     60: 
                     61: static void CheckSeqButtons(toc)
                     62: Toc toc;
                     63: {
                     64:     Scrn scrn = toc->scrn;
                     65:     int i, numinbox;
                     66:     int rebuild;
                     67:     extern void PrepareDoubleClickSequence();
                     68:     if (scrn == NULL) return;
                     69:     rebuild = FALSE;
                     70:     numinbox = BBoxNumButtons(scrn->seqbuttons);
                     71:     if (numinbox != toc->numsequences)
                     72:        rebuild = TRUE;
                     73:     else {
                     74:        for (i=0 ; i<toc->numsequences && !rebuild; i++)
                     75:            rebuild =
                     76:                strcmp(toc->seqlist[i]->name,
                     77:                       BBoxNameOfButton(BBoxButtonNumber(scrn->seqbuttons,
                     78:                                                         i)));
                     79:     }
                     80:     if (rebuild) {
                     81:        BBoxStopUpdate(scrn->seqbuttons);
                     82:        for (i = 1; i < numinbox ; i++)
                     83:            BBoxDeleteButton(BBoxButtonNumber(scrn->seqbuttons, 1));
                     84:        for (i = (numinbox ? 1 : 0); i < toc->numsequences; i++)
                     85:            BBoxAddButton(scrn->seqbuttons, toc->seqlist[i]->name,
                     86:                          PrepareDoubleClickSequence, 999, TRUE);
                     87:        BBoxStartUpdate(scrn->seqbuttons);
                     88:     }
                     89:     if (scrn->seqbuttons) 
                     90:        BBoxSetRadio(scrn->seqbuttons,
                     91:                     BBoxFindButtonNamed(scrn->seqbuttons,
                     92:                                         toc->viewedseq->name));
                     93: }
                     94: 
                     95: 
                     96: 
                     97: void TUScanFileForToc(toc)
                     98:   Toc toc;
                     99: {
                    100:     static Arg arglist[] = {
                    101:        {XtNlabel, NULL},
                    102:        {XtNx, (XtArgVal) 30},
                    103:        {XtNy, (XtArgVal) 30}
                    104:     };
                    105: 
                    106:     Window parent, label;
                    107:     Scrn scrn;
                    108:     char  **argv, str[100], str2[10];
                    109:     if (toc) {
                    110:        TUGetFullFolderInfo(toc);
                    111:        scrn = toc->scrn;
                    112:        if (!scrn) scrn = scrnList[0];
                    113:        parent = scrn->tocwindow;
                    114:        if (!parent) parent = scrn->window;
                    115:        (void) sprintf(str, "Rescanning %s", toc->foldername);
                    116:        arglist[0].value = (XtArgVal) str;
                    117:        label = XtLabelCreate(DISPLAY parent, arglist, XtNumber(arglist));
                    118:        QXMapWindow(theDisplay, label);
                    119:        (void) XtSendExpose(DISPLAY label);
                    120:        QXFlush(theDisplay);
                    121: 
                    122:        argv = MakeArgv(4);
                    123:        argv[0] = "scan";
                    124:        (void) sprintf(str, "+%s", toc->foldername);
                    125:        argv[1] = str;
                    126:        argv[2] = "-width";
                    127:        (void) sprintf(str2, "%d", defTocWidth);
                    128:        argv[3] = str2;
                    129:        DoCommand(argv, (char *) NULL, toc->scanfile);
                    130:        XtFree((char *) argv);
                    131: 
                    132:        (void) XtSendDestroyNotify(DISPLAY label);
                    133:        QXDestroyWindow(theDisplay, label);
                    134:        toc->validity = valid;
                    135:        toc->curmsg = NULL;     /* Get cur msg somehow! %%% */
                    136:     }
                    137: }
                    138: 
                    139: 
                    140: 
                    141: int TUGetMsgPosition(toc, msg)
                    142:   Toc toc;
                    143:   Msg msg;
                    144: {
                    145:     int msgid, h, l, m;
                    146:     char str[100];
                    147:     msgid = msg->msgid;
                    148:     l = 0;
                    149:     h = toc->nummsgs - 1;
                    150:     while (l < h - 1) {
                    151:        m = (l + h) / 2;
                    152:        if (toc->msgs[m]->msgid > msgid)
                    153:            h = m;
                    154:        else
                    155:            l = m;
                    156:     }
                    157:     if (toc->msgs[l] == msg) return l;
                    158:     if (toc->msgs[h] == msg) return h;
                    159:     (void) sprintf(str, "TUGetMsgPosition search failed! hi=%d, lo=%d, msgid=%d",
                    160:                   h, l, msgid);
                    161:     Punt(str);
                    162:     return 0; /* Keep lint happy. */
                    163: }
                    164: 
                    165: 
                    166: void TUResetTocLabel(scrn)
                    167:   Scrn scrn;
                    168: {
                    169:     char str[500];
                    170:     Toc toc;
                    171:     if (scrn) {
                    172:        toc = scrn->toc;
                    173:        if (toc == NULL)
                    174:            (void) strcpy(str, " ");
                    175:        else {
                    176:            if (toc->stopupdate) {
                    177:                toc->needslabelupdate = TRUE;
                    178:                return;
                    179:            }
                    180:            (void) sprintf(str, "%s:%s", toc->foldername,
                    181:                           toc->viewedseq->name);
                    182:            toc->needslabelupdate = FALSE;
                    183:        }
                    184:        ChangeLabel(scrn->toclabel, str);
                    185:     }
                    186: }
                    187: 
                    188: 
                    189: /* A major toc change has occured; redisplay it.  (This also should work even
                    190:    if we now have a new source to display stuff from.) */
                    191: 
                    192: void TURedisplayToc(scrn)
                    193:   Scrn scrn;
                    194: {
                    195:     Toc toc;
                    196:     int lines, width, height;
                    197:     XtTextPosition position;
                    198:     if (scrn != NULL && scrn->tocwindow != NULL) {
                    199:        toc = scrn->toc;
                    200:        if (toc) {
                    201:            if (toc->stopupdate) {
                    202:                toc->needsrepaint = TRUE;
                    203:                return;
                    204:            }
                    205:            GetWindowSize(scrn->tocwindow, &width, &height);
                    206:            lines = scrn->tocsink->maxLines(scrn->tocsink, height);
                    207:            position = toc->source->getLastPos(toc->source);
                    208:            position = toc->source->scan(toc->source, position, XtstEOL,
                    209:                                         XtsdLeft, lines, FALSE);
                    210:            XtTextNewSource(DISPLAY scrn->tocwindow, toc->source, position);
                    211:            TocSetCurMsg(toc, TocGetCurMsg(toc));
                    212:            CheckSeqButtons(toc);
                    213:            toc->needsrepaint = FALSE;
                    214:        } else {
                    215:            XtTextNewSource(DISPLAY scrn->tocwindow, NullSource, (XtTextPosition) 0);
                    216:        }
                    217:     }
                    218: }
                    219: 
                    220: 
                    221: 
                    222: void TULoadSeqLists(toc)
                    223:   Toc toc;
                    224: {
                    225:     Sequence seq;
                    226:     FILEPTR fid;
                    227:     char    str[500], *ptr, *ptr2, viewed[500];
                    228:     int     i;
                    229:     if (toc->viewedseq) (void) strcpy(viewed, toc->viewedseq->name);
                    230:     else *viewed = 0;
                    231:     for (i = 0; i < toc->numsequences; i++) {
                    232:        seq = toc->seqlist[i];
                    233:        XtFree((char *) seq->name);
                    234:        if (seq->mlist) FreeMsgList(seq->mlist);
                    235:        XtFree((char *)seq);
                    236:     }
                    237:     toc->numsequences = 1;
                    238:     toc->seqlist = (Sequence *) XtRealloc((char *) toc->seqlist,
                    239:                                               sizeof(Sequence));
                    240:     seq = toc->seqlist[0] = (Sequence) XtMalloc(sizeof(SequenceRec));
                    241:     bzero((char *) seq, sizeof(SequenceRec));
                    242:     seq->name = MallocACopy("all");
                    243:     seq->mlist = NULL;
                    244:     toc->viewedseq = seq;
                    245:     (void) sprintf(str, "%s/.mh_sequences", toc->path);
                    246:     fid = myfopen(str, "r");
                    247:     if (fid) {
                    248:        while (ptr = ReadLine(fid)) {
                    249:            ptr2 = index(ptr, ':');
                    250:            if (ptr2) {
                    251:                *ptr2 = 0;
                    252:                if (strcmp(ptr, "all") != 0 &&
                    253:                    strcmp(ptr, "cur") != 0 &&
                    254:                    strcmp(ptr, "unseen") != 0) {
                    255:                    toc->numsequences++;
                    256:                    toc->seqlist = (Sequence *)
                    257:                        XtRealloc((char *) toc->seqlist,
                    258:                                  (unsigned) toc->numsequences * sizeof(Sequence));
                    259:                    seq = toc->seqlist[toc->numsequences - 1] =
                    260:                        (Sequence) XtMalloc(sizeof(SequenceRec));
                    261:                    bzero((char *) seq, sizeof(SequenceRec));
                    262:                    seq->name = MallocACopy(ptr);
                    263:                    seq->mlist = StringToMsgList(toc, ptr2 + 1);
                    264:                    if (strcmp(seq->name, viewed) == 0) {
                    265:                        toc->viewedseq = seq;
                    266:                        *viewed = 0;
                    267:                    }
                    268:                }
                    269:            }
                    270:        }
                    271:        (void) myfclose(fid);
                    272:     }
                    273: }
                    274: 
                    275: 
                    276: 
                    277: /* Refigure what messages are visible.  Also makes sure we're displaying the
                    278:    correct set of seq buttons. */
                    279: 
                    280: void TURefigureWhatsVisible(toc)
                    281: Toc toc;
                    282: {
                    283:     MsgList mlist;
                    284:     Msg msg, oldcurmsg;
                    285:     int     i, w, changed, newval, msgid;
                    286:     Sequence seq = toc->viewedseq;
                    287:     mlist = seq->mlist;
                    288:     oldcurmsg = toc->curmsg;
                    289:     TocSetCurMsg(toc, (Msg)NULL);
                    290:     w = 0;
                    291:     changed = FALSE;
                    292:     CheckSeqButtons(toc);
                    293:     for (i = 0; i < toc->nummsgs; i++) {
                    294:        msg = toc->msgs[i];
                    295:        msgid = msg->msgid;
                    296:        while (mlist && mlist->msglist[w] && mlist->msglist[w]->msgid < msgid)
                    297:            w++;
                    298:        newval = (!mlist || mlist->msglist[w]->msgid == msgid);
                    299:        if (newval != msg->visible) {
                    300:            changed = TRUE;
                    301:            msg->visible = newval;
                    302:        }
                    303:     }
                    304:     if (changed) {
                    305:        TURefigureTocPositions(toc);
                    306:        if (oldcurmsg) {
                    307:            if (!oldcurmsg->visible) {
                    308:                toc->curmsg = TocMsgAfter(toc, oldcurmsg);
                    309:                if (toc->curmsg == NULL)
                    310:                    toc->curmsg = TocMsgBefore(toc, oldcurmsg);
                    311:            } else toc->curmsg = oldcurmsg;
                    312:        }
                    313:        TURedisplayToc(toc->scrn);
                    314:     } else TocSetCurMsg(toc, oldcurmsg);
                    315:     TUResetTocLabel(toc->scrn);
                    316: }
                    317: 
                    318: 
                    319: /* (Re)load the toc from the scanfile.  If reloading, this makes efforts to
                    320:    keep the fates of msgs, and to keep msgs that are being edited.  Note that
                    321:    this routine must know of all places that msg ptrs are stored; it expects
                    322:    them to be kept only in tocs, in scrns, and in msg sequences. */
                    323: 
                    324: #define SeemsIdentical(msg1, msg2) ((msg1)->msgid == (msg2)->msgid &&        \
                    325:                                    ((msg1)->temporary || (msg2)->temporary ||\
                    326:                                     strcmp((msg1)->buf, (msg2)->buf) == 0))
                    327: 
                    328: void TULoadTocFile(toc)
                    329:   Toc toc;
                    330: {
                    331:     int maxmsgs, l, orignummsgs, i, j, origcurmsgid;
                    332:     FILEPTR fid;
                    333:     XtTextPosition position;
                    334:     char *ptr;
                    335:     Msg msg, curmsg;
                    336:     Msg *origmsgs;
                    337: 
                    338:     TocStopUpdate(toc);
                    339:     toc->lastreaddate = CurrentDate();
                    340:     if (toc->curmsg) {
                    341:        origcurmsgid = toc->curmsg->msgid;
                    342:        TocSetCurMsg(toc, (Msg)NULL);
                    343:     } else origcurmsgid = 0;
                    344:     fid = FOpenAndCheck(toc->scanfile, "r");
                    345:     maxmsgs = 10;
                    346:     orignummsgs = toc->nummsgs;
                    347:     toc->nummsgs = 0;
                    348:     origmsgs = toc->msgs;
                    349:     toc->msgs = (Msg *) XtMalloc((unsigned) maxmsgs * sizeof(Msg));
                    350:     position = 0;
                    351:     i = 0;
                    352:     curmsg = NULL;
                    353:     while (ptr = ReadLineWithCR(fid)) {
                    354:        toc->msgs[toc->nummsgs++] = msg = (Msg) XtMalloc(sizeof(MsgRec));
                    355:        bzero((char *) msg, sizeof(MsgRec));
                    356:        l = strlen(ptr);
                    357:        msg->toc = toc;
                    358:        msg->position = position;
                    359:        msg->length = l;
                    360:        msg->buf = MallocACopy(ptr);
                    361:        msg->msgid = atoi(ptr);
                    362:        if (msg->msgid == origcurmsgid)
                    363:            curmsg = msg;
                    364:        msg->buf[MARKPOS] = ' ';
                    365:        position += l;
                    366:        msg->changed = FALSE;
                    367:        msg->fate = Fignore;
                    368:        msg->desttoc = NULL;
                    369:        msg->visible = TRUE;
                    370:        if (toc->nummsgs >= maxmsgs) {
                    371:            maxmsgs += 100;
                    372:            toc->msgs = (Msg *) XtRealloc((char *) toc->msgs,
                    373:                                          (unsigned) maxmsgs * sizeof(Msg));
                    374:        }
                    375:        while (i < orignummsgs && origmsgs[i]->msgid < msg->msgid) i++;
                    376:        if (i < orignummsgs) {
                    377:            origmsgs[i]->buf[MARKPOS] = ' ';
                    378:            if (SeemsIdentical(origmsgs[i], msg))
                    379:                MsgSetFate(msg, origmsgs[i]->fate, origmsgs[i]->desttoc);
                    380:        }
                    381:     }
                    382:     toc->length = toc->origlength = toc->lastPos = position;
                    383:     toc->msgs = (Msg *) XtRealloc((char *) toc->msgs,
                    384:                                  (unsigned) toc->nummsgs * sizeof(Msg));
                    385:     (void) myfclose(fid);
                    386:     if (toc->source == NULL)
                    387:        toc->source = TSourceCreate(toc);
                    388:     for (i=0 ; i<numScrns ; i++) {
                    389:        msg = scrnList[i]->msg;
                    390:        if (msg && msg->toc == toc) {
                    391:            for (j=0 ; j<toc->nummsgs ; j++) {
                    392:                if (SeemsIdentical(toc->msgs[j], msg)) {
                    393:                    msg->position = toc->msgs[j]->position;
                    394:                    msg->visible = TRUE;
                    395:                    ptr = toc->msgs[j]->buf;
                    396:                    *(toc->msgs[j]) = *msg;
                    397:                    toc->msgs[j]->buf = ptr;
                    398:                    scrnList[i]->msg = toc->msgs[j];
                    399:                    break;
                    400:                }
                    401:            }
                    402:            if (j >= toc->nummsgs) {
                    403:                msg->temporary = FALSE; /* Don't try to auto-delete msg. */
                    404:                MsgSetScrnForce(msg, (Scrn) NULL);
                    405:            }
                    406:        }
                    407:     }
                    408:     for (i=0 ; i<orignummsgs ; i++)
                    409:        MsgFree(origmsgs[i]);
                    410:     XtFree((char *)origmsgs);
                    411:     TocSetCurMsg(toc, curmsg);
                    412:     TULoadSeqLists(toc);
                    413:     TocStartUpdate(toc);
                    414: }
                    415: 
                    416: 
                    417: void TUSaveTocFile(toc)
                    418:   Toc toc;
                    419: {
                    420:     extern long lseek();
                    421:     Msg msg;
                    422:     int fid;
                    423:     int i;
                    424:     XtTextPosition position;
                    425:     char c;
                    426:     if (toc->stopupdate) {
                    427:        toc->needscachesave = TRUE;
                    428:        return;
                    429:     }
                    430:     fid = -1;
                    431:     position = 0;
                    432:     for (i = 0; i < toc->nummsgs; i++) {
                    433:        msg = toc->msgs[i];
                    434:        if (fid < 0 && msg->changed) {
                    435:            fid = myopen(toc->scanfile, O_RDWR, 0666);
                    436:            (void) lseek(fid, (long)position, 0);
                    437:        }
                    438:        if (fid >= 0) {
                    439:            c = msg->buf[MARKPOS];
                    440:            msg->buf[MARKPOS] = ' ';
                    441:            (void) write(fid, msg->buf, msg->length);
                    442:            msg->buf[MARKPOS] = c;
                    443:        }
                    444:        position += msg->length;
                    445:     }
                    446:     if (fid < 0 && toc->length != toc->origlength)
                    447:        fid = myopen(toc->scanfile, O_RDWR, 0666);
                    448:     if (fid >= 0) {
                    449:        (void) ftruncate(fid, toc->length);
                    450:        toc->origlength = toc->length;
                    451:        (void) myclose(fid);
                    452:     } else
                    453:        (void) utime(toc->scanfile, (time_t *)NULL);
                    454:     toc->needscachesave = FALSE;
                    455:     toc->lastreaddate = CurrentDate();
                    456: }
                    457: 
                    458: 
                    459: void TUEnsureScanIsValidAndOpen(toc)
                    460:   Toc toc;
                    461: {
                    462:     if (toc) {
                    463:        TUGetFullFolderInfo(toc);
                    464:        if (TUScanFileOutOfDate(toc)) {
                    465:            if (toc->source) {
                    466:                XtFree((char *) toc->source);
                    467:                toc->source = NULL;
                    468:            }
                    469:            TUScanFileForToc(toc);
                    470:        }
                    471:        if (toc->source == NULL)
                    472:            TULoadTocFile(toc);
                    473:        toc->validity = valid;
                    474:     }
                    475: }
                    476: 
                    477: 
                    478: 
                    479: /* Refigure all the positions, based on which lines are visible. */
                    480: 
                    481: void TURefigureTocPositions(toc)
                    482:   Toc toc;
                    483: {
                    484:     int i;
                    485:     Msg msg;
                    486:     XtTextPosition position, length;
                    487:     position = length = 0;
                    488:     for (i=0; i<toc->nummsgs ; i++) {
                    489:        msg = toc->msgs[i];
                    490:        msg->position = position;
                    491:        if (msg->visible) position += msg->length;
                    492:        length += msg->length;
                    493:     }
                    494:     toc->lastPos = position;
                    495:     toc->length = length;
                    496: }
                    497: 
                    498: 
                    499: 
                    500: /* Make sure we've loaded ALL the folder info for this toc, including its
                    501:    path and sequence lists. */
                    502: 
                    503: void TUGetFullFolderInfo(toc)
                    504:   Toc toc;
                    505: {
                    506:     char str[500];
                    507:     if (toc->path == NULL) {
                    508:        (void) sprintf(str, "%s/%s", mailDir, toc->foldername);
                    509:        toc->path = MallocACopy(str);
                    510:        (void) sprintf(str, "%s/.xmhcache", toc->path);
                    511:        toc->scanfile = MallocACopy(str);
                    512:        toc->lastreaddate = LastModifyDate(toc->scanfile);
                    513:        if (TUScanFileOutOfDate(toc))
                    514:            toc->validity = invalid;
                    515:        else {
                    516:            toc->validity = valid;
                    517:            TULoadTocFile(toc);
                    518:        }
                    519:     }
                    520: }
                    521: 
                    522: /* Append a message to the end of the toc.  It has the given scan line.  This
                    523:    routine will figure out the message number, and change the scan line
                    524:    accordingly. */
                    525: 
                    526: Msg TUAppendToc(toc, ptr)
                    527:   Toc toc;
                    528:   char *ptr;
                    529: {
                    530:     char str[10];
                    531:     Msg msg;
                    532:     int msgid, i;
                    533:     TUGetFullFolderInfo(toc);
                    534:     if (toc->validity != valid)
                    535:        return NULL;
                    536:            
                    537:     if (toc->nummsgs > 0)
                    538:        msgid = toc->msgs[toc->nummsgs - 1]->msgid + 1;
                    539:     else
                    540:        msgid = 1;
                    541:     (toc->nummsgs)++;
                    542:     toc->msgs = (Msg *) XtRealloc((char *) toc->msgs,
                    543:                                  (unsigned) toc->nummsgs * sizeof(Msg));
                    544:     toc->msgs[toc->nummsgs - 1] = msg = (Msg) XtMalloc(sizeof(MsgRec));
                    545:     bzero((char *) msg, (int) sizeof(MsgRec));
                    546:     msg->toc = toc;
                    547:     msg->buf = MallocACopy(ptr);
                    548:     (void)sprintf(str, "%4d", msgid);
                    549:     for (i=0; i<4 ; i++) msg->buf[i] = str[i];
                    550:     msg->buf[MARKPOS] = ' ';
                    551:     msg->msgid = msgid;
                    552:     msg->position = toc->lastPos;
                    553:     msg->length = strlen(ptr);
                    554:     msg->changed = TRUE;
                    555:     msg->fate = Fignore;
                    556:     msg->desttoc = NULL;
                    557:     if (toc->viewedseq == toc->seqlist[0]) {
                    558:        msg->visible = TRUE;
                    559:        toc->lastPos += msg->length;
                    560:     }
                    561:     else
                    562:        msg->visible = FALSE;
                    563:     toc->length += msg->length;
                    564:     TURedisplayToc(toc->scrn);
                    565:     TUSaveTocFile(toc);
                    566:     return msg;
                    567: }

unix.superglobalmegacorp.com

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