home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume1 / rn / part07 < prev    next >
Internet Message Format  |  1986-11-30  |  63KB

  1. Date: Tue, 7 May 85 14:01:47 pdt
  2. From: allegra!sdcrdcf!RDCF.SDC.UUCP!lwall (Larry Wall)
  3. Newsgroups: mod.sources
  4. Subject: rn version 4.3 (kit 7 of 9)
  5. Reply-To: lwall@sdcrdcf.UUCP
  6. Organization: System Development Corporation R&D, Santa Monica
  7.  
  8. #! /bin/sh
  9.  
  10. # Make a new directory for the rn sources, cd to it, and run kits 1 thru 9 
  11. # through sh.  When all 9 kits have been run, read README.
  12.  
  13. echo "This is rn kit 7 (of 9).  If kit 7 is complete, the line"
  14. echo '"'"End of kit 7 (of 9)"'" will echo at the end.'
  15. echo ""
  16. export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
  17. echo Extracting term.h
  18. cat >term.h <<'!STUFFY!FUNK!'
  19. /* $Header: term.h,v 4.3 85/05/01 11:51:36 lwall Exp $
  20.  *
  21.  * $Log:    term.h,v $
  22.  * Revision 4.3  85/05/01  11:51:36  lwall
  23.  * Baseline for release with 4.3bsd.
  24.  * 
  25.  */
  26.  
  27. #ifdef PUSHBACK
  28. EXT char circlebuf[PUSHSIZE];
  29. EXT int nextin INIT(0);
  30. EXT int nextout INIT(0);
  31. #ifdef PENDING
  32. #ifdef FIONREAD
  33. EXT long iocount INIT(0);
  34. #ifndef lint
  35. #define input_pending() (nextin!=nextout || (ioctl(0, FIONREAD, &iocount),(int)iocount))
  36. #else
  37. #define input_pending() bizarre
  38. #endif lint
  39. #else FIONREAD
  40. int circfill();
  41. #ifndef lint
  42. #define input_pending() (nextin!=nextout || circfill())
  43. #else
  44. #define input_pending() bizarre
  45. #endif lint
  46. #endif FIONREAD
  47. #else PENDING
  48. #ifndef lint
  49. #define input_pending() (nextin!=nextout)
  50. #else
  51. #define input_pending() bizarre
  52. #endif lint
  53. #endif PENDING
  54. #else PUSHBACK
  55. #ifdef PENDING
  56. #ifdef FIONREAD    /* must have FIONREAD or O_NDELAY for input_pending() */
  57. #define read_tty(addr,size) read(0,addr,size)
  58. #ifndef lint
  59. #define input_pending() (ioctl(0, FIONREAD, &iocount),(int)iocount)
  60. #else
  61. #define input_pending() bizarre
  62. #endif lint
  63. EXT long iocount INIT(0);
  64.  
  65. #else FIONREAD
  66.  
  67. EXT int devtty INIT(0);
  68. EXT bool is_input INIT(FALSE);
  69. EXT char pending_ch INIT(0);
  70. #ifndef lint
  71. #define input_pending() (is_input || (is_input=read(devtty,&pending_ch,1)))
  72. #else
  73. #define input_pending() bizarre
  74. #endif lint
  75. #endif FIONREAD
  76. #else PENDING
  77. #define read_tty(addr,size) read(0,addr,size)
  78. #define input_pending() (FALSE)
  79. #endif PENDING
  80. #endif PUSHBACK
  81.  
  82. /* stuff wanted by terminal mode diddling routines */
  83.  
  84. #ifdef TERMIO
  85. EXT struct termio _tty, _oldtty;
  86. #else
  87. EXT struct sgttyb _tty;
  88. EXT int _res_flg INIT(0);
  89. #endif
  90.  
  91. EXT int _tty_ch INIT(2);
  92. EXT bool bizarre INIT(FALSE);            /* do we need to restore terminal? */
  93.  
  94. /* terminal mode diddling routines */
  95.  
  96. #ifdef TERMIO
  97.  
  98. #define crmode() ((bizarre=1),_tty.c_lflag &=~ICANON,_tty.c_cc[VMIN] = 1,ioctl(_tty_ch,TCSETAF,&_tty))
  99. #define nocrmode() ((bizarre=1),_tty.c_lflag |= ICANON,_tty.c_cc[VEOF] = CEOF,stty(_tty_ch,&_tty))
  100. #define echo()     ((bizarre=1),_tty.c_lflag |= ECHO, ioctl(_tty_ch, TCSETA, &_tty))
  101. #define noecho() ((bizarre=1),_tty.c_lflag &=~ECHO, ioctl(_tty_ch, TCSETA, &_tty))
  102. #define nl()     ((bizarre=1),_tty.c_iflag |= ICRNL,_tty.c_oflag |= ONLCR,ioctl(_tty_ch, TCSETAW, &_tty))
  103. #define nonl()     ((bizarre=1),_tty.c_iflag &=~ICRNL,_tty.c_oflag &=~ONLCR,ioctl(_tty_ch, TCSETAW, &_tty))
  104. #define    savetty() (ioctl(_tty_ch, TCGETA, &_oldtty),ioctl(_tty_ch, TCGETA, &_tty))
  105. #define    resetty() ((bizarre=0),ioctl(_tty_ch, TCSETAF, &_oldtty))
  106. #define unflush_output()
  107.  
  108. #else
  109.  
  110. #define raw()     ((bizarre=1),_tty.sg_flags|=RAW, stty(_tty_ch,&_tty))
  111. #define noraw()     ((bizarre=1),_tty.sg_flags&=~RAW,stty(_tty_ch,&_tty))
  112. #define crmode() ((bizarre=1),_tty.sg_flags |= CBREAK, stty(_tty_ch,&_tty))
  113. #define nocrmode() ((bizarre=1),_tty.sg_flags &= ~CBREAK,stty(_tty_ch,&_tty))
  114. #define echo()     ((bizarre=1),_tty.sg_flags |= ECHO, stty(_tty_ch, &_tty))
  115. #define noecho() ((bizarre=1),_tty.sg_flags &= ~ECHO, stty(_tty_ch, &_tty))
  116. #define nl()     ((bizarre=1),_tty.sg_flags |= CRMOD,stty(_tty_ch, &_tty))
  117. #define nonl()     ((bizarre=1),_tty.sg_flags &= ~CRMOD, stty(_tty_ch, &_tty))
  118. #define    savetty() (gtty(_tty_ch, &_tty), _res_flg = _tty.sg_flags)
  119. #define    resetty() ((bizarre=0),_tty.sg_flags = _res_flg, stty(_tty_ch, &_tty))
  120. #ifdef LFLUSHO
  121. #ifndef lint
  122. EXT int lflusho INIT(LFLUSHO);
  123. #else
  124. EXT long lflusho INIT(LFLUSHO);
  125. #endif lint
  126. #define unflush_output() (ioctl(_tty_ch,TIOCLBIC,&lflusho))
  127. #else
  128. #define unflush_output()
  129. #endif LFLUSHO
  130. #endif TERMIO
  131.  
  132. #ifdef TIOCSTI
  133. #ifdef lint
  134. #define forceme(c) ioctl(_tty_ch,TIOCSTI,Null(long*))    /* ghad! */
  135. #else
  136. #define forceme(c) ioctl(_tty_ch,TIOCSTI,c) /* pass character in " " */
  137. #endif lint
  138. #else
  139. #define forceme(c)
  140. #endif
  141.  
  142. /* termcap stuff */
  143.  
  144. /*
  145.  * NOTE: if you don't have termlib you'll either have to define these strings
  146.  *    and the tputs routine, or you'll have to redefine the macros below
  147.  */
  148.  
  149. #ifdef HAVETERMLIB
  150. EXT char *BC INIT(Nullch);        /* backspace character */
  151. EXT char *UP INIT(Nullch);        /* move cursor up one line */
  152. EXT char *CR INIT(Nullch);        /* get to left margin, somehow */
  153. EXT char *VB INIT(Nullch);        /* visible bell */
  154. EXT char *CL INIT(Nullch);        /* home and clear screen */
  155. EXT char *CE INIT(Nullch);        /* clear to end of line */
  156. #ifdef CLEAREOL
  157. EXT char *CM INIT(Nullch);        /* cursor motion -- PWP */
  158. EXT char *HO INIT(Nullch);        /* home cursor -- PWP */
  159. EXT char *CD INIT(Nullch);        /* clear to end of display -- PWP */
  160. #endif CLEAREOL
  161. EXT char *SO INIT(Nullch);        /* begin standout mode */
  162. EXT char *SE INIT(Nullch);        /* end standout mode */
  163. EXT int SG INIT(0);        /* blanks left by SO and SE */
  164. EXT char *US INIT(Nullch);        /* start underline mode */
  165. EXT char *UE INIT(Nullch);        /* end underline mode */
  166. EXT char *UC INIT(Nullch);        /* underline a character, if that's how it's done */
  167. EXT int UG INIT(0);        /* blanks left by US and UE */
  168. EXT bool AM INIT(FALSE);        /* does terminal have automatic margins? */
  169. EXT bool XN INIT(FALSE);        /* does it eat 1st newline after automatic wrap? */
  170. EXT char PC INIT(0);        /* pad character for use by tputs() */
  171. EXT short ospeed INIT(0);    /* terminal output speed, for use by tputs() */
  172. EXT int LINES INIT(0), COLS INIT(0);    /* size of screen */
  173. EXT int just_a_sec INIT(960);            /* 1 sec at current baud rate */
  174.                     /* (number of nulls) */
  175.  
  176. /* define a few handy macros */
  177.  
  178. #define backspace() tputs(BC,0,putchr) FLUSH
  179. #define clear() tputs(CL,LINES,putchr) FLUSH
  180. #define erase_eol() tputs(CE,1,putchr) FLUSH
  181. #ifdef CLEAREOL
  182. #define clear_rest() tputs(CD,LINES,putchr) FLUSH    /* PWP */
  183. #define maybe_eol() if(erase_screen&&can_home_clear)tputs(CE,1,putchr) FLUSH
  184. #endif CLEAREOL
  185. #define underline() tputs(US,1,putchr) FLUSH
  186. #define un_underline() tputs(UE,1,putchr) FLUSH
  187. #define underchar() tputs(UC,0,putchr) FLUSH
  188. #define standout() tputs(SO,1,putchr) FLUSH
  189. #define un_standout() tputs(SE,1,putchr) FLUSH
  190. #define up_line() tputs(UP,1,putchr) FLUSH
  191. #define carriage_return() tputs(CR,1,putchr) FLUSH
  192. #define dingaling() tputs(VB,1,putchr) FLUSH
  193. #else
  194.   ????????        /* up to you */
  195. #endif
  196.  
  197. EXT int page_line INIT(1);    /* line number for paging in print_line (origin 1) */
  198.  
  199. void    term_init();
  200. void    term_set();
  201. #ifdef PUSHBACK
  202. void    pushchar();
  203. void    mac_init();
  204. void    mac_line();
  205. void    show_macros();
  206. #endif
  207. char    putchr();    /* routine for tputs to call */
  208. bool    finish_command();
  209. void    eat_typeahead();
  210. void    settle_down();
  211. #ifndef read_tty
  212.     int        read_tty();
  213. #endif
  214. void    underprint();
  215. #ifdef NOFIREWORKS
  216.     void    no_sofire();
  217.     void    no_ulfire();
  218. #endif
  219. void    getcmd();
  220. int    get_anything();
  221. void    in_char();
  222. int    print_lines();
  223. void    page_init();
  224. void    pad();
  225. void    printcmd();
  226. void    rubout();
  227. void    reprint();
  228. #ifdef CLEAREOL
  229. void    home_cursor();
  230. #endif CLEAREOL
  231. !STUFFY!FUNK!
  232. echo Extracting head.c
  233. cat >head.c <<'!STUFFY!FUNK!'
  234. /* $Header: head.c,v 4.3 85/05/01 11:38:21 lwall Exp $
  235.  *
  236.  * $Log:    head.c,v $
  237.  * Revision 4.3  85/05/01  11:38:21  lwall
  238.  * Baseline for release with 4.3bsd.
  239.  * 
  240.  */
  241.  
  242. #include "EXTERN.h"
  243. #include "common.h"
  244. #include "artio.h"
  245. #include "bits.h"
  246. #include "util.h"
  247. #include "INTERN.h"
  248. #include "head.h"
  249.  
  250. bool first_one;        /* is this the 1st occurance of this header line? */
  251.  
  252. static char htypeix[26] =
  253.     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  254.  
  255. void
  256. head_init()
  257. {
  258.     register int i;
  259.  
  260.     for (i=HEAD_FIRST+1; i<HEAD_LAST; i++)
  261.     htypeix[*htype[i].ht_name - 'a'] = i;
  262. }
  263.  
  264. int
  265. set_line_type(bufptr,colon)
  266. char *bufptr;
  267. register char *colon;
  268. {
  269.     char lc[LONGKEY+3];
  270.     register char *t, *f;
  271.     register int i, len;
  272.  
  273.     for (t=lc,f=bufptr; f<colon; f++, t++) {
  274.     if (isspace(*f))
  275.     /* guard against space before : */
  276.         break;
  277.     *t = isupper(*f) ? tolower(*f) : *f;
  278.     }
  279.     *t = '\0';
  280.     f = lc;                /* get lc into register */
  281.     len = t - f;
  282.  
  283.     /* now scan the headtype table, backwards so we don't have to supply an
  284.      * extra terminating value, using first letter as index, and length as
  285.      * optimization to avoid calling subroutine strEQ unnecessarily.  Hauls.
  286.      */
  287.     
  288.     if (islower(*f)) {
  289.     for (i = htypeix[*f - 'a']; *htype[i].ht_name == *f; --i) {
  290.         if (len == htype[i].ht_length && strEQ(f, htype[i].ht_name)) {
  291.         return i;
  292.         }
  293.     }
  294.     }
  295.     return SOME_LINE;
  296. }
  297.  
  298. void
  299. start_header(artnum)
  300. ART_NUM artnum;
  301. {
  302.     register int i;
  303.  
  304.     for (i=0; i<HEAD_LAST; i++) {
  305.     htype[i].ht_minpos = -1;
  306.     htype[i].ht_maxpos = 0;
  307.     }
  308.     in_header = SOME_LINE;
  309.     first_one = FALSE;
  310. #ifdef ASYNC_PARSE
  311.     parsed_art = artnum;
  312. #endif
  313. }
  314.  
  315. bool
  316. parseline(art_buf,newhide,oldhide)
  317. char *art_buf;
  318. int newhide, oldhide;
  319. {
  320.     if (*art_buf == ' ' || *art_buf == '\t')
  321.                     /* header continuation line? */
  322.     return oldhide;
  323.     else {                /* maybe another header line */
  324.     char *s;
  325.  
  326.     if (first_one) {        /* did we just pass 1st occurance? */
  327.         first_one = FALSE;
  328.         htype[in_header].ht_maxpos = artpos;
  329.                     /* remember where line left off */
  330.     }
  331.     s = index(art_buf,':');
  332.     if (s == Nullch || s-art_buf > LONGKEY+2) {
  333.                 /* is it the end of the header? */
  334.         htype[PAST_HEADER].ht_minpos =
  335.         (*art_buf == '\n') ? ftell(artfp) : artpos;
  336.                 /* remember where body starts */
  337.         in_header = PAST_HEADER;
  338.     }
  339.     else {    /* it is a new header line */
  340.         in_header = set_line_type(art_buf,s);
  341.         first_one = (htype[in_header].ht_minpos < 0);
  342.         if (first_one)
  343.         htype[in_header].ht_minpos = artpos;
  344.         if (htype[in_header].ht_flags & HT_HIDE)
  345.         return newhide;
  346.     }
  347.     }
  348.     return FALSE;            /* don't hide this line */
  349. }
  350.  
  351. #ifdef ASYNC_PARSE
  352. int
  353. parse_maybe(artnum)
  354. ART_NUM artnum;
  355. {
  356.     char tmpbuf[LBUFLEN];
  357.  
  358.     if (parsed_art == artnum)
  359.     return 0;
  360.     /* no maybe about it now */
  361.     if (artopen(artnum) == Nullfp) {
  362.     return -1;
  363.     }
  364.     start_header(artnum);
  365.     while (in_header) {
  366.     artpos = ftell(artfp);
  367.     if (fgets(tmpbuf,LBUFLEN,artfp) == Nullch)
  368.         break;
  369.     parseline(tmpbuf,FALSE,FALSE);
  370.     }
  371.     in_header = PAST_HEADER;
  372.     return 0;
  373. }
  374. #endif
  375.  
  376. /* get the subject line for an article */
  377.  
  378. char *
  379. fetchsubj(artnum,current_subject,copy)
  380. ART_NUM artnum;                /* article to get subject from */
  381. bool current_subject;            /* is it in a parsed header? */
  382. bool copy;                /* do you want it savestr()ed? */
  383. {
  384.     char *s = Nullch, *t;
  385.  
  386. #ifdef CACHESUBJ
  387.     if (!subj_list) {
  388.     register ART_NUM i;
  389.     
  390.  
  391. #ifndef lint
  392.     subj_list =
  393.       (char**)safemalloc((MEM_SIZE)((OFFSET(lastart)+2)*sizeof(char *)));
  394. #endif lint
  395.     for (i=0; i<=OFFSET(lastart); i++)
  396.         subj_list[i] = Nullch;
  397.     }
  398.     if (!artnum || artnum > lastart)
  399.     s = nullstr;
  400.     else
  401.     s = subj_list[OFFSET(artnum)];
  402. #endif
  403.     if (s == Nullch) {
  404.     if (current_subject) {
  405.         s = fetchlines(artnum,SUBJ_LINE);
  406. #ifdef CACHESUBJ
  407.         subj_list[OFFSET(artnum)] = s;
  408. #endif
  409.     }
  410.     else {
  411.         s = safemalloc((MEM_SIZE)256);
  412.         *s = '\0';
  413.         if (artopen(artnum) != Nullfp) {
  414.         do {
  415.             if (fgets(s,256,artfp) == Nullch)
  416.             strcpy(s, "Title: \n");
  417.         } while (strnNE(s,"Title:",6) && strnNE(s,"Subject:",8));
  418.         s[strlen(s)-1] = '\0';
  419.         t = index(s,':')+1;
  420.         while (*t == ' ') t++;
  421.         strcpy(s, t);
  422.         }
  423.         s = saferealloc(s, (MEM_SIZE)strlen(s)+1);
  424. #ifdef CACHESUBJ
  425.         subj_list[OFFSET(artnum)] = s;
  426. #endif 
  427.     }
  428.     }
  429. #ifdef CACHESUBJ
  430.     if (copy) {
  431.     t = savestr(s);
  432.     return t;
  433.     }
  434.     else
  435.     return s;
  436. #else
  437.     if (copy)
  438.     return s;
  439.     else {
  440.     safecpy(cmd_buf,s,CBUFLEN);    /* hope this is okay--we're */
  441.     free(s);
  442.     return cmd_buf;            /* really scraping for space here */
  443.     }
  444. #endif
  445. }
  446.  
  447. /* get header lines from an article */
  448.  
  449. char *
  450. fetchlines(artnum,which_line)
  451. ART_NUM artnum;                /* article to get line from */
  452. int which_line;                /* type of line desired */
  453. {
  454.     char *newbuf, *t, tmp_buf[LBUFLEN];
  455.     register ART_POS curpos;
  456.     int size;
  457.     register ART_POS firstpos;
  458.     register ART_POS lastpos;
  459.     
  460. #ifdef ASYNC_PARSE
  461.     if (parse_maybe(artnum))
  462.     artnum = 0;
  463. #endif
  464.     firstpos = htype[which_line].ht_minpos;
  465.     lastpos = htype[which_line].ht_maxpos;
  466.     if (!artnum || firstpos < 0 || artopen(artnum) == Nullfp) {
  467.     newbuf = safemalloc((unsigned int)1);
  468.     *newbuf = '\0';
  469.     return newbuf;
  470.     }
  471. #ifndef lint
  472.     size = lastpos - firstpos + 1;
  473. #else
  474.     size = Null(int);
  475. #endif lint
  476. #ifdef DEBUGGING
  477.     if (debug && (size < 1 || size > 1000)) {
  478.     printf("Firstpos = %ld, lastpos = %ld\n",(long)firstpos,(long)lastpos);
  479.     gets(tmp_buf);
  480.     }
  481. #endif
  482.     newbuf = safemalloc((unsigned int)size);
  483.     *newbuf = '\0';
  484.     fseek(artfp,firstpos,0);
  485.     for (curpos = firstpos; curpos < lastpos; curpos = ftell(artfp)) {
  486.     if (fgets(tmp_buf,LBUFLEN,artfp) == Nullch)
  487.         break;
  488.     if (*tmp_buf == ' ' || *tmp_buf == '\t')
  489.         t = tmp_buf;
  490.     else
  491.         t = index(tmp_buf,':')+1;
  492.     if (t == Nullch)
  493.         break;
  494.     else {
  495.         while (*t == ' ' || *t == '\t') t++;
  496.         safecat(newbuf,t,size);
  497.     }
  498.     }
  499.     return newbuf;
  500. }
  501.  
  502. !STUFFY!FUNK!
  503. echo Extracting README
  504. cat >README <<'!STUFFY!FUNK!'
  505.             Rn Kit, Version 4.3
  506.  
  507.             Copyright (c) 1985, Larry Wall
  508.  
  509. You may copy the rn kit in whole or in part as long as you don't try to
  510. make money off it, or pretend that you wrote it.
  511. --------------------------------------------------------------------------
  512.  
  513. Please read all the directions below before you proceed any further, and
  514. then follow them carefully.  Failure to do so may void your warranty. :-)
  515.  
  516. After you have unpacked your kit, you should have all the files listed
  517. in MANIFEST.
  518.  
  519. Installation
  520.  
  521. 1)  Run Configure.  This will figure out various things about your system.
  522.     Some things Configure will figure out for itself, other things it will
  523.     ask you about.  It will then proceed to make config.h, config.sh, Makefile,
  524.     and a bunch of shell scripts.  It will also do a make depend for you.
  525.     You might possibly have to trim # comments from the front of Configure
  526.     if your sh doesn't handle them, but all other # comments will be taken
  527.     care of.
  528.  
  529. 2)  Glance through config.h and common.h to make sure system dependencies
  530.     are correct.  Most of them should have been taken care of by running
  531.     the Configure script.
  532.  
  533.     If you have any additional changes to make to the C definitions, they
  534.     can be done in the Makefile, in config.h, or in common.h.  If you have
  535.     strange mailboxes on your system you should modify mbox.saver to correctly
  536.     append an article to a mailbox or folder.
  537.  
  538.     If you are on a machine with limited address space, you may have to
  539.     remove some of the special functions of rn to make it fit.  This is
  540.     easily done by undefining symbols in the System Dependencies section
  541.     of common.h.  You should run "make depend" again to be safe.
  542.  
  543. 3)  make
  544.  
  545.     This will attempt to make rn in the current directory.
  546.  
  547. 4)  make install
  548.  
  549.     This will put rn, newsetup, newsgroups, Pnews, and Rnmail into a public
  550.     directory (normally /usr/local/bin), and put a number of files into the
  551.     private rn library (normally /usr/lib/news/rn).  It will also try to put
  552.     the man pages in a reasonable place.
  553.  
  554. 5)  Read the manual entry before running rn.  It's quite different from
  555.     readnews.
  556.  
  557. 6)  Install the Xref patch to header.h, header.c, and inews.c.  These patches
  558.     are found in header.h.?.pat, header.c.?.pat, and inews.c.?.pat, where ? is
  559.     either 1 for news 2.10.1 (or earlier) or 2 for 2.10.2.  Last I heard,
  560.     2.10.3 was going to have the Xref patch built in.  The purpose
  561.     of the Xref patch is to put an Xref: line in the header of articles
  562.     posted to more than one newsgroup.  Rn uses this line to keep from showing
  563.     such postings more than once.  Other than that rn will work without
  564.     this patch, so if you just want to try out rn you can delay putting in
  565.     the patch.
  566.  
  567.     When you put in the patch and recompile inews, don't forget to define
  568.     DOXREFS in the makefile for inews.  Do NOT define LINKART unless you
  569.     are a Eunice site and really want to do that.  In fact, if you are not
  570.     a Eunice site you needn't install the LINKART part of the patch.
  571.  
  572.     NOTE: the Makefile that comes with some of the older news systems does not
  573.     have all the dependencies quite right.  In particular, ifuncs.c may
  574.     not recompile when you change header.h.  If this happens when you install
  575.     the Xref patch, inews will start dumping core.  Make sure both inews.o
  576.     and ifuncs.o depend on header.h in the Makefile.
  577.  
  578.     Eunice users: the inews.c patch contains both the Xref patch and a LINKART
  579.     patch to put a form of "symbolic link" between articles posted to
  580.     multiple newsgroups.  What it does is to put the article into the first
  581.     newsgroup on the Newsgroups line, and in subsequent newsgroups it just
  582.     puts a little file containing the name of the article in the first
  583.     newsgroup.  Rn (when compiled with the LINKART option) is clever about
  584.     these pseudo-articles, and ends up opening the right one.  YOU WILL NOT
  585.     be able to use readnews or vnews on your system without modification,
  586.     though.  If you do this, be sure to define both DOXREFS and LINKART in
  587.     the makefile for inews.c.  If you are using the option in inews that
  588.     copies instead of linking, you will want to rip that out.
  589.  
  590.     NOTE: if you transmit articles to other systems using xfernews with the
  591.     U flag, Xref's can leak out of your system, as can Date-Received's.  This
  592.     may make neighboring sites unhappy unless they also have the Xref patch
  593.     installed.  For now, either don't use the U flag, or fix the inews/xfernews
  594.     interaction.
  595.  
  596. 7)  Try rn, and play with some of the switches.  You may want to make -/
  597.     default on your system.  This is done in common.h.  You may want to modify
  598.     which header lines are displayed by default--this is done in head.h.
  599.  
  600.     To change default values of enviroment variables on a system-wide basis
  601.     without recompiling rn, put switches into file INIT in the rn library.
  602.  
  603. 8)  IMPORTANT!  Help save the world!  Communicate any problems and
  604.     suggested patches to me, lwall@sdcrdcf.UUCP (Larry Wall), so we can
  605.     keep the world in sync.  If you have a problem, there's someone else
  606.     out there who either has had or will have the same problem.
  607.  
  608.     If possible, send in patches such that the patch program will apply them.
  609.     Context diffs are the best, then normal diffs.  Don't send ed scripts--
  610.     I've probably changed my copy since the version you have.
  611.  
  612.     Watch for rn patches in net.sources.bugs.  Patches will generally be
  613.     applyable (is that a word?) by the patch program.  If you are just
  614.     now bringing up news and aren't sure how many patches there are, write
  615.     to me and I'll send any you don't have.
  616.  
  617. 9)  If you are going to hack on rn, please read the HACKERSGUIDE first.
  618. !STUFFY!FUNK!
  619. echo Extracting MANIFEST
  620. cat >MANIFEST <<'!STUFFY!FUNK!'
  621. After all the rn kits are run you should have the following files:
  622.  
  623. Filename    Kit Description
  624. --------    --- -----------
  625. Configure        2  A shell script that installs everything system dependent.
  626. EXTERN.h         9  When included, makes other includes not belong to me.
  627. HACKERSGUIDE     5  A brief guide to the contorted innards of rn.
  628. INIT             3  Sample system-wide switch file. (NEW)
  629. INTERN.h         9  When included, makes other includes belong to me.
  630. MANIFEST         7  This list of files.
  631. Makefile.SH      7  The makefile.
  632. NEW              3  List of new features with 4.3 rn.
  633. Pnews.1          8  Manual page for Pnews.
  634. Pnews.SH         5  A news posting shell script that knows about -h.
  635. README           7  Installation instructions.
  636. Rnmail.1         8  Manual page for Rnmail.
  637. Rnmail.SH        7  A mailer that knows about -h.
  638. Wishlist         8  What the next version wants in it.
  639. addng.c          8  Routines for scanning the active file for new newsgroups.
  640. addng.h          9  Public info regarding addng.c.
  641. art.c            4  Routines to display an article.
  642. art.h            8  Public info regarding art.c.
  643. art.help.SH      7  Shell script for help at the article level.
  644. artio.c          8  Reserved for the article abstract type, someday.
  645. artio.h          8  Public info regarding artio.c.
  646. artsrch.c        6  Routines for searching among articles.
  647. artsrch.h        8  Public info regarding artsrch.c.
  648. artstate.h       8  Info on the current state of the article.
  649. backpage.c       8  Routines for paging backwards in articles.
  650. backpage.h       8  Public info regarding backpage.c.
  651. bits.c           3  Bitmap management functions.
  652. bits.h           8  Public info regarding bits.c.
  653. cheat.c          7  Routines to do lookahead of several types.
  654. cheat.h          8  Public info regarding cheat.c.
  655. common.h         3  Global info.
  656. final.c          7  Finalization (exit) routines.
  657. final.h          8  Public info regarding final.c.
  658. head.c           7  Header parsing routines.
  659. head.h           7  Public info regarding head.c.
  660. header.c.1.pat   8  DOXREFS patch for header.c for 2.10.1 news.
  661. header.c.2.pat   8  DOXREFS patch for header.c for 2.10.2 news.
  662. header.h.1.pat   8  DOXREFS patch for header.h for 2.10.1 news.
  663. header.h.2.pat   7  DOXREFS patch for header.h for 2.10.2 news.
  664. help.c           6  Help routines.
  665. help.h           9  Public info regarding help.c.
  666. inews.c.1.pat    6  DOXREFS and LINKART patches for 2.10.1 news.
  667. inews.c.2.pat    6  DOXREFS and LINKART patches for 2.10.2 news.
  668. init.c           1  Initialization (startup) routines.
  669. init.h           9  Public info regarding init.c.
  670. intrp.c          3  Filename expansion and % interpretation routines.
  671. intrp.h          8  Public info regarding intrp.c.
  672. kfile.c          7  KILL file routines.
  673. kfile.h          8  Public info regarding kfile.c.
  674. kitleader        8  Shell script to produce front of kit.
  675. kitlists.c       8  Knapsack packer.
  676. kittrailer       8  Shell script to produce end of kit.
  677. last.c           8  Routines for handling the .rnlast file.
  678. last.h           8  Public info regarding last.c.
  679. makedepend.SH    8  Shell script to generate make dependencies.
  680. makedir.SH       8  Shell script to make nested subdirectories.
  681. makedist         4  Shell script to make a distribution kit.
  682. makekit          8  Shell script to make a kit file.
  683. manifake         8  Shell script to make MANIFEST.new file.
  684. manimake         8  Shell script to make MANIFEST file.
  685. mbox.saver.SH    8  Shell script to save an article to a mailbox.
  686. ndir.c           8  4.2 directory routine emulation.
  687. ndir.h           8  Public info regarding ndir.c.
  688. newsetup.1       8  Manual page for newsetup.
  689. newsetup.SH      7  Shell script to create a .newsrc file.
  690. newsgroups.1     8  Manual page for newsgroups.
  691. newsgroups.SH    8  Shell script to list unsubscribed newsgroups.
  692. newsnews.SH      8  A motd-like file that rn may print at startup.
  693. ng.c             4  Routines to display a newsgroup.
  694. ng.h             1  Public info regarding ng.c.
  695. ng.help.SH       8  Shell script to do newsgroup selection help.
  696. ngdata.c         7  General data fetching routines for a newsgroup.
  697. ngdata.h         8  Public info regarding ngdata.c.
  698. ngsrch.c         7  Routines to search among newsgroups.
  699. ngsrch.h         8  Public info regarding ngsrch.c.
  700. ngstuff.c        4  Support routines for ng.c.
  701. ngstuff.h        8  Public info regarding ng.c.
  702. norm.saver.SH    8  Shell script to save an article to a normal file.
  703. only.c           8  Routines to perform newsgroup restriction.
  704. only.h           8  Public info regarding only.c.
  705. pager.help.SH    8  Shell script for help at the pager level.
  706. rcln.c           5  Routines to mung a .newsrc line.
  707. rcln.h           8  Public info regarding rcln.c.
  708. rcstuff.c        2  Routines to mung the .newsrc file.
  709. rcstuff.h        8  Public info regarding rcstuff.c.
  710. respond.c        6  Various routines for doing things with articles.
  711. respond.h        8  Public info regarding respond.c.
  712. rn.1             1  Manual pages for rn. PLEASE READ.
  713. rn.c             5  Main program.
  714. rn.h             8  Public info regarding rn.c.
  715. search.c         4  Regular expression processing ala emacs.
  716. search.h         8  Public info regarding search.c.
  717. subs.help.SH     8  Shell script for help for escape substitutions.
  718. sw.c             6  Switch processing routines.
  719. sw.h             9  Public info regarding switch.c.
  720. term.c           5  Terminal interface routines.
  721. term.h           7  Public info regarding term.c.
  722. util.c           6  Utility routines.
  723. util.h           8  Public info regarding util.c.
  724. !STUFFY!FUNK!
  725. echo Extracting Rnmail.SH
  726. cat >Rnmail.SH <<'!STUFFY!FUNK!'
  727. case $CONFIG in
  728.     '') . config.sh ;;
  729. esac
  730. echo "Extracting Rnmail (with variable substitutions)"
  731. $spitshell >Rnmail <<!GROK!THIS!
  732. $startsh
  733. # $Header: Rnmail.SH,v 4.3 85/05/01 11:34:18 lwall Exp $
  734. # $Log:    Rnmail.SH,v $
  735. # Revision 4.3  85/05/01  11:34:18  lwall
  736. # Baseline for release with 4.3bsd.
  737. #
  738. # syntax: Rnmail -h headerfile [oldart]        or
  739. #         Rnmail destination-list         or just
  740. #         Rnmail
  741.  
  742. export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed myself to sh."; sh \$0; kill \$\$)
  743.  
  744. # System dependencies
  745.  
  746. mailer="${mailer-/bin/mail}"
  747. # if you change this to something that does signatures, take out signature code
  748.  
  749. # your site name
  750. case $portable in
  751. define) sitename=\`$hostcmd\` ;;
  752. undef) sitename="$sitename" ;;
  753. esac
  754. # your organization name
  755. orgname="$orgname"
  756. # what pager you use--if you have kernal paging use cat
  757. pager="\${PAGER-$pager}"
  758. # how you derive full names, bsd, usg, or other
  759. nametype="$nametype"
  760. # default editor
  761. defeditor="$defeditor"
  762. # how not to do a newline with echo
  763. n="$n"
  764. c="$c"
  765.  
  766. test=${test-test}
  767. sed=${sed-sed}
  768. echo=${echo-echo}
  769. cat=${cat-cat}
  770. grep=${grep-grep}
  771. rm=${rm-rm}
  772.  
  773. !GROK!THIS!
  774. $spitshell >>Rnmail <<'!NO!SUBS!'
  775. tmpart=/tmp/rnmail$$
  776. dotdir=${DOTDIR-${HOME-$LOGDIR}}
  777.  
  778. headerfile=""
  779. case $# in
  780. 0) ;;
  781. *)  case $1 in
  782.     -h)
  783.     headerfile="$2"
  784.     case $# in
  785.     3) oldart=$3 ;;
  786.     esac
  787.     ;;
  788.     esac
  789.     ;;
  790. esac
  791.  
  792. case $headerfile in
  793. '')
  794.     case $# in
  795.     0)
  796.     to=h
  797.     while $test "$to" = h ; do
  798.         $echo ""
  799.         $echo $n "To: $c"
  800.         read to
  801.         case $to in
  802.         h)
  803.         $cat <<'EOH'
  804.  
  805. Type the net address of those people that you wish the message sent to.
  806. Note that you will be asked later for additional addresses of people to
  807. whom the message is not addressed but you wish to get copies.
  808.  
  809. Separate multiple addresses with spaces.
  810.  
  811. EOH
  812.         ;;
  813.         esac
  814.     done
  815.     ;;
  816.     *)
  817.     to="$*"
  818.     ;;
  819.     esac
  820.     to=`$echo "$to" | $sed 's/  */ /g'`
  821.  
  822.     title=h
  823.     while $test "$title" = h ; do
  824.     $echo ""
  825.     $echo $n "Title/Subject: $c"
  826.     read title
  827.     case $title in
  828.     h)
  829.         $cat <<'EOH'
  830.  
  831. Type the title for your message.  
  832. EOH
  833.         ;;
  834.     esac
  835.     done
  836.  
  837. # now build a file with a header for them to edit
  838.     
  839.     orgname=${ORGANIZATION-$orgname}
  840.     case $orgname in
  841.     /*) orgname=`$cat $orgname` ;;
  842.     esac
  843.  
  844.     $cat > $tmpart <<EOHeader
  845. To: $to
  846. Subject: $title
  847. Organization: $orgname
  848. Cc:
  849. Bcc:
  850.  
  851. EOHeader
  852.  
  853.     ;;
  854. *)
  855.     $cat < $headerfile  > $tmpart
  856.     ;;
  857. esac
  858.  
  859.  
  860. file=h
  861. while $test "$file" = h ; do
  862.     $echo ""
  863.     $echo $n "Prepared file to include [none]: $c"
  864.     read file
  865.     case $file in
  866.     h)
  867.     $cat <<'EOH'
  868.  
  869. If you have already produced the body of your message, type the filename
  870. for it here.  If you just want to proceed directly to the editor, type a
  871. RETURN.  In any event, you will be allowed to edit as many times as you
  872. want before you send off the message.
  873. EOH
  874.     ;;
  875.     '')
  876.     $echo "" >> $tmpart
  877.     state=edit
  878.     ;;
  879.     *)
  880.     $cat $file >>$tmpart
  881.     state=ask
  882.     ;;
  883.     esac
  884. done
  885.  
  886. $echo ""
  887.  
  888. while true ; do
  889.     case $state in
  890.     edit)
  891.     rescue="sleep 1; $cat $tmpart >>${HOME-$LOGDIR}/dead.letter ; $echo saved in ${HOME-$LOGDIR}/dead.letter ; $rm -f $tmpart; exit"
  892.     trap "$rescue" 1
  893.     trap : 2
  894.     tmp=h
  895.     while $test "$tmp" = h ; do
  896.         $echo $n "Editor [${VISUAL-${EDITOR-$defeditor}}]: $c"
  897.         read tmp
  898.         case $tmp in
  899.         h)
  900.         $cat <<'EOH'
  901.  
  902. Type a return to get the default editor, or type the name of the editor you
  903. prefer.  The default editor depends on the VISUAL and EDITOR environment
  904. variables.
  905.  
  906. EOH
  907.         ;;
  908.         '')
  909.         ;;
  910.         *)
  911.         VISUAL=$tmp
  912.         export VISUAL
  913.         ;;
  914.         esac
  915.     done
  916.     ${VISUAL-${EDITOR-$defeditor}} $tmpart $oldart
  917.     trap "$rescue" 2
  918.     state=ask
  919.     ;;
  920.     
  921.     ask)
  922.     $echo ""
  923.     $echo $n "Send, abort, edit, or list? $c"
  924.     read ans
  925.     
  926.     case $ans in
  927.     a*)
  928.         state=rescue
  929.         ;;
  930.     e*)
  931.         state=edit
  932.         ;;
  933.     l*)
  934.         $pager $tmpart
  935.         state=ask
  936.         ;;
  937.     s*)
  938.         state=send
  939.         ;;
  940.     h*)
  941.         $cat <<'EOH'
  942.  
  943. Type s to send the message, a to abort and append the message to dead.letter,
  944. e to edit the message again, or l to list the message.
  945. EOH
  946.     esac
  947.     ;;
  948.     
  949.     send)
  950.     if $test -f $dotdir/.signature; then
  951.         echo $n "Append .signature file? [y] $c"
  952.         read ans
  953.         case $ans in
  954.         ''|y*) cat $dotdir/.signature >> $tmpart
  955.         esac
  956.     fi
  957.     case $mailer in
  958.     *sendmail)
  959.         $mailer -t <$tmpart
  960.         ;;
  961. # but recmail does not know about Bcc, alas
  962.     *recmail)
  963.         $mailer <$tmpart
  964.         ;;
  965.     *)
  966.         set X `$sed <$tmpart -n -e '/^To:/{' -e 's/To: *//p' -e q -e '}'`
  967.         shift
  968.         set X "$@" `$sed <$tmpart -n -e '/^Cc:/{' -e 's/Cc: *//p' -e q -e '}'`
  969.         shift
  970.         set X "$@" `$sed <$tmpart -n -e '/^Bcc:/{' -e 's/Bcc: *//p' -e q -e '}'`
  971.         shift
  972.         $grep -v "^Bcc:"  <$tmpart | $mailer "$@"
  973.         ;;
  974.     esac
  975.     case $? in
  976.     0)
  977.         state=cleanup
  978.         ;;
  979.     *)
  980.         state=rescue
  981.         ;;
  982.     esac
  983.     ;;
  984.     rescue)
  985.     $cat $tmpart >> ${HOME-$LOGDIR}/dead.letter
  986.     $echo "Message saved to ${HOME-$LOGDIR}/dead.letter"
  987.     state=cleanup
  988.     ;;
  989.     cleanup)
  990.     $rm -f $tmpart
  991.     exit
  992.     ;;
  993.     esac
  994. done
  995. !NO!SUBS!
  996. $eunicefix Rnmail
  997. chmod 755 Rnmail
  998. !STUFFY!FUNK!
  999. echo Extracting kfile.c
  1000. cat >kfile.c <<'!STUFFY!FUNK!'
  1001. /* $Header: kfile.c,v 4.3 85/05/01 11:41:53 lwall Exp $
  1002.  *
  1003.  * $Log:    kfile.c,v $
  1004.  * Revision 4.3  85/05/01  11:41:53  lwall
  1005.  * Baseline for release with 4.3bsd.
  1006.  * 
  1007.  */
  1008.  
  1009. #include "EXTERN.h"
  1010. #include "common.h"
  1011. #include "term.h"
  1012. #include "util.h"
  1013. #include "artsrch.h"
  1014. #include "ng.h"
  1015. #include "bits.h"
  1016. #include "intrp.h"
  1017. #include "ngstuff.h"
  1018. #include "rcstuff.h"
  1019. #include "rn.h"
  1020. #include "INTERN.h"
  1021. #include "kfile.h"
  1022.  
  1023. static bool exitcmds = FALSE;
  1024.  
  1025. void
  1026. kfile_init()
  1027. {
  1028.     ;
  1029. }
  1030.  
  1031. #ifndef KILLFILES
  1032. int
  1033. edit_kfile()
  1034. {
  1035.     notincl("^K");
  1036.     return -1;
  1037. }
  1038.  
  1039. #else KILLFILES
  1040.  
  1041. char killglobal[] = KILLGLOBAL;
  1042. char killlocal[] = KILLLOCAL;
  1043.  
  1044. void
  1045. mention(str)
  1046. char *str;
  1047. {
  1048. #ifdef NOFIREWORKS
  1049.     no_sofire();
  1050. #endif
  1051.     standout();
  1052.     fputs(str,stdout);
  1053.     un_standout();
  1054.     putchar('\n');
  1055.     fflush(stdout);
  1056. }
  1057.  
  1058. int
  1059. do_kfile(kfp,entering)
  1060. FILE *kfp;
  1061. int entering;
  1062. {
  1063.     art = lastart+1;
  1064.     fseek(kfp,0L,0);            /* rewind file */
  1065.     while (fgets(buf,LBUFLEN,kfp) != Nullch) {
  1066.     buf[strlen(buf)-1] = '\0';
  1067.     if (strnEQ(buf,"THRU",4)) {
  1068.         firstart = atol(buf+4)+1;
  1069.         continue;
  1070.     }
  1071.     if (*buf == 'X') {        /* exit command? */
  1072.         if (entering) {
  1073.         exitcmds = TRUE;
  1074.         continue;
  1075.         }
  1076.         strcpy(buf,buf+1);
  1077.     }
  1078.     else {
  1079.         if (!entering)
  1080.         continue;
  1081.     }
  1082.     if (*buf == '&') {
  1083.         mention(buf);
  1084.         switcheroo();
  1085.     }
  1086.     else if (*buf == '/' && firstart <= lastart) {
  1087.         mention(buf);
  1088.         switch (art_search(buf, (sizeof buf), FALSE)) {
  1089.         case SRCH_ABORT:
  1090.         continue;
  1091.         case SRCH_INTR:
  1092. #ifdef VERBOSE
  1093.         IF(verbose)
  1094.             printf("\n(Interrupted at article %ld)\n",(long)art)
  1095.               FLUSH;
  1096.         ELSE
  1097. #endif
  1098. #ifdef TERSE
  1099.             printf("\n(Intr at %ld)\n",(long)art) FLUSH;
  1100. #endif
  1101.         return -1;
  1102.         case SRCH_DONE:
  1103.         break;
  1104.         case SRCH_SUBJDONE:
  1105.         fputs("\tsubject not found (???)\n",stdout) FLUSH;
  1106.         break;
  1107.         case SRCH_NOTFOUND:
  1108.         fputs("\tnot found\n",stdout) FLUSH;
  1109.         break;
  1110.         case SRCH_FOUND:
  1111.         fputs("\tfound\n",stdout) FLUSH;
  1112.         }
  1113.     }
  1114.     }
  1115.     return 0;
  1116. }
  1117.  
  1118. void
  1119. kill_unwanted(starting,message,entering)
  1120. ART_NUM starting;
  1121. char *message;
  1122. int entering;
  1123. {
  1124.     bool intr = FALSE;            /* did we get an interrupt? */
  1125.     ART_NUM oldfirst;
  1126.     bool anytokill = (toread[ng] > 0);
  1127.  
  1128.     if (localkfp || globkfp) {
  1129.     if (!entering && !exitcmds)
  1130.         return;
  1131.     exitcmds = FALSE;
  1132.     oldfirst = firstart;
  1133.     firstart = starting;
  1134.     clear();
  1135.     if (message)
  1136.         fputs(message,stdout) FLUSH;
  1137.     if (localkfp)
  1138.         intr = do_kfile(localkfp,entering);
  1139.     if (globkfp && !intr)
  1140.         intr = do_kfile(globkfp,entering);
  1141.     if (entering && localkfp && !intr)
  1142.         setthru(lastart);
  1143.     putchar('\n') FLUSH;
  1144.     if (entering)
  1145.         get_anything();
  1146.     if (anytokill)            /* if there was anything to kill */
  1147.         forcelast = FALSE;        /* allow for having killed it all */
  1148.     firstart = oldfirst;
  1149.     }
  1150. }
  1151.  
  1152. void
  1153. setthru(thru)
  1154. ART_NUM thru;
  1155. {
  1156.     FILE *newkfp;
  1157.  
  1158.     fseek(localkfp,0L,0);        /* rewind current file */
  1159.     strcpy(buf,filexp(getval("KILLLOCAL",killlocal)));
  1160.     UNLINK(buf);            /* to prevent file reuse */
  1161.     if (newkfp = fopen(buf,"w")) {
  1162.     fprintf(newkfp,"THRU %ld\n",(long)thru);
  1163.     while (fgets(buf,LBUFLEN,localkfp) != Nullch) {
  1164.         if (strnEQ(buf,"THRU",4))
  1165.         continue;
  1166.         fputs(buf,newkfp);
  1167.     }
  1168.     fclose(newkfp);
  1169.     open_kfile(KF_LOCAL);        /* and reopen local file */
  1170.     }
  1171.     else
  1172.     printf(cantcreate,buf) FLUSH;
  1173. }
  1174.  
  1175. /* edit KILL file for newsgroup */
  1176.  
  1177. int
  1178. edit_kfile()
  1179. {
  1180.     int r = -1;
  1181.  
  1182.     if (in_ng)
  1183.     strcpy(buf,filexp(getval("KILLLOCAL",killlocal)));
  1184.     else
  1185.     strcpy(buf,filexp(getval("KILLGLOBAL",killglobal)));
  1186.     if ((r = makedir(buf,MD_FILE)) >= 0) {
  1187.     sprintf(cmd_buf,"%s %s",
  1188.         filexp(getval("VISUAL",getval("EDITOR",defeditor))),buf);
  1189.     printf("\nEditing %s KILL file:\n%s\n",
  1190.         (in_ng?"local":"global"),cmd_buf) FLUSH;
  1191.     resetty();            /* make sure tty is friendly */
  1192.     r = doshell(sh,cmd_buf);/* invoke the shell */
  1193.     noecho();            /* and make terminal */
  1194.     crmode();            /*   unfriendly again */
  1195.     open_kfile(in_ng);
  1196.     }
  1197.     else
  1198.     printf("Can't make %s\n",buf) FLUSH;
  1199.     return r;
  1200. }
  1201.  
  1202. void
  1203. open_kfile(local)
  1204. int local;
  1205. {
  1206.     char *kname = filexp(local ?
  1207.     getval("KILLLOCAL",killlocal) :
  1208.     getval("KILLGLOBAL",killglobal)
  1209.     );
  1210.     
  1211.     stat(kname,&filestat);
  1212.     if (!filestat.st_size)        /* nothing in the file? */
  1213.     UNLINK(kname);            /* delete the file */
  1214.     if (local) {
  1215.     if (localkfp)
  1216.         fclose(localkfp);
  1217.     localkfp = fopen(kname,"r");
  1218.     }
  1219.     else {
  1220.     if (globkfp)
  1221.         fclose(globkfp);
  1222.     globkfp = fopen(kname,"r");
  1223.     }
  1224. }
  1225.  
  1226. void
  1227. kf_append(cmd)
  1228. char *cmd;
  1229. {
  1230.     strcpy(cmd_buf,filexp(getval("KILLLOCAL",killlocal)));
  1231.     if (makedir(cmd_buf,MD_FILE) >= 0) {
  1232. #ifdef VERBOSE
  1233.     IF(verbose)
  1234.         printf("\nDepositing command in %s...",cmd_buf);
  1235.     ELSE
  1236. #endif
  1237. #ifdef TERSE
  1238.         printf("\n--> %s...",cmd_buf);
  1239. #endif
  1240.     fflush(stdout);
  1241.     sleep(2);
  1242.     if ((tmpfp = fopen(cmd_buf,"a")) != Nullfp) {
  1243.         fseek(tmpfp,0L,2);        /* get to EOF for sure */
  1244.         fprintf(tmpfp,"%s\n",cmd);
  1245.         fclose(tmpfp);
  1246.         fputs("done\n",stdout) FLUSH;
  1247.     }
  1248.     else
  1249.         printf(cantopen,cmd_buf) FLUSH;
  1250.     }
  1251. }
  1252. #endif KILLFILES
  1253. !STUFFY!FUNK!
  1254. echo Extracting ngdata.c
  1255. cat >ngdata.c <<'!STUFFY!FUNK!'
  1256. /* $Header: ngdata.c,v 4.3 85/05/01 11:44:38 lwall Exp $
  1257.  *
  1258.  * $Log:    ngdata.c,v $
  1259.  * Revision 4.3  85/05/01  11:44:38  lwall
  1260.  * Baseline for release with 4.3bsd.
  1261.  * 
  1262.  */
  1263.  
  1264. #include "EXTERN.h"
  1265. #include "common.h"
  1266. #include "ndir.h"
  1267. #include "rcstuff.h"
  1268. #include "rn.h"
  1269. #include "intrp.h"
  1270. #include "final.h"
  1271. #include "rcln.h"
  1272. #include "INTERN.h"
  1273. #include "ngdata.h"
  1274.  
  1275. void
  1276. ngdata_init()
  1277. {
  1278. /* The following is only for systems that do not zero globals properly */
  1279. #ifdef ZEROGLOB
  1280. # ifdef CACHEFIRST
  1281.     for (i=0; i<MAXRCLINE; i++)
  1282.     abs1st[i] = 0;
  1283. # endif
  1284. #endif    /* ZEROGLOB */
  1285.  
  1286.     /* open the active file */
  1287.  
  1288.     actfp = fopen(filexp(ACTIVE),"r");
  1289.     if (actfp == Nullfp) {
  1290.     printf(cantopen,filexp(ACTIVE)) FLUSH;
  1291.     finalize(1);
  1292.     }
  1293. }
  1294.  
  1295. /* find the maximum article number of a newsgroup */
  1296.  
  1297. ART_NUM
  1298. getngsize(num)
  1299. register NG_NUM num;
  1300. {
  1301.     register int len;
  1302.     register char *nam;
  1303.     char tmpbuf[80];
  1304.     ART_POS oldsoft;
  1305.  
  1306.     nam = rcline[num];
  1307.     len = rcnums[num] - 1;
  1308.     softtries++;
  1309. #ifdef DEBUGGING
  1310.     if (debug & DEB_SOFT_POINTERS)
  1311.     printf("Softptr = %ld\n",(long)softptr[num]) FLUSH;
  1312. #endif
  1313.     oldsoft = softptr[num];
  1314.     if ((softptr[num] = findact(tmpbuf, nam, len, (long)oldsoft)) >= 0) {
  1315.     if (softptr[num] != oldsoft) {
  1316.         softmisses++;
  1317.         writesoft = TRUE;
  1318.     }
  1319.     }
  1320.     else {
  1321.     softptr[num] = 0;
  1322.     if (rcchar[num] == ':')        /* unsubscribe quietly */
  1323.         rcchar[num] = NEGCHAR;
  1324.     return TR_BOGUS;        /* well, not so quietly, actually */
  1325.     }
  1326.     
  1327. #ifdef DEBUGGING
  1328.     if (debug & DEB_SOFT_POINTERS) {
  1329.     printf("Should be %ld\n",(long)softptr[num]) FLUSH;
  1330.     }
  1331. #endif
  1332. #ifdef MININACT
  1333.     {
  1334.     register char *s;
  1335.     ART_NUM tmp;
  1336.  
  1337.     for (s=tmpbuf+len+1; isdigit(*s); s++) ;
  1338.     if (tmp = atol(s))
  1339. #ifdef CACHEFIRST
  1340.         abs1st[num] = tmp;
  1341. #else
  1342.         abs1st = tmp;
  1343. #endif
  1344.     }
  1345. #endif
  1346.     return atol(tmpbuf+len+1);
  1347. }
  1348.  
  1349. ACT_POS
  1350. findact(outbuf,nam,len,suggestion)
  1351. char *outbuf;
  1352. char *nam;
  1353. int len;
  1354. long suggestion;
  1355. {
  1356.     ACT_POS retval;
  1357.  
  1358.     fseek(actfp,100000L,1);    /* hopefully this forces a reread */
  1359.     if (suggestion == 0L || fseek(actfp,suggestion,0) < 0 ||
  1360.       fgets(outbuf,80,actfp) == Nullch ||
  1361.       outbuf[len] != ' ' ||
  1362.       strnNE(outbuf,nam,len)) {
  1363. #ifdef DEBUGGING
  1364.     if (debug & DEB_SOFT_POINTERS)
  1365.         printf("Missed, looking for %s in %sLen = %d\n",nam,outbuf,len)
  1366.           FLUSH;
  1367. #endif
  1368.     fseek(actfp,0L,0);
  1369. #ifndef lint
  1370.     retval = (ACT_POS)ftell(actfp);
  1371. #else
  1372.     retval = Null(ACT_POS);
  1373. #endif lint
  1374.     while (fgets(outbuf,80,actfp) != Nullch) {
  1375.         if (outbuf[len] == ' ' && strnEQ(outbuf,nam,len))
  1376.         return retval;
  1377. #ifndef lint
  1378.         retval = (ACT_POS) ftell(actfp);
  1379. #endif lint
  1380.     }
  1381.     return (ACT_POS) -1;        /* well, not so quietly, actually */
  1382.     }
  1383.     else
  1384. #ifndef lint
  1385.     return (ACT_POS) suggestion;
  1386. #else
  1387.     return retval;
  1388. #endif lint
  1389.     /*NOTREACHED*/
  1390. }
  1391.  
  1392. /* determine the absolutely first existing article number */
  1393.  
  1394. ART_NUM
  1395. getabsfirst(ngnum,ngsize)
  1396. register NG_NUM ngnum;
  1397. ART_NUM ngsize;
  1398. {
  1399.     register ART_NUM a1st;
  1400. #ifndef MININACT
  1401.     char dirname[MAXFILENAME];
  1402. #endif
  1403.  
  1404. #ifdef CACHEFIRST
  1405.     if (a1st = abs1st[ngnum])
  1406.     return a1st;
  1407. #endif
  1408. #ifdef MININACT
  1409.     getngsize(ngnum);
  1410. # ifdef CACHEFIRST
  1411.     return abs1st[ngnum];
  1412. # else
  1413.     return abs1st;
  1414. # endif
  1415. #else not MININACT
  1416.     sprintf(dirname,"%s/%s",spool,getngdir(rcline[ngnum]));
  1417.     a1st = getngmin(dirname,0L);
  1418.     if (!a1st)                /* nothing there at all? */
  1419.     a1st = ngsize+1;        /* aim them at end of newsgroup */
  1420. # ifdef CACHEFIRST
  1421.     abs1st[ngnum] = a1st;
  1422. # endif
  1423.     return a1st;
  1424. #endif MININACT
  1425. }
  1426.  
  1427. /* scan a directory for minimum article number greater than floor */
  1428.  
  1429. ART_NUM
  1430. getngmin(dirname,floor)
  1431. char *dirname;
  1432. ART_NUM floor;
  1433. {
  1434.     register DIR *dirp;
  1435.     register struct direct *dp;
  1436.     register ART_NUM min = 1000000;
  1437.     register ART_NUM maybe;
  1438.     register char *p;
  1439.     char tmpbuf[128];
  1440.     
  1441.     dirp = opendir(dirname);
  1442.     if (!dirp)
  1443.     return 0;
  1444.     while ((dp = readdir(dirp)) != Null(struct direct *)) {
  1445.     if ((maybe = atol(dp->d_name)) < min && maybe > floor) {
  1446.         for (p = dp->d_name; *p; p++)
  1447.         if (!isdigit(*p))
  1448.             goto nope;
  1449.         if (*dirname == '.' && !dirname[1])
  1450.         stat(dp->d_name, &filestat);
  1451.         else {
  1452.         sprintf(tmpbuf,"%s/%s",dirname,dp->d_name);
  1453.         stat(tmpbuf, &filestat);
  1454.         }
  1455.         if (! (filestat.st_mode & S_IFDIR))
  1456.         min = maybe;
  1457.     }
  1458.       nope:
  1459.     ;
  1460.     }
  1461.     closedir(dirp);
  1462.     return min==1000000 ? 0 : min;
  1463. }
  1464.  
  1465. !STUFFY!FUNK!
  1466. echo Extracting final.c
  1467. cat >final.c <<'!STUFFY!FUNK!'
  1468. /* $Header: final.c,v 4.3 85/05/01 11:38:08 lwall Exp $
  1469.  *
  1470.  * $Log:    final.c,v $
  1471.  * Revision 4.3  85/05/01  11:38:08  lwall
  1472.  * Baseline for release with 4.3bsd.
  1473.  * 
  1474.  */
  1475.  
  1476. #include "EXTERN.h"
  1477. #include "common.h"
  1478. #include "util.h"
  1479. #include "term.h"
  1480. #include "ng.h"
  1481. #include "init.h"
  1482. #include "bits.h"
  1483. #include "last.h"
  1484. #include "rcstuff.h"
  1485. #include "INTERN.h"
  1486. #include "final.h"
  1487.  
  1488. void
  1489. final_init()
  1490. {
  1491. #ifdef SIGTSTP
  1492.     sigset(SIGTSTP, stop_catcher);    /* job control signals */
  1493.     sigset(SIGCONT, cont_catcher);    /* job control signals */
  1494. #endif
  1495.  
  1496.     sigset(SIGINT, int_catcher);    /* always catch interrupts */
  1497.     sigset(SIGHUP, sig_catcher);    /* and hangups */
  1498. #ifndef lint
  1499.     sigignore(SIGEMT);
  1500. #endif lint
  1501.  
  1502.     sigset(SIGILL, sig_catcher);
  1503.     sigset(SIGTRAP, sig_catcher);
  1504.     sigset(SIGFPE, sig_catcher);
  1505.     sigset(SIGBUS, sig_catcher);
  1506.     sigset(SIGSEGV, sig_catcher);
  1507.     sigset(SIGSYS, sig_catcher);
  1508.     sigset(SIGTERM, sig_catcher);
  1509. #ifdef SIGXCPU
  1510.     sigset(SIGXCPU, sig_catcher);
  1511. #endif
  1512. #ifdef SIGXFSZ
  1513.     sigset(SIGXFSZ, sig_catcher);
  1514. #endif
  1515. }
  1516.  
  1517. void                    /* very much void */
  1518. finalize(status)
  1519. int status;
  1520. {
  1521.     if (bizarre)
  1522.     resetty();
  1523.     UNLINK(lockname);
  1524.     if (status < 0) {
  1525.     chdir("/usr/tmp");
  1526.     sigset(SIGILL,SIG_DFL);
  1527.     abort();
  1528.     }
  1529.     exit(status);
  1530. }
  1531.  
  1532. /* come here on interrupt */
  1533.  
  1534. int
  1535. int_catcher()
  1536. {
  1537.     sigset(SIGINT,int_catcher);
  1538. #ifdef DEBUGGING
  1539.     if (debug)
  1540.     write(2,"int_catcher\n",12);
  1541. #endif
  1542.     if (!waiting) {
  1543.     if (int_count) {        /* was there already an interrupt? */
  1544.         write(2,"\nBye-bye.\n",10);
  1545.         sig_catcher(0);        /* emulate the other signals */
  1546.     }
  1547.     int_count++;
  1548.     }
  1549. }
  1550.  
  1551. /* come here on signal other than interrupt, stop, or cont */
  1552.  
  1553. int
  1554. sig_catcher(signo)
  1555. {
  1556. #ifdef VERBOSE
  1557.     static char *signame[] = {
  1558.     "",
  1559.     "HUP",
  1560.     "INT",
  1561.     "QUIT",
  1562.     "ILL",
  1563.     "TRAP",
  1564.     "IOT",
  1565.     "EMT",
  1566.     "FPE",
  1567.     "KILL",
  1568.     "BUS",
  1569.     "SEGV",
  1570.     "SYS",
  1571.     "PIPE",
  1572.     "ALRM",
  1573.     "TERM",
  1574.     "???"
  1575. #ifdef SIGTSTP
  1576.     ,"STOP",
  1577.     "TSTP",
  1578.     "CONT",
  1579.     "CHLD",
  1580.     "TTIN",
  1581.     "TTOU",
  1582.     "TINT",
  1583.     "XCPU",
  1584.     "XFSZ"
  1585. #ifdef SIGPROF
  1586.     ,"VTALARM",
  1587.     "PROF"
  1588. #endif
  1589. #endif
  1590.     };
  1591. #endif
  1592.  
  1593. #ifdef SIGTTOU
  1594. #ifndef lint
  1595.     sigignore(SIGTTOU);
  1596. #endif lint
  1597. #endif
  1598. #ifdef DEBUGGING
  1599.     if (debug) {
  1600.     printf("\nSIG%s--.newsrc not restored in debug\n",signame[signo]);
  1601.     finalize(-1);
  1602.     }
  1603. #endif
  1604.     if (panic)
  1605.     abort();
  1606.     (void) sigset(SIGILL,SIG_DFL);
  1607.     panic = TRUE;            /* disable terminal I/O */
  1608.     if (doing_ng) {            /* need we reconstitute rc line? */
  1609.     yankback();
  1610.     restore_ng();            /* then do so (hope this works) */
  1611.     }
  1612.     doing_ng = FALSE;
  1613.     if (rc_changed)            /* need we write .newsrc out? */
  1614.     write_rc();            /* then do so */
  1615.     rc_changed = FALSE;
  1616.     if (signo != SIGHUP)
  1617. #ifdef VERBOSE
  1618.     IF(verbose)
  1619.         printf("\nCaught %s%s--.newsrc restored\n",
  1620.         signo ? "a SIG" : "an internal error", signame[signo]);
  1621.     ELSE
  1622. #endif
  1623. #ifdef TERSE
  1624.         printf("\nSignal %d--bye bye\n",signo);
  1625. #endif
  1626.     switch (signo) {
  1627.     case SIGBUS:
  1628.     case SIGILL:
  1629.     case SIGSEGV:
  1630.     finalize(-signo);
  1631.     }
  1632.     finalize(1);                /* and blow up */
  1633. }
  1634.  
  1635. #ifdef SIGTSTP
  1636. /* come here on stop signal */
  1637.  
  1638. int
  1639. stop_catcher()
  1640. {
  1641.     if (!waiting) {
  1642.     checkpoint_rc();        /* good chance of crash while stopped */
  1643.     resetty();            /* this is the point of all this */
  1644. #ifdef DEBUGGING
  1645.     if (debug)
  1646.         write(2,"stop_catcher\n",13);
  1647. #endif
  1648.     sigset(SIGTSTP,SIG_DFL);    /* enable stop */
  1649. #ifdef BSD42
  1650.     sigsetmask(sigblock(0) & ~(1 << (SIGTSTP-1)));
  1651. #endif
  1652.     kill(0,SIGTSTP);        /* and do the stop */
  1653.     }
  1654.     sigset(SIGTSTP,stop_catcher);    /* unenable the stop */
  1655. }
  1656.  
  1657. /* come here on cont signal */
  1658.  
  1659. int
  1660. cont_catcher()
  1661. {
  1662.     sigset(SIGCONT,cont_catcher);
  1663.     savetty();
  1664. #ifdef MAILCALL;
  1665.     mailcount = 0;            /* force recheck */
  1666. #endif
  1667.     if (!panic) {
  1668.     if (!waiting) {
  1669. #ifdef DEBUGGING
  1670.         if (debug)
  1671.         write(2,"cont_catcher\n",13);
  1672. #endif
  1673.         noecho();            /* set no echo */
  1674.         crmode();            /* set cbreak mode */
  1675.         forceme("\f");        /* cause a refresh */
  1676.                     /* (defined only if TIOCSTI defined) */
  1677.     }
  1678.     }
  1679. }
  1680. #endif
  1681.  
  1682. !STUFFY!FUNK!
  1683. echo Extracting head.h
  1684. cat >head.h <<'!STUFFY!FUNK!'
  1685. /* $Header: head.h,v 4.3 85/05/01 11:38:31 lwall Exp $
  1686.  *
  1687.  * $Log:    head.h,v $
  1688.  * Revision 4.3  85/05/01  11:38:31  lwall
  1689.  * Baseline for release with 4.3bsd.
  1690.  * 
  1691.  */
  1692.  
  1693. #define HEAD_FIRST 1
  1694.  
  1695. /* types of header lines (if only C really believed in enums)
  1696.  * (These must stay in alphabetic order at least in the first letter.
  1697.  * Within each letter it helps to arrange in increasing likelihood.)
  1698.  */
  1699.  
  1700. #define PAST_HEADER    0    /* body */
  1701. #define SOME_LINE    1    /* unrecognized */
  1702. #define ARTID_LINE    2    /* article-i.d. */
  1703. #define APPR_LINE    3    /* approved */
  1704. #define DIST_LINE    4    /* distribution */
  1705. #define DATE_LINE    5    /* date */
  1706. #define RECEIVED_LINE    6    /* date-received */
  1707. #define EXPIR_LINE    7    /* expires */
  1708. #define FOLLOW_LINE    8    /* followup-to */
  1709. #define FROM_LINE    9    /* from */
  1710. #define KEYW_LINE    10    /* keywords */
  1711. #define LINES_LINE    11    /* lines */
  1712. #define MESSID_LINE    12    /* message-id */
  1713. #define NFFR_LINE    13    /* nf-from */
  1714. #define NFID_LINE    14    /* nf-id */
  1715. #define NGS_LINE    15    /* newsgroups */
  1716. #define ORG_LINE    16    /* organization */
  1717. #define PATH_LINE    17    /* path */
  1718. #define POSTED_LINE    18    /* posted */
  1719. #define PVER_LINE    19    /* posting-version */
  1720. #define REPLY_LINE    20    /* reply-to */
  1721. #define REFS_LINE    21    /* references */
  1722. #define RVER_LINE    22    /* relay-version */
  1723. #define SENDER_LINE    23    /* sender */
  1724. #define SUMRY_LINE    24    /* summary */
  1725. #define SUBJ_LINE    25    /* subject */
  1726. #define XREF_LINE    26    /* xref */
  1727.  
  1728. #define HEAD_LAST    27    /* one more than the last one above */
  1729.  
  1730. struct headtype {
  1731.     char *ht_name;        /* header line identifier */
  1732. #ifdef pdp11
  1733.     short ht_minpos;
  1734.     short ht_maxpos;
  1735. #else
  1736.     ART_POS ht_minpos;        /* pointer to beginning of line in article */
  1737.     ART_POS ht_maxpos;        /* pointer to end of line in article */
  1738. #endif
  1739.     char ht_length;        /* could make these into nybbles but */
  1740.     char ht_flags;        /* it wouldn't save space normally */
  1741. };                /* due to alignment considerations */
  1742.  
  1743. #define HT_HIDE 1    /* -h on this line */
  1744. #define HT_MAGIC 2    /* do any special processing on this line */
  1745.  
  1746. /* This array must stay in the same order as the list above */
  1747.  
  1748. #ifndef DOINIT
  1749. EXT struct headtype htype[HEAD_LAST];
  1750. #else
  1751. struct headtype htype[HEAD_LAST] = {
  1752.  /* name             minpos   maxpos  length   flag */
  1753.     {"BODY",        0,    0,    4,    0        },
  1754.     {"unrecognized",    0,    0,    12,    0        },
  1755.     {"article-i.d.",    0,    0,    12,    HT_HIDE        },
  1756.     {"approved",    0,    0,    8,    HT_HIDE        },
  1757.     {"distribution",    0,    0,    12,    0        },
  1758.     {"date",        0,    0,    4,    0        },
  1759.     {"date-received",    0,    0,    13,    0        },
  1760.     {"expires",        0,    0,    7,    HT_HIDE|HT_MAGIC},
  1761.     {"followup-to",    0,    0,    11,    0        },
  1762.     {"from",        0,    0,    4,    0        },
  1763.     {"keywords",    0,    0,    8,    0        },
  1764.     {"lines",        0,    0,    5,    0        },
  1765.     {"message-id",    0,    0,    10,    0        },
  1766.     {"nf-from",        0,    0,    7,    HT_HIDE        },
  1767.     {"nf-id",        0,    0,    5,    HT_HIDE        },
  1768.     {"newsgroups",    0,    0,    10,    HT_MAGIC|HT_HIDE},
  1769.     {"organization",    0,    0,    12,    0        },
  1770.     {"path",        0,    0,    4,    HT_HIDE        },
  1771.     {"posted",        0,    0,    6,    HT_HIDE        },
  1772.     {"posting-version",    0,    0,    15,    HT_HIDE        },
  1773.     {"reply-to",    0,    0,    8,    0        },
  1774.     {"references",    0,    0,    10,    0        },
  1775.     {"relay-version",    0,    0,    13,    HT_HIDE        },
  1776.     {"sender",        0,    0,    6,    0        },
  1777.     {"summary",        0,    0,    7,    0        },
  1778.     {"subject",        0,    0,    7,    HT_MAGIC    },
  1779.     {"xref",        0,    0,    4,    HT_HIDE        }
  1780. };
  1781. #endif
  1782.  
  1783. #ifdef ASYNC_PARSE
  1784. EXT ART_NUM parsed_art INIT(0);
  1785. #endif
  1786.  
  1787. EXT char in_header INIT(0);        /* are we decoding the header? */
  1788.  
  1789. #ifdef CACHESUBJ
  1790.     EXT char **subj_list INIT(Null(char **));
  1791. #endif
  1792.  
  1793. void    head_init();
  1794. int    set_line_type();
  1795. void    start_header();
  1796. bool    parseline();
  1797. #ifdef ASYNC_PARSE
  1798.     int        parse_maybe();
  1799. #endif
  1800. char    *fetchsubj();
  1801. char    *fetchlines();
  1802. !STUFFY!FUNK!
  1803. echo Extracting newsetup.SH
  1804. cat >newsetup.SH <<'!STUFFY!FUNK!'
  1805. case $CONFIG in
  1806.     '') . config.sh ;;
  1807. esac
  1808. echo "Extracting newsetup (with variable substitutions)"
  1809. $spitshell >newsetup <<!GROK!THIS!
  1810. $startsh
  1811. # $Header: newsetup.SH,v 4.3 85/05/01 11:43:05 lwall Exp $
  1812. # $Log:    newsetup.SH,v $
  1813. # Revision 4.3  85/05/01  11:43:05  lwall
  1814. # Baseline for release with 4.3bsd.
  1815.  
  1816. export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed myself to sh."; sh \$0; kill \$\$)
  1817.  
  1818. : syntax: newsetup
  1819.  
  1820. : System dependencies
  1821. : You will want to change the definitions below to reflect the distribution
  1822. : areas around you.  If you have more areas than this you will need to modify
  1823. : the sed below.
  1824.  
  1825. locorg="$locpref"
  1826. organization="$orgpref"
  1827. city="$citypref"
  1828. state="$statepref"
  1829. cntry="$cntrypref"
  1830. cont="$contpref"
  1831. active="${active-/usr/lib/news/active}"
  1832.  
  1833. dotdir="\${DOTDIR-\${HOME-\$LOGDIR}}"
  1834. $rm -f \$dotdir/.oldnewsrc
  1835. $echo "Creating .newsrc in \$dotdir to be used by news programs."
  1836.  
  1837. case \$active in
  1838. ~*) active=\`$filexp \$active\` ;;
  1839. esac
  1840.  
  1841. : NOTE: SED WILL NOT TAKE MORE THAN 10 WFILES, SO BEWARE
  1842.  
  1843. $sort <\$active | $sed >/tmp/n.tmp\$\$    \\
  1844.     -e 's/^\([^ ]*\) .*\$/\1:/'    \\
  1845.     -e '/^control:/{'        \\
  1846.     -e "  w /tmp/n.test\$\$"    \\
  1847.     -e '  d'            \\
  1848.     -e '}'                \\
  1849.     -e '/^junk:/{'            \\
  1850.     -e "  w /tmp/n.test\$\$"    \\
  1851.     -e '  d'            \\
  1852.     -e '}'                \\
  1853.     -e '/test:/{'            \\
  1854.     -e "  w /tmp/n.test\$\$"    \\
  1855.     -e '  d'            \\
  1856.     -e '}'                \\
  1857.     -e "/^net\./{"            \\
  1858.     -e "  w /tmp/n.net\$\$"        \\
  1859.     -e '  d'            \\
  1860.     -e '}'                \\
  1861.     -e "/^mod\./{"            \\
  1862.     -e "  w /tmp/n.mod\$\$"        \\
  1863.     -e '  d'            \\
  1864.     -e '}'                \\
  1865.     -e "/^\$locorg\./{"        \\
  1866.     -e "  w /tmp/n.\$locorg\$\$"    \\
  1867.     -e '  d'            \\
  1868.     -e '}'                \\
  1869.     -e "/^\$organization\./{"    \\
  1870.     -e "  w /tmp/n.\$organization\$\$"    \\
  1871.     -e '  d'            \\
  1872.     -e '}'                \\
  1873.     -e "/^\$city\./{"        \\
  1874.     -e "  w /tmp/n.\$city\$\$"    \\
  1875.     -e '  d'            \\
  1876.     -e '}'                \\
  1877.     -e "/^\$state\./{"         \\
  1878.     -e "  w /tmp/n.\$state\$\$"    \\
  1879.     -e '  d'            \\
  1880.     -e '}'                \\
  1881.     -e "/^fa\./{"            \\
  1882.     -e "  w /tmp/n.fa\$\$"        \\
  1883.     -e '  d'            \\
  1884.     -e '}'
  1885.  
  1886. $sed </tmp/n.tmp\$\$ >/tmp/n.local\$\$    \\
  1887.     -e "/^\$cntry\./{"         \\
  1888.     -e "  w /tmp/n.\$cntry\$\$"    \\
  1889.     -e '  d'            \\
  1890.     -e '}'                \\
  1891.     -e "/^\$cont\./{"         \\
  1892.     -e "  w /tmp/n.\$cont\$\$"    \\
  1893.     -e '  d'            \\
  1894.     -e '}'                \\
  1895.     -e "/^to\./{"            \\
  1896.     -e "  w /tmp/n.to\$\$"        \\
  1897.     -e '  d'            \\
  1898.     -e '}'                \\
  1899.     -e "/\./{"            \\
  1900.     -e "  w /tmp/n.misc\$\$"    \\
  1901.     -e '  d'            \\
  1902.     -e '}'
  1903.  
  1904.  
  1905. if $test -s \$dotdir/.newsrc ; then
  1906.     $echo "Saving your current .newsrc as .oldnewsrc..."
  1907.     $mv -f \$dotdir/.newsrc \$dotdir/.oldnewsrc
  1908. fi
  1909.  
  1910. : newsrc order determined here
  1911. $cat \\
  1912.     /tmp/n.local\$\$ \\
  1913.     /tmp/n.\$locorg\$\$ \\
  1914.     /tmp/n.\$organization\$\$ \\
  1915.     /tmp/n.\$city\$\$ \\
  1916.     /tmp/n.\$state\$\$ \\
  1917.     /tmp/n.\$cntry\$\$ \\
  1918.     /tmp/n.\$cont\$\$ \\
  1919.     /tmp/n.mod\$\$ \\
  1920.     /tmp/n.net\$\$ \\
  1921.     /tmp/n.fa\$\$ \\
  1922.     /tmp/n.misc\$\$ \\
  1923.     /tmp/n.test\$\$ \\
  1924. | $uniq >\$dotdir/.newsrc
  1925.  
  1926. $rm -f    /tmp/n.to\$\$ \\
  1927.     /tmp/n.tmp\$\$ \\
  1928.     /tmp/n.local\$\$ \\
  1929.     /tmp/n.\$locorg\$\$ \\
  1930.     /tmp/n.\$organization\$\$ \\
  1931.     /tmp/n.\$city\$\$ \\
  1932.     /tmp/n.\$state\$\$ \\
  1933.     /tmp/n.\$cntry\$\$ \\
  1934.     /tmp/n.\$cont\$\$ \\
  1935.     /tmp/n.mod\$\$ \\
  1936.     /tmp/n.net\$\$ \\
  1937.     /tmp/n.fa\$\$ \\
  1938.     /tmp/n.misc\$\$ \\
  1939.     /tmp/n.test\$\$
  1940.  
  1941. $cat <<'EOH'
  1942. Done.
  1943.  
  1944. If you have never used the news system before, you may find the articles
  1945. in net.announce.newuser to be helpful.  There is also a manual entry for rn.
  1946.  
  1947. To get rid of newsgroups you aren't interested in, use the 'u' command.
  1948. Type h for help at any time while running rn.
  1949. EOH
  1950. !GROK!THIS!
  1951. $eunicefix newsetup
  1952. chmod 755 newsetup
  1953. !STUFFY!FUNK!
  1954. echo Extracting Makefile.SH
  1955. cat >Makefile.SH <<'!STUFFY!FUNK!'
  1956. case $CONFIG in
  1957.     '') . config.sh ;;
  1958. esac
  1959. echo "Extracting Makefile (with variable substitutions)"
  1960. cat >Makefile <<!GROK!THIS!
  1961. # $Header: Makefile.SH,v 4.3 85/05/01 11:33:26 lwall Exp $
  1962. #
  1963. # $Log:    Makefile.SH,v $
  1964. # Revision 4.3  85/05/01  11:33:26  lwall
  1965. # Baseline for release with 4.3bsd.
  1966.  
  1967. CC = $cc
  1968. rnbin = $rnbin
  1969. rnlib = $rnlib
  1970. mansrc = $mansrc
  1971. manext = $manext
  1972. CFLAGS = $iandd -O
  1973. LDFLAGS = $iandd
  1974. NDIRC = $ndirc
  1975. NDIRO = $ndiro
  1976.  
  1977. libs = $ndirlib $termlib $jobslib
  1978. !GROK!THIS!
  1979. cat >>Makefile <<'!NO!SUBS!'
  1980.  
  1981. public = rn newsetup newsgroups Pnews Rnmail
  1982. private = norm.saver mbox.saver ng.help art.help pager.help subs.help makedir filexp Pnews.header
  1983. manpages = rn.1 Pnews.1 Rnmail.1 newsetup.1 newsgroups.1
  1984. util = Makefile makedepend newsnews
  1985.  
  1986. h1 = addng.h art.h artio.h artsrch.h backpage.h bits.h cheat.h common.h
  1987. h2 = final.h head.h help.h init.h intrp.h kfile.h last.h ndir.h ng.h
  1988. h3 = ngdata.h ngsrch.h ngstuff.h only.h rcln.h rcstuff.h
  1989. h4 = respond.h rn.h search.h sw.h term.h util.h
  1990.  
  1991. h = $(h1) $(h2) $(h3) $(h4)
  1992.  
  1993. c1 = addng.c art.c artio.c artsrch.c backpage.c bits.c cheat.c
  1994. c2 = final.c head.c help.c init.c intrp.c kfile.c last.c $(NDIRC) ng.c
  1995. c3 = ngdata.c ngsrch.c ngstuff.c only.c rcln.c rcstuff.c
  1996. c4 = respond.c rn.c search.c sw.c term.c util.c
  1997.  
  1998. c = $(c1) $(c2) $(c3) $(c4)
  1999.  
  2000. obj1 = addng.o art.o artio.o artsrch.o backpage.o bits.o cheat.o
  2001. obj2 = final.o head.o help.o init.o intrp.o kfile.o last.o $(NDIRO) ng.o
  2002. obj3 = ngdata.o ngsrch.o ngstuff.o only.o rcln.o rcstuff.o
  2003. obj4 = respond.o rn.o search.o sw.o term.o util.o
  2004.  
  2005. obj = $(obj1) $(obj2) $(obj3) $(obj4)
  2006.  
  2007. lintflags = -phbvxac
  2008.  
  2009. add1 = Makefile.old Pnews Rnmail art.help
  2010. add2 = bsd config.h config.sh eunice filexp
  2011. add3 = loc makedepend makedir mbox.saver newsetup
  2012. add4 = newsgroups newsnews ng.help norm.saver pager.help
  2013. add5 = pdp11 rn subs.help usg v7
  2014.  
  2015. addedbyconf = $(add1) $(add2) $(add3) $(add4) $(add5)
  2016.  
  2017. # grrr
  2018. SHELL = /bin/sh
  2019.  
  2020. .c.o:
  2021.     $(CC) -c $(CFLAGS) $*.c
  2022.  
  2023. all: $(public) $(private) $(util)
  2024.     touch all
  2025.  
  2026. rn: $(obj)
  2027.     $(CC) $(LDFLAGS) $(obj) $(libs) -o rn
  2028.  
  2029. # if a .h file depends on another .h file...
  2030. $(h):
  2031.     touch $@
  2032.  
  2033. install: rn
  2034. # won't work with csh
  2035.     export PATH || exit 1
  2036.     - mv $(rnbin)/rn $(rnbin)/rn.old
  2037.     - if test `pwd` != $(rnbin); then cp $(public) $(rnbin); fi
  2038.     cd $(rnbin); chmod 755 $(public)
  2039.     chmod 755 makedir
  2040.     - ./makedir `./filexp $(rnlib)`
  2041.     - if test `pwd` != `./filexp $(rnlib)`; then cp INIT $(private) `./filexp $(rnlib)`; fi
  2042.     cd `./filexp $(rnlib)`; chmod 755 $(private)
  2043.     - if test ! -f `./filexp $(rnlib)/newsnews`; then cp newsnews `./filexp $(rnlib)`; fi
  2044.     - if test `pwd` != $(mansrc); then\
  2045. for page in $(manpages); do\
  2046. cp $$page $(mansrc)/`basename $$page .1`.$(manext);\
  2047. done;\
  2048. fi
  2049.  
  2050. clean:
  2051.     rm -f *.o
  2052.  
  2053. realclean:
  2054.     rm -f rn *.o core $(addedbyconf)
  2055.  
  2056. # The following lint has practically everything turned on.  Unfortunately,
  2057. # you have to wade through a lot of mumbo jumbo that can't be suppressed.
  2058. # If the source file has a /*NOSTRICT*/ somewhere, ignore the lint message
  2059. # for that spot.
  2060.  
  2061. lint:
  2062.     lint $(lintflags) $(defs) $(c) > rn.fuzz
  2063.  
  2064. depend:
  2065.     makedepend
  2066.  
  2067. # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
  2068. $(obj):
  2069.     @ echo "You haven't done a "'"make depend" yet!'; exit 1
  2070. !NO!SUBS!
  2071. $eunicefix Makefile
  2072. !STUFFY!FUNK!
  2073. echo Extracting ngsrch.c
  2074. cat >ngsrch.c <<'!STUFFY!FUNK!'
  2075. /* $Header: ngsrch.c,v 4.3 85/05/01 11:44:51 lwall Exp $
  2076.  *
  2077.  * $Log:    ngsrch.c,v $
  2078.  * Revision 4.3  85/05/01  11:44:51  lwall
  2079.  * Baseline for release with 4.3bsd.
  2080.  * 
  2081.  */
  2082.  
  2083. #include "EXTERN.h"
  2084. #include "common.h"
  2085. #include "rcstuff.h"
  2086. #include "final.h"
  2087. #include "search.h"
  2088. #include "rn.h"
  2089. #include "util.h"
  2090. #include "term.h"
  2091. #include "rcln.h"
  2092. #include "INTERN.h"
  2093. #include "ngsrch.h"
  2094.  
  2095. #ifdef NGSORONLY
  2096.     COMPEX ngcompex;
  2097. #endif
  2098.  
  2099. void
  2100. ngsrch_init()
  2101. {
  2102. #ifdef ZEROGLOB
  2103.     init_compex(&ngcompex);
  2104. #endif    /* ZEROGLOB */
  2105.     ;
  2106. }
  2107.  
  2108. #ifdef NGSEARCH
  2109. int
  2110. ng_search(patbuf,get_cmd)
  2111. char *patbuf;                /* if patbuf != buf, get_cmd must */
  2112. int get_cmd;                /*   be set to FALSE!!! */
  2113. {
  2114.     char *pattern;            /* unparsed pattern */
  2115.     register char cmdchr = *patbuf;    /* what kind of search? */
  2116.     register char *s;
  2117.     bool backward = cmdchr == '?';    /* direction of search */
  2118.  
  2119.     int_count = 0;
  2120.     if (get_cmd && buf == patbuf)
  2121.     if (!finish_command(FALSE))        /* get rest of command */
  2122.         return NGS_ABORT;
  2123.     for (pattern = patbuf+1; *pattern == ' '; pattern++) ;
  2124.     if (*pattern) {
  2125.     ng_doread = FALSE;
  2126.     }
  2127.     s = rindex(pattern,cmdchr);
  2128.     if (s != Nullch && *(s-1) != '\\') {
  2129.     *s++ = '\0';
  2130.     if (index(s,'r') != Nullch)
  2131.         ng_doread = TRUE;
  2132.     }
  2133.     if ((s = ng_comp(&ngcompex,pattern,TRUE,TRUE)) != Nullch) {
  2134.                     /* compile regular expression */
  2135.     printf("\n%s\n",s) FLUSH;
  2136.     return NGS_ABORT;
  2137.     }
  2138.     fputs("\nSearching...",stdout) FLUSH;    /* give them something to read */
  2139.     fflush(stdout);
  2140.     for (;;) {
  2141.     if (int_count) {
  2142.         int_count = 0;
  2143.         return NGS_INTR;
  2144.     }
  2145.     if (backward) {
  2146.         if (ng > 0)
  2147.         --ng;
  2148.         else
  2149.         ng = nextrcline;
  2150.     }
  2151.     else {
  2152.         if (ng >= nextrcline)
  2153.         ng = 0;
  2154.         else
  2155.         ++ng;
  2156.     }
  2157.     if (ng == current_ng)
  2158.         return NGS_NOTFOUND;
  2159.     if (ng == nextrcline || toread[ng] < TR_NONE || !ng_wanted())
  2160.         continue;
  2161.     if (toread[ng] == TR_NONE)
  2162.         set_toread(ng);
  2163.     
  2164.     if (toread[ng] > TR_NONE)
  2165.         return NGS_FOUND;
  2166.     else if (toread[ng] == TR_NONE)
  2167.         if (ng_doread)
  2168.         return NGS_FOUND;
  2169.         else
  2170.         printf("\n[0 unread in %s--skipping]",rcline[ng]) FLUSH;
  2171.     }
  2172. }
  2173.  
  2174. bool
  2175. ng_wanted()
  2176. {
  2177.     return execute(&ngcompex,rcline[ng]) != Nullch;
  2178. }
  2179. #endif
  2180.  
  2181. #ifdef NGSORONLY
  2182. char *
  2183. ng_comp(compex,pattern,RE,fold)
  2184. COMPEX *compex;
  2185. char *pattern;
  2186. bool RE;
  2187. bool fold;
  2188. {
  2189.     char ng_pattern[128];
  2190.     register char *s = pattern, *d = ng_pattern;
  2191.  
  2192.     if (!*s)
  2193.     return Nullch;            /* reuse old pattern */
  2194.     for (; *s; s++) {
  2195.     if (*s == '.') {
  2196.         *d++ = '\\';
  2197.         *d++ = *s;
  2198.     }
  2199.     else if (*s == '?') {
  2200.         *d++ = '.';
  2201.     }
  2202.     else if (*s == '*') {
  2203.         *d++ = '.';
  2204.         *d++ = *s;
  2205.     }
  2206.     else if (strnEQ(s,"all",3)) {
  2207.         *d++ = '.';
  2208.         *d++ = '*';
  2209.         s += 2;
  2210.     }
  2211.     else
  2212.         *d++ = *s;
  2213.     }
  2214.     *d = '\0';
  2215.     return compile(compex,ng_pattern,RE,fold);
  2216. }
  2217. #endif
  2218.  
  2219. !STUFFY!FUNK!
  2220. echo Extracting art.help.SH
  2221. cat >art.help.SH <<'!STUFFY!FUNK!'
  2222. case $CONFIG in
  2223.     '') . config.sh ;;
  2224. esac
  2225. echo "Extracting art.help (with variable substitutions)"
  2226. $spitshell >art.help <<!GROK!THIS!
  2227. $startsh
  2228. # $Header: art.help.SH,v 4.3 85/05/01 11:35:34 lwall Exp $
  2229. # $Log:    art.help.SH,v $
  2230. # Revision 4.3  85/05/01  11:35:34  lwall
  2231. # Baseline for release with 4.3bsd.
  2232. $pager <<'EOT'
  2233. Article Selection commands:
  2234.  
  2235. n,SP    Scan forward for next unread article.
  2236. N    Go to next article.
  2237. ^N    Scan forward for next unread article with same subject.
  2238. p,P,^P    Same as n,N,^N, only going backwards.
  2239. -    Go to previously displayed article.
  2240. number    Go to specified article.
  2241. range{,range} command{:command}
  2242.     Apply one or more commands to one or more ranges of articles.
  2243.     Ranges are of the form: number | number-number.  You may use . for
  2244.     the current article, and $ for the last article.
  2245.      Valid commands are: j, m, M, s, S, and !.
  2246. /pattern/modifiers
  2247.     Scan forward for article containing pattern in the subject line.
  2248.     (Use ?pat? to scan backwards; append h to scan headers, a to scan
  2249.     entire articles, r to scan read articles, c to make case sensitive.
  2250. /pattern/modifiers:command{:command}
  2251.     Apply one or more commands to the set of articles matching pattern.
  2252.     Use a K modifier to save entire command to the KILL file for this
  2253.     newsgroup.  Commands m and M, if first, imply an r modifier.
  2254.      Valid commands are: j, m, M, s, S, and !.
  2255. f,F    Submit a followup article (F = include this article).
  2256. r,R    Reply through net mail (R = include this article).
  2257. s ...    Save to file or pipe via sh.
  2258. S ...    Save via preferred shell.
  2259. w,W    Like s and S but save without the header.
  2260. | ...    Same as s|...
  2261. C    Cancel this article, if yours.
  2262. ^R,v    Restart article (v=verbose).
  2263. ^X    Restart article, rot13 mode.
  2264. c    Catch up (mark all articles as read).
  2265. ^B    Back up one page.
  2266. ^L    Refresh the screen.  You can get back to the pager with this.
  2267. X    Refresh screen in rot13 mode.
  2268. ^    Go to first unread article.  Disables subject search mode.
  2269. $    Go to end of newsgroup.  Disables subject search mode.
  2270. #       Print last article number.
  2271. &    Print current values of command-line switches.
  2272. &switch {switch}
  2273.     Set or unset more switches.
  2274. &&    Print current macro definitions.
  2275. &&def    Define a new macro.
  2276. j    Junk this article (mark it read).  Stays at end of article.
  2277. m    Mark article as still unread.
  2278. M    Mark article as still unread upon exiting newsgroup or Y command.
  2279. Y    Yank back articles marked temporarily read via M.
  2280. k    Mark current SUBJECT as read.
  2281. K    Mark current SUBJECT as read, and save command in KILL file.
  2282. =    List subjects of unread articles.
  2283. u    Unsubscribe to this newsgroup.
  2284. ^K    Edit local KILL file (the one for this newsgroup).
  2285. q    Quit this newsgroup for now.
  2286. Q    Quit newsgroup, staying at current newsgroup.
  2287. EOT
  2288.  
  2289. !GROK!THIS!
  2290. $eunicefix art.help
  2291. chmod 755 art.help
  2292. !STUFFY!FUNK!
  2293. echo Extracting cheat.c
  2294. cat >cheat.c <<'!STUFFY!FUNK!'
  2295. /* $Header: cheat.c,v 4.3 85/05/01 11:36:46 lwall Exp $
  2296.  *
  2297.  * $Log:    cheat.c,v $
  2298.  * Revision 4.3  85/05/01  11:36:46  lwall
  2299.  * Baseline for release with 4.3bsd.
  2300.  * 
  2301.  */
  2302.  
  2303. #include "EXTERN.h"
  2304. #include "common.h"
  2305. #include "intrp.h"
  2306. #include "search.h"
  2307. #include "ng.h"
  2308. #include "bits.h"
  2309. #include "artio.h"
  2310. #include "term.h"
  2311. #include "artsrch.h"
  2312. #include "head.h"
  2313. #include "INTERN.h"
  2314. #include "cheat.h"
  2315.  
  2316. /* see what we can do while they are reading */
  2317.  
  2318. #ifdef PENDING
  2319. #   ifdef ARTSEARCH
  2320.     COMPEX srchcompex;        /* compiled regex for searchahead */
  2321. #   endif
  2322. #endif
  2323.  
  2324. void
  2325. cheat_init()
  2326. {
  2327.     ;
  2328. }
  2329.  
  2330. #ifdef PENDING
  2331. void
  2332. look_ahead()
  2333. {
  2334. #ifdef ARTSEARCH
  2335.     register char *h, *s;
  2336.  
  2337. #ifdef DEBUGGING
  2338.     if (debug && srchahead) {
  2339.     printf("(%ld)",(long)srchahead);
  2340.     fflush(stdout);
  2341.     }
  2342. #endif
  2343.     if (srchahead && srchahead < art) {    /* in ^N mode? */
  2344.     char *pattern;
  2345.  
  2346.     pattern = buf+1;
  2347.     strcpy(pattern,": *");
  2348.     h = pattern + strlen(pattern);
  2349.     interp(h,(sizeof buf) - (h-buf),"%s");
  2350.     h[24] = '\0';        /* compensate for notesfiles */
  2351.     while (*h) {
  2352.         if (index("\\[.^*$'\"",*h) != Nullch)
  2353.         *h++ = '.';
  2354.         else
  2355.         h++;
  2356.     }
  2357. #ifdef DEBUGGING
  2358.     if (debug & DEB_SEARCH_AHEAD) {
  2359.         fputs("(hit CR)",stdout);
  2360.         fflush(stdout);
  2361.         gets(buf+128);
  2362.         printf("\npattern = %s\n",pattern);
  2363.     }
  2364. #endif
  2365.     if ((s = compile(&srchcompex,pattern,TRUE,TRUE)) != Nullch) {
  2366.                     /* compile regular expression */
  2367.         printf("\n%s\n",s);
  2368.         srchahead = 0;
  2369.     }
  2370.     if (srchahead) {
  2371.         srchahead = art;
  2372.         for (;;) {
  2373.         srchahead++;    /* go forward one article */
  2374.         if (srchahead > lastart) { /* out of articles? */
  2375. #ifdef DEBUGGING
  2376.             if (debug)
  2377.             fputs("(not found)",stdout);
  2378. #endif
  2379.             break;
  2380.         }
  2381.         if (!was_read(srchahead) &&
  2382.             wanted(&srchcompex,srchahead,0)) {
  2383.                     /* does the shoe fit? */
  2384. #ifdef DEBUGGING
  2385.             if (debug)
  2386.             printf("(%ld)",(long)srchahead);
  2387. #endif
  2388.             artopen(srchahead);
  2389.             break;
  2390.         }
  2391.         if (input_pending())
  2392.             break;
  2393.         }
  2394.         fflush(stdout);
  2395.     }
  2396.     }
  2397.     else
  2398. #endif
  2399.     {
  2400.     if (art+1 <= lastart)/* how about a pre-fetch? */
  2401.         artopen(art+1);    /* look for the next article */
  2402.     }
  2403. }
  2404. #endif
  2405.  
  2406. /* see what else we can do while they are reading */
  2407.  
  2408. void
  2409. collect_subjects()
  2410. {
  2411. #ifdef PENDING
  2412. # ifdef CACHESUBJ
  2413.     ART_NUM oldart = openart;
  2414.     ART_POS oldartpos;
  2415.  
  2416.     if (!in_ng || !srchahead)
  2417.     return;
  2418.     if (oldart)            /* remember where we were in art */
  2419.     oldartpos = ftell(artfp);
  2420.     if (srchahead >= subj_to_get)
  2421.     subj_to_get = srchahead+1;
  2422.     while (!input_pending() && subj_to_get <= lastart)
  2423.     fetchsubj(subj_to_get++,FALSE,FALSE);
  2424.     if (oldart) {
  2425.     artopen(oldart);
  2426.     fseek(artfp,oldartpos,0);    /* do not screw the pager */
  2427.     }
  2428. # endif
  2429. #endif
  2430. }
  2431.  
  2432. !STUFFY!FUNK!
  2433. echo Extracting header.h.2.pat
  2434. cat >header.h.2.pat <<'!STUFFY!FUNK!'
  2435. *** header.old.h    Tue Apr 30 14:33:33 1985
  2436. --- header.h        Tue Apr 30 14:33:35 1985
  2437. ***************
  2438. *** 35,39
  2439.       char    approved[BUFLEN];    /* Approved:        */
  2440.       char    nf_id[BUFLEN];        /* Nf-ID:        */
  2441.       char    nf_from[BUFLEN];    /* Nf-From:        */
  2442.       char    *unrec[NUNREC];        /* unrecognized lines    */
  2443.   };
  2444.  
  2445. --- 35,42 -----
  2446.       char    approved[BUFLEN];    /* Approved:        */
  2447.       char    nf_id[BUFLEN];        /* Nf-ID:        */
  2448.       char    nf_from[BUFLEN];    /* Nf-From:        */
  2449. + #ifdef DOXREFS
  2450. +     char    xref[BUFLEN];        /* Xref:        */
  2451. + #endif DOXREFS
  2452.       char    *unrec[NUNREC];        /* unrecognized lines    */
  2453.   };
  2454. !STUFFY!FUNK!
  2455. echo ""
  2456. echo "End of kit 7 (of 9)"
  2457. cat /dev/null >kit7isdone
  2458. config=true
  2459. for iskit in 1 2 3 4 5 6 7 8 9; do
  2460.     if test -f kit${iskit}isdone; then
  2461.     echo "You have run kit ${iskit}."
  2462.     else
  2463.     echo "You still need to run kit ${iskit}."
  2464.     config=false
  2465.     fi
  2466. done
  2467. case $config in
  2468.     true)
  2469.     echo "You have run all your kits.  Please read README and then type Configure."
  2470.     chmod 755 Configure
  2471.     ;;
  2472. esac
  2473. : I do not append .signature, but someone might mail this.
  2474. exit
  2475.  
  2476.