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