Annotation of 43BSD/contrib/notes/src/dsply.c, revision 1.1

1.1     ! root        1: #include       "parms.h"
        !             2: #include       "structs.h"
        !             3: 
        !             4: #ifdef RCSIDENT
        !             5: static char rcsid[] = "$Header: dsply.c,v 1.7.0.2 85/03/18 20:54:06 notes Rel $";
        !             6: #endif RCSIDENT
        !             7: 
        !             8: 
        !             9: /*
        !            10:  * dspnote(io,note) struct io_f *io; struct note_f *note;
        !            11:  *
        !            12:  *    displays a completely formatted note on the screen.  It calls
        !            13:  *    gettrec to get the text of the note.
        !            14:  *
        !            15:  * dspresp(io,note,resp,phys,logical) is a little trickier.
        !            16:  *
        !            17:  *   it prints out the response to <note> from response form <resp>
        !            18:  *   (at index of <resp> of <phys>).  <logical> is the logical number
        !            19:  *   of the note and is displayed.
        !            20:  *
        !            21:  *     Original coding:        Rob Kolstad     Winter 1980
        !            22:  *     Modified:               Ray Essick      December 1981
        !            23:  *             - reordered display so went top to bottom, left to right
        !            24:  *             - to facilitate use on dumb terminals (or tty's)
        !            25:  */
        !            26: 
        !            27: static char *Anon = "Anonymous";
        !            28: static char *Fromnews = "(From News system)";
        !            29: static char *Continued = "-- more  %d%% --";
        !            30: 
        !            31: 
        !            32: dspnote (io, note, notenum)
        !            33: struct io_f *io;
        !            34: struct note_f  *note;
        !            35: {
        !            36:     int     c,                                         /* character temp */
        !            37:             Rotate;                                    /* whether rotated */
        !            38:     long    where;                                     /* for seeking */
        !            39:     struct dsply_f  dispbuf;
        !            40:     long    pagecnt[PAGESAV + 1];
        !            41:     int     pagesout;
        !            42: 
        !            43: 
        !            44:     Rotate = 0;                                                /* default non-rotated */
        !            45:     io -> nnotread++;                                  /* bump count of notes read */
        !            46:     pagesout = 0;
        !            47:     pagecnt[pagesout] = 0;
        !            48: 
        !            49:     if (note -> n_addr.addr == 0)
        !            50:        dispbuf.d_head.textlen = 0;                     /* empty text */
        !            51:     else
        !            52:     {
        !            53:        x (lseek (io -> fidtxt, note -> n_addr.addr, 0) != note -> n_addr.addr,
        !            54:                "dsply: bad note seek");
        !            55:        dispbuf.d_head = note -> n_addr;                /* get header info */
        !            56:     }
        !            57: 
        !            58:     dispbuf.outcount = dispbuf.optr = dispbuf.olim = 0;        /* fix buffer */
        !            59:     do                                                 /* always show the first page */
        !            60:                                                        /* display loop */
        !            61:     {
        !            62:        erase ();                                       /* write header crap */
        !            63:        at (1, 1);
        !            64:        if (notenum != 0)
        !            65:        {
        !            66:            if (dispbuf.outcount)                       /* nth page */
        !            67:                printf ("[Continued] ");
        !            68:            printf ("Note %d", notenum);
        !            69:        }
        !            70:        center (io -> descr.d_title, NNLEN, 1, 40 - NNLEN / 2);
        !            71:        if (note -> n_nresp > 0)
        !            72:        {
        !            73:            at (1, 67);
        !            74:            printf ("%d response", note -> n_nresp);
        !            75:            if (note -> n_nresp > 1)
        !            76:                printf ("s");
        !            77:        }
        !            78:        at (2, 1);
        !            79:        printf ("%s", note -> n_auth.aname);
        !            80:        center (note -> ntitle, TITLEN, 2, 40 - TITLEN / 2);
        !            81:        at (2, 59);
        !            82:        prdate (&note -> n_date);
        !            83:        if (strcmp (Authsystem, note -> n_auth.asystem) && strcmp (Anon, note -> n_auth.aname))
        !            84:        {
        !            85:            at (3, 1);
        !            86:            printf ("(at %s)", note -> n_auth.asystem); /* print system name if not local */
        !            87:        }
        !            88:        if (note -> n_stat & DIRMES)
        !            89:            center (io -> descr.d_drmes, DMLEN, 3, 40 - DMLEN / 2);
        !            90:        else
        !            91:            if (note -> n_stat & ORPHND)
        !            92:            {
        !            93:                at (3, 29);
        !            94:                printf ("-- (Foster Parent) --");
        !            95:            }
        !            96:            else
        !            97:                if (note -> n_stat & WRITONLY)
        !            98:                {
        !            99:                    at (3, 31);
        !           100:                    printf ("-- (Write Only) --");
        !           101:                }
        !           102:        if (note -> n_stat & FRMNEWS)
        !           103:        {
        !           104:            at (3, 59);
        !           105:            printf ("%s", Fromnews);
        !           106:        }
        !           107:        if (dispbuf.d_head.textlen == 0)
        !           108:        {
        !           109:            c = (-1);
        !           110:            break;                                      /* header is it for empties */
        !           111:        }
        !           112:        at (4, 1);
        !           113:        putc ('\n', stdout);                            /* make sure soft-tabs work */
        !           114:        c = showit (io, &dispbuf, Rotate);
        !           115:        switch (c)
        !           116:        {
        !           117:            case ' ':                                   /* wants the next page */
        !           118:                if (pagesout < PAGESAV)
        !           119:                    pagecnt[++pagesout] = dispbuf.outcount;
        !           120:                                                        /* save new start */
        !           121:                break;
        !           122: 
        !           123:            case '-':                                   /* go back to previous */
        !           124:            case '\b':                                  /* backspace has same function */
        !           125:                if (pagesout-- == 0)
        !           126:                    return c;                           /* pass the buck */
        !           127:                goto replot;                            /* else fall into replot */
        !           128: 
        !           129: #ifdef ROTATE
        !           130:            case 'R':                                   /* rot-13 the text */
        !           131:                Rotate = !Rotate;                       /* toggle */
        !           132:                                                        /* and fall into re-plot */
        !           133: #endif ROTATE
        !           134:        replot:                                         /* nasty goto label */
        !           135:            case 'r': 
        !           136:            case '\014':                                /* control-L too */
        !           137:                dispbuf.optr = dispbuf.olim = 0;
        !           138:                dispbuf.outcount = pagecnt[pagesout];
        !           139:                where = dispbuf.d_head.addr + dispbuf.outcount;
        !           140:                x (lseek (io -> fidtxt, where, 0) < 0, "dspnote: bad seek");
        !           141:                break;                                  /* are all set now */
        !           142: 
        !           143: 
        !           144:            default:                                    /* pass the buck */
        !           145:                return c;
        !           146:        }
        !           147:     } while (dispbuf.outcount < dispbuf.d_head.textlen);
        !           148: 
        !           149:     return c;                                          /* didn't field a command */
        !           150: }
        !           151: 
        !           152: /*
        !           153:  *     Code to print the header and manage the paging of a response
        !           154:  *     It calls the "showit" routine to print pages of text
        !           155:  */
        !           156: 
        !           157: dspresp (io, note, resp, phys, logical, notenum)
        !           158: struct io_f *io;
        !           159: struct note_f  *note;
        !           160: struct resp_f  *resp;
        !           161: {
        !           162:     int     c;
        !           163:     int     Rotate;                                    /* whether rotated */
        !           164:     struct dsply_f  dispbuf;
        !           165: 
        !           166:     long    where,
        !           167:             pagecnt[PAGESAV + 1];                      /* stack for backing up */
        !           168:     int     pagesout;
        !           169: 
        !           170:     Rotate = 0;                                                /* default non-rotated */
        !           171:     io -> nrspread++;                                  /* bump count or responses read */
        !           172:     pagesout = 0;
        !           173:     pagecnt[pagesout] = 0;
        !           174: 
        !           175: 
        !           176:     if (resp -> r_addr[phys].addr == 0)
        !           177:        dispbuf.d_head.textlen = 0;                     /* so can get a header */
        !           178:     else
        !           179:     {
        !           180:        x (lseek (io -> fidtxt, resp -> r_addr[phys].addr, 0) != resp -> r_addr[phys].addr,
        !           181:                "dspresp: bad resp seek");
        !           182:        dispbuf.d_head = resp -> r_addr[phys];          /* get header info */
        !           183:     }
        !           184: 
        !           185:     dispbuf.outcount = dispbuf.optr = dispbuf.olim = 0;        /* fix buffer */
        !           186:     do                                                 /* always make 1 pass */
        !           187:     {
        !           188:        erase ();                                       /* paint the header */
        !           189:        at (1, 1);
        !           190:        if (dispbuf.outcount)                           /* nth page */
        !           191:            printf ("[Continued] ");
        !           192:        printf ("Note %d", notenum);
        !           193:        center (io -> descr.d_title, NNLEN, 1, 40 - NNLEN / 2);
        !           194:        at (2, 1);
        !           195:        printf ("%s", resp -> r_auth[phys].aname);
        !           196:        at (2, 31);
        !           197:        printf ("Response %2d of %2d", logical, note -> n_nresp);
        !           198:        at (2, 59);
        !           199:        prdate (&resp -> r_when[phys]);
        !           200:        if (strcmp (Authsystem, resp -> r_auth[phys].asystem) != 0 && strcmp (Anon, resp -> r_auth[phys].aname) != 0)
        !           201:        {
        !           202:            at (3, 1);
        !           203:            printf ("(at %s)", resp -> r_auth[phys].asystem);/* print sys name if not here */
        !           204:        }
        !           205:        if (resp -> r_stat[phys] & DIRMES)
        !           206:            center (io -> descr.d_drmes, DMLEN, 3, 40 - DMLEN / 2);
        !           207:        if (resp -> r_stat[phys] & FRMNEWS)
        !           208:        {
        !           209:            at (3, 59);
        !           210:            printf ("%s", Fromnews);
        !           211:        }
        !           212:        if (dispbuf.d_head.textlen == 0)
        !           213:        {
        !           214:            c = (-1);
        !           215:            break;                                      /* header is all for empties */
        !           216:        }
        !           217:        at (4, 1);
        !           218:        putc ('\n', stdout);                            /* make sure soft-tabs work */
        !           219:        c = showit (io, &dispbuf, Rotate);
        !           220:        switch (c)
        !           221:        {
        !           222:            case ' ':                                   /* wants the next page */
        !           223:                if (pagesout < PAGESAV)
        !           224:                    pagecnt[++pagesout] = dispbuf.outcount;
        !           225:                                                        /* save new start */
        !           226:                break;
        !           227: 
        !           228:            case '-':                                   /* go back to previous */
        !           229:            case '\b':                                  /* backspace does the same thing */
        !           230:                if (pagesout-- == 0)
        !           231:                    return c;                           /* pass the buck */
        !           232:                goto replot;                            /* else fall into replot */
        !           233: 
        !           234: #ifdef ROTATE
        !           235:            case 'R':                                   /* rot-13 the text */
        !           236:                Rotate = !Rotate;                       /* toggle */
        !           237:                                                        /* and fall into re-plot */
        !           238: #endif ROTATE
        !           239:        replot:                                         /* nasty goto label */
        !           240:            case 'r': 
        !           241:            case '\014':                                /* control-L too */
        !           242:                dispbuf.optr = dispbuf.olim = 0;
        !           243:                dispbuf.outcount = pagecnt[pagesout];
        !           244:                where = dispbuf.d_head.addr + dispbuf.outcount;
        !           245:                x (lseek (io -> fidtxt, where, 0) < 0, "dspnote: bad seek");
        !           246:                break;                                  /* are all set now */
        !           247: 
        !           248: 
        !           249:            default:                                    /* pass the buck */
        !           250:                return c;
        !           251:        }
        !           252:     } while (dispbuf.outcount < dispbuf.d_head.textlen);
        !           253: 
        !           254:     return c;                                          /* didn't field a command */
        !           255: }
        !           256: /*
        !           257:  *     showit
        !           258:  *
        !           259:  *     accepts a pointer to a dsply_f and dumps text until runs out
        !           260:  *     or the screen is filled.
        !           261:  *     Counts things like lines, columns, and also prints a "more" line
        !           262:  *
        !           263:  *     Ray Essick      June 15, 1982
        !           264:  */
        !           265: 
        !           266: showit (io, dbuf, Rotate)
        !           267: struct io_f *io;
        !           268: struct dsply_f *dbuf;
        !           269: int     Rotate;
        !           270: {
        !           271:     int     lines,
        !           272:             wides;                                     /* screen fill stuff */
        !           273:     int     c;
        !           274: 
        !           275:     lines = 4;                                         /* header eats 4 */
        !           276:     wides = 0;                                         /* start in col 1 */
        !           277:     while (lines < nrows - 1 && dbuf -> outcount < dbuf -> d_head.textlen)
        !           278:     {
        !           279:        if (intflag)                                    /* user abort? */
        !           280:        {
        !           281:            intflag = 0;
        !           282:            return (-1);                                /* back to key processing */
        !           283:        }
        !           284:        if (dbuf -> optr == dbuf -> olim)               /* buffer is empty */
        !           285:        {
        !           286:            x ((dbuf -> olim = read (io -> fidtxt, dbuf -> d_buf.txtbuf, BUFSIZE)) < 0, "dspnote: text read");
        !           287:            dbuf -> optr = 0;
        !           288:        }
        !           289: #ifdef ROTATE
        !           290:        if (Rotate)
        !           291:        {
        !           292:            register char   cc;
        !           293:            cc = dbuf -> d_buf.txtbuf[dbuf -> optr];
        !           294:            if ((cc >= 'a' && cc <= 'm') || (cc >= 'A' && cc <= 'M'))
        !           295:                cc += ROTATE;
        !           296:            else
        !           297:                if ((cc >= 'n' && cc <= 'z') || (cc >= 'N' && cc <= 'Z'))
        !           298:                    cc -= ROTATE;
        !           299:            putc (cc, stdout);
        !           300:        }
        !           301:        else
        !           302: #endif ROTATE
        !           303:        {
        !           304:            putc (dbuf -> d_buf.txtbuf[dbuf -> optr], stdout);
        !           305:        }
        !           306:                                                        /* show the character */
        !           307:        dbuf -> outcount++;
        !           308:        switch (dbuf -> d_buf.txtbuf[dbuf -> optr++])   /* some special chars */
        !           309:        {
        !           310:            case '\n':                                  /* next line */
        !           311:                if (isinput ())                         /* PLATO-brand erase-abort */
        !           312:                    goto exisho;
        !           313:                wides = 0;
        !           314:                lines++;
        !           315:                break;
        !           316: 
        !           317:            case '\014':                                /* force next page */
        !           318:                lines = nrows;                          /* forces loop exit */
        !           319:                break;
        !           320: 
        !           321:            case '\t':                                  /* almost forgot tabs */
        !           322:                wides += (8 - (wides % 8));             /* tab stops */
        !           323:                break;
        !           324: 
        !           325:            case '\b':                                  /* perverts using backspaces */
        !           326:                wides--;
        !           327:                break;
        !           328: 
        !           329:            default:                                    /* dull characters */
        !           330:                wides++;
        !           331:                break;
        !           332:        }
        !           333:        if (wides >= ncols)                             /* test line overflow */
        !           334:        {
        !           335:            lines++;
        !           336:            wides = 0;
        !           337:        }
        !           338:     }
        !           339: exisho:                                                /* typeahead exit */
        !           340:     if (dbuf -> outcount < dbuf -> d_head.textlen)
        !           341:     {
        !           342:        at (0, 60);
        !           343:        printf (Continued,
        !           344:                (int) (dbuf -> outcount * 100L / (long) dbuf -> d_head.textlen));
        !           345:     }
        !           346:     at (0, 1);                                         /* grab command */
        !           347: #ifdef PROMPT
        !           348:     printf ("%s", PROMPT);
        !           349: #endif
        !           350:     c = gchar ();                                      /* grab command */
        !           351:     printf ("\b \b");
        !           352:     return c;                                          /* so let caller handle it */
        !           353: }

unix.superglobalmegacorp.com

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