Annotation of 43BSD/contrib/rn/ngstuff.c, revision 1.1.1.1

1.1       root        1: /* $Header: ngstuff.c,v 4.3.1.2 85/05/10 14:31:52 lwall Exp $
                      2:  *
                      3:  * $Log:       ngstuff.c,v $
                      4:  * Revision 4.3.1.2  85/05/10  14:31:52  lwall
                      5:  * Prevented "Junked" or "Marked unread" when no state change.
                      6:  * 
                      7:  * Revision 4.3.1.1  85/05/10  11:36:45  lwall
                      8:  * Branch for patches.
                      9:  * 
                     10:  * Revision 4.3  85/05/01  11:45:03  lwall
                     11:  * Baseline for release with 4.3bsd.
                     12:  * 
                     13:  */
                     14: 
                     15: #include "EXTERN.h"
                     16: #include "common.h"
                     17: #include "term.h"
                     18: #include "util.h"
                     19: #include "ng.h"
                     20: #include "bits.h"
                     21: #include "intrp.h"
                     22: #include "cheat.h"
                     23: #include "head.h"
                     24: #include "final.h"
                     25: #include "sw.h"
                     26: #include "INTERN.h"
                     27: #include "ngstuff.h"
                     28: 
                     29: void
                     30: ngstuff_init()
                     31: {
                     32:     ;
                     33: }
                     34: 
                     35: /* do a shell escape */
                     36: 
                     37: int
                     38: escapade()
                     39: {
                     40:     register char *s;
                     41:     bool interactive = (buf[1] == FINISHCMD);
                     42:     bool docd;
                     43:     char whereiam[256];
                     44: 
                     45:     if (!finish_command(interactive))  /* get remainder of command */
                     46:        return -1;
                     47:     s = buf+1;
                     48:     docd = *s != '!';
                     49:     if (!docd) {
                     50:        s++;
                     51:     }
                     52:     else {
                     53:        getwd(whereiam);
                     54:        if (chdir(cwd)) {
                     55:            printf(nocd,cwd) FLUSH;
                     56:            sig_catcher(0);
                     57:        }
                     58:     }
                     59:     while (*s == ' ') s++;
                     60:                                        /* skip leading spaces */
                     61:     interp(cmd_buf, (sizeof cmd_buf), s);/* interpret any % escapes */
                     62:     resetty();                         /* make sure tty is friendly */
                     63:     doshell(Nullch,cmd_buf);   /* invoke the shell */
                     64:     noecho();                          /* and make terminal */
                     65:     crmode();                          /*   unfriendly again */
                     66:     if (docd) {
                     67:        if (chdir(whereiam)) {
                     68:            printf(nocd,whereiam) FLUSH;
                     69:            sig_catcher(0);
                     70:        }
                     71:     }
                     72: #ifdef MAILCALL;
                     73:     mailcount = 0;                     /* force recheck */
                     74: #endif
                     75:     return 0;
                     76: }
                     77: 
                     78: /* process & command */
                     79: 
                     80: int
                     81: switcheroo()
                     82: {
                     83:     if (!finish_command(TRUE)) /* get rest of command */
                     84:        return -1;      /* if rubbed out, try something else */
                     85:     if (!buf[1])
                     86:        pr_switches();
                     87: #ifdef PUSHBACK
                     88:     else if (buf[1] == '&') {
                     89:        if (!buf[2]) {
                     90:            page_init();
                     91:            show_macros();
                     92:        }
                     93:        else {
                     94:            char tmpbuf[LBUFLEN];
                     95:            register char *s;
                     96: 
                     97:            for (s=buf+2; isspace(*s); s++);
                     98:            mac_line(s,tmpbuf,(sizeof tmpbuf));
                     99:        }
                    100:     }
                    101: #endif
                    102:     else {
                    103:        bool docd = (instr(buf,"-d") != Nullch);
                    104:        char whereami[256];
                    105:  
                    106:        if (docd)
                    107:            getwd(whereami);
                    108:        sw_list(buf+1);
                    109:        if (docd) {
                    110:            cwd_check();
                    111:            if (chdir(whereami)) {              /* -d does chdirs */
                    112:                printf(nocd,whereami) FLUSH;
                    113:                sig_catcher(0);
                    114:            }
                    115:        }
                    116:     }
                    117:     return 0;
                    118: }
                    119: 
                    120: /* process range commands */
                    121: 
                    122: int
                    123: numnum()
                    124: {
                    125:     ART_NUM min, max;
                    126:     char *cmdlst = Nullch;
                    127:     register char *s, *c;
                    128:     ART_NUM oldart = art;
                    129:     char tmpbuf[LBUFLEN];
                    130:     bool justone = TRUE;               /* assume only one article */
                    131: 
                    132:     if (!finish_command(TRUE)) /* get rest of command */
                    133:        return NN_INP;
                    134:        if (lastart < 1) {
                    135:            fputs("\nNo articles\n",stdout) FLUSH;
                    136:            return NN_ASK;
                    137:        }
                    138: #ifdef ARTSRCH
                    139:     if (srchahead)
                    140:        srchahead = -1;
                    141: #endif
                    142:     for (s=buf; *s && (isdigit(*s) || index(" ,-.$",*s)); s++)
                    143:        if (!isdigit(*s))
                    144:            justone = FALSE;
                    145:     if (*s) {
                    146:        cmdlst = savestr(s);
                    147:        justone = FALSE;
                    148:     }
                    149:     else if (!justone)
                    150:        cmdlst = savestr("m");
                    151:     *s++ = ',';
                    152:     *s = '\0';
                    153:     safecpy(tmpbuf,buf,LBUFLEN);
                    154:     for (s = tmpbuf; c = index(s,','); s = ++c) {
                    155:        *c = '\0';
                    156:        if (*s == '.')
                    157:            min = oldart;
                    158:        else
                    159:            min = atol(s);
                    160:        if (min<absfirst) {             /* make sure it is reasonable */
                    161:            min = absfirst;
                    162:            printf("(First article is %ld)\n",(long)absfirst) FLUSH;
                    163:            pad(just_a_sec/3);
                    164:        }
                    165:        if ((s=index(s,'-')) != Nullch) {
                    166:            s++;
                    167:            if (*s == '$')
                    168:                max = lastart;
                    169:            else if (*s == '.')
                    170:                max = oldart;
                    171:            else
                    172:                max = atol(s);
                    173:        }
                    174:        else
                    175:            max = min;
                    176:        if (max>lastart) {
                    177:            max = lastart;
                    178:            if (min > max)
                    179:                min = max;
                    180:            printf("(Last article is %ld)\n",(long)lastart) FLUSH;
                    181:            pad(just_a_sec/3);
                    182:        }
                    183:        if (max < min) {
                    184:            fputs("\nBad range\n",stdout) FLUSH;
                    185:            if (cmdlst)
                    186:                free(cmdlst);
                    187:            return NN_ASK;
                    188:        }
                    189:        if (justone) {
                    190:            art = min;
                    191:            return NN_REREAD;
                    192:        }
                    193:        check_first(min);
                    194:        for (art=min; art<=max; art++) {
                    195:            if (perform(cmdlst,TRUE)) {
                    196: #ifdef VERBOSE
                    197:                IF(verbose)
                    198:                    printf("\n(Interrupted at article %ld)\n",(long)art)
                    199:                      FLUSH;
                    200:                ELSE
                    201: #endif
                    202: #ifdef TERSE
                    203:                    printf("\n(Intr at %ld)\n",(long)art) FLUSH;
                    204: #endif
                    205:                if (cmdlst)
                    206:                    free(cmdlst);
                    207:                return NN_ASK;
                    208:            }
                    209:        }
                    210:     }
                    211:     art = oldart;
                    212:     if (cmdlst)
                    213:        free(cmdlst);
                    214:     return NN_NORM;
                    215: }
                    216: 
                    217: int
                    218: perform(cmdlst,toplevel)
                    219: register char *cmdlst;
                    220: int toplevel;
                    221: {
                    222:     register int ch;
                    223:     
                    224:     if (toplevel) {
                    225:        printf("%-6ld",art);
                    226:        fflush(stdout);
                    227:     }
                    228:     for (; ch = *cmdlst; cmdlst++) {
                    229:        if (isspace(ch) || ch == ':')
                    230:            continue;
                    231:        if (ch == 'j') {
                    232:            if (!was_read(art)) {
                    233:                mark_as_read(art);
                    234: #ifdef VERBOSE
                    235:                IF(verbose)
                    236:                    fputs("\tJunked",stdout);
                    237: #endif
                    238:            }
                    239:        }
                    240:        else if (ch == 'm') {
                    241:            if (was_read(art)) {
                    242:                unmark_as_read(art);
                    243: #ifdef VERBOSE
                    244:                IF(verbose)
                    245:                    fputs("\tMarked unread",stdout);
                    246: #endif
                    247:            }
                    248:        }
                    249:        else if (ch == 'M') {
                    250: #ifdef DELAYMARK
                    251:            delay_unmark(art);
                    252: #ifdef VERBOSE
                    253:                IF(verbose)
                    254:                    fputs("\tWill return",stdout);
                    255: #endif
                    256: #else
                    257:            notincl("M");
                    258:            return -1;
                    259: #endif
                    260:        }
                    261:        else if (ch == '=') {
                    262:            printf("\t%s",fetchsubj(art,FALSE,FALSE));
                    263: #ifdef VERBOSE
                    264:            IF(verbose)
                    265:                ;
                    266:            ELSE
                    267: #endif
                    268:                putchar('\n') FLUSH;            /* ghad! */
                    269:        }
                    270:        else if (ch == 'C') {
                    271: #ifdef ASYNC_PARSE
                    272:            printf("\t%sancelled",(cancel_article() ? "Not c" : "C"));
                    273: #else
                    274:            notincl("C");
                    275:            return -1;
                    276: #endif
                    277:        }
                    278:        else if (ch == '%') {
                    279: #ifdef ASYNC_PARSE
                    280:            char tmpbuf[512];
                    281: 
                    282:            cmdlst = dointerp(tmpbuf, (sizeof tmpbuf), cmdlst,":");
                    283:            if (*cmdlst != ':')
                    284:                --cmdlst;
                    285:            if (perform(tmpbuf,FALSE))
                    286:                return -1;
                    287: #else
                    288:            notincl("%");
                    289:            return -1;
                    290: #endif
                    291:        }
                    292:        else if (index("!&sSwW|",ch)) {
                    293:            cmdlst = cpytill(buf,cmdlst,':') - 1;
                    294:            /* we now have the command in buf */
                    295:            if (ch == '!') {
                    296:                escapade();
                    297: #ifdef VERBOSE
                    298:                IF(verbose)
                    299:                    fputs("\tShell escaped",stdout);
                    300: #endif
                    301:            }
                    302:            else if (ch == '&') {
                    303:                switcheroo();
                    304: #ifdef VERBOSE
                    305:                IF(verbose)
                    306:                    fputs("\tSwitched",stdout);
                    307: #endif
                    308:            }
                    309:            else {
                    310:                putchar('\t');
                    311:                save_article();
                    312:            }
                    313:        }
                    314:        else {
                    315:            printf("\t???%s\n",cmdlst);
                    316:            return -1;
                    317:        }
                    318: #ifdef VERBOSE
                    319:        fflush(stdout);
                    320: #endif
                    321:     }
                    322:     if (toplevel) {
                    323: #ifdef VERBOSE
                    324:        IF(verbose)
                    325:            putchar('\n') FLUSH;
                    326:        ELSE
                    327: #endif
                    328: #ifdef TERSE
                    329:            putchar(' ');
                    330: #endif
                    331:     }
                    332:     return 0;
                    333: }
                    334: 

unix.superglobalmegacorp.com

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