|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.