Annotation of 43BSD/contrib/rn/sw.c, revision 1.1

1.1     ! root        1: /* $Header: sw.c,v 4.3.1.2 85/05/21 13:36:23 lwall Exp $
        !             2:  *
        !             3:  * $Log:       sw.c,v $
        !             4:  * Revision 4.3.1.2  85/05/21  13:36:23  lwall
        !             5:  * Sped up "rn -c" by not doing unnecessary initialization.
        !             6:  * 
        !             7:  * Revision 4.3.1.1  85/05/10  11:40:38  lwall
        !             8:  * Branch for patches.
        !             9:  * 
        !            10:  * Revision 4.3  85/05/01  11:50:54  lwall
        !            11:  * Baseline for release with 4.3bsd.
        !            12:  * 
        !            13:  */
        !            14: 
        !            15: #include "EXTERN.h"
        !            16: #include "common.h"
        !            17: #include "util.h"
        !            18: #include "head.h"
        !            19: #include "only.h"
        !            20: #include "term.h"
        !            21: #include "ng.h"
        !            22: #include "intrp.h"
        !            23: #include "INTERN.h"
        !            24: #include "sw.h"
        !            25: 
        !            26: void
        !            27: sw_init(argc,argv,tcbufptr)
        !            28: int argc;
        !            29: char *argv[];
        !            30: char **tcbufptr;
        !            31: {
        !            32:     register int i;
        !            33: 
        !            34:     if (argc >= 2 && strEQ(argv[1],"-c"))
        !            35:        checkflag=TRUE;                 /* so we can optimize for -c */
        !            36:     interp(*tcbufptr,1024,GLOBINIT);
        !            37:     sw_file(tcbufptr,FALSE);
        !            38:     safecpy(*tcbufptr,getenv("RNINIT"),1024);
        !            39:     if (**tcbufptr) {
        !            40:        if (**tcbufptr == '/') {
        !            41:            sw_file(tcbufptr,TRUE);
        !            42:        }
        !            43:        else
        !            44:            sw_list(*tcbufptr);
        !            45:     }
        !            46: 
        !            47:     for (i = 1; i < argc; i++)
        !            48:        decode_switch(argv[i]);
        !            49: }
        !            50: 
        !            51: void
        !            52: sw_file(tcbufptr,bleat)
        !            53: char **tcbufptr;
        !            54: bool bleat;
        !            55: {
        !            56:     int initfd = open(*tcbufptr,0);
        !            57:        
        !            58:     if (initfd >= 0) {
        !            59:        fstat(initfd,&filestat);
        !            60:        if (filestat.st_size > 1024)
        !            61:            *tcbufptr = saferealloc(*tcbufptr,(MEM_SIZE)filestat.st_size);
        !            62:        if (filestat.st_size) {
        !            63:            read(initfd,*tcbufptr,(int)filestat.st_size);
        !            64:            (*tcbufptr)[filestat.st_size-1] = '\0';
        !            65:                                /* wipe out last newline */
        !            66:            sw_list(*tcbufptr);
        !            67:        }
        !            68:        else
        !            69:            **tcbufptr = '\0';
        !            70:        close(initfd);
        !            71:     }
        !            72:     else {
        !            73:        if (bleat)
        !            74:            printf(cantopen,*tcbufptr) FLUSH;
        !            75:        **tcbufptr = '\0';
        !            76:     }
        !            77: }
        !            78: 
        !            79: /* decode a list of space separated switches */
        !            80: 
        !            81: void
        !            82: sw_list(swlist)
        !            83: char *swlist;
        !            84: {
        !            85:     char *tmplist = safemalloc((MEM_SIZE) strlen(swlist) + 2);
        !            86:                                        /* semi-automatic string */
        !            87:     register char *p, inquote = 0;
        !            88: 
        !            89:     strcpy(tmplist,swlist);
        !            90:     for (p=tmplist; isspace(*p); p++) ;        /* skip any initial spaces */
        !            91:     while (*p) {                       /* "String, or nothing" */
        !            92:        if (!inquote && isspace(*p)) {  /* word delimiter? */
        !            93:            *p++ = '\0';                /* chop here */
        !            94:            while (isspace(*p))         /* these will be ignored later */
        !            95:                p++;
        !            96:        }
        !            97:        else if (inquote == *p) {
        !            98:            strcpy(p,p+1);              /* delete trailing quote */
        !            99:            inquote = 0;                /* no longer quoting */
        !           100:        }
        !           101:        else if (!inquote && *p == '"' || *p == '\'') {
        !           102:                                        /* OK, I know when I am not wanted */
        !           103:            inquote = *p;               /* remember single or double */
        !           104:            strcpy(p,p+1);              /* delete the quote */
        !           105:        }                               /* (crude, but effective) */
        !           106:        else if (*p == '\\') {          /* quoted something? */
        !           107:            if (p[1] == '\n')           /* newline? */
        !           108:                strcpy(p,p+2);          /* "I didn't see anything" */
        !           109:            else {
        !           110:                strcpy(p,p+1);          /* delete the backwhack */
        !           111:                p++;                    /* leave the whatever alone */
        !           112:            }
        !           113:        }
        !           114:        else
        !           115:            p++;                        /* normal char, leave it alone */
        !           116:     }
        !           117:     *++p = '\0';                       /* put an extra null on the end */
        !           118:     if (inquote)
        !           119:        printf("Unmatched %c in switch\n",inquote) FLUSH;
        !           120:     for (p = tmplist; *p; /* p += strlen(p)+1 */ ) {
        !           121:        decode_switch(p);
        !           122:        while (*p++) ;                  /* point at null + 1 */
        !           123:     }
        !           124:     free(tmplist);                     /* this oughta be in Ada */
        !           125: }
        !           126: 
        !           127: /* decode a single switch */
        !           128: 
        !           129: void
        !           130: decode_switch(s)
        !           131: register char *s;
        !           132: {
        !           133:     while (isspace(*s))                        /* ignore leading spaces */
        !           134:        s++;
        !           135: #ifdef DEBUGGING
        !           136:     if (debug)
        !           137:        printf("Switch: %s\n",s) FLUSH;
        !           138: #endif
        !           139:     if (*s != '-' && *s != '+') {      /* newsgroup pattern */
        !           140:        setngtodo(s);
        !           141:     }
        !           142:     else {                             /* normal switch */
        !           143:        bool upordown = *s == '-' ? TRUE : FALSE;
        !           144:        char tmpbuf[LBUFLEN];
        !           145: 
        !           146:        s++;
        !           147:        switch (*s) {
        !           148: #ifdef TERMMOD
        !           149:        case '=': {
        !           150:            char *beg = s+1;
        !           151: 
        !           152:            while (*s && *s != '-' && *s != '+') s++;
        !           153:            cpytill(tmpbuf,beg,*s);
        !           154:            if (upordown ? strEQ(getenv("TERM"),tmpbuf)
        !           155:                         : strNE(getenv("TERM"),tmpbuf) ) {
        !           156:                decode_switch(s);
        !           157:            }
        !           158:            break;
        !           159:        }
        !           160: #endif
        !           161: #ifdef BAUDMOD
        !           162:        case '0': case '1': case '2': case '3': case '4':
        !           163:        case '5': case '6': case '7': case '8': case '9':
        !           164:            if (upordown ? (just_a_sec*10 <= atoi(s))
        !           165:                         : (just_a_sec*10 >= atoi(s)) ) {
        !           166:                while (isdigit(*s)) s++;
        !           167:                decode_switch(s);
        !           168:            }
        !           169:            break;
        !           170: #endif
        !           171:        case '/':
        !           172:            if (checkflag)
        !           173:                break;
        !           174: #ifdef SETENV
        !           175:            setenv("SAVEDIR",  upordown ? "%p/%c" : "%p" );
        !           176:            setenv("SAVENAME", upordown ? "%a"    : "%^C");
        !           177: #else
        !           178:            notincl("-/");
        !           179: #endif
        !           180:            break;
        !           181:        case 'c':
        !           182:            checkflag = upordown;
        !           183:            break;
        !           184:        case 'C':
        !           185:            s++;
        !           186:            if (*s == '=') s++;
        !           187:            docheckwhen = atoi(s);
        !           188:            break;
        !           189:        case 'd': {
        !           190:            if (checkflag)
        !           191:                break;
        !           192:            s++;
        !           193:            if (*s == '=') s++;
        !           194:            if (cwd) {
        !           195:                chdir(cwd);
        !           196:                free(cwd);
        !           197:            }
        !           198:            cwd = savestr(s);
        !           199:            break;
        !           200:        }
        !           201: #ifdef DEBUGGING
        !           202:        case 'D':
        !           203:            s++;
        !           204:            if (*s == '=') s++;
        !           205:            if (*s)
        !           206:                if (upordown)
        !           207:                    debug |= atoi(s);
        !           208:                else
        !           209:                    debug &= ~atoi(s);
        !           210:            else
        !           211:                if (upordown)
        !           212:                    debug |= 1;
        !           213:                else
        !           214:                    debug = 0;
        !           215:            break;
        !           216: #endif
        !           217:        case 'e':
        !           218:            erase_screen = upordown;
        !           219:            break;
        !           220:        case 'E':
        !           221: #ifdef SETENV
        !           222:            s++;
        !           223:            if (*s == '=')
        !           224:                s++;
        !           225:            strcpy(tmpbuf,s);
        !           226:            s = index(tmpbuf,'=');
        !           227:            if (s) {
        !           228:                *s++ = '\0';
        !           229:                setenv(tmpbuf,s);
        !           230:            }
        !           231:            else
        !           232:                setenv(tmpbuf,nullstr);
        !           233: #else
        !           234:            notincl("-E");
        !           235: #endif
        !           236:            break;
        !           237:        case 'F':
        !           238:            s++;
        !           239:            indstr = savestr(s);
        !           240:            break;
        !           241: #ifdef INNERSEARCH
        !           242:        case 'g':
        !           243:            gline = atoi(s+1)-1;
        !           244:            break;
        !           245: #endif
        !           246:        case 'H':
        !           247:        case 'h': {
        !           248:            register int len, i;
        !           249:            char *t;
        !           250:            int flag = (*s == 'h' ? HT_HIDE : HT_MAGIC);
        !           251:            
        !           252:            if (checkflag)
        !           253:                break;
        !           254:            s++;
        !           255:            len = strlen(s);
        !           256:            for (t=s; *t; t++)
        !           257:                if (isupper(*t))
        !           258:                   *t = tolower(*t);
        !           259:            for (i=HEAD_FIRST; i<HEAD_LAST; i++)
        !           260:                if (!len || strnEQ(s,htype[i].ht_name,len))
        !           261:                    if (upordown)
        !           262:                        htype[i].ht_flags |= flag;
        !           263:                    else
        !           264:                        htype[i].ht_flags &= ~flag;
        !           265:            break;
        !           266:        }
        !           267:        case 'i':
        !           268:            s++;
        !           269:            if (*s == '=') s++;
        !           270:            initlines = atoi(s);
        !           271:            break;
        !           272:        case 'l':
        !           273:            muck_up_clear = upordown;
        !           274:            break;
        !           275:        case 'L':
        !           276: #ifdef CLEAREOL
        !           277:            can_home_clear = upordown;
        !           278: #else
        !           279:            notincl("-L");
        !           280: #endif
        !           281:            break;
        !           282:        case 'M':
        !           283:            mbox_always = upordown;
        !           284:            break;
        !           285:        case 'm':
        !           286:            s++;
        !           287:            if (*s == '=') s++;
        !           288:            if (!upordown)
        !           289:                marking = NOMARKING;
        !           290:            else if (*s == 'u')
        !           291:                marking = UNDERLINE;
        !           292:            else {
        !           293:                marking = STANDOUT;
        !           294:            }
        !           295:            break;
        !           296:        case 'N':
        !           297:            norm_always = upordown;
        !           298:            break;
        !           299: #ifdef VERBOSE
        !           300:        case 'n':
        !           301:            fputs("This isn't readnews.  Don't use -n.\n\n",stdout) FLUSH;
        !           302:            break;
        !           303: #endif
        !           304:        case 'r':
        !           305:            findlast = upordown;
        !           306:            break;
        !           307:        case 's':
        !           308:            s++;
        !           309:            if (*s == '=') s++;
        !           310:            if (*s) {
        !           311:                countdown = atoi(s);
        !           312:                suppress_cn = FALSE;
        !           313:            }
        !           314:            else {
        !           315:                if (!upordown)
        !           316:                    countdown = 5;
        !           317:                suppress_cn = upordown;
        !           318:            }
        !           319:            break;
        !           320:        case 'S':
        !           321: #ifdef ARTSEARCH
        !           322:            s++;
        !           323:            if (*s == '=') s++;
        !           324:            if (*s)
        !           325:                scanon = atoi(s);
        !           326:            else
        !           327:                scanon = upordown*3;
        !           328: #else
        !           329:            notincl("-S");
        !           330: #endif
        !           331:            break;
        !           332:        case 't':
        !           333: #ifdef VERBOSE
        !           334: #ifdef TERSE
        !           335:            verbose = !upordown;
        !           336: #else
        !           337:            notincl("+t");
        !           338: #endif
        !           339: #else
        !           340:            notincl("+t");
        !           341: #endif
        !           342:            break;
        !           343:        case 'T':
        !           344:            typeahead = upordown;
        !           345:            break;
        !           346:        case 'v':
        !           347: #ifdef VERIFY
        !           348:            verify = upordown;
        !           349: #else
        !           350:            notincl("-v");
        !           351: #endif
        !           352:            break;
        !           353:        default:
        !           354: #ifdef VERBOSE
        !           355:            IF(verbose)
        !           356:                printf("\nIgnoring unrecognized switch: -%c\n", *s) FLUSH;
        !           357:            ELSE
        !           358: #endif
        !           359: #ifdef TERSE
        !           360:                printf("\nIgnoring -%c\n", *s) FLUSH;
        !           361: #endif
        !           362:            break;
        !           363:        }
        !           364:     }
        !           365: }
        !           366: 
        !           367: /* print current switch values */
        !           368: 
        !           369: void
        !           370: pr_switches()
        !           371: {
        !           372:     static char mp[2] = {'+','-'};
        !           373:     register int i;
        !           374:     
        !           375:     fputs("\nCurrent switch settings:\n",stdout);
        !           376:     printf("%c/ ", mp[strEQ(getval("SAVEDIR",SAVEDIR),"%p/%c")]);
        !           377:     printf("%cc ", mp[checkflag]);
        !           378:     printf("-C%d ", docheckwhen);
        !           379:     printf("-d%s ", cwd);
        !           380: #ifdef DEBUGGING
        !           381:     if (debug)
        !           382:        printf("-D%d ", debug);
        !           383: #endif
        !           384:     printf("%ce ", mp[erase_screen]);
        !           385:     printf("-F\"%s\" ", indstr);
        !           386: #ifdef INNERSEARCH
        !           387:     printf("-g%d", gline);
        !           388: #endif
        !           389:     putchar('\n');
        !           390: #ifdef VERBOSE
        !           391:     if (verbose) {
        !           392:        for (i=HEAD_FIRST; i<HEAD_LAST; i++)
        !           393:            printf("%ch%s%c",
        !           394:                mp[htype[i].ht_flags & HT_HIDE], htype[i].ht_name,
        !           395:                (! (i % 5) ? '\n' : ' ') );
        !           396:     }
        !           397: #endif
        !           398:     printf("-i%d ", initlines);
        !           399:     printf("%cl ", mp[muck_up_clear]);
        !           400: #ifdef CLEAREOL
        !           401:     printf("%cL ", mp[can_home_clear]);
        !           402: #endif CLEAREOL
        !           403:     if (marking)
        !           404:        printf("-m%c ",marking==UNDERLINE?'u':'s');
        !           405:     else
        !           406:        printf("+m ");
        !           407:     printf("%cM ", mp[mbox_always]);
        !           408:     printf("%cN ", mp[norm_always]);
        !           409:     printf("%cr ", mp[findlast]);
        !           410:     if (countdown)
        !           411:        printf("-s%d ", countdown);
        !           412:     else
        !           413:        printf("%cs ", mp[suppress_cn]);
        !           414: #ifdef ARTSEARCH
        !           415:     if (scanon)
        !           416:        printf("-S%d ",scanon);
        !           417:     else
        !           418:        printf("+S ");
        !           419: #ifdef VERBOSE
        !           420: #ifdef TERSE
        !           421:     printf("%ct ", mp[!verbose]);
        !           422: #endif
        !           423: #endif
        !           424:     printf("%cT ", mp[typeahead]);
        !           425: #ifdef VERIFY
        !           426:     printf("%cv ", mp[verify]);
        !           427: #endif
        !           428: #endif
        !           429:     fputs("\n\n",stdout) FLUSH;
        !           430: #ifdef ONLY
        !           431:     if (maxngtodo) {
        !           432: #ifdef VERBOSE
        !           433:        IF(verbose)
        !           434:            fputs("Current restriction:",stdout);
        !           435:        ELSE
        !           436: #endif
        !           437: #ifdef TERSE
        !           438:            fputs("Only:",stdout);
        !           439: #endif
        !           440:        for (i=0; i<maxngtodo; i++)
        !           441:            printf(" %s",ngtodo[i]);
        !           442:        fputs("\n\n",stdout) FLUSH;
        !           443:     }
        !           444: #ifdef VERBOSE
        !           445:     else if (verbose)
        !           446:        fputs("No restriction.\n\n",stdout) FLUSH;
        !           447: #endif
        !           448: #endif
        !           449: }
        !           450: 
        !           451: void
        !           452: cwd_check()
        !           453: {
        !           454:     char tmpbuf[LBUFLEN];
        !           455: 
        !           456:     if (!cwd)
        !           457:        cwd = savestr(filexp("~/News"));
        !           458:     strcpy(tmpbuf,cwd);
        !           459:     if (chdir(cwd)) {
        !           460:        safecpy(tmpbuf,filexp(cwd),sizeof tmpbuf);
        !           461:        if (makedir(tmpbuf,MD_DIR) < 0 || chdir(tmpbuf) < 0) {
        !           462:            interp(cmd_buf, (sizeof cmd_buf), "%~/News");
        !           463:            if (makedir(cmd_buf,MD_DIR) < 0)
        !           464:                strcpy(tmpbuf,homedir);
        !           465:            else
        !           466:                strcpy(tmpbuf,cmd_buf);
        !           467:            chdir(tmpbuf);
        !           468: #ifdef VERBOSE
        !           469:            IF(verbose)
        !           470:                printf("\
        !           471: Cannot make directory %s--\n\
        !           472:        articles will be saved to %s\n\
        !           473: \n\
        !           474: ",cwd,tmpbuf) FLUSH;
        !           475:            ELSE
        !           476: #endif
        !           477: #ifdef TERSE
        !           478:                printf("\
        !           479: Can't make %s--\n\
        !           480:        using %s\n\
        !           481: \n\
        !           482: ",cwd,tmpbuf) FLUSH;
        !           483: #endif
        !           484:        }
        !           485:     }
        !           486:     free(cwd);
        !           487:     getwd(tmpbuf);
        !           488:     if (eaccess(tmpbuf,2)) {
        !           489: #ifdef VERBOSE
        !           490:        IF(verbose)
        !           491:            printf("\
        !           492: Current directory %s is not writeable--\n\
        !           493:        articles will be saved to home directory\n\n\
        !           494: ",tmpbuf) FLUSH;
        !           495:        ELSE
        !           496: #endif
        !           497: #ifdef TERSE
        !           498:            printf("%s not writeable--using ~\n\n",tmpbuf) FLUSH;
        !           499: #endif
        !           500:        strcpy(tmpbuf,homedir);
        !           501:     }
        !           502:     cwd = savestr(tmpbuf);
        !           503: }

unix.superglobalmegacorp.com

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