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