home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part10 / sw.c < prev   
C/C++ Source or Header  |  1991-08-22  |  12KB  |  581 lines

  1. /* $Header: sw.c,v 4.3.3.2 91/01/16 03:37:38 davison Trn $
  2.  *
  3.  * $Log:    sw.c,v $
  4.  * Revision 4.3.3.2  91/01/16  03:37:38  davison
  5.  * Integrated rn patches 48-54.
  6.  * 
  7.  * Revision 4.3.3.1  90/06/20  22:40:11  davison
  8.  * Initial Trn Release
  9.  * 
  10.  * Revision 4.3.2.4  90/11/22  16:09:19  sob
  11.  * Added changes to accomodate pickly C preprocessors
  12.  * 
  13.  * Revision 4.3.2.3  90/05/08  22:06:00  sob
  14.  * Added quick startup (-q) flag.
  15.  * 
  16.  * Revision 4.3.2.2  90/03/22  23:05:34  sob
  17.  * Fixes provided by Wayne Davison <drivax!davison>
  18.  * 
  19.  * Revision 4.3.2.1  89/12/09  00:52:40  sob
  20.  * Now handles SIGWINCH correctly.
  21.  * 
  22.  * Revision 4.3.1.2  85/05/21  13:36:23  lwall
  23.  * Sped up "rn -c" by not doing unnecessary initialization.
  24.  * 
  25.  * Revision 4.3.1.1  85/05/10  11:40:38  lwall
  26.  * Branch for patches.
  27.  * 
  28.  * Revision 4.3  85/05/01  11:50:54  lwall
  29.  * Baseline for release with 4.3bsd.
  30.  * 
  31.  */
  32.  
  33. #include "EXTERN.h"
  34. #include "common.h"
  35. #include "util.h"
  36. #include "head.h"
  37. #include "only.h"
  38. #include "term.h"
  39. #include "ng.h"
  40. #include "intrp.h"
  41. #include "INTERN.h"
  42. #include "sw.h"
  43.  
  44. void
  45. sw_init(argc,argv,tcbufptr)
  46. int argc;
  47. char *argv[];
  48. char **tcbufptr;
  49. {
  50.     register int i;
  51.  
  52.     if (argc >= 2 && strEQ(argv[1],"-c"))
  53.     checkflag=TRUE;            /* so we can optimize for -c */
  54.     interp(*tcbufptr,1024,GLOBINIT);
  55.     sw_file(tcbufptr,FALSE);
  56.     safecpy(*tcbufptr,getenv("RNINIT"),1024);
  57.     if (**tcbufptr) {
  58.     if (**tcbufptr == '/') {
  59.         sw_file(tcbufptr,TRUE);
  60.     }
  61.     else
  62.         sw_list(*tcbufptr);
  63.     }
  64.  
  65.     for (i = 1; i < argc; i++)
  66.     decode_switch(argv[i]);
  67. }
  68.  
  69. void
  70. sw_file(tcbufptr,bleat)
  71. char **tcbufptr;
  72. bool bleat;
  73. {
  74.     int initfd = open(*tcbufptr,0);
  75.     
  76.     if (initfd >= 0) {
  77.     fstat(initfd,&filestat);
  78.     if (filestat.st_size > 1024)
  79.         *tcbufptr = saferealloc(*tcbufptr,(MEM_SIZE)filestat.st_size);
  80.     if (filestat.st_size) {
  81.         read(initfd,*tcbufptr,(int)filestat.st_size);
  82.         (*tcbufptr)[filestat.st_size-1] = '\0';
  83.                 /* wipe out last newline */
  84.         sw_list(*tcbufptr);
  85.     }
  86.     else
  87.         **tcbufptr = '\0';
  88.     close(initfd);
  89.     }
  90.     else {
  91.     if (bleat)
  92.         printf(cantopen,*tcbufptr) FLUSH;
  93.     **tcbufptr = '\0';
  94.     }
  95. }
  96.  
  97. /* decode a list of space separated switches */
  98.  
  99. void
  100. sw_list(swlist)
  101. char *swlist;
  102. {
  103.     char *tmplist = safemalloc((MEM_SIZE) strlen(swlist) + 2);
  104.                     /* semi-automatic string */
  105.     register char *p, inquote = 0;
  106.  
  107.     strcpy(tmplist,swlist);
  108.     for (p=tmplist; isspace(*p); p++) ;    /* skip any initial spaces */
  109.     while (*p) {            /* "String, or nothing" */
  110.     if (!inquote && isspace(*p)) {    /* word delimiter? */
  111.         *p++ = '\0';        /* chop here */
  112.         while (isspace(*p))        /* these will be ignored later */
  113.         p++;
  114.     }
  115.     else if (inquote == *p) {
  116.         strcpy(p,p+1);        /* delete trailing quote */
  117.         inquote = 0;        /* no longer quoting */
  118.     }
  119.     else if (!inquote && *p == '"' || *p == '\'') {
  120.                     /* OK, I know when I am not wanted */
  121.         inquote = *p;        /* remember single or double */
  122.         strcpy(p,p+1);        /* delete the quote */
  123.     }                /* (crude, but effective) */
  124.     else if (*p == '\\') {        /* quoted something? */
  125.         if (p[1] == '\n')        /* newline? */
  126.         strcpy(p,p+2);        /* "I didn't see anything" */
  127.         else {
  128.         strcpy(p,p+1);        /* delete the backwhack */
  129.         p++;            /* leave the whatever alone */
  130.         }
  131.     }
  132.     else
  133.         p++;            /* normal char, leave it alone */
  134.     }
  135.     *++p = '\0';            /* put an extra null on the end */
  136.     if (inquote)
  137.     printf("Unmatched %c in switch\n",inquote) FLUSH;
  138.     for (p = tmplist; *p; /* p += strlen(p)+1 */ ) {
  139.     decode_switch(p);
  140.     while (*p++) ;            /* point at null + 1 */
  141.     }
  142.     free(tmplist);            /* this oughta be in Ada */
  143. }
  144.  
  145. /* decode a single switch */
  146.  
  147. void
  148. decode_switch(s)
  149. register char *s;
  150. {
  151.     while (isspace(*s))            /* ignore leading spaces */
  152.     s++;
  153. #ifdef DEBUGGING
  154.     if (debug)
  155.     printf("Switch: %s\n",s) FLUSH;
  156. #endif
  157.     if (*s != '-' && *s != '+') {    /* newsgroup pattern */
  158.     setngtodo(s);
  159.     }
  160.     else {                /* normal switch */
  161.     bool upordown = *s == '-' ? TRUE : FALSE;
  162.     char tmpbuf[LBUFLEN];
  163.  
  164.     s++;
  165.     switch (*s) {
  166. #ifdef TERMMOD
  167.     case '=': {
  168.         char *beg = s+1;
  169.  
  170.         while (*s && *s != '-' && *s != '+') s++;
  171.         cpytill(tmpbuf,beg,*s);
  172.         if (upordown ? strEQ(getenv("TERM"),tmpbuf)
  173.                  : strNE(getenv("TERM"),tmpbuf) ) {
  174.         decode_switch(s);
  175.         }
  176.         break;
  177.     }
  178. #endif
  179. #ifdef BAUDMOD
  180.     case '0': case '1': case '2': case '3': case '4':
  181.     case '5': case '6': case '7': case '8': case '9':
  182.         if (upordown ? (just_a_sec*10 <= atoi(s))
  183.                  : (just_a_sec*10 >= atoi(s)) ) {
  184.         while (isdigit(*s)) s++;
  185.         decode_switch(s);
  186.         }
  187.         break;
  188. #endif
  189.     case '/':
  190.         if (checkflag)
  191.         break;
  192. #ifdef SETENV
  193.         setenv("SAVEDIR",  upordown ? "%p/%c" : "%p" );
  194.         setenv("SAVENAME", upordown ? "%a"    : "%^C");
  195. #else
  196.         notincl("-/");
  197. #endif
  198.         break;
  199.     case 'c':
  200.         checkflag = upordown;
  201.         break;
  202.     case 'C':
  203.         s++;
  204.         if (*s == '=') s++;
  205.         docheckwhen = atoi(s);
  206.         break;
  207.     case 'd': {
  208.         if (checkflag)
  209.         break;
  210.         s++;
  211.         if (*s == '=') s++;
  212.         if (cwd) {
  213.         chdir(cwd);
  214.         free(cwd);
  215.         }
  216.         cwd = savestr(s);
  217.         break;
  218.     }
  219. #ifdef DEBUGGING
  220.     case 'D':
  221.         s++;
  222.         if (*s == '=') s++;
  223.         if (*s)
  224.         if (upordown)
  225.             debug |= atoi(s);
  226.         else
  227.             debug &= ~atoi(s);
  228.         else
  229.         if (upordown)
  230.             debug |= 1;
  231.         else
  232.             debug = 0;
  233.         break;
  234. #endif
  235.     case 'e':
  236.         erase_screen = upordown;
  237.         break;
  238.     case 'E':
  239. #ifdef SETENV
  240.         s++;
  241.         if (*s == '=')
  242.         s++;
  243.         strcpy(tmpbuf,s);
  244.         s = index(tmpbuf,'=');
  245.         if (s) {
  246.         *s++ = '\0';
  247.         setenv(tmpbuf,s);
  248.         }
  249.         else
  250.         setenv(tmpbuf,nullstr);
  251. #else
  252.         notincl("-E");
  253. #endif
  254.         break;
  255.     case 'F':
  256.         s++;
  257.         indstr = savestr(s);
  258.         break;
  259. #ifdef INNERSEARCH
  260.     case 'g':
  261.         gline = atoi(s+1)-1;
  262.         break;
  263. #endif
  264.     case 'H':
  265.     case 'h': {
  266.         register int len, i;
  267.         char *t;
  268.         int flag = (*s == 'h' ? HT_HIDE : HT_MAGIC);
  269.         
  270.         if (checkflag)
  271.         break;
  272.         s++;
  273.         len = strlen(s);
  274.         for (t=s; *t; t++)
  275.         if (isupper(*t))
  276.            *t = tolower(*t);
  277.         for (i=HEAD_FIRST; i<HEAD_LAST; i++)
  278.         if (!len || strnEQ(s,htype[i].ht_name,len))
  279.             if (upordown)
  280.             htype[i].ht_flags |= flag;
  281.             else
  282.             htype[i].ht_flags &= ~flag;
  283.         break;
  284.     }
  285.     case 'i':
  286.         s++;
  287.         if (*s == '=') s++;
  288.         initlines = atoi(s);
  289.         initlines_specified = TRUE;
  290.         break;
  291.     case 'l':
  292.         muck_up_clear = upordown;
  293.         break;
  294.     case 'L':
  295. #ifdef CLEAREOL
  296.         can_home_clear = upordown;
  297. #else
  298.         notincl("-L");
  299. #endif
  300.         break;
  301.     case 'M':
  302.         mbox_always = upordown;
  303.         break;
  304.     case 'm':
  305.         s++;
  306.         if (*s == '=') s++;
  307.         if (!upordown)
  308.         marking = NOMARKING;
  309.         else if (*s == 'u')
  310.         marking = UNDERLINE;
  311.         else {
  312.         marking = STANDOUT;
  313.         }
  314.         break;
  315.     case 'N':
  316.         norm_always = upordown;
  317.         break;
  318. #ifdef VERBOSE
  319.     case 'n':
  320.         fputs("This isn't readnews.  Don't use -n.\n\n",stdout) FLUSH;
  321.         break;
  322. #endif
  323.     case 'r':
  324.         findlast = upordown;
  325.         break;
  326.     case 's':
  327.         s++;
  328.         if (*s == '=') s++;
  329.         if (*s) {
  330.         countdown = atoi(s);
  331.         suppress_cn = FALSE;
  332.         }
  333.         else {
  334.         if (!upordown)
  335.             countdown = 5;
  336.         suppress_cn = upordown;
  337.         }
  338.         break;
  339.     case 'S':
  340. #ifdef ARTSEARCH
  341.         s++;
  342.         if (*s == '=') s++;
  343.         if (*s)
  344.         scanon = atoi(s);
  345.         else
  346.         scanon = upordown*3;
  347. #else
  348.         notincl("-S");
  349. #endif
  350.         break;
  351.     case 't':
  352. #ifdef VERBOSE
  353. #ifdef TERSE
  354.         verbose = !upordown;
  355. #else
  356.         notincl("+t");
  357. #endif
  358. #else
  359.         notincl("+t");
  360. #endif
  361.         break;
  362.     case 'T':
  363.         typeahead = upordown;
  364.         break;
  365.     case 'v':
  366. #ifdef VERIFY
  367.         verify = upordown;
  368. #else
  369.         notincl("-v");
  370. #endif
  371.         break;
  372.     case 'x':
  373. #ifdef USETHREADS
  374.         s++;
  375.         if (*s == '=') s++;
  376.         if (*s <= '9' && *s >= '0') {
  377.         if ((max_tree_lines = atoi(s)) > 11)
  378.             max_tree_lines = 11;
  379.         do {
  380.             s++;
  381.         } while (*s <= '9' && *s >= '0');
  382.         } else
  383.         max_tree_lines = upordown*6;
  384.         if (*s)
  385.         strncpy(select_order, s, 3);
  386.         if (mode == 'i')
  387.         use_threads = upordown;
  388.         else if (use_threads != upordown)
  389.         printf("You must exit and restart to turn threaded operation %s.\n\n",
  390.             upordown ? "on" : "off");
  391. #else
  392.         notincl("-x");
  393. #endif
  394.         break;
  395.     case 'X':
  396. #ifdef USETHREADS
  397.         s++;
  398.         if (*s == '=') s++;
  399.         if (*s <= '9' && *s >= '0') {
  400.         select_on = atoi(s);
  401.         do {
  402.             s++;
  403.         } while (*s <= '9' && *s >= '0');
  404.         } else
  405.         select_on = upordown;
  406.         if (*s)
  407.         end_select = *s++;
  408.         if (*s)
  409.         page_select = *s;
  410. #else
  411.         notincl("-X");
  412. #endif
  413.         break;
  414.     /*
  415.      * People want a way to avoid checking for new newsgroups on startup.
  416.      */
  417.     case 'q':
  418.         quickstart = upordown;
  419.         break;
  420.     default:
  421. #ifdef VERBOSE
  422.         IF(verbose)
  423.         printf("\nIgnoring unrecognized switch: -%c\n", *s) FLUSH;
  424.         ELSE
  425. #endif
  426. #ifdef TERSE
  427.         printf("\nIgnoring -%c\n", *s) FLUSH;
  428. #endif
  429.         break;
  430.     }
  431.     }
  432. }
  433.  
  434. /* print current switch values */
  435.  
  436. void
  437. pr_switches()
  438. {
  439.     static char mp[2] = {'+','-'};
  440.     register int i;
  441.     
  442.     fputs("\nCurrent switch settings:\n",stdout);
  443.     printf("%c/ ", mp[strEQ(getval("SAVEDIR",SAVEDIR),"%p/%c")]);
  444.     printf("%cc ", mp[checkflag]);
  445.     printf("-C%d ", docheckwhen);
  446.     printf("-d%s ", cwd);
  447. #ifdef DEBUGGING
  448.     if (debug)
  449.     printf("-D%d ", debug);
  450. #endif
  451.     printf("%ce ", mp[erase_screen]);
  452.     printf("-F\"%s\" ", indstr);
  453. #ifdef INNERSEARCH
  454.     printf("-g%d", gline);
  455. #endif
  456.     putchar('\n');
  457. #ifdef VERBOSE
  458.     if (verbose) {
  459.     for (i=HEAD_FIRST; i<HEAD_LAST; i++)
  460.         printf("%ch%s%c",
  461.         mp[htype[i].ht_flags & HT_HIDE], htype[i].ht_name,
  462.         (! (i % 5) ? '\n' : ' ') );
  463.     }
  464. #endif
  465.     printf("-i%d ", initlines);
  466.     printf("%cl ", mp[muck_up_clear]);
  467. #ifdef CLEAREOL
  468.     printf("%cL ", mp[can_home_clear]);
  469. #endif /* CLEAREOL */
  470.     if (marking)
  471.     printf("-m%c ",marking==UNDERLINE?'u':'s');
  472.     else
  473.     printf("+m ");
  474.     printf("%cM ", mp[mbox_always]);
  475.     printf("%cN ", mp[norm_always]);
  476.     printf("%cr ", mp[findlast]);
  477.     if (countdown)
  478.     printf("-s%d ", countdown);
  479.     else
  480.     printf("%cs ", mp[suppress_cn]);
  481. #ifdef ARTSEARCH
  482.     if (scanon)
  483.     printf("-S%d ",scanon);
  484.     else
  485.     printf("+S ");
  486. #endif
  487. #ifdef VERBOSE
  488. #ifdef TERSE
  489.     printf("%ct ", mp[!verbose]);
  490. #endif
  491. #endif
  492.     printf("%cT ", mp[typeahead]);
  493. #ifdef VERIFY
  494.     printf("%cv ", mp[verify]);
  495. #endif
  496. #ifdef USETHREADS
  497.     if (use_threads)
  498.     printf("-x%d%s ",max_tree_lines,select_order);
  499.     else
  500.     printf("+x ");
  501.     if (select_on)
  502.     printf("-X%d%c%c ",select_on,end_select,page_select);
  503.     else
  504.     printf("+X ");
  505. #endif
  506.     fputs("\n\n",stdout) FLUSH;
  507. #ifdef ONLY
  508.     if (maxngtodo) {
  509. #ifdef VERBOSE
  510.     IF(verbose)
  511.         fputs("Current restriction:",stdout);
  512.     ELSE
  513. #endif
  514. #ifdef TERSE
  515.         fputs("Only:",stdout);
  516. #endif
  517.     for (i=0; i<maxngtodo; i++)
  518.         printf(" %s",ngtodo[i]);
  519.     fputs("\n\n",stdout) FLUSH;
  520.     }
  521. #ifdef VERBOSE
  522.     else if (verbose)
  523.     fputs("No restriction.\n\n",stdout) FLUSH;
  524. #endif
  525. #endif
  526. }
  527.  
  528. void
  529. cwd_check()
  530. {
  531.     char tmpbuf[LBUFLEN];
  532.  
  533.     if (!cwd)
  534.     cwd = savestr(filexp("~/News"));
  535.     strcpy(tmpbuf,cwd);
  536.     if (chdir(cwd)) {
  537.     safecpy(tmpbuf,filexp(cwd),sizeof tmpbuf);
  538.     if (makedir(tmpbuf,MD_DIR) < 0 || chdir(tmpbuf) < 0) {
  539.         interp(cmd_buf, (sizeof cmd_buf), "%~/News");
  540.         if (makedir(cmd_buf,MD_DIR) < 0)
  541.         strcpy(tmpbuf,homedir);
  542.         else
  543.         strcpy(tmpbuf,cmd_buf);
  544.         chdir(tmpbuf);
  545. #ifdef VERBOSE
  546.         IF(verbose)
  547.         printf("\
  548. Cannot make directory %s--\n\
  549.     articles will be saved to %s\n\
  550. \n\
  551. ",cwd,tmpbuf) FLUSH;
  552.         ELSE
  553. #endif
  554. #ifdef TERSE
  555.         printf("\
  556. Can't make %s--\n\
  557.     using %s\n\
  558. \n\
  559. ",cwd,tmpbuf) FLUSH;
  560. #endif
  561.     }
  562.     }
  563.     free(cwd);
  564.     getwd(tmpbuf);
  565.     if (eaccess(tmpbuf,2)) {
  566. #ifdef VERBOSE
  567.     IF(verbose)
  568.         printf("\
  569. Current directory %s is not writeable--\n\
  570.     articles will be saved to home directory\n\n\
  571. ",tmpbuf) FLUSH;
  572.     ELSE
  573. #endif
  574. #ifdef TERSE
  575.         printf("%s not writeable--using ~\n\n",tmpbuf) FLUSH;
  576. #endif
  577.     strcpy(tmpbuf,homedir);
  578.     }
  579.     cwd = savestr(tmpbuf);
  580. }
  581.