|
|
1.1 root 1: /* $Header: common.h,v 4.3.1.4 86/10/31 15:46:09 lwall Exp $
2: *
3: * $Log: common.h,v $
4: * Revision 4.3.1.4 86/10/31 15:46:09 lwall
5: * Expanded maximum number of .newsrc lines for net reorganization.
6: *
7: * Revision 4.3.1.3 85/05/23 17:19:32 lwall
8: * Now allows 'r' and 'f' on null articles.
9: *
10: * Revision 4.3.1.2 85/05/13 09:30:39 lwall
11: * Added CUSTOMLINES option.
12: *
13: * Revision 4.3.1.1 85/05/10 11:32:04 lwall
14: * Branch for patches.
15: *
16: * Revision 4.3 85/05/01 11:37:11 lwall
17: * Baseline for release with 4.3bsd.
18: *
19: */
20:
21: #include "config.h" /* generated by installation script */
22: #ifdef WHOAMI
23: # include <whoami.h>
24: #endif
25:
26: #include <stdio.h>
27: #include <sys/types.h>
28: #include <sys/stat.h>
29: #include <ctype.h>
30:
31: #ifndef isalnum
32: # define isalnum(c) (isalpha(c) || isdigit(c))
33: #endif
34:
35: #include <errno.h>
36: #include <signal.h>
37: #ifdef IOCTL
38: #include <sys/ioctl.h>
39: #endif IOCTL
40:
41: #ifdef FCNTL
42: # include <fcntl.h>
43: #endif
44:
45: #ifdef TERMIO
46: # include <termio.h>
47: #else
48: # include <sgtty.h>
49: #endif
50:
51: #ifdef GETPWENT
52: # include <pwd.h>
53: #endif
54:
55: #define BITSPERBYTE 8
56: #define LBUFLEN 512 /* line buffer length */
57: /* (don't worry, .newsrc lines can exceed this) */
58: #ifdef pdp11
59: # define CBUFLEN 256 /* command buffer length */
60: # define PUSHSIZE 128
61: #else
62: # define CBUFLEN 512 /* command buffer length */
63: # define PUSHSIZE 256
64: #endif
65: #ifdef pdp11
66: # define MAXFILENAME 128
67: #else
68: # define MAXFILENAME 512
69: #endif
70: #define LONGKEY 15 /* longest keyword: currently "posting-version" */
71: #define FINISHCMD 0177
72:
73: /* some handy defs */
74:
75: #define bool char
76: #define TRUE (1)
77: #define FALSE (0)
78: #define Null(t) ((t)0)
79: #define Nullch Null(char *)
80: #define Nullfp Null(FILE *)
81:
82: #define Ctl(ch) (ch & 037)
83:
84: #define strNE(s1,s2) (strcmp(s1,s2))
85: #define strEQ(s1,s2) (!strcmp(s1,s2))
86: #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
87: #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
88:
89: /* Things we can figure out ourselves */
90:
91: #ifdef SIGTSTP
92: # define BERKELEY /* include job control signals? */
93: #endif
94:
95: #ifdef SIGPROF
96: # define BSD42 /* do we have Berkeley 4.2? */
97: #endif
98:
99: #ifdef FIONREAD
100: # define PENDING
101: #else
102: # ifdef O_NDELAY
103: # define PENDING
104: # endif
105: #endif
106:
107: #ifdef EUNICE
108: # define LINKART /* add 1 level of possible indirection */
109: # define UNLINK(victim) while (!unlink(victim))
110: #else
111: # define UNLINK(victim) unlink(victim)
112: #endif
113:
114: /* Valid substitutions for strings marked with % comment are:
115: * %a Current article number
116: * %A Full name of current article (%P/%c/%a)
117: * (if LINKART defined, is the name of the real article)
118: * %b Destination of a save command, a mailbox or command
119: * %B The byte offset to the beginning of the article for saves
120: * with or without the header
121: * %c Current newsgroup, directory form
122: * %C Current newsgroup, dot form
123: * %d %P/%c
124: * %D Old Distribution: line
125: * %f Old From: line or Reply-To: line
126: * %F Newsgroups to followup to from Newsgroups: and Followup-To:
127: * %h Name of header file to pass to mail or news poster
128: * %H Host name (yours)
129: * %i Old Message-I.D.: line, with <>
130: * %I Inclusion indicator
131: * %l News administrator login name
132: * %L Login name (yours)
133: * %M Number of articles markd with M
134: * %n Newsgroups from source article
135: * %N Full name (yours)
136: * %o Organization (yours)
137: * %O Original working directory (where you ran rn from)
138: * %p Your private news directory (-d switch)
139: * %P Public news spool directory (SPOOLDIR)
140: * %r Last reference (parent article id)
141: * %R New references list
142: * %s Subject, with all Re's and (nf)'s stripped off
143: * %S Subject, with one Re stripped off
144: * %t New To: line derived from From: and Reply-To (Internet always)
145: * %T New To: line derived from Path:
146: * %u Number of unread articles
147: * %U Number of unread articles disregarding current article
148: * %x News library directory, usually /usr/lib/news
149: * %X Rn library directory, usually %x/rn
150: * %z Size of current article in bytes.
151: * %~ Home directory
152: * %. Directory containing . files
153: * %$ current process number
154: * %{name} Environment variable "name". %{name-default} form allowed.
155: * %[name] Header line beginning with "Name: ", without "Name: "
156: * %"prompt"
157: * Print prompt and insert what is typed.
158: * %`command`
159: * Insert output of command.
160: * %(test_text=pattern?if_text:else_text)
161: * Substitute if_text if test_text matches pattern, otherwise
162: * substitute else_text. Use != for negated match.
163: * % substitutions are done on test_text, if_text, and else_text.
164: * (Note: %() only works if CONDSUB defined.)
165: * %digit Substitute the text matched by the nth bracket in the last
166: * pattern that had brackets. %0 matches the last bracket
167: * matched, in case you had alternatives.
168: *
169: * Put ^ in the middle to capitalize the first letter: %^C = Net.jokes
170: * Put _ in the middle to capitalize last component: %_c = net/Jokes
171: *
172: * ~ interpretation in filename expansion happens after % expansion, so
173: * you could put ~%{NEWSLOGNAME-news} and it will expand correctly.
174: */
175:
176: /* *** System Dependent Stuff *** */
177:
178: /* NOTE: many of these are defined in the config.h file */
179:
180: /* name of organization */
181: #ifndef ORGNAME
182: # define ORGNAME "ACME Widget Company, Widget Falls, Southern North Dakota"
183: #endif
184:
185: #ifndef MBOXCHAR
186: # define MBOXCHAR 'F' /* how to recognize a mailbox by 1st char */
187: #endif
188:
189: #ifndef ROOTID
190: # define ROOTID 0 /* uid of superuser */
191: #endif
192:
193: #ifdef NORMSIG
194: # define sigset signal
195: # define sigignore(sig) signal(sig,SIG_IGN)
196: #endif
197:
198: #ifndef LOGDIRFIELD
199: # define LOGDIRFIELD 6 /* Which field (origin 1) is the */
200: /* login directory in /etc/passwd? */
201: /* (If it is not kept in passwd, */
202: /* but getpwnam() returns it, */
203: /* define the symbol GETPWENT) */
204: #endif
205: #ifndef GCOSFIELD
206: # define GCOSFIELD 5
207: #endif
208:
209: #ifndef NEGCHAR
210: # define NEGCHAR '!'
211: #endif
212:
213: /* Space conservation section */
214:
215: /* To save D space, cut down size of MAXRCLINE, NGMAX, VARYSIZE. */
216: #define MAXRCLINE 1000 /* number of lines allowed in .newsrc */
217: /* several parallel arrays affected. */
218: /* (You can have more lines in the active file, */
219: /* just not in the .newsrc) */
220: #define HASHSIZ 1103 /* should be prime, and at least MAXRCLINE + 10% */
221: #define NGMAX 100 /* number of newsgroups allowed on command line */
222: /* undefine ONLY symbol to disable "only" feature */
223: #define VARYSIZE 256 /* this makes a block 1024 bytes long in DECville */
224: /* (used by virtual array routines) */
225:
226: /* Undefine any of the following features to save both I and D space */
227: /* In general, earlier ones are easier to get along without */
228: /* Pdp11's without split I and D may have to undefine them all */
229: #define DEBUGGING /* include debugging code */
230: #define CUSTOMLINES /* include code for HIDELINE and PAGESTOP */
231: #define PUSHBACK /* macros and keymaps using pushback buffer */
232: #define SPEEDOVERMEM /* use more memory to run faster */
233: #define WORDERASE /* enable ^W to erase a word */
234: #define MAILCALL /* check periodically for mail */
235: #define CLEAREOL /* use clear to end-of-line instead of clear screen */
236: #define NOFIREWORKS /* keep whole screen from flashing on certain */
237: /* terminals such as older Televideos */
238: #define VERIFY /* echo the command they just typed */
239: #define HASHNG /* hash newsgroup lines for fast lookup-- */
240: /* linear search used if not defined */
241: #define CONDSUB /* allow %(cond?text:text) */
242: #define BACKTICK /* allow %`command` */
243: #define PROMPTTTY /* allow %"prompt" */
244: #define ULSMARTS /* catch _^H in text and do underlining */
245: #define TERMMOD /* allow terminal type modifier on switches */
246: #define BAUDMOD /* allow baudrate modifier on switches */
247: #define GETLOGIN /* use getlogin() routine as backup to environment */
248: /* variables USER or LOGNAME */
249: #define ORGFILE /* if organization begins with /, look up in file */
250: #define TILDENAME /* allow ~logname expansion */
251: #define SETENV /* allow command line environment variable setting */
252: #define GETWD /* use our getwd() instead of piped in pwd */
253: #ifndef BSD42 /* 4.2 sites should just use groups for this */
254: #define SETUIDGID /* substitute eaccess() for access() so that rn */
255: /* can run setuid or setgid */
256: /* if not setuid or setgid, you don't need it */
257: #endif
258: #define MAKEDIR /* use our makedir() instead of shell script */
259: #define MEMHELP /* keep help messages in memory */
260: #define VERBOSE /* compile in more informative messages */
261: #define TERSE /* compile in shorter messages */
262: /* (Note: both VERBOSE and TERSE can be defined; -t
263: * sets terse mode. One or the other MUST be defined.
264: */
265: #ifndef pdp11
266: # define CACHESUBJ /* cache subject lines in memory */
267: /* without this ^N still works but runs really slow */
268: /* but you save lots and lots of D space */
269: # define CACHEFIRST /* keep absolute first article numbers in memory */
270: /* cost: about 2k */
271: #endif
272: #define ROTATION /* enable x, X and ^X commands to work */
273: #define DELBOGUS /* ask if bogus newsgroups should be deleted */
274: #define RELOCATE /* allow newsgroup rearranging */
275: #define ESCSUBS /* escape substitutions in multi-character commands */
276: #define DELAYMARK /* allow articles to be temporarily marked as read */
277: /* until exit from current newsgroup or Y command */
278: #define MCHASE /* unmark xrefed articles on m or M */
279: #define MUNGHEADER /* allow alternate header formatting via */
280: /* environment variable ALTHEADER (not impl) */
281: #define ASYNC_PARSE /* allow parsing headers asyncronously to reading */
282: /* used by MCHASE and MUNGHEADER */
283: #define FINDNEWNG /* check for new newsgroups on startup */
284: #define FASTNEW /* do optimizations on FINDNEWNG for faster startup */
285: /* (this optimization can make occasional mistakes */
286: /* if a group is removed and another group of the */
287: /* same length is added, and if no softpointers are */
288: /* affected by said change.) */
289: #define INNERSEARCH /* search command 'g' with article */
290: #define CATCHUP /* catchup command at newsgroup level */
291: #define NGSEARCH /* newsgroup pattern matching */
292: #define ONLY /* newsgroup restrictions by pattern */
293: #define KILLFILES /* automatic article killer files */
294: #define ARTSEARCH /* pattern searches among articles */
295: /* /, ?, ^N, ^P, k, K */
296:
297: /* some dependencies among options */
298:
299: #ifndef ARTSEARCH
300: # undef KILLFILES
301: # undef INNERSEARCH
302: # undef CACHESUBJ
303: #endif
304:
305: #ifndef DELAYMARK
306: # ifndef MCHASE
307: # ifndef MUNGHEADER
308: # undef ASYNC_PARSE
309: # endif
310: # endif
311: #endif
312:
313: #ifndef SETUIDGID
314: # define eaccess access
315: #endif
316:
317: #ifdef ONLY /* idiot lint doesn't grok #if */
318: # define NGSORONLY
319: #else
320: # ifdef NGSEARCH
321: # define NGSORONLY
322: # endif
323: #endif
324:
325: #ifdef VERBOSE
326: # ifdef TERSE
327: # define IF(c) if (c)
328: # define ELSE else
329: # else !TERSE
330: # define IF(c)
331: # define ELSE
332: # endif
333: #else !VERBOSE
334: # ifndef TERSE
335: # define TERSE
336: # endif
337: # define IF(c) "IF" outside of VERBOSE???
338: # define ELSE "ELSE" outside of VERBOSE???
339: #endif
340:
341: #ifdef DEBUGGING
342: # define assert(ex) {if (!(ex)){fprintf(stderr,"Assertion failed: file %s, line %d\n", __FILE__, __LINE__);sig_catcher(0);}}
343: #else
344: # define assert(ex) ;
345: #endif
346:
347: #ifdef SPEEDOVERMEM
348: # define OFFSET(x) (x)
349: #else
350: # define OFFSET(x) ((x)-absfirst)
351: #endif
352:
353: /* If you're strapped for space use the help messages in shell scripts */
354: /* if {NG,ART,PAGER,SUBS}HELP is undefined, help messages are in memory */
355: #ifdef MEMHELP /* undef MEMHELP above to get them all as sh scripts */
356: # undef NGHELP
357: # undef ARTHELP
358: # undef PAGERHELP
359: # undef SUBSHELP
360: #else
361: # ifndef NGHELP /* % and ~ */
362: # define NGHELP "%X/ng.help"
363: # endif
364: # ifndef ARTHELP /* % and ~ */
365: # define ARTHELP "%X/art.help"
366: # endif
367: # ifndef PAGERHELP /* % and ~ */
368: # define PAGERHELP "%X/pager.help"
369: # endif
370: # ifndef SUBSHELP /* % and ~ */
371: # define SUBSHELP "%X/subs.help"
372: # endif
373: #endif
374:
375: #ifdef CLEAREOL
376: # define TCSIZE 512 /* capacity for termcap strings */
377: #else
378: # ifdef pdp11
379: # define TCSIZE 256 /* capacity for termcap strings */
380: # else
381: # define TCSIZE 512 /* capacity for termcap srings */
382: # endif
383: #endif
384:
385: /* Additional ideas:
386: * Make the do_newsgroup() routine a separate process.
387: * Keep .newsrc on disk instead of in memory.
388: * Overlays, if you have them.
389: * Get a bigger machine.
390: */
391:
392: /* End of Space Conservation Section */
393:
394: /* More System Dependencies */
395:
396: /* news library */
397: #ifndef LIB /* ~ and %l only ("~%l" is permissable) */
398: # define LIB "/usr/lib/news"
399: #endif
400:
401: /* path to private executables */
402: #ifndef RNLIB /* ~, %x and %l only */
403: # define RNLIB "%x/rn"
404: #endif
405:
406: /* system-wide RNINIT switches */
407: #ifndef GLOBINIT
408: # define GLOBINIT "%X/INIT"
409: #endif
410:
411: /* where to find news files */
412: #ifndef SPOOL /* % and ~ */
413: # define SPOOL "/usr/spool/news"
414: #endif
415:
416: /* file containing list of active newsgroups and max article numbers */
417: #ifndef ACTIVE /* % and ~ */
418: # define ACTIVE "%x/active"
419: #endif
420:
421: /* location of history file */
422: #ifndef ARTFILE /* % and ~ */
423: # define ARTFILE "%x/history"
424: #endif
425:
426: /* command to setup a new .newsrc */
427: #ifndef NEWSETUP /* % and ~ */
428: # define NEWSETUP "newsetup"
429: #endif
430:
431: /* command to display a list of un-subscribed-to newsgroups */
432: #ifndef NEWSGROUPS /* % and ~ */
433: # define NEWSGROUPS "newsgroups"
434: #endif
435:
436: /* preferred shell for use in doshell routine */
437: /* ksh or sh would be okay here */
438: #ifndef PREFSHELL
439: # define PREFSHELL "/bin/csh"
440: #endif
441:
442: /* path to fastest starting shell */
443: #ifndef SH
444: # define SH "/bin/sh"
445: #endif
446:
447: /* path to default editor */
448: #ifndef DEFEDITOR
449: # define DEFEDITOR "/usr/ucb/vi"
450: #endif
451:
452: /* location of macro file */
453: #ifndef RNMACRO
454: # ifdef PUSHBACK
455: # define RNMACRO "%./.rnmac"
456: # endif
457: #endif
458:
459: /* location of full name */
460: #ifndef FULLNAMEFILE
461: # ifndef PASSNAMES
462: # define FULLNAMEFILE "%./.fullname"
463: # endif
464: #endif
465:
466: /* virtual array file name template */
467: #ifndef VARYNAME /* % and ~ */
468: # define VARYNAME "/tmp/rnvary.%$"
469: #endif
470:
471: /* file to pass header to followup article poster */
472: #ifndef HEADNAME /* % and ~ */
473: # define HEADNAME "%./.rnhead"
474: /* or alternately #define HEADNAME "/tmp/rnhead.%$" */
475: #endif
476:
477: #ifndef MAKEDIR
478: /* shell script to make n-deep subdirectories */
479: # ifndef DIRMAKER /* % and ~ */
480: # define DIRMAKER "%X/makedir"
481: # endif
482: #endif
483:
484: /* location of newsrc file */
485: #ifndef RCNAME /* % and ~ */
486: # define RCNAME "%./.newsrc"
487: #endif
488:
489: /* temporary newsrc file in case we crash while writing out */
490: #ifndef RCTNAME /* % and ~ */
491: # define RCTNAME "%./.newnewsrc"
492: #endif
493:
494: /* newsrc file at the beginning of this session */
495: #ifndef RCBNAME /* % and ~ */
496: # define RCBNAME "%./.oldnewsrc"
497: #endif
498:
499: /* if existent, contains process number of current or crashed rn */
500: #ifndef LOCKNAME /* % and ~ */
501: # define LOCKNAME "%./.rnlock"
502: #endif
503:
504: /* information from last invocation of rn */
505: #ifndef LASTNAME /* % and ~ */
506: # define LASTNAME "%./.rnlast"
507: #endif
508:
509: /* file with soft pointers into the active file */
510: #ifndef SOFTNAME /* % and ~ */
511: # define SOFTNAME "%./.rnsoft"
512: #endif
513:
514: /* list of article numbers to mark as unread later (see M and Y cmmands) */
515: #ifndef RNDELNAME /* % and ~ */
516: # define RNDELNAME "%./.rndelay"
517: #endif
518:
519: /* a motd-like file for rn */
520: #ifndef NEWSNEWSNAME /* % and ~ */
521: # define NEWSNEWSNAME "%X/newsnews"
522: #endif
523:
524: /* command to send a reply */
525: #ifndef MAILPOSTER /* % and ~ */
526: # define MAILPOSTER "Rnmail -h %h"
527: #endif
528:
529: #ifdef INTERNET
530: # ifndef MAILHEADER /* % */
531: # ifdef CONDSUB
532: # define MAILHEADER "To: %t\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\n%(%[references]!=^$?References\\: %[references]\n)Organization: %o\nCc: \nBcc: \n\n"
533: # else
534: # define MAILHEADER "To: %t\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\nReferences: %[references]\nCc: \nBcc: \n\n"
535: # endif
536: # endif
537: #else
538: # ifndef MAILHEADER /* % */
539: # ifdef CONDSUB
540: # define MAILHEADER "To: %T\nSubject: %(%i=^$?:Re: %S\nNewsgroups: %n\nIn-Reply-To: %i)\n%(%[references]!=^$?References\\: %[references]\n)Organization: %o\nCc: \nBcc: \n\n"
541: # else
542: # define MAILHEADER "To: %T\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\nReferences: %[references]\nCc: \nBcc: \n\n"
543: # endif
544: # endif
545: #endif
546:
547: #ifndef YOUSAID /* % */
548: # define YOUSAID "In article %i you write:"
549: #endif
550:
551: /* command to submit a followup article */
552: #ifndef NEWSPOSTER /* % and ~ */
553: # define NEWSPOSTER "Pnews -h %h"
554: #endif
555:
556: #ifndef NEWSHEADER /* % */
557: # ifdef CONDSUB
558: # define NEWSHEADER "Newsgroups: %(%F=^$?%C:%F)\nSubject: %(%S=^$?%\"\n\nSubject: \":Re: %S)\nSummary: \nExpires: \n%(%R=^$?:References: %R\n)Sender: \nReply-To: %L@%H.UUCP (%N)\nFollowup-To: \nDistribution: %(%i=^$?%\"Distribution: \":%D)\nOrganization: %o\nKeywords: %[keywords]\n\n"
559: # else
560: # define NEWSHEADER "Newsgroups: %F\nSubject: Re: %S\nSummary: \nExpires: \nReferences: %R\nSender: \nReply-To: %L@%H.UUCP (%N)\nFollowup-To: \nDistribution: %D\nOrganization: %o\nKeywords: %[keywords]\n\n"
561: # endif
562: #endif
563:
564: #ifndef ATTRIBUTION /* % */
565: # define ATTRIBUTION "In article %i %f writes:"
566: #endif
567:
568: #ifndef PIPESAVER /* % */
569: # ifdef CONDSUB
570: # define PIPESAVER "%(%B=^0$?<%A:tail +%Bc %A |) %b"
571: # else
572: # define PIPESAVER "tail +%Bc %A | %b"
573: # endif
574: #endif
575:
576: #ifndef NORMSAVER /* % and ~ */
577: # define NORMSAVER "%X/norm.saver %A %P %c %a %B %C \"%b\""
578: #endif
579:
580: #ifndef MBOXSAVER /* % and ~ */
581: # ifdef MININACT /* 2.10.2 site? */
582: # define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %`date`\""
583: # else
584: # ifdef CONDSUB
585: # define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %(%[date]=^\\(\\w*\\), \\(\\w*\\)-\\(\\w*\\)-\\(\\w*\\) \\([^ ]*\\)?%1 %3 %(%2=..?%2: %2) %5 19%4)\""
586: /* header munging with a vengeance */
587: # else
588: # define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %[posted]\""
589: # endif
590: # endif
591: #endif
592:
593: #ifdef MKDIRS
594:
595: # ifndef SAVEDIR /* % and ~ */
596: # define SAVEDIR "%p/%c"
597: # endif
598: # ifndef SAVENAME /* % */
599: # define SAVENAME "%a"
600: # endif
601:
602: #else
603:
604: # ifndef SAVEDIR /* % and ~ */
605: # define SAVEDIR "%p"
606: # endif
607: # ifndef SAVENAME /* % */
608: # define SAVENAME "%^C"
609: # endif
610:
611: #endif
612:
613: #ifndef KILLGLOBAL /* % and ~ */
614: # define KILLGLOBAL "%p/KILL"
615: #endif
616:
617: #ifndef KILLLOCAL /* % and ~ */
618: # define KILLLOCAL "%p/%c/KILL"
619: #endif
620:
621: /* how to cancel an article */
622: #ifndef CANCEL
623: # ifdef MININACT /* 2.10.2 ? */
624: # define CANCEL "%x/inews -h < %h"
625: # else
626: # define CANCEL "inews -h < %h"
627: # endif
628: #endif
629:
630: /* how to cancel an article, continued */
631: #ifndef CANCELHEADER
632: # define CANCELHEADER "Newsgroups: %n\nSubject: cmsg cancel %i\nReferences: %R\nReply-To: %L@%H.UUCP (%N)\nDistribution: %D\nOrganization: %o\n"
633: #endif
634:
635: /* where to find the mail file */
636: #ifndef MAILFILE
637: # define MAILFILE "/usr/spool/mail/%L"
638: #endif
639:
640: /* some important types */
641:
642: typedef int NG_NUM; /* newsgroup number */
643: typedef long ART_NUM; /* article number */
644: #ifdef pdp11
645: typedef short ART_UNREAD; /* ordinarily this should be long */
646: /* like ART_NUM, but assuming that */
647: /* we stay less than 32767 articles */
648: /* behind saves a lot of space. */
649: /* NOTE: do not make unsigned. */
650: #else
651: typedef long ART_UNREAD;
652: #endif
653: typedef long ART_POS; /* char position in article file */
654: typedef int ART_LINE; /* line position in article file */
655: typedef short ACT_POS; /* char position in active file */
656: typedef unsigned int MEM_SIZE; /* for passing to malloc */
657:
658: /* *** end of the machine dependent stuff *** */
659:
660: /* GLOBAL THINGS */
661:
662: /* file statistics area */
663:
664: EXT struct stat filestat;
665:
666: /* various things of type char */
667:
668: char *index();
669: char *rindex();
670: char *getenv();
671: char *strcat();
672: char *strcpy();
673: char *sprintf();
674:
675: EXT char buf[LBUFLEN+1]; /* general purpose line buffer */
676: EXT char cmd_buf[CBUFLEN]; /* buffer for formatting system commands */
677:
678: EXT char *indstr INIT(">"); /* indent for old article embedded in followup */
679:
680: EXT char *cwd INIT(Nullch); /* current working directory */
681: EXT char *dfltcmd INIT(Nullch); /* 1st char is default command */
682:
683: /* switches */
684:
685: #ifdef DEBUGGING
686: EXT int debug INIT(0); /* -D */
687: # define DEB_INNERSRCH 32
688: # define DEB_FILEXP 64
689: # define DEB_HASH 128
690: # define DEB_XREF_MARKER 256
691: # define DEB_CTLAREA_BITMAP 512
692: # define DEB_SOFT_POINTERS 1024
693: # define DEB_NEWSRC_LINE 2048
694: # define DEB_SEARCH_AHEAD 4096
695: # define DEB_CHECKPOINTING 8192
696: # define DEB_FEED_XREF 16384
697: #endif
698:
699: #ifdef ARTSEARCH
700: EXT int scanon INIT(0); /* -S */
701: #endif
702:
703: EXT bool mbox_always INIT(FALSE); /* -M */
704: EXT bool norm_always INIT(FALSE); /* -N */
705: EXT bool checkflag INIT(FALSE); /* -c */
706: EXT bool suppress_cn INIT(FALSE); /* -s */
707: EXT int countdown INIT(5); /* how many lines to list before invoking -s */
708: EXT bool muck_up_clear INIT(FALSE); /* -loco */
709: EXT bool erase_screen INIT(FALSE); /* -e */
710: #ifdef CLEAREOL
711: EXT bool can_home_clear INIT(FALSE); /* fancy -e -- PWP */
712: #endif CLEAREOL
713: EXT bool findlast INIT(FALSE); /* -r */
714: EXT bool typeahead INIT(FALSE); /* -T */
715: #ifdef VERBOSE
716: # ifdef TERSE
717: EXT bool verbose INIT(TRUE); /* +t */
718: # endif
719: #endif
720: #ifdef VERIFY
721: EXT bool verify INIT(FALSE); /* -v */
722: #endif
723:
724: #define NOMARKING 0
725: #define STANDOUT 1
726: #define UNDERLINE 2
727: EXT int marking INIT(NOMARKING); /* -m */
728:
729: EXT ART_LINE initlines INIT(0); /* -i */
730:
731: /* miscellania */
732:
733: long atol(), fseek(), ftell();
734: EXT bool in_ng INIT(FALSE); /* current state of rn */
735: EXT char mode INIT('i'); /* current state of rn */
736:
737: EXT FILE *tmpfp INIT(Nullfp); /* scratch fp used for .rnlock, .rnlast, etc. */
738:
739: EXT NG_NUM nextrcline INIT(0); /* 1st unused slot in rcline array */
740: /* startup to avoid checking twice in a row */
741:
742: extern errno;
743:
744: /* Factored strings */
745:
746: EXT char nullstr[] INIT("");
747: EXT char sh[] INIT(SH);
748: EXT char defeditor[] INIT(DEFEDITOR);
749: EXT char hforhelp[] INIT("Type h for help.\n");
750: #ifdef STRICTCR
751: EXT char badcr[] INIT("\nUnnecessary CR ignored.\n");
752: #endif
753: EXT char readerr[] INIT("rn read error");
754: EXT char unsubto[] INIT("\n\nUnsubscribed to newsgroup %s\n");
755: EXT char cantopen[] INIT("Can't open %s\n");
756: EXT char cantcreate[] INIT("Can't create %s\n");
757:
758: #ifdef VERBOSE
759: EXT char nocd[] INIT("Can't chdir to directory %s\n");
760: #else
761: EXT char nocd[] INIT("Can't find %s\n");
762: #endif
763:
764: #ifdef NOLINEBUF
765: #define FLUSH ,fflush(stdout)
766: #else
767: #define FLUSH
768: #endif
769:
770: #ifdef lint
771: #undef FLUSH
772: #define FLUSH
773: #undef putchar
774: #define putchar(c)
775: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.