📄 ngstuff.c
字号:
/* $Id: ngstuff.c,v 3.0 1991/09/09 20:23:31 davison Trn $ *//* This software is Copyright 1991 by Stan Barber. * * Permission is hereby granted to copy, reproduce, redistribute or otherwise * use this software as long as: there is no monetary profit gained * specifically from the use or reproduction of this software, it is not * sold, rented, traded or otherwise marketed, and this copyright notice is * included prominently in any copy made. * * The author make no claims as to the fitness or correctness of this software * for any use whatsoever, and it is provided as is. Any use of this software * is at the user's own risk. */#include "EXTERN.h"#include "common.h"#include "term.h"#include "util.h"#include "cache.h"#include "bits.h"#include "ngdata.h"#include "ng.h"#include "intrp.h"#include "head.h"#include "final.h"#include "sw.h"#include "rthread.h"#include "rt-select.h"#include "rt-wumpus.h"#include "trn.h"#include "rcstuff.h"#include "respond.h"#include "kfile.h"#include "decode.h"#include "INTERN.h"#include "ngstuff.h"voidngstuff_init(){ ;}/* do a shell escape */intescapade(){ register char *s; bool interactive = (buf[1] == FINISHCMD); bool docd; char whereiam[512]; if (!finish_command(interactive)) /* get remainder of command */ return -1; s = buf+1; docd = *s != '!'; if (!docd) { s++; } else { getwd(whereiam); if (chdir(cwd)) { printf(nocd,cwd) FLUSH; sig_catcher(0); } } while (*s == ' ') s++; /* skip leading spaces */ interp(cmd_buf, (sizeof cmd_buf), s);/* interpret any % escapes */ resetty(); /* make sure tty is friendly */ doshell(Nullch,cmd_buf); /* invoke the shell */ noecho(); /* and make terminal */ crmode(); /* unfriendly again */ if (docd) { if (chdir(whereiam)) { printf(nocd,whereiam) FLUSH; sig_catcher(0); } }#ifdef MAILCALL mailcount = 0; /* force recheck */#endif return 0;}/* process & command */intswitcheroo(){ if (!finish_command(TRUE)) /* get rest of command */ return -1; /* if rubbed out, try something else */ if (!buf[1]) pr_switches(); else if (buf[1] == '&') { if (!buf[2]) { page_init(); show_macros(); } else { char tmpbuf[LBUFLEN]; register char *s; for (s=buf+2; isspace(*s); s++); mac_line(s,tmpbuf,(sizeof tmpbuf)); } } else { bool docd = (instr(buf,"-d", TRUE) != Nullch); char whereami[512]; if (docd) getwd(whereami); sw_list(buf+1); if (docd) { cwd_check(); if (chdir(whereami)) { /* -d does chdirs */ printf(nocd,whereami) FLUSH; sig_catcher(0); } } } return 0;}/* process range commands */intnumnum(){ ART_NUM min, max; char *cmdlst = Nullch; register char *s, *c; ART_NUM oldart = art; char tmpbuf[LBUFLEN]; bool justone = TRUE; /* assume only one article */ perform_cnt = 0; if (!finish_command(TRUE)) /* get rest of command */ return NN_INP; if (lastart < 1) { fputs("\nNo articles\n",stdout) FLUSH; return NN_ASK; }#ifdef ARTSRCH if (srchahead) srchahead = -1;#endif for (s=buf; *s && (isdigit(*s) || index(" ,-.$",*s)); s++) if (!isdigit(*s)) justone = FALSE; if (*s) { cmdlst = savestr(s); justone = FALSE; } else if (!justone) cmdlst = savestr("m"); *s++ = ','; *s = '\0'; safecpy(tmpbuf,buf,LBUFLEN); for (s = tmpbuf; c = index(s,','); s = ++c) { *c = '\0'; if (*s == '.') min = oldart; else min = atol(s); if (min < absfirst) { min = absfirst; printf("(First article is %ld)\n",(long)absfirst) FLUSH; pad(just_a_sec/3); } if ((s=index(s,'-')) != Nullch) { s++; if (*s == '$') max = lastart; else if (*s == '.') max = oldart; else max = atol(s); } else max = min; if (max>lastart) { max = lastart; if (min > max) min = max; printf("(Last article is %ld)\n",(long)lastart) FLUSH; pad(just_a_sec/3); } if (max < min) { fputs("\nBad range\n",stdout) FLUSH; if (cmdlst) free(cmdlst); return NN_ASK; } if (justone) { art = min; return NN_REREAD; } for (art=min, artp=article_ptr(min); art<=max; art++, artp++) { if (perform(cmdlst,TRUE)) {#ifdef VERBOSE IF(verbose) printf("\n(Interrupted at article %ld)\n",(long)art) FLUSH; ELSE#endif#ifdef TERSE printf("\n(Intr at %ld)\n",(long)art) FLUSH;#endif if (cmdlst) free(cmdlst); return NN_ASK; } } } art = oldart; if (cmdlst) free(cmdlst); return NN_NORM;}intuse_selected(){ register SUBJECT *sp; register ARTICLE *ap; bool want_read; char *cmdstr; int len, ret = 1; int subj_mask = (sel_mode == SM_THREAD? (SF_THREAD|SF_VISIT) : SF_VISIT); if (!finish_command(TRUE)) /* get rest of command */ return 0; if (!buf[1]) return -1; cmdstr = savestr(buf+1); want_read = (sel_rereading || *cmdstr =='m'); perform_cnt = 0; page_line = 1; len = strlen(cmdstr); /* A few commands can just loop through the subjects. */ if ((len == 1 && (*cmdstr == 't' || *cmdstr == 'J')) || (len == 2 && (((*cmdstr == '+' || *cmdstr == '-') && cmdstr[0] == cmdstr[1]) || *cmdstr == 'T'))) { for (sp = first_subject; sp; sp = sp->next) { if ((sp->flags & subj_mask) == subj_mask) { artp = first_art(sp); if (artp) { art = article_num(artp); if (perform(cmdstr, FALSE)) { fputs("\nInterrupted\n", stdout) FLUSH; goto break_out; } }#ifdef VERBOSE IF(verbose) if (mode != 't' && *cmdstr != 't' && *cmdstr != 'T') putchar('\n') FLUSH;#endif } } } else if (strEQ(cmdstr, "E")) { /* The 'E'nd-decode command doesn't do any looping at all. */ if (decode_fp) decode_end(); else ret = 2; } else { /* The rest loop through all (selected) articles. */ /* Use the explicit article-order if it exists */ if (artptr_list) { ARTICLE **app, **limit = artptr_list + article_count; for (app = artptr_list; app < limit; app++) if ((!((ap = *app)->flags & AF_READ) ^ want_read) && (ap->flags & sel_mask)) { art = article_num(ap); artp = ap; if (perform(cmdstr, TRUE)) { fputs("\nInterrupted\n", stdout) FLUSH; goto break_out; } } } else { for (sp = first_subject; sp; sp = sp->next) if ((sp->flags & subj_mask) == subj_mask) for (ap = first_art(sp); ap; ap = next_art(ap)) if ((!(ap->flags & AF_READ) ^ want_read) && (ap->flags & sel_mask)) { art = article_num(ap); artp = ap; if (perform(cmdstr, TRUE)) { fputs("\nInterrupted\n", stdout) FLUSH; goto break_out; } } } } break_out: free(cmdstr); return ret;}intperform(cmdlst,toplevel)register char *cmdlst;int toplevel;{ register int ch; bool saveit = FALSE; if (toplevel) { printf("%-6ld ",art); fflush(stdout); } perform_cnt++; for (; ch = *cmdlst; cmdlst++) { if (isspace(ch) || ch == ':') continue; if (ch == 'j' && !saveit) { if (!was_read(art)) { mark_as_read();#ifdef VERBOSE IF(verbose) fputs("\tJunked",stdout);#endif } if (sel_rereading) deselect_article(artp); } else if (ch == '+') { if (cmdlst[1] == '+') { if (sel_mode == SM_THREAD) select_thread(artp->subj->thread, saveit? AF_AUTOSELECTALL : 0); else select_subject(artp->subj, saveit? AF_AUTOSELECTALL : 0); cmdlst++; } else select_article(artp, (saveit? AF_AUTOSELECT : 0) | AF_ECHO); } else if (ch == '.') { select_subthread(artp, saveit? AF_AUTOSELECT : 0); } else if (ch == '-') { if (cmdlst[1] == '-') { if (sel_mode == SM_THREAD) deselect_thread(artp->subj->thread); else deselect_subject(artp->subj); cmdlst++; } else deselect_article(artp); } else if (ch == ',') { kill_subthread(artp, saveit? (KF_ALL|KF_KILLFILE) : KF_ALL); } else if (ch == 'J' || ch == 'j') { kill_thread(artp->subj->thread, saveit? (KF_ALL|KF_KILLFILE) : KF_ALL); } else if (ch == 't') { entire_tree(artp); } else if (ch == 'T') { saveit = TRUE; } else if (ch == 'm') { if (was_read(art)) { unmark_as_read();#ifdef VERBOSE IF(verbose) fputs("\tMarked unread",stdout);#endif } } else if (ch == 'M') { delay_unmark(artp); oneless(artp);#ifdef VERBOSE IF(verbose) fputs("\tWill return",stdout);#endif } else if (ch == '=') { printf("\t%s",fetchsubj(art,FALSE));#ifdef VERBOSE IF(verbose) ; ELSE#endif putchar('\n') FLUSH; /* ghad! */ } else if (ch == 'C') {#ifdef ASYNC_PARSE printf("\t%sancelled",(cancel_article() ? "Not c" : "C"));#else notincl("C"); return -1;#endif } else if (ch == '%') {#ifdef ASYNC_PARSE char tmpbuf[512]; if (one_command) interp(tmpbuf, (sizeof tmpbuf), cmdlst); else cmdlst = dointerp(tmpbuf, (sizeof tmpbuf), cmdlst, ":") - 1; perform_cnt--; if (perform(tmpbuf,FALSE)) return -1;#else notincl("%"); return -1;#endif } else if (index("!&sSwWe|",ch)) { if (one_command) strcpy(buf,cmdlst); else cmdlst = cpytill(buf,cmdlst,':') - 1; /* we now have the command in buf */ if (ch == '!') { escapade();#ifdef VERBOSE IF(verbose) fputs("\tShell escaped",stdout);#endif } else if (ch == '&') { switcheroo();#ifdef VERBOSE IF(verbose) if (buf[1] && buf[1] != '&') fputs("\tSwitched",stdout);#endif } else { putchar('\t'); save_article();#ifdef VERBOSE IF(verbose) ; ELSE#endif putchar('\n') FLUSH; } } else { printf("\t???%s\n",cmdlst); return -1; }#ifdef VERBOSE fflush(stdout);#endif if (one_command) break; } if (toplevel) {#ifdef VERBOSE IF(verbose) putchar('\n') FLUSH;#endif } if (int_count) { int_count = 0; return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -