|
|
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.