Annotation of 40BSD/cmd/ucbmail/cmd1.c, revision 1.1

1.1     ! root        1: #
        !             2: #include "rcv.h"
        !             3: #include <sys/stat.h>
        !             4: 
        !             5: /*
        !             6:  * Mail -- a mail program
        !             7:  *
        !             8:  * User commands.
        !             9:  */
        !            10: 
        !            11: /*
        !            12:  * Print the current active headings.
        !            13:  */
        !            14: 
        !            15: static int screen;
        !            16: 
        !            17: headers(msgvec)
        !            18:        int *msgvec;
        !            19: {
        !            20:        register int n, mesg, flag;
        !            21:        register struct message *mp;
        !            22: 
        !            23:        n = msgvec[0];
        !            24:        if (n != 0)
        !            25:                screen = (n-1)/SCREEN;
        !            26:        if (screen < 0)
        !            27:                screen = 0;
        !            28:        mp = &message[screen * SCREEN];
        !            29:        if (mp >= &message[msgCount])
        !            30:                mp = &message[msgCount - SCREEN];
        !            31:        if (mp < &message[0])
        !            32:                mp = &message[0];
        !            33:        flag = 0;
        !            34:        mesg = mp - &message[0];
        !            35:        dot = mp;
        !            36:        for (; mp < &message[msgCount]; mp++) {
        !            37:                mesg++;
        !            38:                if (mp->m_flag & MDELETED)
        !            39:                        continue;
        !            40:                if (flag++ >= SCREEN)
        !            41:                        break;
        !            42:                printhead(mesg);
        !            43:                sreset();
        !            44:        }
        !            45:        if (flag == 0) {
        !            46:                printf("No more mail.\n");
        !            47:                return(1);
        !            48:        }
        !            49:        return(0);
        !            50: }
        !            51: 
        !            52: /*
        !            53:  * Scroll to the next/previous screen
        !            54:  */
        !            55: 
        !            56: scroll(arg)
        !            57:        char arg[];
        !            58: {
        !            59:        register int s;
        !            60:        int cur[1];
        !            61: 
        !            62:        cur[0] = 0;
        !            63:        s = screen;
        !            64:        switch (*arg) {
        !            65:        case 0:
        !            66:        case '+':
        !            67:                s++;
        !            68:                if (s*SCREEN > msgCount) {
        !            69:                        printf("On last screenful of messages\n");
        !            70:                        return(0);
        !            71:                }
        !            72:                screen = s;
        !            73:                break;
        !            74: 
        !            75:        case '-':
        !            76:                if (--s < 0) {
        !            77:                        printf("On first screenful of messages\n");
        !            78:                        return(0);
        !            79:                }
        !            80:                screen = s;
        !            81:                break;
        !            82: 
        !            83:        default:
        !            84:                printf("Unrecognized scrolling command \"%s\"\n", arg);
        !            85:                return(1);
        !            86:        }
        !            87:        return(headers(cur));
        !            88: }
        !            89: 
        !            90: 
        !            91: /*
        !            92:  * Print out the headlines for each message
        !            93:  * in the passed message list.
        !            94:  */
        !            95: 
        !            96: from(msgvec)
        !            97:        int *msgvec;
        !            98: {
        !            99:        register int *ip;
        !           100: 
        !           101:        for (ip = msgvec; *ip != NULL; ip++) {
        !           102:                printhead(*ip);
        !           103:                sreset();
        !           104:        }
        !           105:        if (--ip >= msgvec)
        !           106:                dot = &message[*ip - 1];
        !           107:        return(0);
        !           108: }
        !           109: 
        !           110: /*
        !           111:  * Print out the header of a specific message.
        !           112:  * This is a slight improvement to the standard one.
        !           113:  */
        !           114: 
        !           115: printhead(mesg)
        !           116: {
        !           117:        struct message *mp;
        !           118:        FILE *ibuf;
        !           119:        char headline[LINESIZE], wcount[10], *subjline, dispc;
        !           120:        char pbuf[BUFSIZ];
        !           121:        int s;
        !           122:        struct headline hl;
        !           123:        register char *cp;
        !           124: 
        !           125:        mp = &message[mesg-1];
        !           126:        ibuf = setinput(mp);
        !           127:        readline(ibuf, headline);
        !           128:        subjline = hfield("subject", mp);
        !           129:        if (subjline == NOSTR)
        !           130:                subjline = hfield("subj", mp);
        !           131: 
        !           132:        /*
        !           133:         * Bletch!
        !           134:         */
        !           135: 
        !           136:        if (subjline != NOSTR && strlen(subjline) > 28)
        !           137:                subjline[29] = '\0';
        !           138:        dispc = ' ';
        !           139:        if (mp->m_flag & MSAVED)
        !           140:                dispc = '*';
        !           141:        if (mp->m_flag & MPRESERVE)
        !           142:                dispc = 'P';
        !           143:        parse(headline, &hl, pbuf);
        !           144:        sprintf(wcount, " %d/%d", mp->m_lines, mp->m_size);
        !           145:        s = strlen(wcount);
        !           146:        cp = wcount + s;
        !           147:        while (s < 7)
        !           148:                s++, *cp++ = ' ';
        !           149:        *cp = '\0';
        !           150:        if (subjline != NOSTR)
        !           151:                printf("%c%3d %-8s %16.16s %s \"%s\"\n", dispc, mesg,
        !           152:                    nameof(mp), hl.l_date, wcount, subjline);
        !           153:        else
        !           154:                printf("%c%3d %-8s %16.16s %s\n", dispc, mesg,
        !           155:                    nameof(mp), hl.l_date, wcount);
        !           156: }
        !           157: 
        !           158: /*
        !           159:  * Print out the value of dot.
        !           160:  */
        !           161: 
        !           162: pdot()
        !           163: {
        !           164:        printf("%d\n", dot - &message[0] + 1);
        !           165:        return(0);
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Print out all the possible commands.
        !           170:  */
        !           171: 
        !           172: pcmdlist()
        !           173: {
        !           174:        register struct cmd *cp;
        !           175:        register int cc;
        !           176:        extern struct cmd cmdtab[];
        !           177: 
        !           178:        printf("Commands are:\n");
        !           179:        for (cc = 0, cp = cmdtab; cp->c_name != NULL; cp++) {
        !           180:                cc += strlen(cp->c_name) + 2;
        !           181:                if (cc > 72) {
        !           182:                        printf("\n");
        !           183:                        cc = strlen(cp->c_name) + 2;
        !           184:                }
        !           185:                if ((cp+1)->c_name != NOSTR)
        !           186:                        printf("%s, ", cp->c_name);
        !           187:                else
        !           188:                        printf("%s\n", cp->c_name);
        !           189:        }
        !           190:        return(0);
        !           191: }
        !           192: 
        !           193: /*
        !           194:  * Type out the messages requested.
        !           195:  */
        !           196: 
        !           197: type(msgvec)
        !           198:        int *msgvec;
        !           199: {
        !           200:        register *ip;
        !           201:        register struct message *mp;
        !           202:        register int mesg;
        !           203:        int c;
        !           204:        FILE *ibuf;
        !           205: 
        !           206:        for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
        !           207:                mesg = *ip;
        !           208:                touch(mesg);
        !           209:                mp = &message[mesg-1];
        !           210:                dot = mp;
        !           211:                print(mp);
        !           212:        }
        !           213:        return(0);
        !           214: }
        !           215: 
        !           216: /*
        !           217:  * Print the indicated message on standard output.
        !           218:  */
        !           219: 
        !           220: print(mp)
        !           221:        register struct message *mp;
        !           222: {
        !           223: 
        !           224:        if (value("quiet") == NOSTR)
        !           225:                printf("Message %2d:\n", mp - &message[0] + 1);
        !           226:        touch(mp - &message[0] + 1);
        !           227:        send(mp, stdout);
        !           228: }
        !           229: 
        !           230: /*
        !           231:  * Print the top so many lines of each desired message.
        !           232:  * The number of lines is taken from the variable "toplines"
        !           233:  * and defaults to 5.
        !           234:  */
        !           235: 
        !           236: top(msgvec)
        !           237:        int *msgvec;
        !           238: {
        !           239:        register int *ip;
        !           240:        register struct message *mp;
        !           241:        register int mesg;
        !           242:        int c, topl, lines, lineb;
        !           243:        char *valtop, linebuf[LINESIZE];
        !           244:        FILE *ibuf;
        !           245: 
        !           246:        topl = 5;
        !           247:        valtop = value("toplines");
        !           248:        if (valtop != NOSTR) {
        !           249:                topl = atoi(valtop);
        !           250:                if (topl < 0 || topl > 10000)
        !           251:                        topl = 5;
        !           252:        }
        !           253:        lineb = 1;
        !           254:        for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
        !           255:                mesg = *ip;
        !           256:                touch(mesg);
        !           257:                mp = &message[mesg-1];
        !           258:                dot = mp;
        !           259:                if (value("quiet") == NOSTR)
        !           260:                        printf("Message %2d:\n", mesg);
        !           261:                ibuf = setinput(mp);
        !           262:                c = mp->m_lines;
        !           263:                if (!lineb)
        !           264:                        printf("\n");
        !           265:                for (lines = 0; lines < c && lines <= topl; lines++) {
        !           266:                        if (readline(ibuf, linebuf) <= 0)
        !           267:                                break;
        !           268:                        puts(linebuf);
        !           269:                        lineb = blankline(linebuf);
        !           270:                }
        !           271:        }
        !           272:        return(0);
        !           273: }
        !           274: 
        !           275: /*
        !           276:  * Touch all the given messages so that they will
        !           277:  * get mboxed.
        !           278:  */
        !           279: 
        !           280: stouch(msgvec)
        !           281:        int msgvec[];
        !           282: {
        !           283:        register int *ip;
        !           284: 
        !           285:        for (ip = msgvec; *ip != 0; ip++) {
        !           286:                touch(*ip);
        !           287:                dot = &message[*ip-1];
        !           288:                dot->m_flag &= ~MPRESERVE;
        !           289:        }
        !           290:        return(0);
        !           291: }

unix.superglobalmegacorp.com

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