Annotation of 43BSD/contrib/rn/ngstuff.c, revision 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.