[comp.sources.unix] v12i036: C News alpha release, Part11/14

rsalz@uunet.UU.NET (Rich Salz) (10/23/87)

Submitted-by: utzoo!henry (Henry Spencer)
Posting-number: Volume 12, Issue 36
Archive-name: cnews/part11


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 11 (of 14)."
if test -f 'lib.proto/newsgroups' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lib.proto/newsgroups'\"
else
echo shar: Extracting \"'lib.proto/newsgroups'\" \(16226 characters\)
sed "s/^X//" >'lib.proto/newsgroups' <<'END_OF_FILE'
Xcontrol		control message repository
Xjunk		rubbish bin
Xutstat.general	general-interest news for all users
Xutstat.hacknews	news primarily of interest to hacks
Xutstat.gripes	complaints (and answers thereto)
Xutstat.deadletter	disused dead-letter collection
Xutstat.test	local tests
Xutstat.control
Xutstat.junk
Xto.utstat	testing news links ...
Xto.utgpu
Xto.utzoo
Xut.general	U of T local groups ...
Xut.16k
Xut.vlsi
Xut.supercomputer
Xut.theory	vague CSRI CS `theory' group
Xut.na		numerical applications
Xtor.general	Toronto local groups ...
Xtor.news
Xtor.news.stats
Xont.general	General news local to Ontario sites ...
Xont.events	Seminars and the like at Ont. sites
Xont.jobs	Help-wanted column for Ont. sites
Xont.micro	micro-processors for Ont. sites
Xont.singles	pain and pleasure of singlitude for Ont. sites
Xont.uucp	status reports on connections from utzoo for Ont. sites
Xont.test
Xont.sf-lovers
Xcan.general	general news local to Canadian sites ...
Xcan.jobs
Xcan.ai
Xcan.politics
Xcan.francais
Xlist.ailist	mailing lists from Bitnet...
Xlist.bind
Xlist.can-inet
Xlist.comm-l
Xlist.dtp
Xlist.future-l
Xlist.ibm-nets
Xlist.info-1100
Xlist.info-futures
Xlist.info-nets
Xlist.info-postscript
Xlist.iso
Xlist.license
Xlist.macsyma
Xlist.mail-l
Xlist.mh-users
Xlist.mh-workers
Xlist.mhs_implementation
Xlist.namedroppers
Xlist.netmonth
Xlist.netnws-l
Xlist.neuron
Xlist.news-makers
Xlist.nl-kr
Xlist.nnmail-l
Xlist.rscsmods
Xlist.rscsv2-l
Xlist.s-comput
Xlist.sas-l
Xlist.security
Xlist.servers
Xlist.slug
Xlist.spssx-l
Xlist.std-l
Xlist.sun-spots
Xlist.texhax
Xlist.texmag-l
Xlist.trafic-l
Xlist.trans-l
Xlist.unix-sw
Xlist.unix-tex
Xlist.usrdir-l
Xlist.vision-list
Xlist.x400-l
Xlist.xpert
Xlist.domain-l
Xlist.pc-token
Xlist.big-lan
Xlist.humanist
Xlist.ibmtcp-l
Xcomp.ai			Artificial intelligence discussions.
Xcomp.ai.digest		Artificial Intelligence discussions. (Moderated)
Xcomp.arch		Computer architecture.
Xcomp.binaries.amiga	Encoded public domain programs in binary. (Moderated)
Xcomp.binaries.atari.st	Binary-only postings for the Atari ST. (Moderated)
Xcomp.binaries.ibm.pc	Binary-only postings for IBM PC/MS-DOS. (Moderated)
Xcomp.binaries.mac	Encoded Macintosh programs in binary. (Moderated)
Xcomp.bugs.2bsd		Reports of UNIX* version 2BSD related bugs.
Xcomp.bugs.4bsd		Reports of UNIX version 4BSD related bugs.
Xcomp.bugs.4bsd.ucb-fixes	Bug reports/fixes for BSD Unix. (Moderated)
Xcomp.bugs.misc		General UNIX bug reports and fixes (incl V7, uucp)
Xcomp.bugs.sys5		Reports of USG (System III, V, etc.) bugs.
Xcomp.cog-eng		Cognitive engineering.
Xcomp.compilers		Compiler construction, theory, etc. (Moderated)
Xcomp.databases		Database and data management issues and theory.
Xcomp.dcom.lans		Local area network hardware and software.
Xcomp.dcom.modems	Data communications hardware and software.
Xcomp.dcom.telecom	Telecommunications digest. (Moderated)
Xcomp.doc		Archived public-domain documentation. (Moderated)
Xcomp.doc.techreports	Lists of technical reports. (Moderated)
Xcomp.edu		Computer science education.
Xcomp.emacs		EMACS editors of different flavors.
Xcomp.graphics		Computer graphics, art, animation, image processing.
Xcomp.graphics.digest	Graphics software, hardware, theory, etc. (Moderated)
Xcomp.hypercube		Massively parallel systems: hardware & software. (Moderated)
Xcomp.lang.ada		Discussion about Ada*.
Xcomp.lang.apl		Discussion about APL.
Xcomp.lang.c		Discussion about C.
Xcomp.lang.c++		The object-oriented C++ language.
Xcomp.lang.forth		Discussion about Forth.
Xcomp.lang.fortran	Discussion about FORTRAN.
Xcomp.lang.lisp		Discussion about LISP.
Xcomp.lang.misc		Different computer languages not specifically listed.
Xcomp.lang.modula2	Discussion about Modula-2.
Xcomp.lang.pascal	Discussion about Pascal.
Xcomp.lang.prolog	Discussion about PROLOG.
Xcomp.lang.smalltalk	Discussion about Smalltalk 80.
Xcomp.laser-printers	Laser printers, hardware & software. (Moderated)
Xcomp.lsi		Large scale integrated circuits.
Xcomp.mail.elm		Discussion and fixes for ELM mail system. 
Xcomp.mail.headers	Gatewayed from the ARPA header-people list.
Xcomp.mail.maps		Various maps, including UUCP maps. (Moderated)
Xcomp.mail.misc		General discussions about computer mail.
Xcomp.mail.uucp		Mail in the uucp network environment.
Xcomp.misc		General topics about computers not covered elsewhere.
Xcomp.newprod		Announcements of new products of interest. (Moderated)
Xcomp.org.decus		DEC* Users' Society newsgroup.
Xcomp.org.fidonet	FidoNews digest, official news of FidoNet Assoc. (Moderated)
Xcomp.org.usenix		USENIX Association events and announcements.
Xcomp.os.cpm		Discussion about the CP/M operating system.
Xcomp.os.eunice		The SRI Eunice system.
Xcomp.os.minix		Discussion of Tanenbaum's MINIX system.
Xcomp.os.misc		General OS-oriented discussion not carried elsewhere.
Xcomp.os.os9		Discussions about the os9 operating system. (Moderated)
Xcomp.os.research	Operating systems and related areas. (Moderated)
Xcomp.os.vms		DEC's VAX* line of computers & VMS.
Xcomp.periphs		Peripheral devices.
Xcomp.protocols.appletalk	Applebus hardware & software.
Xcomp.protocols.kermit	Info about the Kermit package. (Moderated)
Xcomp.protocols.misc	Various forms and types of FTP protocol.
Xcomp.protocols.tcp-ip	TCP and IP network protocols.
Xcomp.risks		Risks to the public from computers & users. (Moderated)
Xcomp.society		The impact of technology on society. (Moderated)
Xcomp.sources.amiga	Source code-only postings for the Amiga. (Moderated)
Xcomp.sources.atari.st	Source code-only postings for the Atari ST. (Moderated)
Xcomp.sources.bugs	Bug reports, fixes, discussion for posted sources
Xcomp.sources.d		For any discussion of source postings.
Xcomp.sources.games	Postings of recreational software. (Moderated)
Xcomp.sources.mac	Software for the Apple Macintosh. (Moderated)
Xcomp.sources.misc	Posting of software . (Moderated)
Xcomp.sources.unix	Postings of complete, UNIX-oriented sources. (Moderated)
Xcomp.sources.wanted	Requests for software and fixes.
Xcomp.std.c		Discussion about C language standards. (Moderated)
Xcomp.std.internat	Discussion about international standards.
Xcomp.std.misc		Discussion about various standards. (Moderated)
Xcomp.std.mumps		Discussion for the X11.1 committee on Mumps. (Moderated)
Xcomp.std.unix		Discussion for the P1003 committee on UNIX. (Moderated)
Xcomp.sys.amiga		Commodore Amiga: info&uses, but no programs.
Xcomp.sys.apollo		Apollo computer systems.
Xcomp.sys.apple		Discussion about Apple micros.
Xcomp.sys.atari.8bit	Discussion about 8 bit Atari micros.
Xcomp.sys.atari.st	Discussion about 16 bit Atari micros.
Xcomp.sys.att		Discussions about AT&T microcomputers.
Xcomp.sys.cbm		Discussion about Commodore micros.
Xcomp.sys.dec		Discussions about DEC computer systems.
Xcomp.sys.hp		Discussion about Hewlett-Packard equipment.
Xcomp.sys.ibm.pc		Discussion about IBM personal computers.
Xcomp.sys.ibm.pc.digest	The IBM PC, PC-XT, and PC-AT. (Moderated)
Xcomp.sys.intel		Disucussions about Intel systems and parts.
Xcomp.sys.m6809		Discussion about 6809's.
Xcomp.sys.m68k		Discussion about 68k's.
Xcomp.sys.m68k.pc	Discussion about 68k-based PCs. (Moderated)
Xcomp.sys.mac		Discussions about the Apple Macintosh & Lisa.
Xcomp.sys.mac.digest	Apple Macintosh: info&uses, but no programs. (Moderated)
Xcomp.sys.masscomp	The Masscomp line of computers. (Moderated)
Xcomp.sys.misc		Discussion about computers of all kinds.
Xcomp.sys.nsc.32k	National Semiconductor 32000 series chips.
Xcomp.sys.pyramid	Pyramid 90x computers.
Xcomp.sys.ridge		Ridge 32 computers and ROS. 
Xcomp.sys.sequent	Sequent systems, (esp. Balance 8000). (Moderated)
Xcomp.sys.sun		Sun "workstation" computers. (Moderated)
Xcomp.sys.tandy		Discussion about TRS-80's.
Xcomp.sys.ti		Discussion about Texas Instruments.
Xcomp.sys.workstations	Various workstation-type computers. (Moderated)
Xcomp.terminals		All sorts of terminals.
Xcomp.text		Text processing issues and methods.
Xcomp.text.desktop	Technolgy & techniques of desktop publishing. (Moderated)
Xcomp.unix		Discussion of UNIX* features and bugs. (Moderated)
Xcomp.unix.questions	UNIX neophytes group.
Xcomp.unix.ultrix	Discussions about DEC's Ultrix. (Moderated)
Xcomp.unix.wizards	Discussions, bug reports, and fixes on and for UNIX.
Xcomp.unix.xenix		Discussion about the Xenix OS.
Xcomp.windows.misc	Various issues about windowing systems.
Xcomp.windows.news	Sun Microsystems' NewS window system.
Xcomp.windows.x		Discussion about the X Window System.
Xmisc.consumers		Consumer interests, product reviews, etc.
Xmisc.consumers.house	Discussion about owning and maintaining a house.
Xmisc.forsale		Short, tasteful postings about items for sale.
Xmisc.handicap		Items of interest for/about the handicapped. (Moderated)
Xmisc.headlines		Current interest: drug testing, terrorism, etc.
Xmisc.invest		Investments and the handling of money.
Xmisc.jobs.misc		Discussion about employment, workplaces, careers.
Xmisc.jobs.offered	Announcements of positions available.
Xmisc.jobs.resumes	Postings of resumes and "situation wanted" articles.
Xmisc.kids		Children, their behavior and activities.
Xmisc.legal		Legalities and the ethics of law.
Xmisc.misc		Various discussions not fitting in any other group.
Xmisc.psi		Paranormal abilities and experiences. (Moderated)
Xmisc.taxes		Tax laws and advice.
Xmisc.test		For testing of network software.  Very boring.
Xmisc.wanted		Requests for things that are needed (NOT software).
Xnews.admin		Comments directed to news administrators.
Xnews.announce.conferences	Calls for papers and conference announcements. (Moderated)
Xnews.announce.important	General announcements of interest to all. (Moderated)
Xnews.announce.newusers	Explanatory postings for new users. (Moderated)
Xnews.config		Postings of system down times and interruptions.
Xnews.groups		Discussions and lists of newsgroups.
Xnews.lists		News-related statistics and lists. (Moderated)
Xnews.misc		Discussions of USENET itself.
Xnews.newsites		Postings of new site announcements.
Xnews.software.b		Discussion about B news software.
Xnews.software.notes	Notesfile software from the Univ. of Illinois.
Xnews.stargate		Discussion about satellite transmission of news.
Xnews.sysadmin		Comments directed to system administrators.
Xrec.arts.books		Books of all genres, shapes, and sizes.
Xrec.arts.comics		The funnies, old and new.
Xrec.arts.drwho		Discussion about Dr. Who.
Xrec.arts.int-fiction	Discussions about interactive fiction.
Xrec.arts.movies		Discussions of movies and movie making.
Xrec.arts.movies.reviews	Reviews of movies. (Moderated)
Xrec.arts.poems		For the posting of poems.
Xrec.arts.sf-lovers	Science fiction lovers' newsgroup.
Xrec.arts.startrek	Star Trek, the TV show and the movies.
Xrec.arts.tv		The boob tube, its history, and past and current shows.
Xrec.arts.tv.soaps	Postings about soap operas.
Xrec.arts.wobegon	"A Prairie Home Companion" radio show discussion.
Xrec.audio		High fidelity audio.
Xrec.autos		Automobiles, automotive products and laws.
Xrec.autos.tech		Technical aspects of automobiles, et. al.
Xrec.aviation		Aviation rules, means, and methods.
Xrec.bicycles		Bicycles, related products and laws.
Xrec.birds		Hobbyists interested in bird watching.
Xrec.boats		Hobbyists interested in boating.
Xrec.food.cooking	Food, cooking, cookbooks, and recipes.
Xrec.food.drink		Wines and spirits.
Xrec.food.recipes	Recipes from the USENET Cookbook (troff & text). (Moderated)
Xrec.food.veg		Vegetarians.
Xrec.games.board		Discussion and hints on board games.
Xrec.games.bridge	Hobbyists interested in bridge.
Xrec.games.chess		Chess & computer chess.
Xrec.games.empire	Discussion and hints about Empire.
Xrec.games.frp		Discussion about Fantasy Role Playing games.
Xrec.games.go		Discussion about Go.
Xrec.games.hack		Discussion, hints, etc. about the Hack game.
Xrec.games.misc		Games and computer games.
Xrec.games.pbm		Discussion about Play by Mail games.
Xrec.games.rogue		Discussion and hints about Rogue.
Xrec.games.trivia	Discussion about trivia.
Xrec.games.video		Discussion about video games.
Xrec.gardens		Gardening, methods and results.
Xrec.guns		Discussions about firearms. (Moderated)
Xrec.ham-radio		Amateur Radio practices, contests, events, rules, etc.
Xrec.ham-radio.packet	Discussion about packet radio setups.
Xrec.humor		Jokes and the like.  May be somewhat offensive.
Xrec.humor.d		Discussions on the content of rec.humor articles.
Xrec.humor.funny		Jokes that are funny (in the moderator's opinion).  (Moderated)
Xrec.humor.spc		The Stupid People's Court! (Moderated)
Xrec.mag			Magazine summaries, tables of contents, etc.
Xrec.mag.otherrealms	Edited science fiction & fantasy "magazine". (Moderated)
Xrec.misc		General topics about recreational/participant sports.
Xrec.motorcycles		Motorcycles and related products and laws.
Xrec.music.beatles	Postings about the Fab Four & their music.
Xrec.music.classical	Discussion about classical music.
Xrec.music.folk		Folks discussing folk music of various sorts.
Xrec.music.gaffa		Progressive music (e.g., Kate Bush). (Moderated)
Xrec.music.gdead		A group for (Grateful) Dead-heads.
Xrec.music.makers	For performers and their discussions.
Xrec.music.misc		Music lovers' group.
Xrec.music.synth		Synthesizers and computer music.
Xrec.nude		Hobbyists interested in naturist/nudist activities.
Xrec.pets		Pets, pet care, and household animals in general.
Xrec.photo		Hobbyists interested in photography.
Xrec.puzzles		Puzzles, problems, and quizzes.
Xrec.railroad		Real and model train fans' newsgroup.
Xrec.scuba		Hobbyists interested in SCUBA diving.
Xrec.skiing		Hobbyists interested in skiing.
Xrec.skydiving		Hobbyists interested in skydiving.
Xrec.sport.baseball	Discussion about baseball.
Xrec.sport.basketball	Discussion about basketball.
Xrec.sport.football	Discussion about football.
Xrec.sport.hockey	Discussion about hockey.
Xrec.sport.misc		Spectator sports.
Xrec.travel		Traveling all over the world.
Xrec.video		Video and video components.
Xrec.woodworking		Hobbyists interested in woodworking.
Xsci.astro		Astronomy discussions and information.
Xsci.bio			Biology and related sciences.
Xsci.crypt		Different methods of data en/decryption.
Xsci.electronics		Circuits, theory, electrons and discussions.
Xsci.lang		Natural languages, communication, etc.
Xsci.math		Mathematical discussions and pursuits.
Xsci.math.stat		Statistics discussion.
Xsci.math.symbolic	Symbolic algebra discussion.
Xsci.med			Medicine and its related products and regulations.
Xsci.med.aids		AIDS: treatment, pathology/biology of HIV, prevention. (Moderated)
Xsci.misc		Short-lived discussions on subjects in the sciences.
Xsci.philosophy.tech	Technical philosophy: math, science, logic, etc. 
Xsci.physics		Physical laws, properties, etc.
Xsci.research		Research methods, funding, ethics, and whatever.
Xsci.space		Space, space programs, space related research, etc.
Xsci.space.shuttle	The space shuttle and the STS program.
Xsoc.college		College, college activities, campus life, etc.
Xsoc.culture.african	Discussions about Africa & things African.
Xsoc.culture.celtic	Group about Celts (*not* basketball!).
Xsoc.culture.greek	Group about Greeks.
Xsoc.culture.indian	Group for discussion about India & things Indian.
Xsoc.culture.jewish	Group for discussion about Jewish culture & religion.
Xsoc.culture.misc	Group for discussion about other cultures.
Xsoc.human-nets		Computer aided communications digest. (Moderated)
Xsoc.men			Issues related to men, their problems & relationships.
Xsoc.misc		Socially-oriented topics not in other groups.
Xsoc.motss		Issues pertaining to homosexuality.
Xsoc.net-people		Announcements, requests, etc. about people on the net.
Xsoc.politics		Political problems, systems, solutions. (Moderated)
Xsoc.politics.arms-d	Arms discussion digest. (Moderated)
Xsoc.religion.christian	Christianity and related topics. (Moderated)
Xsoc.roots		Genealogical matters.
Xsoc.singles		Newsgroup for single people, their activities, etc.
Xsoc.women		Women's rights, discrimination, etc.
Xtalk.abortion		All sorts of discussions and arguments on abortion.
Xtalk.bizarre		The unusual, bizarre, curious, and often stupid.
Xtalk.origins		Evolution versus creationism (sometimes hot!).
Xtalk.philosophy.misc	Philosophical musings on all topics.
Xtalk.politics.misc	Political discussions and ravings of all kinds.
Xtalk.politics.theory	Theory of politics and political systems.
Xtalk.religion.misc	Religious, ethical, & moral implications.
Xtalk.religion.newage	Esoteric and minority religions & philosophies.
Xtalk.rumors		For the posting of rumors.
END_OF_FILE
if test 16226 -ne `wc -c <'lib.proto/newsgroups'`; then
    echo shar: \"'lib.proto/newsgroups'\" unpacked with wrong size!
fi
# end of 'lib.proto/newsgroups'
fi
if test -f 'libc/getdate.y' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/getdate.y'\"
else
echo shar: Extracting \"'libc/getdate.y'\" \(11603 characters\)
sed "s/^X//" >'libc/getdate.y' <<'END_OF_FILE'
X%token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
X%{
X	/* 	Steven M. Bellovin (unc!smb)			*/
X	/*	Dept. of Computer Science			*/
X	/*	University of North Carolina at Chapel Hill	*/
X	/*	@(#)getdate.y	2.5	3/3/83	*/
X
X#include <sys/types.h>
X#ifdef USG
Xstruct timeb
X{
X	time_t	time;
X	unsigned short millitm;
X	short	timezone;
X	short	dstflag;
X};
X#else
X#include <sys/timeb.h>
X#endif
X#include <ctype.h>
X#include <time.h>
X
X#define	NULL	0
X#define daysec (24L*60L*60L)
X	static int timeflag, zoneflag, dateflag, dayflag, relflag;
X	static time_t relsec, relmonth;
X	static int hh, mm, ss, merid, daylight;
X	static int dayord, dayreq;
X	static int month, day, year;
X	static int ourzone;
X#define AM 1
X#define PM 2
X#define DAYLIGHT 1
X#define STANDARD 2
X#define MAYBE    3
X%}
X
X%%
Xtimedate: 		/* empty */
X	| timedate item;
X
Xitem:	tspec =
X		{timeflag++;}
X	| zone =
X		{zoneflag++;}
X	| dtspec =
X		{dateflag++;}
X	| dyspec =
X		{dayflag++;}
X	| rspec =
X		{relflag++;}
X	| nspec;
X
Xnspec:	NUMBER =
X		{if (timeflag && dateflag && !relflag) year = $1;
X		else {timeflag++;hh = $1/100;mm = $1%100;ss = 0;merid = 24;}};
X
Xtspec:	NUMBER MERIDIAN =
X		{hh = $1; mm = 0; ss = 0; merid = $2;}
X	| NUMBER ':' NUMBER =
X		{hh = $1; mm = $3; merid = 24;}
X	| NUMBER ':' NUMBER MERIDIAN =
X		{hh = $1; mm = $3; merid = $4;}
X	| NUMBER ':' NUMBER ':' NUMBER =
X		{hh = $1; mm = $3; ss = $5; merid = 24;}
X	| NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
X		{hh = $1; mm = $3; ss = $5; merid = $6;};
X
Xzone:	ZONE =
X		{ourzone = $1; daylight = STANDARD;}
X	| DAYZONE =
X		{ourzone = $1; daylight = DAYLIGHT;};
X
Xdyspec:	DAY =
X		{dayord = 1; dayreq = $1;}
X	| DAY ',' =
X		{dayord = 1; dayreq = $1;}
X	| NUMBER DAY =
X		{dayord = $1; dayreq = $2;};
X
Xdtspec:	NUMBER '/' NUMBER =
X		{month = $1; day = $3;}
X	| NUMBER '/' NUMBER '/' NUMBER =
X		{month = $1; day = $3; year = $5;}
X	| MONTH NUMBER =
X		{month = $1; day = $2;}
X	| MONTH NUMBER ',' NUMBER =
X		{month = $1; day = $2; year = $4;}
X	| NUMBER MONTH =
X		{month = $2; day = $1;}
X	| NUMBER MONTH NUMBER =
X		{month = $2; day = $1; year = $3;};
X
X
Xrspec:	NUMBER UNIT =
X		{relsec +=  60L * $1 * $2;}
X	| NUMBER MUNIT =
X		{relmonth += $1 * $2;}
X	| NUMBER SUNIT =
X		{relsec += $1;}
X	| UNIT =
X		{relsec +=  60L * $1;}
X	| MUNIT =
X		{relmonth += $1;}
X	| SUNIT =
X		{relsec++;}
X	| rspec AGO =
X		{relsec = -relsec; relmonth = -relmonth;};
X%%
X
Xstatic int mdays[12] =
X	{31, 0, 31,  30, 31, 30,  31, 31, 30,  31, 30, 31};
X#define epoch 1970
X
Xextern struct tm *localtime();
Xtime_t dateconv(mm, dd, yy, h, m, s, mer, zone, dayflag)
Xint mm, dd, yy, h, m, s, mer, zone, dayflag;
X{
X	time_t tod, jdate;
X	register int i;
X	time_t timeconv();
X
X	if (yy < 0) yy = -yy;
X	if (yy < 100) yy += 1900;
X	mdays[1] = 28 + (yy%4 == 0);
X	if (yy < epoch || yy > 1999 || mm < 1 || mm > 12 ||
X		dd < 1 || dd > mdays[--mm]) return (-1);
X	jdate = dd-1;
X        for (i=0; i<mm; i++) jdate += mdays[i];
X	for (i = epoch; i < yy; i++) jdate += 365 + (i%4 == 0);
X	jdate *= daysec;
X	jdate += zone * 60L;
X	if ((tod = timeconv(h, m, s, mer)) < 0) return (-1);
X	jdate += tod;
X	if (dayflag==DAYLIGHT || (dayflag==MAYBE&&localtime(&jdate)->tm_isdst))
X		jdate += -1*60*60;
X	return (jdate);
X}
X
Xtime_t dayconv(ord, day, now) int ord, day; time_t now;
X{
X	register struct tm *loctime;
X	time_t tod;
X	time_t daylcorr();
X
X	tod = now;
X	loctime = localtime(&tod);
X	tod += daysec * ((day - loctime->tm_wday + 7) % 7);
X	tod += 7*daysec*(ord<=0?ord:ord-1);
X	return daylcorr(tod, now);
X}
X
Xtime_t timeconv(hh, mm, ss, mer) register int hh, mm, ss, mer;
X{
X	if (mm < 0 || mm > 59 || ss < 0 || ss > 59) return (-1);
X	switch (mer) {
X		case AM: if (hh < 1 || hh > 12) return(-1);
X			 return (60L * ((hh%12)*60L + mm)+ss);
X		case PM: if (hh < 1 || hh > 12) return(-1);
X			 return (60L * ((hh%12 +12)*60L + mm)+ss);
X		case 24: if (hh < 0 || hh > 23) return (-1);
X			 return (60L * (hh*60L + mm)+ss);
X		default: return (-1);
X	}
X}
Xtime_t monthadd(sdate, relmonth) time_t sdate, relmonth;
X{
X	struct tm *ltime;
X	time_t dateconv();
X	time_t daylcorr();
X	int mm, yy;
X
X	if (relmonth == 0) return 0;
X	ltime = localtime(&sdate);
X	mm = 12*ltime->tm_year + ltime->tm_mon + relmonth;
X	yy = mm/12;
X	mm = mm%12 + 1;
X	return daylcorr(dateconv(mm, ltime->tm_mday, yy, ltime->tm_hour,
X		ltime->tm_min, ltime->tm_sec, 24, ourzone, MAYBE), sdate);
X}
X
Xtime_t daylcorr(future, now) time_t future, now;
X{
X	int fdayl, nowdayl;
X
X	nowdayl = (localtime(&now)->tm_hour+1) % 24;
X	fdayl = (localtime(&future)->tm_hour+1) % 24;
X	return (future-now) + 60L*60L*(nowdayl-fdayl);
X}
X
Xstatic char *lptr;
X
Xyylex()
X{
X	extern int yylval;
X	int sign;
X	register char c;
X	register char *p;
X	char idbuf[20];
X	int pcnt;
X
X	for (;;) {
X		while (isspace(*lptr)) lptr++;
X
X		if (isdigit(c = *lptr) || c == '-' || c == '+') {
X			if (c== '-' || c == '+') {
X				if (c=='-') sign = -1;
X				else sign = 1;
X				if (!isdigit(*++lptr)) {
X					/* yylval = sign; return (NUMBER); */
X					return yylex();	/* skip the '-' sign */
X				}
X			} else sign = 1;
X			yylval = 0;
X			while (isdigit(c = *lptr++)) yylval = 10*yylval + c - '0';
X			yylval *= sign;
X			lptr--;
X			return (NUMBER);
X
X		} else if (isalpha(c)) {
X			p = idbuf;
X			while (isalpha(c = *lptr++) || c=='.')
X				*p++ = c;
X			*p = '\0';
X			lptr--;
X			return (lookup(idbuf));
X		}
X
X		else if (c == '(') {
X			pcnt = 0;
X			do {
X				c = *lptr++;
X				if (c == '\0') return(c);
X				else if (c == '(') pcnt++;
X				else if (c == ')') pcnt--;
X			} while (pcnt > 0);
X		}
X
X		else return (*lptr++);
X	}
X}
X
Xstruct table {
X	char *name;
X	int type, value;
X};
X
Xstruct table mdtab[] = {
X	{"January", MONTH, 1},
X	{"February", MONTH, 2},
X	{"March", MONTH, 3},
X	{"April", MONTH, 4},
X	{"May", MONTH, 5},
X	{"June", MONTH, 6},
X	{"July", MONTH, 7},
X	{"August", MONTH, 8},
X	{"September", MONTH, 9},
X	{"Sept", MONTH, 9},
X	{"October", MONTH, 10},
X	{"November", MONTH, 11},
X	{"December", MONTH, 12},
X
X	{"Sunday", DAY, 0},
X	{"Monday", DAY, 1},
X	{"Tuesday", DAY, 2},
X	{"Tues", DAY, 2},
X	{"Wednesday", DAY, 3},
X	{"Wednes", DAY, 3},
X	{"Thursday", DAY, 4},
X	{"Thur", DAY, 4},
X	{"Thurs", DAY, 4},
X	{"Friday", DAY, 5},
X	{"Saturday", DAY, 6},
X	{0, 0, 0}};
X
X#define HRS *60
X#define HALFHR 30
Xstruct table mztab[] = {
X	{"a.m.", MERIDIAN, AM},
X	{"am", MERIDIAN, AM},
X	{"p.m.", MERIDIAN, PM},
X	{"pm", MERIDIAN, PM},
X	{"nst", ZONE, 3 HRS + HALFHR},		/* Newfoundland */
X	{"n.s.t.", ZONE, 3 HRS + HALFHR},
X	{"ast", ZONE, 4 HRS},		/* Atlantic */
X	{"a.s.t.", ZONE, 4 HRS},
X	{"adt", DAYZONE, 4 HRS},
X	{"a.d.t.", DAYZONE, 4 HRS},
X	{"est", ZONE, 5 HRS},		/* Eastern */
X	{"e.s.t.", ZONE, 5 HRS},
X	{"edt", DAYZONE, 5 HRS},
X	{"e.d.t.", DAYZONE, 5 HRS},
X	{"cst", ZONE, 6 HRS},		/* Central */
X	{"c.s.t.", ZONE, 6 HRS},
X	{"cdt", DAYZONE, 6 HRS},
X	{"c.d.t.", DAYZONE, 6 HRS},
X	{"mst", ZONE, 7 HRS},		/* Mountain */
X	{"m.s.t.", ZONE, 7 HRS},
X	{"mdt", DAYZONE, 7 HRS},
X	{"m.d.t.", DAYZONE, 7 HRS},
X	{"pst", ZONE, 8 HRS},		/* Pacific */
X	{"p.s.t.", ZONE, 8 HRS},
X	{"pdt", DAYZONE, 8 HRS},
X	{"p.d.t.", DAYZONE, 8 HRS},
X	{"yst", ZONE, 9 HRS},		/* Yukon */
X	{"y.s.t.", ZONE, 9 HRS},
X	{"ydt", DAYZONE, 9 HRS},
X	{"y.d.t.", DAYZONE, 9 HRS},
X	{"hst", ZONE, 10 HRS},		/* Hawaii */
X	{"h.s.t.", ZONE, 10 HRS},
X	{"hdt", DAYZONE, 10 HRS},
X	{"h.d.t.", DAYZONE, 10 HRS},
X	{"bst", ZONE, 11 HRS},		/* Bering */
X	{"b.s.t.", ZONE, 11 HRS},
X	{"bdt", DAYZONE, 11 HRS},
X	{"b.d.t.", DAYZONE, 11 HRS},
X
X	{"gmt", ZONE, 0 HRS},
X	{"g.m.t.", ZONE, 0 HRS},
X
X	{"aest", ZONE, -10 HRS},	/* Australian Eastern Time */
X	{"a.e.s.t.", ZONE, -10 HRS},
X	{"aesst", DAYZONE, -10 HRS},	/* Australian Eastern Summer Time */
X	{"a.e.s.s.t.", DAYZONE, -10 HRS},
X	{"acst", ZONE, -(9 HRS + HALFHR)},	/* Australian Central Time */
X	{"a.c.s.t.", ZONE, -(9 HRS + HALFHR)},
X	{"acsst", DAYZONE, -(9 HRS + HALFHR)},	/* Australian Central Summer */
X	{"a.c.s.s.t.", DAYZONE, -(9 HRS + HALFHR)},
X	{"awst", ZONE, -8 HRS},		/* Australian Western Time */
X	{"a.w.s.t.", ZONE, -8 HRS},	/* (no daylight time there, I'm told */
X	{0, 0, 0}};
X
Xstruct table unittb[] = {
X	{"year", MUNIT, 12},
X	{"month", MUNIT, 1},
X	{"fortnight", UNIT, 14*24*60},
X	{"week", UNIT, 7*24*60},
X	{"day", UNIT, 1*24*60},
X	{"hour", UNIT, 60},
X	{"minute", UNIT, 1},
X	{"min", UNIT, 1},
X	{"second", SUNIT, 1},
X	{"sec", SUNIT, 1},
X	{0, 0, 0}};
X
Xstruct table othertb[] = {
X	{"tomorrow", UNIT, 1*24*60},
X	{"yesterday", UNIT, -1*24*60},
X	{"today", UNIT, 0},
X	{"now", UNIT, 0},
X	{"last", NUMBER, -1},
X	{"this", UNIT, 0},
X	{"next", NUMBER, 2},
X	{"first", NUMBER, 1},
X	/* {"second", NUMBER, 2}, */
X	{"third", NUMBER, 3},
X	{"fourth", NUMBER, 4},
X	{"fifth", NUMBER, 5},
X	{"sixth", NUMBER, 6},
X	{"seventh", NUMBER, 7},
X	{"eigth", NUMBER, 8},
X	{"ninth", NUMBER, 9},
X	{"tenth", NUMBER, 10},
X	{"eleventh", NUMBER, 11},
X	{"twelfth", NUMBER, 12},
X	{"ago", AGO, 1},
X	{0, 0, 0}};
X
Xstruct table milzone[] = {
X	{"a", ZONE, 1 HRS},
X	{"b", ZONE, 2 HRS},
X	{"c", ZONE, 3 HRS},
X	{"d", ZONE, 4 HRS},
X	{"e", ZONE, 5 HRS},
X	{"f", ZONE, 6 HRS},
X	{"g", ZONE, 7 HRS},
X	{"h", ZONE, 8 HRS},
X	{"i", ZONE, 9 HRS},
X	{"k", ZONE, 10 HRS},
X	{"l", ZONE, 11 HRS},
X	{"m", ZONE, 12 HRS},
X	{"n", ZONE, -1 HRS},
X	{"o", ZONE, -2 HRS},
X	{"p", ZONE, -3 HRS},
X	{"q", ZONE, -4 HRS},
X	{"r", ZONE, -5 HRS},
X	{"s", ZONE, -6 HRS},
X	{"t", ZONE, -7 HRS},
X	{"u", ZONE, -8 HRS},
X	{"v", ZONE, -9 HRS},
X	{"w", ZONE, -10 HRS},
X	{"x", ZONE, -11 HRS},
X	{"y", ZONE, -12 HRS},
X	{"z", ZONE, 0 HRS},
X	{0, 0, 0}};
X
Xlookup(id) char *id;
X{
X#define gotit (yylval=i->value,  i->type)
X#define getid for(j=idvar, k=id; *j++ = *k++; )
X
X	char idvar[20];
X	register char *j, *k;
X	register struct table *i;
X	int abbrev;
X
X	getid;
X	if (strlen(idvar) == 3) abbrev = 1;
X	else if (strlen(idvar) == 4 && idvar[3] == '.') {
X		abbrev = 1;
X		idvar[3] = '\0';
X	}
X	else abbrev = 0;
X
X	if (islower(*idvar)) *idvar = toupper(*idvar);
X
X	for (i = mdtab; i->name; i++) {
X		k = idvar;
X		for (j = i->name; *j++ == *k++;) {
X			if (abbrev && j==i->name+3) return gotit;
X			if (j[-1] == 0) return gotit;
X		}
X	}
X
X	getid;
X	for (i = mztab; i->name; i++)
X		if (strcmp(i->name, idvar) == 0) return gotit;
X
X	for (j = idvar; *j; j++) if (isupper(*j)) *j = tolower(*j);
X	for (i=mztab; i->name; i++)
X		if (strcmp(i->name, idvar) == 0) return gotit;
X
X	getid;
X	for (i=unittb; i->name; i++)
X		if (strcmp(i->name, idvar) == 0) return gotit;
X
X	if (idvar[strlen(idvar)-1] == 's') idvar[strlen(idvar)-1] = '\0';
X	for (i=unittb; i->name; i++)
X		if (strcmp(i->name, idvar) == 0) return gotit;
X
X	getid;
X	for (i = othertb; i->name; i++)
X		if (strcmp(i->name, idvar) == 0) return gotit;
X
X	getid;
X	if (strlen(idvar) == 1 && isalpha(*idvar)) {
X		if (isupper(*idvar)) *idvar = tolower(*idvar);
X		for (i = milzone; i->name; i++)
X			if (strcmp(i->name, idvar) == 0) return gotit;
X	}
X
X	return(ID);
X}
X
Xtime_t getdate(p, now) char *p; struct timeb *now;
X{
X#define mcheck(f)	if (f>1) err++
X	time_t monthadd();
X	int err;
X	struct tm *lt;
X	struct timeb ftz;
X
X	time_t sdate, tod;
X
X	lptr = p;
X	if (now == ((struct timeb *) NULL)) {
X		now = &ftz;
X		ftime(&ftz);
X	}
X	lt = localtime(&now->time);
X	year = lt->tm_year;
X	month = lt->tm_mon+1;
X	day = lt->tm_mday;
X	relsec = 0; relmonth = 0;
X	timeflag=zoneflag=dateflag=dayflag=relflag=0;
X	ourzone = now->timezone;
X	daylight = MAYBE;
X	hh = mm = ss = 0;
X	merid = 24;
X
X	if (err = yyparse()) return (-1);
X
X	mcheck(timeflag);
X	mcheck(zoneflag);
X	mcheck(dateflag);
X	mcheck(dayflag);
X
X	if (err) return (-1);
X
X	if (dateflag || timeflag || dayflag) {
X		sdate = dateconv(month,day,year,hh,mm,ss,merid,ourzone,daylight);
X		if (sdate < 0) return -1;
X	}
X	else {
X		sdate = now->time;
X		if (relflag == 0)
X			sdate -= (lt->tm_sec + lt->tm_min*60 +
X				lt->tm_hour*(60L*60L));
X	}
X
X	sdate += relsec;
X	sdate += monthadd(sdate, relmonth);
X
X	if (dayflag) {
X		tod = dayconv(dayord, dayreq, sdate);
X		sdate += tod;
X	}
X
X	return sdate;
X}
X
Xyyerror(s) char *s;
X{}
END_OF_FILE
if test 11603 -ne `wc -c <'libc/getdate.y'`; then
    echo shar: \"'libc/getdate.y'\" unpacked with wrong size!
fi
# end of 'libc/getdate.y'
fi
if test -f 'rna/notes/Diffs' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rna/notes/Diffs'\"
else
echo shar: Extracting \"'rna/notes/Diffs'\" \(16211 characters\)
sed "s/^X//" >'rna/notes/Diffs' <<'END_OF_FILE'
XFrom nuucp Sun Oct  7 04:41:24 1984
X>From decvax!mulga!michaelr:elecvax  Sun Oct  7 04:28:09 1984 remote from ihnp4
XFrom: ihnp4!decvax!mulga!michaelr:elecvax
XReceived: by ihnp4.ATT.UUCP; id AA13572; 7 Oct 84 04:28:09 CDT (Sun)
XReturn-Path: <decvax!mulga!michaelr:elecvax>
XReceived: by decvax.UUCP (4.12/1.0)
X	id AA19171; Sun, 7 Oct 84 04:50:18 edt
XMessage-Id: <8410070850.AA19171@decvax.UUCP>
XReceived: by mulga.OZ (4.3)
X	id AA25613; Fri, 5 Oct 84 19:32:39 EST
XDate: Fri, 5 Oct 84 18:22:05 EST
XTo: ihnp4!jett!bill@decvax.UUCP:mulga
XSubject: Final Update of News Software (says he hopefully)
X
XHere are the changes I warned you about, note that a big chunk was moved from
Xreadnews.c to funcs.c. If you are now totally confused, I'll resend anything
Xyou like.
X
XCHANGE SUMMARY (includes some changes you got in the last distribution)
X
X  subscription lists can be altered without editing .newsrc
X    (readnews -s[+-?] [group])
X  
X  control commands added: "sendsys, senduuname, version"
X    a response will always be sent
X  
X  subscription list matching is upward compatible with 2.10.2: X matches X.thing
X    (X.all still matches X - I think it should)
X  
X  new groups aren't created automatically anymore, article is placed
X    in "junk" group, and a warning issued
X  
X  when new groups are created, "active" gets an empty entry, but the
X    existance of the directory still indicates subscription
X    (regardless of "active").
X
X  some local mods to postnews, re default sub. lists (won't be of much use
X  to you)
X
XI believe there should now be NO compatability problems with news 2.10.2
X
XDIFFS OF CHANGED FILES:
X
X----------
Xactive.c
X----------
X138d137
X< 	extern char	*itoa();
X148a148,173
X> 	fclose(f);
X> #if !AUSAM
X> 	unlock(actname);
X> #endif
X> }
X> 
X> /*
X>  * initgrp - initialise an entry for this group
X>  */
X> initgrp(group)
X> char *group;
X> {
X> 	register FILE	*f;
X> 	char		gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
X> 
X> 	f = fopenl(actname);
X> 	lineno = 0;
X> 	while(getline(f, gbuf, dbuf, dbuf2))
X> 		if(CMP(gbuf, group) == 0)
X> 		{
X> #if !AUSAM
X> 			unlock(actname);
X> #endif
X> 			return;
X> 		}
X> 	fprintf(f, "%s 00000 00001\n", group);
X
X----------
Xdefs.h
X----------
X12c12
X< #define NEWSVERSION	 "B UNSW 1.0 3/14/84"
X---
X> #define NEWSVERSION	 "B UNSW 1.1 19 Sep 1984"
X18,19c18,19
X< #define DFLTSUB "general,general.all"	/* default subscription list	*/
X< #define	ADMSUB	"general"		/* Mandatory subscription list */
X---
X> #define DFLTSUB "system,general"	/* default subscription list	*/
X> #define	ADMSUB	"system"		/* Mandatory subscription list */
X36,37c36
X< #define NETPATH	1			/* if you have path finding program
X< 					   /bin/netpath */
X---
X> #define NETPATH	"/bin/netpath"		/* if you have path finding program */
X57a57,58
X> #define MC	"/bin/mc"
X> #define UUNAME	"ls /tmp/net ^ grep '^[a-z]'"	/* uuname program */
X159,160c160,161
X< char	*catstr2(), *bsearch(), *mtempnam();
X< char	*getunique();
X---
X> char	*catstr2(), *bsearch(), *mtempnam(), *newstr6();
X> char	*getunique(), *getretaddr(), *getsubject();
X
X----------
Xfuncs.c
X----------
X68a69,75
X> newstr6(s1, s2, s3, s4, s5, s6)
X> char *s1, *s2, *s3, *s4, *s5, *s6;
X> {
X> 	return strcat(strcat(strcat(strcat(strcat(strcpy(myalloc(strlen(s1) + strlen(s2) + strlen(s3) + strlen(s4) + strlen(s5) + strlen(s6) + 1), s1), s2), s3), s4), s5), s6);
X> }
X> 
X> char *
X89a97,98
X>  * sublist uses "all" like shell uses "*", and "." like shell uses "/"
X>  * if subscription X matches Y, it also matches Y.anything
X159c168,169
X< 			return *ng2 == '\0';	/* if "\0"'s line up - match */
X---
X> 			return (*ng2 == '\0' || *ng2 == '.');
X> 			/* full match or X matching X.thing */
X405a416,571
X> }
X> 
X> /*
X>  * generate a return address
X>  */
X> char *
X> getretaddr(hp)
X> header *hp;
X> {
X> 	register char	*ra;
X> 
X> 	extern char	*getpath(), *exaddress();
X> #ifdef NETPATH
X> 	extern char	*getnetpath();
X> #endif
X> 
X> 	if(hp->h_replyto)
X> 		ra = exaddress(hp->h_replyto);
X> 	else if(hp->h_from)
X> 		ra = exaddress(hp->h_from);
X> 	else
X> 		ra = NIL(char);
X> 	if(hp->h_path && !ra)
X> 		ra = getpath(hp->h_path);
X> #ifdef NETPATH
X> 	if(CMPN(ra, PATHPREF, sizeof(PATHPREF) - 1) == 0)
X> 		ra = getnetpath(ra);
X> #endif
X> 	return ra;
X> }
X> 
X> /*
X>  * try and make a proper address
X>  */
X> char *
X> exaddress(addr)
X> char *addr;
X> {
X> 	register char	*space, *dot, *at;
X> 	register char	*raddr;
X> 
X> 	raddr = NIL(char);
X> 	if(space = strchr(addr, ' '))
X> 		*space = '\0';
X> 	if(at = strchr(addr, '@'))
X> 	{
X> 		*at = '\0';
X> 		if(dot = strchr(at + 1, '.'))
X> 		{
X> 			*dot = '\0';
X> #if OZ
X> 			if(CMP(dot + 1, MYDOMAIN) == 0)
X> 				raddr = newstr3(addr, ":", at + 1);
X> 			else
X> #endif
X> 				raddr = newstr4(PATHPREF, at + 1, PSEPS, addr);
X> 			*dot = '.';
X> 		}
X> 		*at = '@';
X> 	}
X> 	if(space)
X> 		*space = ' ';
X> 	return raddr;
X> 		
X> }
X> 
X> /*
X>  * return the last two components of the path
X>  */
X> char *
X> getpath(path)
X> char *path;
X> {
X> 	register char	*exlast, *ex;
X> 	register char	*raddr;
X> 
X> 	if(exlast = strrchr(path, PSEPCHAR))
X> 	{
X> 		*exlast = '\0';
X> 		if(ex = strrchr(path, PSEPCHAR))
X> 			raddr = newstr4(PATHPREF, ex + 1, PSEPS, exlast + 1);
X> 		else
X> 			raddr = newstr3(path, PSEPS, exlast + 1);
X> 		*exlast = PSEPCHAR;
X> 	}
X> 	else
X> 		raddr = NIL(char);
X> 	return raddr;
X> }
X> 
X> #ifdef NETPATH
X> /*
X>  * try and work out a path from our "netpath" database
X>  */
X> char *
X> getnetpath(path)
X> char *path;
X> {
X> 	FILE		*f;
X> 	register char	*ex1, *ex2, *com, *new;
X> 	char		buf[BUFSIZ];
X> 
X> 	if((ex1 = strchr(path, PSEPCHAR))
X> 	&& (ex2 = strchr(ex1 + 1, PSEPCHAR)))
X> 	{
X> 		*ex2 = '\0';
X> 		com = newstr4("exec ", NETPATH, " mulga ", ex1 + 1);
X> 		if((f = popen(com, "r")) == NIL(FILE))
X> 			printf("Couldn't run \"%s\"\n", com);
X> 		else
X> 		{
X> 			fread(buf, sizeof(buf), 1, f);
X> 			if(pclose(f) != 0)
X> 			{
X> 				printf("Error in running \"%s\"\n", com);
X> 				fflush(stdout);
X> 			}
X> 			else if(CMPN(buf, "mulga!", 6) == 0)
X> 			{
X> 				if(ex1 = strchr(buf, '\n'))
X> 					*ex1 = '\0';
X> 				new = newstr4(buf + 6, PSEPS, ex2 + 1, ":mulga");
X> 				free(path);
X> 				path = new;
X> 			}
X> 		}
X> 		free(com);
X> 		*ex2 = PSEPCHAR;
X> 	}
X> 	return path;
X> 
X> }
X> #endif
X> 
X> /*
X>  * remove extra spaces, and insert separators if necessary in
X>  * newsgroups specification
X>  */
X> convgrps(sp)
X> register char *sp;
X> {
X> 	register char	*sep;
X> 
X> 	sep = NIL(char);
X> 	while(*sp)
X> 	{
X> 		if(sep)
X> 			sp++;
X> 		while(*sp && (isspace(*sp) || *sp == NGSEPCHAR))
X> 			strcpy(sp, sp + 1);
X> 		if(sep)
X> 			*sep = (*sp ? NGSEPCHAR : '\0');
X> 		while(*sp && !isspace(*sp) && *sp != NGSEPCHAR)
X> 			sp++;
X> 		sep = sp;
X> 	}
X
X----------
Xnewsrc.c
X----------
X174c174,180
X< 			if(ap->a_low - 1 > np->n_last)
X---
X> 			/*
X> 			 * if we haven't read any news for a while (or at all),
X> 			 * or somehow seq got smaller (active corrupted?),
X> 			 * set last read to oldest available article
X> 			 */
X> 			if(ap->a_low - 1 > np->n_last
X> 			|| ap->a_seq < np->n_last)
X
X----------
Xpostnews.c
X----------
X14a15,16
X> extern char	mydomain[];
X> extern char	newsversion[];
X19a22,24
X> #ifdef UUNAME
X> char		uuname[] = UUNAME;
X> #endif
X47a53,54
X> char		*dfltgrp();
X> extern FILE	*mailreply();
X157a165,172
X> 		if(!h.h_replyto)
X> 			h.h_replyto = newstr5(
X> #if AUSAM
X> 					pe.pw_strings[LNAME],
X> #else
X> 					pp->pw_name,
X> #endif
X> 					"@", systemid, ".", mydomain);
X172c187,189
X< 	if(!h.h_newsgroups)
X---
X> 	if(h.h_newsgroups)
X> 		convgrps(h.h_newsgroups);
X> 	else
X173a191,196
X> 	if(h.h_distribution)
X> 	{
X> 		convgrps(h.h_distribution);
X> 		if(CMP(h.h_newsgroups, h.h_distribution) == 0)
X> 			h.h_distribution = NIL(char);
X> 	}
X191c214
X< 		if(applyng(h.h_newsgroups, checkng))
X---
X> 		if(!cflag && applyng(h.h_newsgroups, checkng))
X208a232
X> 	initgrp(grp);		/* make entry in active file */
X301c325
X< 		h.h_subject = geth(t_subject, "");
X---
X> 		h.h_subject = geth(t_subject, NIL(char));
X305c329
X< 		h.h_newsgroups = geth(t_newsgroups, DFLTGRP);
X---
X> 		h.h_newsgroups = geth(t_newsgroups, dfltgrp());
X309,314c333
X< 		h.h_distribution = geth(t_distribution,
X< 					(h.h_newsgroups ? h.h_newsgroups
X< 							: DFLTGRP));
X< 	if(h.h_distribution && h.h_newsgroups
X< 	&& CMP(h.h_distribution, h.h_newsgroups) == 0)
X< 		h.h_distribution = NIL(char);
X---
X> 		h.h_distribution = geth(t_distribution, h.h_newsgroups);
X332c351
X< 		if(*def)
X---
X> 		if(def)
X338,339c357,358
X< 		if(*def)
X< 			return NIL(char);
X---
X> 		if(def)
X> 			return newstr(def);
X379c398
X< 		h.h_messageid = catstr2(h.h_messageid, MYDOMAIN, ">");
X---
X> 		h.h_messageid = catstr2(h.h_messageid, mydomain, ">");
X463c482
X< 	if(ccount < 5 && !pflag && !cflag)
X---
X> 	if(ccount < 5 && !pflag)
X704c723
X< 	register char	*s;
X---
X> 	register char	*s, *com;
X716c735,738
X< 			creatgroup(g);
X---
X> 			com = newstr6("exec ", POSTNEWS, " -c 'newgroup ", g,
X> 				 "' -n ", g);
X> 			system(com);
X> 			free(com);
X733a756,757
X> 	static char	junk[] = "junk";
X> 
X741c765,771
X< 		applyng(newg, linkng, tmpname);
X---
X> 		if(!applyng(newg, linkng, tmpname))
X> 		{
X> 			while(!linkng(junk, tmpname))
X> 				creatgroup(junk);
X> 			fprintf(stderr, "postnews: article placed in \"junk\" because no groups active from:\n\t%s\n",
X> 				newg);
X> 		}
X758,764c788,791
X< 	if(pflag)
X< 	{
X< 		dname = convg(newstr3(newsdir, "/", g));
X< 		if(access(dname, 0) != 0)
X< 			creatgroup(g);
X< 		free(dname);
X< 	}
X---
X> 	dname = convg(newstr3(newsdir, "/", g));
X> 	free(dname);
X> 	if(access(dname, 0) != 0)
X> 		return 0;		/* don't save - not an active group */
X771a799
X> 	return 1;
X782a811
X> 	{
X783a813,815
X> 		while(*s && isspace(*s))
X> 			s++;
X> 	}
X784a817,819
X> 	{
X> 		if(!s || !*s)
X> 			error("Cancel: message-id not specified.");
X785a821
X> 	}
X786a823,825
X> 	{
X> 		if(!s || !*s)
X> 			error("Newgroup: group name not specified.");
X788c827
X< 			error("Permission denied.");
X---
X> 			error("Newgroup: permission denied.");
X790a830,836
X> 	}
X> 	else if(CMP(com, "sendsys") == 0)
X> 		sendsys();
X> 	else if(CMP(com, "version") == 0)
X> 		version();
X> 	else if(CMP(com, "senduuname") == 0)
X> 		senduuname();
X792,793c838,844
X< 		error("Unknown control command: %s (Valid: cancel, newgroup)",
X< 			 com);
X---
X> 	{
X> 		sorry(com);
X> 		error("Unknown control command: %s %s\n(Valid: cancel, newgroup, sendsys, senduuname, version)\nSent from: %s",
X> 			com, s ? s : "",
X> 			(h.h_replyto ? h.h_replyto
X> 				     : (h.h_from ? h.h_from : "Unknown?")));
X> 	}
X796a848,958
X>  * send sys file to originator
X>  */
X> sendsys()
X> {
X> 	register FILE	*pp, *fp;
X> 	register int	c;
X> 
X> 	fp = fopenf(sys, "r");
X> 	pp = mailreply("News sendsys request");
X> 	while((c = getc(fp)) != EOF)
X> 		putc(c, pp);
X> 	mailclose(pp);
X> 	fclose(fp);
X> }
X> 
X> /*
X>  * send version name and number to originator
X>  */
X> version()
X> {
X> 	register FILE	*pp;
X> 
X> 	pp = mailreply("News version request");
X> 	fprintf(pp, "Current version: %s\n", newsversion);
X> 	mailclose(pp);
X> 	fclose(pp);
X> }
X> 
X> /*
X>  * send uuname data to originator
X>  */
X> senduuname()
X> {
X> 	register FILE	*pp, *f;
X> 	register int	c;
X> 
X> 	extern FILE	*tmpfile();
X> 
X> #ifndef UUNAME
X> 	sorry("uuname");
X> #else
X> 	if((pp = popen(uuname, "r")) == NIL(FILE))
X> 		error("Couldn't run \"%s\"", uuname);
X> 	if((f = tmpfile()) == NIL(FILE))
X> 		error("Can't open tmp file.");
X> 
X> 	while((c = getc(pp)) != EOF)
X> 		putc(c, f);
X> 
X> 	if(pclose(pp) != 0)
X> 		error("\"%s\" had bad exit status.", uuname);
X> 	rewind(f);
X> 
X> 	pp = mailreply("News senduuname request");
X> 	while((c = getc(f)) != EOF)
X> 		putc(c, pp);
X> 
X> 	fclose(f);
X> 	mailclose(pp);
X> #endif
X> }
X> 
X> 
X> /*
X>  * send message about unimplemented command
X>  */
X> sorry(com)
X> char *com;
X> {
X> 	register FILE	*pp;
X> 
X> 	pp = mailreply("Unimplemented news control message");
X> 	fprintf(pp, "The control message \"%s\" is not implemented at this site.\n", com);
X> 	fprintf(pp, "Our current version of news is: %s\n", newsversion);
X> 	mailclose(pp);
X> 	fclose(pp);
X> }
X> 
X> /*
X>  * set up a pipe to a mail program to reply to control requests
X>  */
X> FILE *
X> mailreply(s)
X> char *s;
X> {
X> 	register FILE	*pp;
X> 	register char	*com, *ra;
X> 
X> 	if((ra = getretaddr(&h)) == NIL(char))
X> 		error("Can't form return address for control message");
X> 	com = newstr4("exec ", MAIL, " ", ra);
X> 	if((pp = popen(com, "w")) == NIL(FILE))
X> 		error("Couldn't run \"%s\"", com);
X> 	fprintf(pp, "Subject: %s\n", s);
X> 	fprintf(pp, "Responding-system: %s.%s\n\n", systemid, mydomain);
X> 	free(com);
X> 	free(ra);
X> 	return pp;
X> }
X> 
X> /*
X>  * close the mail pipe
X>  */
X> mailclose(pp)
X> FILE *pp;
X> {
X> 	if(pclose(pp) != 0)
X> 		error("Mail reply for control message failed");
X> }
X> 
X> /*
X844a1007,1031
X> }
X> 
X> /*
X>  * work out the default group for this user
X>  */
X> char *
X> dfltgrp()
X> {
X> #if MANGRPS
X> 	register char	**sp;
X> 	extern char	**getclasses();
X> 
X> 	for(sp = getclasses(pe.pw_cmask); *sp; sp++)
X> 	{
X> 		if(CMP(*sp, "C-Staff") == 0 || CMP(*sp, "System") == 0)
X> 			return "system";
X> 		if(CMP(*sp, "CLUBS") == 0)
X> 			return newstr2("general.club.", pe.pw_strings[LNAME]);
X> 		if(CMP(*sp, "Languages") == 0)
X> 			return newstr2("general.lang.", pe.pw_strings[LNAME]);
X> 		if(CMP(*sp, "Classaccount") == 0)
X> 			return newstr2("class.", pe.pw_strings[LNAME]);
X> 	}
X> #endif
X> 	return DFLTGRP;
X
X----------
Xreadnews.c
X----------
X63,65d62
X< char		*getnetpath();
X< char		*getsubject(), *exaddress(), *getpath();
X< 
X112c109,111
X< 	if(!nflag)
X---
X> 	if(nflag)
X> 		convgrps(nflag);
X> 	else
X113a113,114
X> 	if(rcgrps)
X> 		convgrps(rcgrps);
X318c319
X< 	register char	*tmp;
X---
X> 	register char	*tmp, *com;
X325c326,327
X< 		if((f = popen("exec /bin/mc", "w")) == NULL)
X---
X> 		com = newstr2("exec ", MC);
X> 		if((f = popen(com, "w")) == NULL)
X326a329
X> 		free(com);
X1057,1069c1060
X< 	if(hp->h_replyto)
X< 		argv[argc++] = exaddress(hp->h_replyto);
X< 	else if(hp->h_from)
X< 		argv[argc++] = exaddress(hp->h_from);
X< 	else
X< 		argv[argc++] = NIL(char);
X< 	if(hp->h_path && !argv[argc - 1])
X< 		argv[argc - 1] = getpath(hp->h_path);
X< #if NETPATH
X< 	if(CMPN(argv[argc - 1], PATHPREF, sizeof(PATHPREF) - 1) == 0)
X< 		argv[argc - 1] = getnetpath(argv[argc - 1]);
X< #endif
X< 	if(!argv[argc - 1])
X---
X> 	if((argv[argc++] = getretaddr(hp)) == NIL(char))
X1105,1208d1095
X< 
X< /*
X<  * try and make a proper address
X<  */
X< char *
X< exaddress(addr)
X< char *addr;
X< {
X< 	register char	*space, *dot, *at;
X< 	register char	*raddr;
X< 
X< 	raddr = NIL(char);
X< 	if(space = strchr(addr, ' '))
X< 		*space = '\0';
X< 	if(at = strchr(addr, '@'))
X< 	{
X< 		*at = '\0';
X< 		if(dot = strchr(at + 1, '.'))
X< 		{
X< 			*dot = '\0';
X< #if OZ
X< 			if(CMP(dot + 1, "SUN") == 0	/* compatability */
X< 			|| CMP(dot + 1, "OZ") == 0)
X< 				raddr = newstr3(addr, ":", at + 1);
X< 			else
X< #endif
X< 				raddr = newstr4(PATHPREF, at + 1, PSEPS, addr);
X< 			*dot = '.';
X< 		}
X< 		*at = '@';
X< 	}
X< 	if(space)
X< 		*space = ' ';
X< 	return raddr;
X< 		
X< }
X< 
X< /*
X<  * return the last two components of the path
X<  */
X< char *
X< getpath(path)
X< char *path;
X< {
X< 	register char	*exlast, *ex;
X< 	register char	*raddr;
X< 
X< 	if(exlast = strrchr(path, PSEPCHAR))
X< 	{
X< 		*exlast = '\0';
X< 		if(ex = strrchr(path, PSEPCHAR))
X< 			raddr = newstr4(PATHPREF, ex + 1, PSEPS, exlast + 1);
X< 		else
X< 			raddr = newstr3(path, PSEPS, exlast + 1);
X< 		*exlast = PSEPCHAR;
X< 	}
X< 	else
X< 		raddr = NIL(char);
X< 	return raddr;
X< }
X< 
X< #if NETPATH
X< /*
X<  * try and work out a path from our "netpath" database
X<  */
X< char *
X< getnetpath(path)
X< char *path;
X< {
X< 	FILE		*f;
X< 	register char	*ex1, *ex2, *com, *new;
X< 	char		buf[BUFSIZ];
X< 
X< 	if((ex1 = strchr(path, PSEPCHAR))
X< 	&& (ex2 = strchr(ex1 + 1, PSEPCHAR)))
X< 	{
X< 		*ex2 = '\0';
X< 		com = newstr2("exec /bin/netpath mulga ", ex1 + 1);
X< 		if((f = popen(com, "r")) == NIL(FILE))
X< 			printf("Couldn't run \"%s\"\n", com);
X< 		else
X< 		{
X< 			fread(buf, sizeof(buf), 1, f);
X< 			if(pclose(f) != 0)
X< 			{
X< 				printf("Error in running \"%s\"\n", com);
X< 				fflush(stdout);
X< 			}
X< 			else if(CMPN(buf, "mulga!", 6) == 0)
X< 			{
X< 				if(ex1 = strchr(buf, '\n'))
X< 					*ex1 = '\0';
X< 				new = newstr4(buf + 6, PSEPS, ex2 + 1, ":mulga");
X< 				free(path);
X< 				path = new;
X< 			}
X< 		}
X< 		free(com);
X< 		*ex2 = PSEPCHAR;
X< 	}
X< 	return path;
X< 
X< }
X< #endif
X
XTHE END!
X
XHopefully you won't see any more of this!
XPlease tell me if you have any problems.
X
XMichael
END_OF_FILE
if test 16211 -ne `wc -c <'rna/notes/Diffs'`; then
    echo shar: \"'rna/notes/Diffs'\" unpacked with wrong size!
fi
# end of 'rna/notes/Diffs'
fi
echo shar: End of archive 11 \(of 14\).
##  End of shell archive.
exit 0