[comp.sources.unix] v24i046: Journal lookup-program with database, Part01/05

rsalz@uunet.uu.net (Rich Salz) (03/15/91)

Submitted-by: Dave Davey <daved@physiol.su.oz.au>
Posting-number: Volume 24, Issue 46
Archive-name: jlook/part01

[  The database is one of the most interesting parts of this submission. --r$ ]  

jlook is a tool to assist with Journal name handling in bibliographic
applications.  It supplements refer and other utilities.  Using a library
of official full titles and abbreviations used by Chemical Abstracts,
Index Medicus and the World List of Scientific Periodicals, jlook can
interconvert these forms, or generate one of them from reasonable
abbreviations.  The library may contain recognised variants of titles, or
local preferred abbreviations.

Used with journal names as command arguments, jlook returns the full title
(or abbreviation selected by a switch).

Used as a filter, jlook converts input lines starting with %J to the
corresponding full title or selected abbreviation.  Titles which cannot
be recognised are passed through unchanged, but diagnostic output
may be obtained.

jlook uses a simple index file to speed searches.  The program starts
marginally faster if the index file exists and is up-to-date, but will
generate the index itself otherwise.

The available library gives fair coverage of the biomedical literature
(about 2000 journals). It compiles and runs on (at least) Version 7 and
BSD 4.3 systems.

#!/bin/sh
# shar:	Shell Archiver  (v1.22)
# This is part 1 of a multipart archive                                    
# do not concatenate these parts, unpack them in order with /bin/sh        
#
#	Run the following text with /bin/sh to create:
#	  README
#	  jlook.1l
#	  jlook.c
#	  jindex.c
#	  jsubs.c
#	  jlook.h
#	  Makefile
#	  tst_alt
#	  tst_chem_good
#	  tst_full_good
#	  tst_input
#	  jlist
#
if test -r s2_seq_.tmp
then echo "Must unpack archives in sequence!"
     next=`cat s2_seq_.tmp`; echo "Please unpack part $next next"
     exit 1; fi
echo "x - extracting README (Text)"
sed 's/^X//' << 'SHAR_EOF' > README &&
Xjlook README
X$Header: /src/local/cmd/jlook/README,v 1.1 90/02/04 12:45:45 daved Rel $
X
Xjlook is a tool to assist with Journal name handling in bibliographic
Xapplications.  It supplements refer and other utilities.  Using a library
Xof official full titles and abbreviations used by Chemical Abstracts,
XIndex Medicus and the World List of Scientific Periodicals, jlook can
Xinterconvert these forms, or generate one of them from reasonable
Xabbreviations.  The library may contain recognised variants of titles, or
Xlocal preferred abbreviations.
X
XUsed with journal names as command arguments, jlook returns the full title
X(or abbreviation selected by a switch).
X
XUsed as a filter, jlook converts input lines starting with %J to the
Xcorresponding full title or selected abbreviation.  Titles which cannot
Xbe recognised are passed through unchanged, but diagnostic output
Xmay be obtained.
X
Xjlook uses a simple index file to speed searches.  The program starts
Xmarginally faster if the index file exists and is up-to-date, but will
Xgenerate the index itself otherwise.
X
XThe available library gives fair coverage of the biomedical literature
X(about 2000 journals). It compiles and runs on (at least) Version 7 and
XBSD 4.3 systems.
X
XThe distribution includes:
X	README		this one!
X	Makefile	
X	jlook.h
X	jlook.c
X	jindex.c
X	jsubs.c
X	jlook.1l	manual troff source
X	jlist		the journal library file
X	tst_chem_good	a test file
X	tst_full_good	"   "   "
X	tst_input	"   "   "
X	tst_alt		"   "   "
X
XCompilation:
X	edit Makefile to reflect whether your system supports re_comp and
X		re_exec regular expression functions, or recmp and regex.
X	make all
X
XCheck integrity:
X	make check
X		should do some checks without errors except that there
X		may be a complaint about no index file
X
XInstallation:
X	edit Makefile if you do not wish jlook to go in /usr/bin or the
X		library and index program to go in /usr/lib/refer
X	make library
X		to install the journal library file and create its index
X	make install
X		to install the binaries.
X
XManual:
X	put jlook.1l in the right place (sorry, the makefile does not do it)
SHAR_EOF
chmod 0440 README || echo "restore of README fails"
set `wc -c README`;Sum=$1
if test "$Sum" != "2078"
then echo original size 2078, current size $Sum;fi
echo "x - extracting jlook.1l (Text)"
sed 's/^X//' << 'SHAR_EOF' > jlook.1l &&
X.TH jlook 1 LOCAL
X.de iD
X$Header: /src/local/cmd/jlook/jlook.1l,v 1.1 90/02/03 17:21:35 daved Exp $
Xphysiol.su.oz.au
X..
X.SH NAME
Xjlook - lookup/replace journal titles or abbreviations from a standard list
X.SH SYNOPSIS
X.B jlook
X[\ \-a\ additional_library\ ]
X[\ \-C\ ]
X[\ \-d\ ]
X[\ \-e\ ]
X[ \-E\ ]
X[\ \-l\ library\ ]
X[\ \-m\fR[\fImacro\fR]\ ]
X[\ \-n\ ]
X[\ \-p\ ]
X[\ \-s\fR[\fImax_chars\fR]\ ]
X[\ \-t\ ]
X[\ \-u\fIX\fP\ ]
X[\ \-x\fR[\fItag_string\fR]\ ]
X["title"\ [\ "title2"\ ...\ ]]
X[\ -f\ file(s)\ ]
X.br
X.B jindex
X[ \-l library ]
X.SH DESCRIPTION
X.I Jlook
Xif given a Journal title or sensible abbreviation looks for an entry
Xin the journal library and prints the result on standard output.
XNormally
Xthe full title is output, but one of a number of standard abbreviations
Xdescribed below can be selected, or the
X.B \-A
Xswitch (described in more detail below)
Xcan be used to obtain all the forms for the item.
XNormally the
Xinput must match the contents of the library in a moderately complete
Xmanner.
XThe
X.B \-t
Xswitch removes the restriction of completeness, and can be helpful in
Xtrying to discover the complete title of a journal, e.g. if you know
Xthe first few words but not the rest.
X.P
XUsed as a filter or given input files
Xfollowing the
X.B \-f
Xswitch, any lines beginning with "%J " (see pubindex, refer or indexbib) are
Xtaken to contain journal titles and are looked up in the same way.
XThe line contents are replaced by the standard form in the library, if
Xfound.
XAny journal line that is not so replaced, and
Xall other lines, are passed through unchanged.
XA different leading string
Xcan be selected with the
X.B \-m
Xswitch.
XThis switch causes the leading string to be changed from "%J " to
X".ds [J " and thus enables
X.I jlook
Xto be used as a filter for refer(1) output.
XOther strings can be used by
Xplacing them immediately after the -m switch (e.g. -m"#j " would cause
Xlines beginning with "#j " to be processed).
X.P
XNormally, full titles are output, but an abbreviation can be selected with
Xthe
X.B \-u\fIX\fP
Xswitch, where
X.I X
Xmust be a single upper case letter code for the abbreviations supported
Xby the library.  As distributed,
X.I X
Xcan be one of:
X.TP
X.B C
Xfor
X.I "Chemical Abstracts"
X.TP
X.B I
Xfor
X.I "Index Medicus"
Xor
X.TP
X.B W
Xfor
X.I "World List of Scientific Periodicals",
X.PP
XThe selected abbreviation can be modified:
Xfull-stops in the abbreviations can be eliminated with the
X.B \-p
Xswitch; and unpaddable blanks will be substituted
Xfor spaces within the title if the
X.B \-s\fI[max_chars]\fP
Xswitch is used.
XIn the latter case, a maximum of
X.I max_chars
Xcharacters will be output without interpreting a space as a space (default 10).
XAll forms of output can be converted to upper-case only though use of the
X.B \-C
Xswitch.
X.P
XJournal abbreviations (or names) which cannot be found in the library can
Xbe identified with the 
X.B \-e
Xswitch, which causes problem "%J" lines to be written to standard error, or
Xthe
X.B \-x
Xswitch which causes them to be added to the output stream as lines labelled
Xwith "%X " (or ".\\"X " if the -m switch has been used) or with the string
Ximmediately following the -x.
XIf the
X.B \-E
Xswitch is used instead of -e, a message "no errors found" will also be generated
Xif appropriate.
XIf only the errors are desired, the
X.B \-n
Xswitch will suppress normal output.
X.P
XThe
X.B \-l \fIlib_file\fP
Xswitch enables a journal library file named by the argument
Xwhich follows it
X.I (lib_file)
Xto be used instead of /usr/lib/refer/jlist.
XThe file will be sought first in the working directory, then in
X/usr/lib/refer.
XIn order to use an alternative library file efficiently,
Xthe library index should first be created with
Xthe command "/usr/lib/refer/jindex -l library_file".
X.P
XThe
X.B \-a
Xswitch provides for
Xan additional library given by the next argument also to be searched
Xfor items not found in the standard library.
X.P
XThe
X.B \-d
Xswitch is for debugging purposes.
XMore than one -d switch causes even more
Xverbose output.
X.P
XSearching of the library is linear but a simple index of entry points for
Xeach letter of the alphabet speeds the process slightly.
XBecause of the
Xsubstantial variation in abbreviation formats,  a more sophisticated
Xindex is difficult to formulate.
XThe index must be rebuilt if the
Xlibrary is modified.
XAn out of date index will cause
X.I jlook
Xto construct one internally which slows its startup.
X.P
XThe lookup process is much faster if the input journal names
Xare already in the form of a standard
Xabbreviation.
XThus it is worth putting files in a regularly used database
Xthrough
X.I jlook
Xonce to
Xstandardise them.
XThis can be done with something like:
X.ti 3c
Xjlook -uC -f file > NEW  && cp NEW file && rm -f NEW
X.SH LIBRARY FILES
XThe default library file begins with comments on its format.
XIt is
Xpossible to create files with support for different abbreviation systems.
XEach system must have a key letter in the "Keys: " line at the start
Xof the file.
XSuch letters can be chosen from the upper case alphabet with the exception
Xof the reserved letters E,F,V, and U.
XThe description which follows applies to the distributed
Xlibrary (Keys CIW).
X.P
XThe entries in the library file
Xconsist of a series of lines for each journal, separated by a
Xblank line.
X(For any one journal argument,
Xthe complete entry can be displayed using the
X.B \-A
Xswitch.)
XThe lines are tagged with the following leading letters,
Xseparated from the entry by white space:
X.in 2c
X.nf
XF	The full title of the Journal
XC	The Chemical Abstracts abbreviation
XI	The Index Medicus abbreviation
XW	The World List abbreviation
XV	A variant to be accepted (e.g. local abbreviation)
XU	Undefined input
XE	Exceptional entry - apparently out of alphabetic order
XS	Sort string
X*	A regular expression for back matching
X.fi
X.in
XThe F,C,I and W lines must appear once and only 
Xonce per entry, but can be combined where appropriate.
XE lines
Xreplace F lines where an accepted abbreviation does not start
Xwith the same letter as the full title (e.g. anglicized abbreviations of
Xforeign titles).
XAn E entry must appear
Xalphabetically under the first letter of that abbreviation.
XIt must
Xalso appear under the first letter of the full title.
XE and F lines
Xare mutually exclusive.
XThere can be any number of V lines.
XFor particularly troublesome entries, for example where an abbreviation
Xdoes not correspond to the leading portion of the full word (e.g.
XZbl. for Zentralblatt), a regular expression may be included in the
Xentry, labelled with an '*'.
XSuch expressions will be used in an attempt
Xto match against the input if all else fails.
XU lines replace F lines
Xwhere a particular form is regarded as a known error, the most
Xcommon instance being where a journal name is equivocal unless
Xa city of publication is included.
XAn S line is treated only as a comment by
X.I jlook,
Xbut may be present to assist automatic sorting of the libary;
Xits contents will be used for the sort instead of the full title.
X.P
XThe library must be kept in alphabetic
Xorder as far as the first letter of the full title of each entry.
XEntries starting with numbers are grouped together with names starting
Xwith 'Z'.
X.SH FILES
X/usr/bin/jlook
X.br
X/usr/lib/refer/jlist - the default library
X.br
X/usr/lib/refer/jlist.index - default offset index to speed searches
X.br
X/usr/lib/refer/jindex - a program to build the index
X.SH DIAGNOSTICS
X"Index predates ...."
Xmeans the index is out of date; this is a warning only and,
Xin the case of the default library,
Xshould be drawn to the attention of the system supervisor.
X.br
XIf an entry is not found, the program exits with a (non-zero) error status.
XIn addition, if the
X.B \-x
Xswitch is used, the offending journal
Xlines will be copied into the output, labelled in accord
Xwith the -m and -x switches, in order
Xthat they can be identified.
X.SH SEE ALSO
Xreflist.1l
X.SH BUGS
XThe program depends upon the database.
X.P
XThe distributed database contains diacritical marks
Xof the form \\*\(aa, \\*\(ga \\*: and \\*;,
Xwhich
Xrequire troff definitions such as those provided in the ms(7) and mm(7)
Xmacro
Xpackages or some further substitution or elimination if troff is not being
Xused.
X.P
XExpansion of abbreviated journal titles is not foolproof.
XAbbreviated forms
Xshould be indicated by the use of full stops.
XNon-trivial words should have
Xthe first letter capitalized.
XFor example: "J. Physiol." is a "good"
Xabbreviation for "Journal of Physiology" whereas "J physiol" is not.
X.P
XAn additional library used with the
X.B \-a
Xswitch must have the same Keys as the primary library.
X.P
XThe
X.I "World List"
Xentries are inconsistent.  A major feature of the original
X.I List
Xwas the use of lower case for the first letter of adjectives in
Xtitles (except for the first word of a title), a feature that appears
Xto appeal to some editors who insist on its use.
XUnfortunately, the
X.I List
Xwas not reprinted in full after 1969, and only supplements were issued
Xuntil 1980, after which the
X.I List
Xwas disbanded.  
XThe supplements list all titles in
X.I "upper case only".
XThese have been converted to mixed case following the original rules.
X(Upper case output can be obtained with the
X.B \-C
Xswitch.)
X.SH AUTHOR
X.nf
XD.F. Davey,
XDepartment of Physiology,
XUniversity of Sydney.
X.sp
Xdaved@physiol.su.oz
SHAR_EOF
chmod 0440 jlook.1l || echo "restore of jlook.1l fails"
set `wc -c jlook.1l`;Sum=$1
if test "$Sum" != "9207"
then echo original size 9207, current size $Sum;fi
echo "x - extracting jlook.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > jlook.c &&
X/* jlook.c
X *
X *	Copyright D.F. Davey, University of Sydney
X *
X *	Permission is granted for the distribution of this software
X *	for non-profit purposes and provided this notice remains intact
X *
X *	daved@physiol.su.oz.au
X *
X *	The debugging switch can be used in two ways. Multiple -d's are
X *	additive.  -dN where N is an integer selects particular debugging
X *	diagnostics:
X *	10	re comparisons with variants
X *	11	library file seeks
X */
X
X#ifndef lint
Xstatic char rcsid[] =
X"$Header: /src/local/cmd/jlook/jlook.c,v 1.3 90/12/22 19:18:40 daved Exp $";
Xstatic char node[] = "physiol.su.oz.au";
X#endif /* lint */
X
X#include <stdio.h>
X#include "jlook.h"
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <ctype.h>
X#ifdef REGEXP
X#include <regexp.h>
X#endif /* REGEXP */
X
XFILE	* infp,
X	* outfp,	/* stdout or /dev/null */
X	* altfp;	/* additional jlist file */
Xchar	* xstr,
X	* leadin,	/* initially %J, reset if refer macros input */
X	* altfname;
Xint	errflg,
X	not_found,
X	nodots,
X	caps,
X	maxwid,		/* maximum length title with unpaddable blanks */
X	eflag,
X	mflag,
X	tflag,
X	xflag,
X	Eflag,
X	Allflag,
X	fflag,
X	altfile,
X	badcount;
Xlong	altstart;
X
X#ifdef COMPAT
XWarnCompat(c)
X	char c;
X{
X	fprintf
X	(	stderr,
X		"%s: Warning: switch -%c is obsolete. Use -u%c instead.\n",
X		progname,
X		c,
X		toupper(c)
X	);
X}
X#endif /* COMPAT */
X
X
Xmain(argc,argv)
X	int argc; char **argv;
X{
X	register int	i;
X	struct stat	sbuf;
X	long		mtime,
X			time();
X	char		*listfile,
X			*standard(),
X			*format();
X
X	leadin = "%J ";
X	listfile = LISTFILE;
X	if((progname = strrchr(argv[0],'/')) != NULL)
X		progname++;
X	else progname = argv[0];
X
X	output = full;
X	outfp = stdout;
X
X	while(--argc)
X	{
X		if(**++argv == '-')
X		  switch(*++*argv)
X		  {
X			case 'A':
X				Allflag++;
X				break;
X			case 'a':
X				altfile++;
X				argc--;
X				altfname = *++argv;
X				if((altfp = fopen(altfname,"r"))== NULL)
X					fatal("cannot open: %s\n",*argv);
X				break;
X#ifdef COMPAT
X			case 'c':
X				useab = 'C';
X				WarnCompat(**argv);
X				break;
X#endif /* COMPAT */
X			case 'C':
X				caps++;
X				break;
X			case 'd':
X				if(*++*argv)
X					debug = atoi(*argv);
X				else
X					debug++;
X				break;
X			case 'E':
X				Eflag++;
X			case 'e':
X				eflag++;
X				break;
X			case 'f':
X				fflag++;
X				break;
X#ifdef COMPAT
X			case 'i':
X				useab = 'I';
X				WarnCompat(**argv);
X				break;
X#endif /* COMPAT */
X			case 'l':
X				listfile = *++argv;
X				argc--;
X				break;
X			case 'm':	/* macros (from refer) */
X				mflag++;
X				if(*++*argv != '\0')
X					leadin = *argv;
X				else
X					leadin = ".ds [J ";
X				break;
X			case 'n':
X				if((outfp = fopen("/dev/null","w")) == NULL)
X					fatal("cannot open","/dev/null");
X				break;
X			case 'p':
X				nodots++;
X				break;
X			case 's':
X				if(*++*argv)
X					maxwid = atoi(*argv);
X				else
X					maxwid = 10;
X				break;
X			case 't':
X				tflag++;
X				break;
X			case 'u':
X				if((useab = *++*argv) == '\0')
X					fatal("no key following -u\n");
X				if(islower(useab))
X					useab=toupper(useab);
X				break;
X#ifdef COMPAT
X			case 'w':
X				useab = 'W';
X				WarnCompat(**argv);
X				break;
X#endif /* COMPAT */
X			case 'X':
X				xflag++;
X			case 'x':
X				xflag++;
X				if(*++*argv != '\0')
X					xstr = *argv;
X				break;
X			default:
X				fatal("unrecognized switch: %s\n", *argv);
X		  }
X		else
X			break;
X	}
X	if(!xstr)
X	{
X		if(mflag)
X			xstr = ".\\\"X ";
X		else
X			xstr = "%X ";
X	}
X
X	listopen(listfile);	/* sets lfp - may prepend path */
X	if(stat(listfile,&sbuf))
X		fatal("cannot stat: %s",listfile);
X	mtime = sbuf.st_mtime;
X	while(time((long *)0) - mtime < 10)
X	{
X		/* don't fail if a large library caught being rewritten */
X		sleep(10);
X		if(stat(listfile,&sbuf))
X			fatal("cannot stat: %s\n",listfile);
X		mtime = sbuf.st_mtime;
X	}
X	(void) strcpy(indfile,listfile);
X	(void) strcat(indfile,".index");
X	if(debug)
X		fprintf(stderr,"list file = %s\nindex file = %s\n",
X			listfile,indfile);
X	
X	/*
X	** now get the index if it exists and is up-to-date and is readable
X	*/
X	if(stat(indfile,&sbuf))
X	{
X		warn("no index for %s, making internal index\n", listfile);
X		l_index();
X	}
X	else if(sbuf.st_mtime < mtime)
X	{
X		warn("index predates %s, making internal index\n", listfile);
X		l_index();
X	}
X	else if((indfp = fopen(indfile,"r")) ==  NULL)
X	{
X		warn("cannot open %s, making internal index\n", indfile);
X		l_index();
X	}
X	else readindex();
X
X	/*
X	** if an alternate file was specified, make sure the keys match
X	*/
X	if(altfile)
X	{
X		get_keys(altfp,1);
X		altstart = ftell(altfp);
X	}
X	if(strchr(keys,useab) == NULL)
X		fatal("abbreviation key %c not in library\n", useab);
X
X	/*
X	** now do the work - either names in args, or files
X	*/
X	if(argc && !fflag)
X	{
X		char * item;
X		while(argc--)
X		{
X			/* argv already points to "next" arg */
X			if
X			(
X				!(
X					(**argv >= 'A' && **argv <= 'Z')
X					||	/* for number proceeedings */
X					(**argv >= '1' && **argv <= '9')
X				)
X			)
X				fatal
X				(
X					"%s capital or number: %s\n",
X					"non file argument must start with",
X					*argv
X				);
X			not_found = 0;
X			item = standard(*argv++);
X			if(not_found == 0)
X			{
X				if(equivocal)
X					errflg = 1;
X				if(caps || nodots)
X					printf("%s\n",
X						format(item,nodots,caps,0));
X				else
X					printf("%s\n",item);
X				if(Allflag)
X				{
X					for(i = 0; i<nkeys; i++)
X						printf
X						(
X							"%c %s\n",
X							keys[i],
X							&abbrev[np[keys[i] -
X								'A']-1][0]
X						);
X					for(i = 0; i < nvariant; i++)
X						printf("V %s\n",&variant[i][0]);
X					for(i = 0; i < ngrep; i++)
X						printf("* %s\n",&grep[i][0]);
X				}
X			}
X			else if(Eflag)
X				printf("%s: no match found\n", *(argv-1));
X		}
X		exit(errflg);
X	}
X	if(argc) /* && flag */
X	{
X		while(argc--)
X		{
X			if((infp = fopen(*argv++,"r")) == NULL)
X				fatal("cannot open: %s\n", *--argv);
X			process();
X			if(fclose(infp) == EOF)
X				fatal("cannot fclose: %s\n", *argv);
X		}
X		uexit(errflg);
X	}
X	/* else do standard input */
X	infp = stdin;
X	process();
X	uexit(errflg);
X}
X
Xuexit(n)
X	int n;
X{
X	if(!n && Eflag)
X		warn("no errors found\n");
X	exit(n);
X}
Xprocess()
X{
X	char	linebuf[BUFSIZ],
X		* format(),
X		* standard(),
X		* fixcase();
X
X	while(fgets(linebuf,sizeof linebuf,infp) != NULL)
X	{
X		if(strlen(linebuf) >= sizeof linebuf -1)
X			warn("input line too long: %s\n",linebuf);
X		not_found=0;
X		linebuf[strlen(linebuf)-1] = '\0';
X		if(strncmp(linebuf,leadin,strlen(leadin)) == 0)
X		{
X			fprintf
X			(
X				outfp,
X				"%s%s\n",
X				leadin,
X				(nodots || maxwid || caps) ?
X				   format
X				   (
X					standard(&linebuf[strlen(leadin)]),
X					nodots,
X					caps,
X					maxwid
X				   )
X				   : standard(&linebuf[strlen(leadin)])
X			);
X			if(equivocal)
X				errflg = 1;
X			if
X			(
X				(xflag && (not_found || equivocal))
X				||
X				xflag > 1
X			)
X				fprintf
X				(
X					outfp,
X					"%s%s\n",
X					xstr,
X					&linebuf[strlen(leadin)]
X				);
X			if((not_found || equivocal) && eflag)
X				fprintf
X				(
X					stderr,
X					"%%J %s\n",
X					&linebuf[strlen(leadin)]
X				);
X		}
X		else
X			fprintf(outfp,"%s\n",linebuf);
X	}
X}
Xstatic char * standard(s)
X	char *s;
X{
X	char		* regcmp(),
X			*make_re(),
X			* re,
X			*re_text,
X			*sre,
X			*sought;
X	static char	lastin[BUFSIZ];
X	static int	last_status;
X	int		i,
X			this_letter,
X			alt_done = 0,
X			fixed = 0;
X	FILE		*searchfile;
X	long		startpoint,
X			endpoint;
X
X	/*
X	** this little trick can vastly speed up processing of input
X	** containing sequential journal names which are identical
X	** - such as with lists of contents of a particular journal issue
X	*/
X	if(strcmp(s,lastin) == 0)
X	{
X		if(last_status)
X			return(s);
X		return(output);
X	}
X	else
X	{
X		(void) strncpy(lastin,s,sizeof lastin);
X		last_status = 0;
X	}
X
X	if(*s >= '0' && *s <= '9')
X		this_letter = 25;	/* 'Z' for numbered proceedings */
X	else
X	{
X		if(*s < 'A' || *s > 'Z')
X			goto no_no;
X		this_letter = *s-'A';
X	}
X	searchfile = lfp;
X	startpoint = letterseek[this_letter];
X	if(this_letter < 25)
X		endpoint = letterseek[this_letter+1];
X
Xdo_alt:
X	sought = s;
Xtrylower:
X	if(fseek(searchfile,startpoint,0) < 0)
X		fatal("seek failed\n");
X	if(debug == 11)
X		fprintf(stderr,"seek took us to %ld\n",ftell(searchfile));
X	while (get_listing(searchfile))
X	{
X		if(debug>2 && debug < 10)
X		{
X			fprintf(stderr,"comparing <%s> and:\n\tF<%s>\n",sought,
X			full);
X			for(i = 0; i<nkeys; i++)
X				fprintf
X				(
X					stderr,
X					"\t%c<%s>\n",keys[i],
X					&abbrev[np[keys[i] - 'A']-1][0]
X				);
X		}
X		/*  full title? */
X		if ( strcmp(sought,full) == 0)
X		{
X			if(debug > 2 && debug < 10)
X				fprintf(stderr,"returning %s\n",output);
X			return(output);
X		}
X		/*  standard abbreviation or full title? */
X		for(i=0; i<nabbrev; i++)
X		{
X			if(debug > 2 && debug < 10)
X				fprintf (stderr,
X				"comparing <%s> and <%s>\n",
X				sought,&abbrev[i][0]);
X			if ( strcmp(sought,&abbrev[i][0]) == 0)
X				return(output);
X		}
X		/* listed variant - i.e. locally accepted */
X		for(i = 0; i< nvariant; i++)
X		{
X			if(debug>2 && debug < 10)
X				fprintf(stderr,"comparing <%s> against <%s>\n",
X					sought,&variant[i][0]);
X			if(strcmp(sought,&variant[i][0]) == 0)
X				return(output);
X		}
X		if(this_letter < 25 && position >= endpoint)
X			break;
X	}
X
X	/* getting here means the input was not in the jlist file */
X	/* so can an re match get it against the full title ? */
X
X	/* start again in the jlist */
X	if(fseek(searchfile,startpoint,0) < 0)
X		fatal("seek failed\n");
X	if(!alt_done)
X		re = regcmp("^",re_text=make_re(sought),0);
X	while (get_listing(searchfile))
X	{
X		if(debug>1 && debug < 10)
X		{
X			fprintf (stderr,
X			"comparing re <%s> and: <%s>\n",
X			re_text,full);
X		}
X		if(regex(re,full,0))
X		{
X			free(re);
X			return(output);
X		}
X		if(this_letter < 25 && position >= endpoint)
X			break;
X	}
X	/* getting here means the input was not a full title in the jlist */
X	/* so can we match against an abbreviation? */
X	if(debug)
X		fprintf(stderr,"match against full titles failed\n");
X	/* start again in the jlist */
X	if(fseek(searchfile,startpoint,0) < 0)
X		fatal("seek failed\n");
X	while (get_listing(searchfile))
X	{
X		if(debug>1 && debug < 10)
X		{
X			fprintf (stderr,
X			"comparing re <%s> and: <%s>\n",
X			re_text,full);
X		}
X		for(i = 0; i< nabbrev; i++)
X		{
X			if(debug>2 && debug < 10)
X				fprintf(stderr,"comparing re against <%s>\n",
X					&abbrev[i][0]);
X			if(regex(re,&abbrev[i][0],0))
X			{
X				free(re);
X				return(output);
X			}
X		}
X		for(i = 0; i< nvariant; i++)
X		{
X			if(debug>2 || debug == 10)
X				fprintf(stderr,"comparing <%s> against <%s>\n",
X					re, &variant[i][0]);
X			if(regex(re,&variant[i][0],0))
X			{
X				free(re);
X				return(output);
X			}
X		}
X			/* if there is a grep string - try it */
X		for(i = 0; i< ngrep; i++)
X		{
X			sre = regcmp("^",&grep[i][0],0);
X			if(debug>2 && debug < 10)
X				fprintf(stderr,"trying grep string %s\n",
X					&grep[i][0]);
X			if(regex(sre,sought,0))
X			{
X				free(re);
X				free(sre);
X				return(output);
X			}
X			free(sre);
X#if	defined(RE_EXEC) || defined(REGEXP)
X			/* a nasty compatibility problem: re_comp keeps
X				its own copy of the re, so we can't reuse it */
X			free(re);
X			re = regcmp("^",re_text,0);
X#endif /* defined(RE_EXEC || defined(REGEXP) */
X		}
X		if(this_letter < 25 && position >= endpoint)
X			break;
X	}
X	/*
X	** if we have still failed by the time we get here, one possibility
X	** is that the input is all upper case, such as produced by some
X	** bibliographic software.  This will not match the data base.
X	** so...
X	*/
X	if(!fixed && allupper(s))
X	{
X		register char * tmp;
X		tmp = fixcase(s);
X		if(debug)
X			fprintf(stderr, "trying fixed case <%s>\n",
X					tmp);
X		sought = tmp;
X		fixed++;
X		goto trylower;
X	}
X	fixed = 0;
X	/* failed on this search file - if we have an alternate file
X		and have not done it yet, now is the time */
X	if(altfile && alt_done++ == 0)
X	{
X		if(debug)
X			fprintf(stderr,"using alternate file %s\n",altfname);
X		startpoint = altstart;
X		endpoint = 10000000L;
X		searchfile = altfp;
X		goto do_alt;
X	}
X	free(re);
Xno_no:
X	not_found = errflg = 1;	/* errflg is never reset */
X	if(badcount++ == 10)
X		(void) nice(6);	/* this person isn't trying ? */
X	last_status = 1;	/* in case we are asked again */
X	return(s); 		/* what we were given - failed! */
X}
Xchar * make_re(in)
X	char *in;
X{
X	static char	* dotstr = "[-a-z.,'`\"\\*:; ]*"; /* '`"\o and \*:
X								for diacrits */
X	static char	* enddot = "[a-z.]*";
X	static char	* colonstr = "[-:;., ]*";
X	static char	* closestr = "[]a-z). ]*";	/* ) or ] */
X	static char	* seriesstr = "[[Series cton]*"; /* Series or Section */
X		/* diacrits:  this is a mess because we want to accept
X			a number of input styles:
X			   tpr:	<diacrit> slosh 'o' letter
X			   macro packages: letter slosh '*' ['`:;]
X			   troff: slosh o delim letter diacrit letter ? will it?
X		 */
X	static char	*diacrits = "[\"'`^\\\\o*:;]*";
X	static char	buf[RE_MAX];
X	int		enddone = 0;
X	register char	*tmp,
X			*out,
X			*start;
X
X	out = buf;
X	start = in;
X
X		/* convert to a useful re */
X	while(*in)
X	    switch(*in)
X	{
X		case '.':	/* an abbreviation */
X			if(*(in +1) == '\0')
X			{
X				tmp = enddot;
X				enddone++;
X			}
X			else
X				tmp = dotstr;
X			while(*tmp)
X				*out++ = *tmp++;
X			if(*++in == ' ')
X				in++;
X			break;
X		case ' ': /* shouldn't get space after dot cause of above */
X			while(*(in+1) == ' ')
X				in++;	/* absorb multiple spaces */
X			if(*(in +1) == '\0')
X			{
X				in++;
X				break;
X			}
X			tmp=dotstr;
X			while(*tmp)
X				*out++ = *tmp++;
X			in++;
X			break;
X		case ',':	/* could be there, but maybe not */
X			*out++ = *in++;
X			*out++ = '*';
X			break;
X		case '-':	/* treat like ':' but strip any leading space
X				   and use any case of following letter (below) 
X			         */
X			if (*(out-1) == ' ')
X				out--;
X		case ';':	/* typo? */
X		case ':':	/* tricky - might be there, with or without
X					following space, or as a '-' instead */
X			tmp = colonstr;
X			while(*tmp)
X				*out++ = *tmp++;
X			if(*in == '-')
X			{
X				in++;
X				if(isalpha(*in))
X				{
X					*out++ = '[';
X					if(isupper(*in))
X						*out++ = tolower(*in);
X					else
X						*out++ = toupper(*in);
X					*out++ = *in++;
X					*out++ = ']';
X				}
X				else if(*in == ' ')
X					in++;
X				break;
X			}
X			else if(*++in == ' ')
X				in++;
X			break;
X		case ']':
X		case ')':	/* might be there, might not, also might
X					have a preceeding '.' missing */
X			if(*(out-1) == '.' || *(out -1) == ' ')
X				out--;
X			tmp = closestr;
X			while(*tmp)
X				*out++ = *tmp++;
X			in++;
X			break;
X		case '(':	/* might be there, might not */
X#ifndef RE_COMP
X			*out++ = '\\';
X#endif /* RE_COMP */
X			*out++ = *in++;
X			*out++ = '*';
X			break;
X		case 'A':
X		case 'B':
X		case 'C':
X			if
X			(
X			    !(
X				*(in+1) == '\0'		/* trailing letter */
X				||
X				(			/* letter dot */
X					*(in+1) == '.'
X					&&
X					*(in+2) == '\0'
X				)
X			     )
X			)
X				goto regular;
X			tmp = seriesstr;
X			while(*tmp)
X				*out++ = *tmp++;
X			*out++ = *in++;
X			*out++ = '.';
X			*out++ = '*';
X			if(*in != '\0')
X				in++;	/* that letter dot case */
X			break;
X
X			/* diacrits */
X		case '\'':			/* something like "l'Acad" */
X			*out++ = '*';		/* the preceeding letter */
X			if (*(in+1) == 's')	/* quite possible the ' is */
X			{			/* an error		   */
X				*out++ = *in++;
X				*out++ = '*';
X				break;
X			}
X		case '"':
X		case '^':
X		case '`':
X			if(*(in+1) != '\\' || *(in+2) != 'o')	/* tpr */
X			{
X				*out++ = *in++;
X				*out++ = '*';
X				break;
X			}
X			tmp = diacrits;
X			while(*tmp)
X				*out++ = *tmp++;
X			in += 3; /* skip current char plus \o */
X			break;
X			/* things that might need to be sloshed */
X		case '\\':
X			if(*(in+1) == '*')	/* macro type diacit */
X			{
X				in++;		/* ignore slosh */
X				in++;		/* ignore asterisk */
X				in++;		/* ignore the diacrit */
X				tmp = diacrits;
X				while(*tmp)
X					*out++ = *tmp++;
X				break;
X			}
X			else if (*(in+1) == ' ')/* unpaddable space */
X			{
X				in++;		/* ignore slosh */
X				break;
X			}
X		case '*':
X		case '[':
X		/* case ']': */
X			*out++ = '\\';
X			*out++ = *in++;
X			break;
X		default:
X			/*
X			** special case of 2/3 letter words which may/may
X			** not be capitalized
X			*/
X			if
X			(
X				in > start
X				&&
X				*(in-1) == ' '
X				&&
X				isupper(*in)
X				&&
X				*(in+1)
X				&&
X				(
X					*(in+2) == ' '
X					||
X					(
X						*(in+2)
X						&&
X						*(in+3) == ' '
X					)
X				)
X			)
X			{
X				*out++ = '[';
X				*out++ = tolower(*in);
X				*out++ = *in++;
X				*out++ = ']';
X				break;
X			}
Xregular:
X			*out++ = *in++;
X			break;
X	}
X	while(*(out-1) == ' ' || *(out-1) == '\t') /* clobber trailing white */
X		out--;
X	if(!enddone)	/* might have something left of end of last word */
X	{
X		tmp = enddot;
X		while(*tmp)
X			*out++ = *tmp++;
X	}
X	if(!tflag)
X		*out++ = '$';
X	if(out >= buf + RE_MAX)
X		fatal("re buffer size exceeded: %s\n",buf);
X	*out = '\0';
X	if(debug)
X		fprintf(stderr,"re: %s\n",buf);
X	return(buf);
X}
Xchar *
Xformat(s,nodots,caps,maxwid)
X	char *s;
X	int nodots,caps,maxwid;
X{
X	/*
X	**	eliminate fullstops in abbreviations
X	**	place sloshes before spaces
X	**	convert to uppercase only
X	*/
X
X	register	count = 0;
X	register	char	*lp;
X	static		char	lbuf[256];
X
X	lp = lbuf;
X	while(*s)
X	{
X		if(nodots && *s == '.')
X		{
X			s++;
X			continue;
X		}
X		if(caps && islower(*s))
X			*s = toupper(*s);
X		if(maxwid && *s == ' ')
X		{
X			if(count > maxwid)
X			{
X				*lp++ = *s++;
X				count = 0;
X				continue;
X			}
X			*lp++ = '\\';
X		}
X		*lp++ = *s++;
X		count++;
X	}
X	*lp = '\0';
X	return(lbuf);
X}
X
X#if	defined(REGEXP) && defined(RE_EXEC)
X#	include "use only one of REGEXP or RE_EXEC"
X#endif	/* defined(REGEXP) && defined(RE_EXEC) */
X
X#ifdef REGEXP
X	/*  these functions are not an attempt at complete duplication of
X	 *  the version 7 ones, but will do the job for the calls above
X	 */
Xstatic	char	re_incore[RE_MAX];
Xint		re_errflag;
Xstatic	regexp	*regprog;
Xregex(re,str,n)
X	char * re, * str;
X	int n;
X{
X	int	retval;
X
X	if(strcmp(re,re_incore))
X	{
X		if (re_errflag++ == 0)
X			warn("regex problem: was <%s>; request <%s>\n",
X				re_incore,re);
X		return(0);	/* i.e. no match */
X	}
X
X	if(n || re == NULL)
X		fatal("internal error: regex given invalid argument\n");
X	if (debug > 2 && debug < 10)
X		fprintf(stderr,"regexec <%s> <%s>",re,str);
X	if((retval = regexec(regprog,str)) == -1)
X	{
X		warn("regexec internal error: %s\n",str);
X		return(0);
X	}
X	if (debug > 2 && debug < 10)
X		fprintf(stderr," returned %d\n",retval);
X	return(retval);
X}
Xchar *
Xregcmp(s1,s2,n)
X	char * s1,*s2;
X	int n;
X{
X	char	* bufp;
X	char	* malloc(),
X		* re_comp();
X
X#ifdef lint
X	if(0)
X		regerror("keep lint smiling\n");
X#endif /* lint */
X
X	re_errflag = 0;
X	if(n)
X		fatal("internal error: regcmp given invalid argument");
X	if((bufp = malloc((unsigned)strlen(s1)+strlen(s2)+1)) == NULL)
X		fatal("malloc failed in regcmp\n");
X	(void) strcpy(bufp,s1);
X	(void) strcat(bufp,s2);
X	(void) strcpy(re_incore,bufp);			/* keep a record */
X	if(regprog)
X		free((char *)regprog);
X	if((regprog = regcomp(bufp)) == NULL)
X	{
X		/*
X		** if we get this error, try to recover with a string
X		** that should always compile and never match so we must
X		** pass the input through
X		*/
X		(void) strcpy(bufp,"UN_JOURNAL_ERROR_STOPPER");
X		regprog = regcomp(bufp); /* should always compile */
X	}
X	return(bufp);
X}
X/*
X** prevent fatal errors
X*/
Xvoid
Xregerror(s)
X	char *s;
X{
X	warn("%s\n",s);
X}
X#endif /* REGEXP */
X#ifdef RE_EXEC
X	/*  these functions are not an attempt at complete duplication of
X	 *  the version 7 ones, but will do the job for the calls above
X	 */
Xstatic	char	re_incore[RE_MAX];
Xint		re_errflag;
Xregex(re,str,n)
X	char * re, * str;
X	int n;
X{
X	int retval;
X
X	if(strcmp(re,re_incore))
X	{
X		if (re_errflag++ == 0)
X			warn("regex problem: was <%s>; request <%s>\n",
X				re_incore,re);
X		return(0);	/* i.e. no match */
X	}
X
X	if(n || re == NULL)
X		fatal("internal error: regex given invalid argument\n");
X	if (debug > 2 && debug < 10)
X		fprintf(stderr,"re_exec <%s> <%s>",re,str);
X	if((retval = re_exec(str)) == -1)
X	{
X		warn("re_exec internal error: %s\n",str);
X		return(0);
X	}
X	if (debug > 2 && debug < 10)
X		fprintf(stderr," returned %d\n",retval);
X	return(retval);
X}
Xchar *
Xregcmp(s1,s2,n)
X	char * s1,*s2;
X	int n;
X{
X	char	* bufp;
X	char	* malloc(),
X		* re_comp(),
X		* errmes;
X
X	re_errflag = 0;
X	if(n)
X		fatal("internal error: regcmp given invalid argument");
X	if((bufp = malloc((unsigned)strlen(s1)+strlen(s2)+1)) == NULL)
X		fatal("malloc failed in regcmp\n");
X	(void) strcpy(bufp,s1);
X	(void) strcat(bufp,s2);
X	(void) strcpy(re_incore,bufp);			/* keep a record */
X	if((errmes = re_comp(bufp)) != 0)
X	{
X		warn("re_comp error: %s: %s\n", errmes, bufp);
X		/*
X		** if we get this error, try to recover with a string
X		** that should always compile and never match so we must
X		** pass the input through
X		*/
X		(void) strcpy(bufp,"UN_JOURNAL_ERROR_STOPPER");
X		(void) re_comp(bufp); /* should always compile */
X	}
X	return(bufp);
X}
X#endif /* RE_EXEC */
X
X/* VARARGS1 */
Xwarn(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
X	char	* fmt;
X	long	a1,a2,a3,a4,a5,a6,a7,a8,a9;
X{
X	fprintf(stderr,"%s: ", progname);
X	fprintf(stderr, fmt, a1,a2,a3,a4,a5,a6,a7,a8,a9);
X}
X
Xallupper(p)
X	char *p;
X{
X	for( ; *p != '\0'; p++)
X		if(*p >= 'a' && *p <= 'z')
X			return (0);
X	return(1);
X}
X
Xchar * fixcase(p)
X	char *p;
X{
X	register int	lastwasup;
X	register char	* out;
X	static   char	outline[BUFSIZ];
X
X	for(out=outline, lastwasup=0; *p != '\0'; p++, out++)
X	{
X		if (*p >= 'A' && *p <= 'Z')
X		{
X			if(lastwasup)
X				*out = *p - 'A' + 'a';
X			else
X			{
X				lastwasup = 1;
X				*out = *p;
X			}
X		}
X		else
X		{
X			lastwasup = 0;
X			*out = *p;
X		}
X	}
X	*out = '\0';
X	return(outline);
X}
SHAR_EOF
chmod 0440 jlook.c || echo "restore of jlook.c fails"
set `wc -c jlook.c`;Sum=$1
if test "$Sum" != "21161"
then echo original size 21161, current size $Sum;fi
echo "x - extracting jindex.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > jindex.c &&
X/* jindex.c
X *
X *	Copyright D.F. Davey, University of Sydney
X *
X *	Permission is granted for the distribution of this software
X *	for non-profit purposes and provided this notice remains intact
X *
X *	daved@physiol.su.oz.au
X */
X
X#ifndef lint
Xstatic char rcsid[] =
X"$Header: /src/local/cmd/jlook/RCS/jindex.c,v 1.1 90/02/04 14:35:14 daved Rel $";
Xstatic char node[] = "physiol.su.oz.au";
X#endif /* lint */
X
X#include <stdio.h>
X#include "jlook.h"
X
Xmain(argc,argv)
X	int argc; char **argv;
X{
X	char * listfile = LISTFILE;
X
X	if((progname = strrchr(argv[0],'/')) != NULL)
X		progname++;
X	else progname = argv[0];
X
X	while(--argc)
X	{
X		if(**++argv == '-')
X		  switch(*++*argv)
X		  {
X			case 'd':
X				if(*++*argv)
X					debug = atoi(*argv);
X				else
X					debug++;
X				break;
X			case 'l':
X				listfile = *++argv;
X				argc--;
X				break;
X			default:
X				fatal("unrecognized switch: %s\n",*argv);
X		  }
X		else
X			break;
X	}
X
X	listopen(listfile);	/* sets lfp - may prepend path */
X	(void) strcpy(indfile,listfile);
X	if((indfp = fopen(strcat(indfile,".index"),"w")) == NULL)
X		fatal("cannot open: %s\n", indfile);
X	indexing++;
X	l_index();
X	outindex();
X	if(debug)
X	{
X		if(fclose(indfp) == EOF)
X			fatal("cannot fclose: %s\n", indfile);
X		if((indfp = fopen(indfile,"r")) == NULL)
X			fatal("cannot open: %s\n", indfile);
X		readindex();
X	}
X	exit(0);
X}
X
Xoutindex()
X{
X	register int i;
X
X	fprintf(indfp,"%s\n",keys);
X	if(debug)
X		fprintf(stderr,"%s\n",keys);
X	for(i = 0; i<26; i++)
X	{
X		fprintf(indfp,"%ld\n",letterseek[i]);
X		if(debug)
X			fprintf(stderr,"writing %ld for %d (%c)\n",
X				letterseek[i],i,(char) 'A' + i);
X	}
X}
SHAR_EOF
chmod 0440 jindex.c || echo "restore of jindex.c fails"
set `wc -c jindex.c`;Sum=$1
if test "$Sum" != "1597"
then echo original size 1597, current size $Sum;fi
echo "x - extracting jsubs.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > jsubs.c &&
X/* jsubs.c
X *
X *	Copyright D.F. Davey, University of Sydney
X *
X *	Permission is granted for the distribution of this software
X *	for non-profit purposes and provided this notice remains intact
X *
X *	daved@physiol.su.oz.au
X */
X
X#ifndef lint
Xstatic char jsubs_id[] =
X"$Header: /src/local/cmd/jlook/jsubs.c,v 1.2 90/06/06 17:55:10 daved Exp Locker: daved $";
X#endif /* lint */
X
X#include	<stdio.h>
X
X#ifdef VERSION_7
X#include	<param.h>
X#else /* VERSION_7 */
X#include	<sys/param.h>
X#endif /* VERSION_7 */
X
X#include	"jlook.h"
X
X#ifndef	MAXPATHLEN
X#define MAXPATHLEN 128
X#endif
X
Xget_keys(f,checkonly)
X	FILE	*f;
X	int	checkonly;
X{
X	register char c;
X	char	buf[20];
X	int	naltkeys = 0;
X
X	getlabel(buf,f);
X	if(strcmp(buf,KEYS) != 0)
X		fatal("fails to start with keys: %s (line %d)\n", buf,line_num);
X	while ((c = getc(f)) != '\n')
X	{
X		switch(c)
X		{
X			case ' ':
X			case '\t':
X				continue;
X			case ACCEPT:
X			case EXCEPTION:
X			case UNDEFINED:
X			case GREP:
X			case SORT:
X			case FULLTAG:
X				fatal("reserved key letter: %c\n", c);
X			default:
X				if(c < 'A' || c > 'Z')
X					fatal("key not capital letter: %c\n",c);
X				if(checkonly)
X				{
X					if(strchr(keys,c) == NULL)
X						fatal
X						(
X							"%s %c %s (%s)\n",
X							"alternate file key",
X							c,
X							"not in library keys",
X							keys
X						);
X					naltkeys++;
X				}
X				else
X				{
X					if(strchr(keys,c) != NULL)
X						fatal("duplicated key: %c\n",c);
X					keys[nkeys++] = c;
X				}
X		}
X	}
X	line_num++;
X	if(checkonly && naltkeys != nkeys)
X		fatal
X		(
X			"%s (%d) and alternate file (%d) keys\n",
X			"different number of library",
X			nkeys,
X			naltkeys
X		);
X	if(debug == 1)
X	{
X		if(checkonly)
X			fprintf(stderr,"check only: ");
X		fprintf(stderr,"Keys: %s\n",keys);
X	}
X}
X	
Xget_listing(f)
X	FILE *f;
X{
X	register char * tag, *first;
X	int	nfirst;
X	char	buf[20];
X	nfirst = 0;
X	first = '\0';
X	out_of_order = ngrep =  nvariant = nabbrev = equivocal = 0;
X	full[0] = '\0';
X
X	tag = keys;
X	while(*tag)
X		np[*tag++ - 'A'] = 0;
X	for(;;)
X	{
X		tag = buf;
X		getlabel(tag,f);
X
X		if(debug >= 2 && debug < 10)
X			fprintf(stderr,"reading label <%s> in list file\n",buf);
X
X		switch(*tag)
X		{
X			case '\0':
X				if(debug > 3 && debug < 10)
X					fprintf(stderr,"getlabel return(0)\n");
X				return(0);
X			case '\n':
X				if(debug > 2 && debug < 10)
X					fprintf(stderr,"nvariant = %d\n",
X							nvariant);
X				if(debug > 3 && debug < 10)
X					fprintf(stderr,"getlabel return(1)\n");
X				if(useab)
X					output = &abbrev[np[useab-'A']-1][0];
X				position = ftell(f);
X				return(1);
X			case FULLTAG:
X				if(full[0])
X					fatal
X					(
X						"F duplicated: %s at line %d\n",
X						full,
X						line_num
X					);
X				getline(first = full,f);
X				break;
X			case ACCEPT:
X				getline(&variant[nvariant++][0],f);
X				break;
X			case GREP:
X				getline(&grep[ngrep++][0],f);
X				break;
X			case EXCEPTION:
X				getline(first = full,f);
X				out_of_order++;
X				break;
X			case UNDEFINED:
X				getline(first = full,f);
X				equivocal++;
X				break;
X			default:
X				if(strchr(keys,*tag) == NULL)
X					fatal
X					(
X						"bad tag: %s at line %d\n",
X						buf,
X						line_num
X					);
X				if(indexing && np[*tag-'A'])
X					fatal
X					(
X						"%c duplicate: %s at line %d\n",
X						*tag,
X						full,
X						line_num
X					);
X				np[*tag-'A'] = nabbrev + 1;
X				first = &abbrev[nfirst=nabbrev++][0];
X				getline(first,f);
X				break;
X		}
X		if(*(tag+1) && !first)
X			fatal("inappropriate tag list: %s\n", buf);
X		while(*++tag)
X		{
X			if(debug > 1 && debug < 10)
X				fprintf(stderr,"for %s, additional tag %c\n",
X						first,*tag);
X			if(strchr(keys,*tag) == NULL)
X				fatal("inappropriate tag list: %s\n",buf);
X			if(indexing && np[*tag-'A'])
X				fatal("%c entry duplicated: %s\n",*tag,buf);
X			if(nabbrev)
X				np[*tag - 'A'] = nfirst+1;
X			else
X			{
X				np[*tag - 'A'] = nabbrev + 1;
X				(void)strcpy(&abbrev[nfirst=nabbrev++][0],full);
X			}
X		}
X		if(nabbrev >= NABBR)
X			fatal
X			(
X				"too many abbreviation fields: %s at line %d\n",
X				full,
X				line_num
X			);
X		if(nvariant >= NVARIANT)
X			fatal
X			(
X				"too many V fields: %s at line %d\n",
X				full,
X				line_num
X			);
X	}
X}
Xgetline(s,locfp)
X	char *s;
X	FILE *locfp;
X{
X	register char	*p;
X	char		*start;
X	start = p = s;
Xcont:
X	while((*p = getc(locfp)) == ' ' || *p == '\t')
X		;	/* ignore leading white space */
X	p++;
X	while((*p = getc(locfp)) != '\n')
X		p++;
X	line_num++;
X	if(*(p-1) == '\\')
X	{
X		*(p-1) = ' ';
X		if(*(p-2) == ' ')
X			p--;
X		goto cont;
X	}
X	if(p - start > JMAX)
X		fatal("name too long: %s at line %d\n", full, line_num);
X	*p = '\0';
X}
Xgetlabel(s,locfp)
X	char *s;
X	FILE *locfp;
X{
X	register	char c,
X			lastc;
X	register int	count = 0;
X
X	while((c = getc(locfp)) != EOF)
X	{
X		if(count++ == 0 && (c == '#' || c == SORT))
X		{
Xmore:
X			while((c = getc(locfp)) != '\n')
X				lastc = c;
X			count = 0;
X			line_num++;
X			if(lastc == '\\')
X				goto more;
X			continue;
X		}
X		if(c == ' ' || c == '\t')
X			break;
X		*s++ = c;
X		if(c == '\n')
X		{
X			line_num++;
X			break; /* but return it as tag for end of item */
X		}
X	}
X	*s = '\0';
X}
X
X/* VARARGS1 */
Xfatal(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
X	char	* fmt;
X	long	a1,a2,a3,a4,a5,a6,a7,a8,a9;
X{
X	fprintf(stderr,"%s: ", progname);
X	fprintf(stderr, fmt, a1,a2,a3,a4,a5,a6,a7,a8,a9);
X	exit(1);
X}
Xl_index()
X{
X	int	letter = 0,
X		i;
X	char	which = 'A';
X	long	lastposition;
X	long	ftell();
X
X	get_keys(lfp,0);
X	lastposition = letterseek[0] = ftell(lfp);
X	if(debug && debug < 10)
X		fprintf(stderr,"offset for %c = %ld\n",
X			which, lastposition);
X
X	while (get_listing(lfp))
X	{
X		if(full[0] == 0)
X		{
X			char * have = 0;
X			for(i=0; i<nkeys; i++)
X				if(np[keys[i]-'A'])
X				{
X					have = &abbrev[np[keys[i]-'A']-1][0];
X					break;
X				}
X			if(!have)
X			{
X				if(nvariant)
X					have = &variant[0][0];
X				else if(ngrep)
X					have = &grep[0][0];
X				fatal
X				(
X					"no full title: %s at line %d\n",
X					have,
X					line_num
X				);
X				exit(1);
X			}
X		}
X		for(i=0; i<nkeys; i++)
X			if(!np[keys[i] - 'A'])
X			{
X				fatal
X				(
X					"no %c abbreviation: %s at line %d\n",
X					keys[i],
X					full,
X					line_num
X				);
X				exit(1);
X			}
X		if(debug > 1 && debug < 10)
X		{
X			fprintf (stderr, "got:\n");
X			for(i=0; i<nkeys; i++)
X				fprintf(stderr,"\t%c<%s>\n",keys[i],
X					&abbrev[np[keys[i]-'A']-1][0]);
X
X		}
X		if(out_of_order)
X		{
X			if(debug>1 && debug < 10)
X				fprintf(stderr,"out_of_order entry: %s\n",full);
X		}
X		else if(full[0] < (char) which)
X		{
X			if(full[0] < 'A')
X				fprintf
X				(
X					stderr,
X					"%s %c (\\0%o)\n",
X					"illegal start to journal title:",
X					full[0],
X					full[0]
X				);
X			if(debug && debug < 10)
X			fprintf
X			(
X				stderr,
X				"expecting entry to start with %c not %c\n",
X				which,
X				full[0]
X			);
X			fatal("out of order: %s\n",full);
X			exit(1);
X		}
X		else while(full[0] >= (char) which + 1)
X		{
X			letterseek[++letter] = lastposition;
X			which++;
X			if(debug && debug < 10)
X				fprintf(stderr,"offset for %c = %ld\n",
X					which, position);
X		}
X		lastposition = position;
X	}
X}
Xreadindex()
X{
X	register int i = 0;
X
X	if(fgets(keys, sizeof keys, indfp) == NULL)
X	{
X		fatal("cannot read Keys line\n");
X		exit(1);
X	}
X	if(debug)
X		fprintf(stderr,"Keys: %s\n",keys);
X	for(i=0; i<strlen(keys); i++)
X	{
X		if(keys[i] == '\n')
X		{
X			keys[i] = '\0';
X			break;
X		}
X		if(keys[i] < 'A' || keys [i] > 'Z')
X		{
X			fatal("illegal key in index: %c\n", keys[i]);
X			exit(1);
X		}
X	}
X	nkeys = strlen(keys);
X
X	for(i = 0; i<26; i++)
X	{
X		if(fscanf(indfp,"%ld\n",&letterseek[i]) != 1)
X		{
X			fatal("index file format error\n");
X			exit(1);
X		}
X		if(debug>1 && debug < 10)
X			fprintf(stderr,"read %ld for %d (%c)\n",
X				letterseek[i],i,(char) 'A' + i);
X	}
X}
Xlistopen(name)
X	char *name;
X{
X	static char	pathname[MAXPATHLEN];
X
X	if((lfp = fopen(name,"r")) == NULL)
X	{
X		(void) strcpy(pathname,LISTDIR);
X		if((lfp = fopen(strcat(pathname,name),"r")) == NULL)
X		{
X			fatal("cannot open: %s\n",name);
X			exit(1);
X		}
X		name = pathname;
X	}
X}
SHAR_EOF
chmod 0640 jsubs.c || echo "restore of jsubs.c fails"
set `wc -c jsubs.c`;Sum=$1
if test "$Sum" != "7825"
then echo original size 7825, current size $Sum;fi
echo "x - extracting jlook.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > jlook.h &&
X/* jlook.h
X *
X *	Copyright D.F. Davey, University of Sydney
X *
X *	Permission is granted for the distribution of this software
X *	for non-profit purposes and provided this notice remains intact
X *
X *	daved@physiol.su.oz.au
X */
X
X#ifndef lint
Xstatic char header_id[] =
X"$Header: /src/local/cmd/jlook/jlook.h,v 1.1 90/02/03 17:33:00 daved Rel $";
X#endif /* lint */
X
X#ifdef	RINDEX
X#	define	strrchr rindex
X#	include <strings.h>
X#else	RINDEX
X#	include <string.h>
X#endif	RINDEX
X
X
X#define LISTFILE	"/usr/lib/refer/jlist"
X#define LISTDIR		"/usr/lib/refer/"	/* addition place to look */
X#define EXCEPTION	'E'
X#define UNDEFINED	'U'	/* cases where title sans city is eqivocal */
X#define GREP		'*'
X#define CHEMTAG		'C'
X#define INDMEDTAG	'I'
X#define WORLDTAG	'W'
X#define FULLTAG		'F'
X#define ACCEPT		'V'
X#define	SORT		'S'
X#define	JMAX		160
X#define RE_MAX		512	/* jsubs tests this is not exceeded */
X#define NVARIANT	20	/* hope we don't need more */
X#define NABBR		5	/* should only ever get 3 */
X#define NGREP		5	/* probably really only need one */
X#define KEYS		"Keys:"
X
Xint	debug,
X	equivocal,		/* set for case UNDEFINED */
X	out_of_order;		/* set for case EXCEPTION */
XFILE	*fopen(),
X	*lfp,
X	*indfp;			/* index file */
Xchar	*progname,
X	indfile[128];		/* index file (listfile.index) */
X
X	/* global storage for items read from the Jlist file */
Xchar	full[JMAX],
X	grep[NGREP][JMAX],
X	abbrev[NABBR][JMAX],
X	keys[NABBR],
X	variant[NVARIANT][JMAX],
X	useab;			/* selected output abbreviation key */
Xint	np[26]; 		/* index to abbrev for key letter */
Xint	nkeys;
Xint	nabbrev;
Xint	ngrep;
Xint	nvariant;
Xint	indexing;	/* flag set if jindex is running */
Xlong	line_num;	/* for debugging */
Xchar	* output;
X
X	/* global storage for index */
Xlong	letterseek[26];
Xlong	position;	/* where we are in jlist after reading an item */
SHAR_EOF
chmod 0440 jlook.h || echo "restore of jlook.h fails"
set `wc -c jlook.h`;Sum=$1
if test "$Sum" != "1795"
then echo original size 1795, current size $Sum;fi
echo "x - extracting Makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > Makefile &&
X# jlook Makefile
X#
X# $Header: /src/local/cmd/jlook/Makefile,v 1.1 90/02/04 14:34:10 daved Rel $
X
XBINDIR=/usr/local
XLIBDIR=/usr/lib/refer
X
X# CFLAGS
X# ======
X# if regcomp and regexp are available (such as on 4.3Tahoe), use
X# CFLAGS=-DREGEXP
X# for 4.3BSD or any system with re_comp and re_exec rather than recmp and regex
X# CFLAGS=-DRE_EXEC
X# 
X# for 4.2BSD and earlier BSD systems that use rindex() rather than strrchr()
X# 	include -DRINDEX
X# 
X# for Version 7 systems having params.h in /usr/include and not in
X#	/usr/include/sys, include -DVERSION_7
X
X# to support earlier versions with hard-wired support for Chem. Abstracts,
X# 	Index Medicus and World List switches (-c, -i, -w) instead of
X#	-u switch include -DCOMPAT
X
XCFLAGS=-DREGEXP -O
X
Xall: jlook jindex
X
Xinstall: $(BINDIR)/jlook $(LIBDIR)/jindex
X
Xlibrary: $(LIBDIR)/jindex $(LIBDIR)/jlist
X
Xcheck: jlook tst_input tst_full_good tst_chem_good
X	./jlook -E -l ./jlist -f tst_input> tst_output
X	cmp tst_output tst_full_good
X	./jlook -E -l ./jlist -f -uC tst_input> tst_output
X	cmp tst_chem_good tst_output
X	./jlook -E -l ./tst_alt -f -uX tst_input > tst_output
X	cmp tst_chem_good tst_output
X	rm -f tst_output
X
X$(BINDIR)/jlook: jlook
X	cp jlook $(BINDIR)
X	chmod 711 $(BINDIR)/jlook
X
X$(LIBDIR)/jindex: jindex
X	cp jindex $(LIBDIR)
X	chmod 711 $(LIBDIR)/jindex
X
X$(LIBDIR)/jlist: jlist
X	cp jlist $(LIBDIR)
X	chmod 444 $(LIBDIR)/jlist
X	$(LIBDIR)/jindex
X	chmod 444 $(LIBDIR)/jlist.index
X
Xjindex: jindex.o jsubs.o
X	$(CC) -o jindex jindex.o jsubs.o
X
Xjlook: jlook.o jsubs.o
X	$(CC) -o jlook jlook.o jsubs.o
X
Xjsubs.o: jsubs.c jlook.h
X	$(CC) $(CFLAGS) -c jsubs.c
X
Xjlook.o: jlook.c jlook.h
X	$(CC) $(CFLAGS) -c jlook.c
X
Xjlook.lint: jlook.c jlook.h jsubs.c
X	lint $(CFLAGS) jlook.c jsubs.c > jlook.lint
X
Xjindex.lint: jindex.c jlook.h jsubs.c
X	lint $(CFLAGS) jindex.c jsubs.c > jindex.lint
X
Xclean:
X	rm -f a.out *.o *.lint ERRORS MADE INSTALL *.index
X
Xclobber: clean
X	rm -f jlook jindex
X
SHAR_EOF
chmod 0400 Makefile || echo "restore of Makefile fails"
set `wc -c Makefile`;Sum=$1
if test "$Sum" != "1915"
then echo original size 1915, current size $Sum;fi
echo "x - extracting tst_alt (Text)"
sed 's/^X//' << 'SHAR_EOF' > tst_alt &&
X# This file tests the use of abbreviation keys other that XYZ
XKeys: XYZ
XE Nippon Acta Something
XXYZ Nippon Acta
XV Acta Something
X
XF American Journal of Physiology
XXYZ Amer. J. Physiol.
XV AJP
XV Amer J Physiol
X* Ajp
X* AJp
X
XF	Journal of Anatomy
XXYZ	J. Anat.
X
XF Journal of Physiology
XX J. Physiol. (London)
XY J. Physiol. (Lond.)
XZ J. Physiol.
XV J Physiol
X
XF Medical Research Reviews
XXYZ Med. Res. Rev.
X
XUXYZ Medicina (WHICH ONE?)
XV Medicina
X
XUXYZ Medicina (Buenos Aires)
XV Medicina
X
XF	Pflu\*:gers Archiv European Journal of Physiology
XXYZ	Pflu\*:gers Arch.
XV	Pflugers Archiv
XV	Pflugers Arch.
XV	Pflugers Archiv European Journal of Physiology
X
XF Physiological Reviews
XXYZ Physiol. Rev.
X
X# out of order entry
XE Journal of Physiology
XX J. Physiol. (London)
XY J. Physiol. (Lond.)
XZ J. Physiol.
XV Physiol. J.
X
XFXYZ Tekniques
XV Tekniques
X
XF Zoologiska Bidrag fran Uppsala
XX Zool. Bidr. Uppsala
XY Zool. Bidr. Ups.
XZ Zool. Bidrag Uppsala
XV Zoologiska Bidrag fran Uppsala
X
XF	Zentralblatt fu\*:r Veterina\*:rmedizin Reihe A
XX	Zentralbl. Veterina\*:rmed. Reihe A
XY	Zentralbl. Veterina\*:rmed. [A]
XZ	Zbl. Vet.-Med. Rheihe A
XV	Zentralblatt fur Veterinarmedizin Rheihe A
XV	Zentralblatt fur Veterinar Medizin Rheihe A
XV	Zentralblatt fur Veterinarmedizin Reihe A
XV	Zentralblatt fur Veterinar Medizin Reihe A
XV	Zentralblatt fur Vet Med A
X*	Z[entralb f\\"ur.]*Vet[erina. ]*[Mm]*ed[izin. Rhe]* A\.*$
X
XF	Zentralblatt fu\*:r Veterina\*:rmedizin Reihe C
XX	Zentralbl. Veterina\*:rmed. Reihe C
XY	Zentralbl. Veterina\*:rmed. [C]
XZ	Zbl. Vet.-Med. Rheihe C
XV	Zentralblatt fur Veterinarmedizin Rheihe C
XV	Zentralblatt fur Veterinar Medizin Rheihe C
XV	Zentralblatt fur Veterinarmedizin Reihe C
XV	Zentralblatt fur Veterinar Medizin Reihe C
XV	Zentralblatt fur Vet Med C
X*	Z[entralb f\\"ur.]*Vet[erina. ]*[Mm]*ed[izin. Rhe]* C\.*$
X
SHAR_EOF
chmod 0440 tst_alt || echo "restore of tst_alt fails"
set `wc -c tst_alt`;Sum=$1
if test "$Sum" != "1795"
then echo original size 1795, current size $Sum;fi
echo "x - extracting tst_chem_good (Text)"
sed 's/^X//' << 'SHAR_EOF' > tst_chem_good &&
X# some shoddy input
X%J J. Physiol. (London)
X%J J. Anat.
X%J Pflu\*:gers Arch.
X%J Zentralbl. Veterina\*:rmed. Reihe A
SHAR_EOF
chmod 0440 tst_chem_good || echo "restore of tst_chem_good fails"
set `wc -c tst_chem_good`;Sum=$1
if test "$Sum" != "116"
then echo original size 116, current size $Sum;fi
echo "x - extracting tst_full_good (Text)"
sed 's/^X//' << 'SHAR_EOF' > tst_full_good &&
X# some shoddy input
X%J Journal of Physiology
X%J Journal of Anatomy
X%J Pflu\*:gers Archiv European Journal of Physiology
X%J Zentralblatt fu\*:r Veterina\*:rmedizin Reihe A
SHAR_EOF
chmod 0440 tst_full_good || echo "restore of tst_full_good fails"
set `wc -c tst_full_good`;Sum=$1
if test "$Sum" != "171"
then echo original size 171, current size $Sum;fi
echo "x - extracting tst_input (Text)"
sed 's/^X//' << 'SHAR_EOF' > tst_input &&
X# some shoddy input
X%J J.Physio.
X%J J. Anatom.
X%J Pflugers Arch. Eu. J. Phys.
X%J Zbl. Vet. Med. A
SHAR_EOF
chmod 0440 tst_input || echo "restore of tst_input fails"
set `wc -c tst_input`;Sum=$1
if test "$Sum" != "98"
then echo original size 98, current size $Sum;fi
echo "x - extracting jlist (Text)"
sed 's/^X//' << 'SHAR_EOF' > jlist &&
X# jlook library file
X# $Header: /src/local/cmd/jlook/jlist,v 1.18 90/11/07 11:11:44 daved Exp $
X#
X# $Log:	jlist,v $
X# Revision 1.18  90/11/07  11:11:44  daved
X# various Scimate variants
X# 
X# Revision 1.17  90/08/10  18:37:09  daved
X# Several new journals, minor corrections, new variants
X# 
X# Revision 1.16  90/07/27  08:54:55  daved
X# new journals:  Edinburgh Med. J.;  J. Psychol. Neurol.; Zentralb. Neuroch.
X# 
X# Revision 1.15  90/07/23  18:23:02  daved
X# Added Diabetes Research
X# 
X# Revision 1.14  90/06/09  07:48:11  daved
X# serveral new surgical journals
X# 
X# Revision 1.13  90/06/06  17:10:02  daved
X# Added more current contents variants
X# 
X# Revision 1.12  90/06/06  16:26:36  daved
X# numerous additions
X# 
X# Revision 1.10  90/04/06  22:13:40  daved
X# About 10 new journals added
X# 
X# Revision 1.9  90/04/06  21:52:09  daved
X# Numerous variants for Current Contents
X# 
X# Revision 1.8  90/03/21  17:59:09  daved
X# New Journal of Biomechanical Engineering variant
X# 
X# Revision 1.7  90/03/17  17:34:51  daved
X# New variants for "Fol. Pharm. Jap." and "IMA Journal..."
X# 
X# Revision 1.6  90/03/14  15:31:32  daved
X# Added "Scientist"; removed all "Et" variants after fixing jlook
X# 
X# Revision 1.5  90/02/27  12:27:54  daved
X# New "Applied Radiation and Isotopes Variant"
X# 
X# Revision 1.4  90/02/15  12:33:43  daved
X# More Et variants; Cancer Cells variant
X# 
X# Revision 1.3  90/02/08  18:45:08  daved
X# Added some misspelled "Ophthalmology"s
X# 
X# Revision 1.2  90/02/07  12:08:34  daved
X# CC variant 'Et' for Acta Histochem Cytochem
X# 
X#
X#	File format
X#	===========
X#	The nature of each line is determined by its leading letter(s):
X#	# any comment
X#	F the Full title for output purposes
X#	E Exceptional full title when out of alphabetic order
X#	U Undefined because of lack of city
X#	V any Variant of title desired for an exact match
X#	* a regular expression which may be a match for odd forms of input
X#	S a sort string if different to F (treated as comment by jlook)
X#	any other upper case letter in the Keys: line, e.g.
X#		C - Chemical Abstracts abbreviation
X#		I - Index Medicus abbreviation
X#		W - World List abbreviation
X#	The first non-comment line must be Keys: XXXX where XXXX is list
X#		of key letters used to define supported abbreviations
X#		e.g. CIW in the distributed system.  Key letters may not
X#		be any of the predefined keys (FEUV).
X#
X#	Elements F and defined key letters may be combined if identical,
X#	thus a journal whose full title, and chem abstracts "abbreviation"
X#	are identical could have an FC line.
X#
X#	Elements F,E and U are mutually exclusive.
X#	Elements V and * can only be used alone.
X#
X#	Note that the key letter(s) are separated from the title text
X#	by one tab character (and nothing but).  Non-comment lines may
X#	be continued if the line terminates with a '\'.
X#
X# The order of journal entries within the file is important only in first letter
X# of full title fields (starting F). All such entries within
X# one letter of alphabet must be together for the index file to work.
X# Potentially equivocal matches should have the preferential match first in the
X# file, which should be assured with an appropriate S field if sort on the F
X# fields will not achieve this. Blank lines can only occur to separate journals.
X# Titles starting with numbers should be given E entries at the end of the
X# file - i.e. these are treated as if they started with 'Z'
X#
X# *** As soon as this file is written after editing, run jindex to rebuild
X# the index and check for errors.
X#
X# Next line defines the abbreviations supported in this file:
XKeys: CIW
X# IW guessed
XF	ACP, Applied Cardiopulmonary Pathophysiology
XCIW	ACP, Appl. Cardiopulm. Pathophysiol.
XV	Acp-Applied Cardiopulmonary Pathophysiology
X
X#
XF	AIChE Journal
XCIW	AIChE J.
X
XFC	AIDS (London)
XIW	Aids
X
X# formerly AIDS Research
XF	AIDS Research and Human Retroviruses
XCI	AIDS Res. Hum. Retroviruses
XW	Aids Res. Hum. Retroviruses
XV	Aids Research and Human Retroviruses
X
XF	AJR American Journal of Roentgenology
XCI	AJR Am. J. Roentgenol.
XW	AJR Amer. J. Roentgenol.
XV	AJR
X
X# formed by union of Acta Pathologica, Microbiologica, et Immunologica
X# Scandinavica, Parts A, B and C
XF	APMIS. Acta Pathologica, Microbiologica et Immunologica Scandinavica
XCIW	APMIS
XV	Apmis
X
X# CW guessed
XF	APMIS. Supplementum
XCIW	APMIS Suppl.
XV	Acta Pathologica, Microbiologica, et Immunologica \
X		Scandinavica. Supplementum
X
XF	AT&T Bell Laboratories Technical Journal
XCIW	AT&T Bell Laboratories Technical J.
X
X# formerly ATLA Abstracts, Alternatives to Laboratory Animals
X# W is guess, based on former title W abbrev, which excluded 2nd segment
XF	ATLA, Alternatives to Laboratory Animals
XCI	ATLA, Altern. Lab. Anim.
XW	ATLA
XV	Atla-Alternatives to Laboratory Animals
X
XF	Abhandlungen der Mathematisch-Physischen Klasse der Sa\*:chsischen\
X		Akademie der Wissenschaften
XCI	Abh. Math.-Phys. Kl. Sa\*:chs. Akad. Wiss.
XW	Abh. Math.-Phys. Kl. Sa\*:chsischen Akad. Wiss.
XV	Abhandlungen der Mathematisch-Physischen Klasse der Sachsischen\
X		Akademie der Wissenschaften
X
XF	Abhandlungen der Sa\*:chsischen Akademie der Wissenschaften zu\
X		Leipzig Mathematisch-Naturwissenschaftliche Klasse
XCI	Abh. Sa\*:chs. Akad. Wiss. Leipzig Math. Naturwiss. Kl.
XW	Abh. Sa\*:chsischen Akad. Wiss. Leipzig Math. Naturwiss. Kl.
XV	Abhandlungen der Sachsischen Akademie der Wissenschaften zu\
X		Leipzig Mathematisch-Naturwissenschaftliche Klasse
X
XF	Accounts of Chemical Research
XCI	Acc. Chem. Res.
XW	Acc. chem. Res.
X
XF	Acta Anaesthesiologica Scandinavica
XCI	Acta Anaesthesiol. Scand.
XW	Acta anaesth. scand.
XV	Acta anaesthesiologica scandinavica
X
XF	Acta Anaesthesiologica Scandinavica, Supplementum
XC	Acta Anaesthesiol. Scand., Suppl.
XI	Acta Anaesthesiol. Scand. [Suppl.]
XW	Acta anaesthesiol. scand., suppl.
XV	Acta Anaesthesiologica Scandinavica. Supplementum
XV	Acta anaesthesiologica scandinavica, supplementum
X
XF	Acta Anatomica
XC	Acta Anat.
XI	Acta Anat. (Basel)
XW	Acta anat. (Basel)
XV	Acta Anatomica Basel
XV	Acta anatomica
X
X#	out of order entry to allow for anglicised form
XE	Kaibogaku Zasshi Acta Anatomica Nipponica
XS	Acta Anatomica Nipponica
XCI	Acta Anat. Nippon.
XW	Acta anat. Nipponica
X
XF	Acta Biochimica Polonica
XCI	Acta Biochim. Pol.
XW	Acta biochim. Polonica
X
XF	Acta Biochimica et Biophysica Academiae Scientiarum Hungaricae
XCI	Acta Biochim. Biophys. Acad. Sci. Hung.
XW	Acta biochim. biophys. Acad. sci. Hung.
XV	Acta Biochemica et Biophysica Academiae Scientiarum Hungaricae
X
X# formerly Acta Biochim. Biophys. Acad. Sci. Hung.
X# changed v21/1986
X# W guessed
XF	Acta Biochimica et Biophysica Hungarica
XCIW	Acta Biochim. Biophys. Hung.
X
XF	Acta Biologica Academia Scientiarum Hungaricae
XCI	Acta Biol. Acad. Sci. Hung.
XW	Acta Biologica Acad. sci. hung.
SHAR_EOF
echo "End of part 1"
echo "File jlist is continued in part 2"
echo "2" > s2_seq_.tmp
exit 0

exit 0 # Just in case...
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.