allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (12/05/89)
Posting-number: Volume 9, Issue 46 Submitted-by: kannan@osc.edu (Kannan Varadhan) Archive-name: bibtools I have written out what I think are fairly decent and comprehensive set of tools for manipulating BibTeX style bibliographies that I would like to have distributed via 'comp.sources.misc'. With this intent in mind, I am sending you this shar file. Briefly, the tools that I have are... bibc - This is a tool for creating and appending bibliography records to a file. This program works by prompting the user for the required fields, and then writes out/appends the record in the correct format. bibv - This tool takes one or more bib files, and produces a sample file, called bibtex.tex, and a dvi version of the same, that contain an entry corresponding to every record in the files. This uses bibtex to flag duplicate entries, hence, the name BIB-Verifier. shbib - This is used to show complete entries matching a given regular expression. The syntax is somewhat similar to egrep. rmbib - This removes entries matching the given regular expression from the specified files. It is useful, in that, the delete records are written to stdout, so one can shuffle records around various bib-files. You will also find, a library of tools that I designed, for breaking up entries in set of specified bibliography files, and having each entry processed by a routine of the user's choice. Notes on these can be found in README.lib_bib. The manpages have more detailed information. Installation requires one to have Henry Spencer's regular expression package, and Flex. #-------------------------------------------------------------------------- # to unpack the routine(s) in this package, remove everything # above the dotted line and say, `sh filename' # If any of the routines already exists, say, `sh -o filename' # Makefile README README.lib_bib TODO alpha.lex bibc.c bibc.h bibcent.c # bibcent.h bibl.l bibtools.man bibv.c bibv.h config.h foo.bib # gen_lex_file header includes.h inits.c lex.yy.c lexstrings.lex # lib_bib.c misc/ omega.lex pyr.regexp.a specl.bst strings.h sun.regexp.a # templates.c typescript misc/Changes misc/README misc/bibv.sh # misc/gets.c if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "Makefile..." 1>&2 if test -f Makefile then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile Makefile' > Makefile X.SUFFIXES: .out .o .c .l .lex X X# The ARCH defines the type of architecture we are using to install X# these tools. This is essentially only to figure out the final BINDEST X# INCDIR defines the location of the regexp includes. X# RELIB defines the location of the regular expression library X# MANTYPE defines the location of the man pages, as manl/bibtools.l X# TEXLIB is the location to put specl.bst, the bibtex macro file XARCH=pyr XCFLAGS=-O XINCDIR=-I../Regexp XRELIB=$(ARCH).regexp.a XBINDEST=/n/shell/0/kannan/bin/${ARCH}/ XMANTYPE=l XMANDEST=/n/shell/0/kannan/man/man$(MANTYPE) XTEXLIB=/n/shell/0/kannan/Bib/ X XCCFLAGS=${CFLAGS} ${INCDIR} XINCLUDES=includes.h config.h strings.h X Xall: bibc shbib rmbib bibv X @echo Fee Fi Fo Fum X Xbibc: bibc.o lex.yy.o inits.o templates.o lib_bib.o X cc ${CFLAGS} bibc.o lex.yy.o inits.o templates.o lib_bib.o $(RELIB) -o $@ X Xshbib: shbib.o lib_bib.o X cc ${CFLAGS} shbib.o lib_bib.o $(RELIB) -o $@ X Xrmbib: rmbib.o lib_bib.o X cc ${CFLAGS} rmbib.o lib_bib.o $(RELIB) -o $@ X Xbibv: bibv.o lib_bib.o X cc ${CFLAGS} bibv.o lib_bib.o $(RELIB) -o $@ X Xbibc.o: bibc.c $(INCLUDES) bibc.h X cc -c ${CCFLAGS} bibc.c X Xinits.o: inits.c $(INCLUDES) bibc.h X cc -c ${CCFLAGS} inits.c X Xtemplates.o: templates.c $(INCLUDES) bibc.h X cc -c ${CCFLAGS} templates.c X Xlex.yy.o: lex.yy.c $(INCLUDES) X cc -c ${CCFLAGS} lex.yy.c X Xlex.yy.c: bibl.l $(INCLUDES) X flex -I bibl.l X Xbibl.l: alpha.lex lexstrings.lex omega.lex X gen_lex_file alpha.lex lexstrings.lex omega.lex > bibl.l X Xshbib.o: bibcent.c $(INCLUDES) bibcent.h X cc -c -DSHBIB ${CCFLAGS} bibcent.c X mv bibcent.o shbib.o X Xrmbib.o: bibcent.c $(INCLUDES) bibcent.h X cc -c -DRMBIB ${CCFLAGS} bibcent.c X mv bibcent.o rmbib.o X Xbibv.o: bibv.c $(INCLUDES) bibv.h X cc -c ${CCFLAGS} bibv.c X Xlib_bib.o: lib_bib.c $(INCLUDES) X cc -c ${CCFLAGS} lib_bib.c X Xinstall: all X install -s bibc ${BINDEST} X install -s bibv ${BINDEST} X install -s shbib ${BINDEST} X install -s rmbib ${BINDEST} X install -c specl.bst ${TEXLIB} X cp bibtools.man ${MANDEST}/bibtools.$(MANTYPE) X ln ${MANDEST}/bibtools.$(MANTYPE) ${MANDEST}/bibc.$(MANTYPE) X ln ${MANDEST}/bibtools.$(MANTYPE) ${MANDEST}/bibv.$(MANTYPE) X ln ${MANDEST}/bibtools.$(MANTYPE) ${MANDEST}/shbib.$(MANTYPE) X ln ${MANDEST}/bibtools.$(MANTYPE) ${MANDEST}/rmbib.$(MANTYPE) X Xclean: X rm -f bibc bibv shbib rmbib core linterrs *.o X Xlint: X lint $(INCDIR) bibc.c inits.c templates.c lib_bib.c lex.yy.c > linterrs X lint $(INCDIR) -DSHBIB bibcent.c lib_bib.c >> linterrs X lint $(INCDIR) -DRMBIB bibcent.c lib_bib.c >> linterrs X lint $(INCDIR) bibv.c lib_bib.c >> linterrs X X# X# Debug and test makes..... X# Xdebug: X make CFLAGS='-gx -DEBUG' ARCH=${ARCH} all X Xbackup: X @rm -f core linterrs *.o X (cd .. ; pack Bibcreate/* > bibc.shar) X Xmakes: X sed 's/^ARCH=.*/ARCH=sun/' Makefile > makefile.sun X sed 's/^ARCH=.*/ARCH=pyr/' Makefile > makefile.pyr EOFile Makefile chmod u=rw+,g=rw+,o=r++ Makefile echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "README..." 1>&2 if test -f README then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile README' > README XCopyright (c) 1989 Ohio State University XWritten by Kannan Varadhan. Not derived from licensed software. X XPermission is granted to anyone to use this software for any purpose on Xany computer system, and to redistribute it freely, subject to the Xfollowing restrictions... X X 1. The author is not responsible for the consequences of use of X this software, no matter how awful, even if they arise X from defects in it. X X 2. The origin of this software must not be misrepresented, either X by explicit claim or by omission. X X 3. Altered versions must be plainly marked as such, and must not X be misrepresented as being the original software. X XInstalling bibc: X XBefore you start, you will need Xa) a regular expression package. I prefer to use the one that Henry XSpenser wrote aeons ago. This one is in the public domain. A copy of Xit should be in the Regexp directory. From this, we need regcomp(), Xregexec() and regerror(). X XIf you wish to use some other regular expression package, you have to Xfigure out how your set of routines will compile the re, and then how it Xwill execute a string on the resulting automaton. You can then change Xthe defines REGCOMP, REGEXEC, which are routine invokes, and REGEXP, the Xstruct, and change the includes for regexp.h in 'includes.h'. Simple, Xisn't it? :-) X Xb) You will also need flex before you can make bibc though. In case Xyou do not have access to flex, you could use the lex.yy.c with this Xcode, which has been generated with flex. X XBoth these packages have appeared on comp.sources.xxxxxxxx. X XNow edit Makefile, and config.h, and put in your various options. There Xare adequate comments alongside the various parameters, so one should Xhave no problem here. X XIf you are on a system V machine, edit strings.h, and make sure all the Xdefinitions there are ok too. X Xmake, and make install should see you through. X XNote that bibv uses a specially hacked bst file, called specl.bst. This Xstyle causes the bibitem keys to be the same as the \cite-keys that you Xhave used. This is a convenient style for keeping hardcopies for ready Xreference, considering that these are sorted nicely and all that :) XIf you would like to have a copy of the btxbst.doc file, send me a note, Xand I'll send it to you.... X XKANNAN Sun Dec 3 02:08:19 EST 1989 EOFile README chmod u=rw+,g=rw+,o=r++ README echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "README.lib_bib..." 1>&2 if test -f README.lib_bib then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile README.lib_bib' > README.lib_bib XThis is a detailed note on the kind of functions available as part of a Xlibrary for manipulating bib-files. Hopefully, someone might find Xthis useful to write other tools to manipulate bibliographies in other Xways. X X------------------------------------------------------------------------- X Xchar * Xmy_gets (buffer, size) X/* X * This is an emulation of gets() using fgets.3 X * This routine reads everything upto a newline, using fgets.3 X * X * OUTPUT: Returns buffer on exit, (char *) NULL on error X * The contents of buffer are the input string, a max of (size -1) X * characters are filled on exit, X * The buffer is zeroed and returned on EOF. X * X * This routine only deals with EOF as an error cleanly. On any other X * error returned by fgets.3, this routine will return will return X * (char *) NULL and a partially filled buffer....*sigh* X * X * if EMUL_GETS is turned on, (it probably should, neh? :-) then X * it converts any trailing NEWLINE character ('\n') to a NIL ('\0') X * character, else, it leaves them alone X */ Xchar *buffer; Xint size; X X------------------------------------------------------------------------- X Xanswer (string, resp) X/* X * Display string, query user....return TRUE if answer = resp X */ Xchar *string; Xchar resp; X X------------------------------------------------------------------------- X Xprocess_bibfiles (files, process_recd, onerror) X/* X * For each file in files, X * delineate_next_record X * process_record (file, record); X * if process_record() indicates error, X * onerror (open_file_descriptor); X * lseek to EOF X * cause exit() X * X * An argument of "-" as a filename, returns the filedescriptor 0, X * corresponding to stdin. X */ Xchar **files; Xint (*process_recd)(), (*onerror)(); X X------------------------------------------------------------------------- X Xget_next_file (curfd) X/* X * Close current file descriptor; X * get next bib file from bibflist X * open file, and return new file descriptor; X * X * An argument of "-" as a filename, returns the filedescriptor 0, X * corresponding to stdin. X */ Xint curfd; X X------------------------------------------------------------------------- X Xchar * Xlcase (string) X/* X * Lower case the given string X */ Xchar *string; X X------------------------------------------------------------------------- X Xchar * Xreplstr (str) X/* X * replicate the given string. get storage, and return the new string. X */ Xchar *str; X X------------------------------------------------------------------------- X Xchar * Xdelineate_recd (string) X/* X * Get next record, using '\n@' as a flag per record. X * Match all braces, X * If record found, delineate current record by placing '\0' at end of X * current record, and return address of next record. X * else return (char *) NULL; X */ Xchar *string; X X------------------------------------------------------------------------- X Xstrcount (str, c) X/* X * Count the number of occurences of character 'c' in string "str" X */ Xchar *str; Xchar c; X X------------------------------------------------------------------------- X Xchar * Xget_atsign (str) X/* X * Get an atsign, check if it is preceeded by a newline X * If yes, return value, X * else repeat search X */ Xchar *str; X X------------------------------------------------------------------------- X XREGEXP * Xmy_rcomp (re) X/* X * STRATEGY: lcase the string inplace, and feed to regcomp(), return the X * value returned as is... X */ Xchar *re; X X{ return regcomp (lcase (re)); } X X------------------------------------------------------------------------- X Xmy_rexec (prog, str) Xregexp *prog; X/* X * my_rexec = TRUE, if lcase (copy of str) contains given re X * = FALSE otherwise. X */ Xchar *str; X EOFile README.lib_bib chmod u=rw+,g=r++,o=r++ README.lib_bib echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "TODO..." 1>&2 if test -f TODO then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile TODO' > TODO Xerror handling in abrupt departures bibc X handled some of it...clean exit is still guaranteed, though X some garbage (?) gets seen on the screen Xsignals all X nyeah..considering the algorithm we are using for processing the X files, this, unless I am shown otherwise, is not going to be X really necessary! Consider the algorithms in brief: X X bibc: X while ! EOF do X get a record from user, X write out record, X done X bibv: For each file do X for each record in file do X get cite key X write into bibtex.tex X store filename X done X done X write out list of files, X run latex, bibtex, latex, latex X X shbib, rmbib: for each file do X for each record in file do X match regexp against record X if match, printout X if no match, and remove specified, X write record into file.bak X done X if file.bak exists rename file.bak as file X done X X Notice that the original file is never destroyed irrecoverably. Xcleaner handling of stdin shbib and rmbib X Question is, why? stdin can always be specified as "-" X to shbib, rmbib and bibv. With shbib and rmbib, a file "-.bak" X will be created for stdin, which is "safe". Xstat the file before editing bibc X DONE Xmanual pages all X Whatever, I guess XA README writeup on installation all X DONE XA writeup and comments for lib_bib.c libbib X DONE EOFile TODO chmod u=rw+,g=r++,o=r++ TODO echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "alpha.lex..." 1>&2 if test -f alpha.lex then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile alpha.lex' > alpha.lex X%{ X X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "bibc.h" X#undef YY_INPUT X#define YY_INPUT(buf,reslt,msize) my_input (buf, &reslt, msize) X Xmy_input (buf,reslt, size) Xchar *buf; Xint *reslt; Xint size; X X{ Xchar inputln[80]; X X bzero (inputln, 80); X if (! GETS (inputln, 80)) X Strcpy (buf, "EOF"); X else X Strncpy (buf, inputln, size); X Strcat (buf, "!"); X#ifdef FLEX_DEBUG X Fprintf (stderr, "buf contains: %s\n", buf); X#endif X return *reslt = strlen (buf); X} X X Xmy_yylex () X X{ X#define PROMPTSTR "\ XWhat kind of record would you like to enter (one of the following)?\n\ X article book booklet conference\n\ X inbook incollection inproceedings manual\n\ X mastersthesis msthesis misc phdthesis\n\ X proceedings techreport unpublished\n\ Xor EDIT quit\n" X X Fprintf (stderr, PROMPTSTR); X return yylex (); X} X X%} EOFile alpha.lex chmod u=rw+,g=r++,o=r++ alpha.lex echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibc.c..." 1>&2 if test -f bibc.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibc.c' > bibc.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#define GLOBALS X#include "bibc.h" X Xmain (argc, argv, envp) Xint argc; Xchar **argv, **envp; X X{ Xint retval; X X retval = FLD_NULL; X X (void) process_args (argc, argv); X (void) initialise (&bibitem); X X while (retval = my_yylex()) { X switch (retval) { X case FLD_ERROR: Fprintf (stderr, "Uh oh! no no no\n"); X continue; X case ARTICLE: retval = get_article (); break; X case BOOK: retval = get_book (); break; X case BOOKLET: retval = get_booklet (); break; X case CONFERENCE: retval = get_inproceedings (); break; X case INBOOK: retval = get_inbook (); break; X case INCOLLECTION: retval = get_incollection (); break; X case INPROCEEDINGS: retval = get_inproceedings (); break; X case MANUAL: retval = get_manual (); break; X case MASTERSTHESIS: retval = get_mastersthesis (); break; X case MISC: retval = get_misc (); break; X case PHDTHESIS: retval = get_phdthesis (); break; X case PROCEEDINGS: retval = get_proceedings (); break; X case TECHREPORT: retval = get_techreport (); break; X case UNPUBLISHED: retval = get_unpublished (); break; X case FLD_EDITOR: retval = edit (outfile, _O_outfilename, envp); break; X } X if (retval != -1) X (void) writeout (&bibitem, outfile); X (void) resetall (&bibitem); X } X fclose (outfile); X return 0; X} X Xwriteout (bi, outfile) Xbibrec *bi; XFILE *outfile; X X{ X#define PUT(VAR,REC) \ X if (ISSET (VAR,REC)) \ X { \ X if (Index (ISVAL(VAR,REC), QUOTE_CHAR)) \ X { tmp1 = OPEN_BRACE; tmp2 = CLOSE_BRACE ; } \ X else if (ISVAL(VAR,REC)[0] == '\\') \ X { \ X tmp1 = tmp2 = ' '; \ X ISVAL(VAR,REC)[0] = ' '; \ X } \ X else \ X tmp1 = tmp2 = QUOTE_CHAR; \ X Sprintf (recordbuf, "%s ,\n\t%s = %c%s%c", recordbuf, \ X (VAR)->REC.prompt, tmp1, ISVAL (VAR,REC), tmp2);\ X } Xchar recordbuf[1024]; Xchar tmp1, tmp2; Xint i; X X Sprintf (recordbuf, "@%s { %s", ISVAL(bi, rectype), ISVAL (bi, citekey)); X PUT (bi, address); X PUT (bi, annote); X PUT (bi, author); X PUT (bi, booktitle); X PUT (bi, chapter); X PUT (bi, edition); X PUT (bi, editor); X PUT (bi, howpublished); X PUT (bi, institution); X PUT (bi, journal); X PUT (bi, key); X PUT (bi, month); X PUT (bi, note); X PUT (bi, number); X PUT (bi, organisation); X PUT (bi, pages); X PUT (bi, publisher); X PUT (bi, school); X PUT (bi, series); X PUT (bi, title); X PUT (bi, type); X PUT (bi, volume); X PUT (bi, year); X PUT (bi, comment); X for (i = 0; i != usr_defns_ctr; i++) X PUT (bi, usr_defns[i]); X Strcat (recordbuf, "\n\t}\n\n"); X X (void) write (2, "", 1); X if (_O_verbose) X Fprintf (stderr, recordbuf); X if (_O_verify) X { X if (answer ("Is this correct?", NO)) X return 0; X } X Fprintf (outfile, recordbuf); X fflush (outfile); X return 0; X} X X Xget_field (next_field, rectype, status) Xfield *next_field; Xchar *rectype; Xchar status; X X{ X#define ERRORMSG1 \ X "ERROR: %s is a REQUIRED FIELD for %s. Let's try that again...sigh...\n" X#define ERRORMSG2 \ X "ERROR: Frankly my dear, I don't give a damn...\n" Xchar inputline[512]; Xchar error; Xchar secondtime = FALSE; X XRETRY: Fprintf (stderr, "%s%s? ", next_field->prompt, X ((status == OPTIONAL)? " (optional)" : "" )); X fflush (stderr); X error = FALSE; X bzero (inputline, 512); X if (! GETS (inputline, 512)) X return -1; X switch (inputline[0]) { X case '\0': X if ((status == REQUIRED) && _O_pester_usr) X error = TRUE; X else X return 0; X break; X case '?': X Fprintf (stderr, "%s\n", next_field->helpstring); X goto RETRY; X case 'x': X if (! Strcmp(inputline, "xx")) X { X if (answer ("Abort?", YES)) X return -1; X } X case ' ': X (void) clr_leading_blanks (inputline); X if (Strlen(inputline) == 0) X { X if ((status == REQUIRED) && _O_pester_usr) X error = TRUE; X else X return 0; X } X break; X } X if (error) X { X if (secondtime) X { X Fprintf (stderr, ERRORMSG2, next_field->prompt, rectype); X return 0; X } X else X { X Fprintf (stderr, ERRORMSG1, next_field->prompt, rectype); X secondtime = TRUE; X goto RETRY; X } X } X Strcpy (next_field->string, inputline); X next_field->full = TRUE; X return 0; X} X X Xedit (filep, editfile, envp) XFILE *filep; Xchar *editfile; Xchar **envp; X X{ XFILE *freopen(); Xchar *EDITOR, *TEXEDIT, *getenv(); Xchar *string, *format_cmd(); Xint editorpid; Xint statresult; Xstruct stat efile; X X statresult = stat (editfile, &efile); X if ((statresult == -1) || (efile.st_mode & S_IFREG != 1)) X { X Fprintf (stderr, "Cannot edit file %s\n", editfile); X return -1; X } X TEXEDIT = getenv ("TEXEDIT"); X if (! TEXEDIT) X { X EDITOR = getenv ("VISUAL"); X if (! EDITOR) EDITOR = getenv ("EDITOR"); X if (! EDITOR) EDITOR = DEFAULT_EDITOR; X } X else X string = format_cmd (TEXEDIT, editfile); X X fclose (filep); X editorpid = fork(); X if (editorpid < 0) X { X perror ("Cannot fork Editor"); X exit (-2); X } X else if (editorpid == 0) /* CHILD */ X { X if (TEXEDIT) X execle ("/bin/sh", "sh", "-c", string, (char *) NULL, envp); X else X execlp (EDITOR, EDITOR, editfile, (char *) NULL, envp); X perror ("Cannot exec EDITOR, using DEFAULT_EDITOR"); X execlp (DEFAULT_EDITOR, DEFAULT_EDITOR, editfile, (char *) NULL, envp); X perror ("Cannot exec DEFAULT_EDITOR, giving up"); X exit (-3); X } X else X (void) wait ((union wait *) 0); X filep = freopen (_O_outfilename, "a", filep); X return -1 /* A wierd return code, indicating, print nothing..*/; X} X X Xclr_leading_blanks (string) Xchar *string; X X{ Xchar *temp, buffer[512]; X X temp = string; X while (*temp == ' ') temp++; X Strcpy (buffer, temp); X Strcpy (string, buffer); X return 0; X} X X X Xchar * Xformat_cmd (envstr, filename) Xchar *envstr, *filename; X X{ X/* X * The envstr is going to be the TEXEDIT environment string. X * The filename is going to be the name of the bibfile we are concerned with X * We assume that the format of the TEXEDIT string is going to be of the form X * <editor name> [%d] %s X * The %d would be optional, and contain the displacement variable.... X * Since we are appending to the end of the bibfile always, we would X * position the editor to the bottom of the file always. X * Strategy...... X * locate the first %, if the character spec after it is not d, X * ie, it is not %d, then assume it is <editor> %s %d X * The %d is really unimportant then, see... X * stuff the stuff in, and return the cmd string... X */ Xint lineno; XFILE *temp, *fopen(); Xchar *strndx, buffer[100], cmdstr[100]; X X /* First find the size in terms of lines of filename */ X temp = fopen (filename, "r"); lineno = 0; X if (temp) X { X while (fgets (buffer, 100, temp)) lineno++; X fclose (temp); X lineno -= 10; /* An arbitrary figure */ X } X X /* lineno = %d specs now... */ X strndx = Index (envstr, '%'); X if (! strndx) X Strcpy (cmdstr, envstr); X else if (*++strndx == 'd') X Sprintf (cmdstr, envstr, lineno, filename); X else X Sprintf (cmdstr, envstr, filename, lineno); X return cmdstr; X} X EOFile bibc.c chmod u=rw+,g=r++,o=r++ bibc.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibc.h..." 1>&2 if test -f bibc.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibc.h' > bibc.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "includes.h" X X#define OPTIONAL FALSE X#define REQUIRED TRUE X X#define FLD_ERROR -1 X#define FLD_NULL 0x0000 X#define ARTICLE 0x0001 X#define BOOK 0x0002 X#define BOOKLET 0x0004 X#define CONFERENCE 0x0008 X#define INBOOK 0x0010 X#define INCOLLECTION 0x0020 X#define INPROCEEDINGS 0x0040 X#define MANUAL 0x0080 X#define MASTERSTHESIS 0x0100 X#define MISC 0x0200 X#define PHDTHESIS 0x0400 X#define PROCEEDINGS 0x0800 X#define TECHREPORT 0x1000 X#define UNPUBLISHED 0x2000 X#define FLD_EDITOR 0x4000 X X#define GET(VAR,FIELD,STATUS) \ X if (get_field (&(VAR)->FIELD, ISVAL(VAR, rectype), STATUS) == -1)\ X return -1 X#define SET(VAR,FIELD,VALUE) { \ X Strcpy ((VAR)->FIELD.string, VALUE); \ X (VAR)->FIELD.full = TRUE; \ X } X#define RESET(VAR,FIELD) { \ X Strcpy ((VAR)->FIELD.string, ""); \ X (VAR)->FIELD.full = FALSE; \ X } X#define ISSET(VAR,FIELD) (VAR)->FIELD.full X#define ISVAL(VAR,FIELD) (VAR)->FIELD.string X#define ISHELP(VAR,FIELD) (VAR)->FIELD.helpstring Xtypedef struct record { X char full /* Actually holds a boolean place value */; X char string[391] /* An even 32 words / field */; X char prompt[32]; X char helpstring[344] /* Display if user is confused */; X } field; X Xtypedef struct biblio_record { X field rectype; X field citekey; X field address; X field annote; X field author; X field booktitle; X field chapter; X field edition; X field editor; X field howpublished; X field institution; X field journal; X field key; X field month; X field note; X field number; X field organisation; X field pages; X field publisher; X field school; X field series; X field title; X field type; X field volume; X field year; X field comment; X field cross_ref; X field usr_defns[USR_DEFNS_MAX]; X } bibrec; X XDCL (char, _O_help, FALSE); XDCL (char, _O_verify, FALSE); XDCL (char, _O_verbose, TRUE); XDCL (FILE, *outfile, stdout); XDCL (char, _O_outfilename[50], ""); XDCL (char, _O_pester_usr, SAFE); X XDCLX (bibrec, bibitem); XDCL (int, usr_defns_ctr, 0); X X EOFile bibc.h chmod u=rw+,g=r++,o=r++ bibc.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibcent.c..." 1>&2 if test -f bibcent.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibcent.c' > bibcent.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#define GLOBALS X#include "bibcent.h" X X#ifdef SHBIB X#undef RMBIB /* why? God alone knows */ X#endif X X#ifdef RMBIB X#define PROGSTR "rmbib" X#else X#define PROGSTR "shbib" X#endif X Xmain (argc, argv) Xint argc; Xchar *argv[]; X X{ Xextern int process_record(), onerror_cleanup(); X X if (process_args (argc, argv) == -1) X return -1 /* EXIT */; X regprog = (REGEXP *) REGCOMP (_O_regexp); X X (void) process_bibfiles (_O_flist, process_record, onerror_cleanup); X X (void) finish_up (); X return 0; X} X X Xfinish_up () X X{ X if (store.isfull) X (void) output_record (store.filename, store.bibentry); X X if (_O_rem) X { X DASSERT (mytmpfile); X (void) restore_bakfile (_O_file, mytmpfile); X } X return 0; X} X X Xonerror_cleanup (rdfd) Xint rdfd; X X{ XFILE *rdfp, *fdopen(); Xchar buffer[100]; X X if (mytmpfile) X { X rdfp = fdopen (rdfd, "r"); X while (fgets (buffer, sizeof(buffer), rdfp)) X Fprintf (mytmpfile, buffer); X (void) restore_bakfile (_O_file, mytmpfile); X } X X return 0; X} X X Xprocess_record (file, string) Xchar *file, *string; X X{ Xint retcode = 0; Xchar tmpfn[20]; X X if (_O_file != file) X { X if (_O_rem) X { X (void) restore_bakfile (_O_file, mytmpfile); X Sprintf (tmpfn, "%s.bak", file); X mytmpfile = fopen (tmpfn, "w"); X } X _O_file = file; X } X X if (REGMATCH (regprog, string) != 1) X { X STASH (string); X retcode = 0; X } X else switch (_O_srch) X { X case FIRST_MATCH: X if (output_record (_O_file, string) == -1) X break /* record was not processed...return normally */; X retcode = -1; X break; X case LAST_MATCH: X if (store.isfull) X { X STASH (store.bibentry); X free (store.bibentry); X } X store.isfull = TRUE; X store.filename = _O_file; X store.bibentry = (char *) replstr (string); X break; X case GLOBAL_MATCH: X (void) output_record (_O_file, string); X break; X } X return retcode; X} X X Xprocess_args (argc, argv) Xint argc; Xchar *argv[]; X X{ Xint opt, count, i; Xextern char *optarg; Xextern int optind; Xchar **temp; X X if (argc <= 1) X _O_help = TRUE; X X while ((opt = getopt (argc, argv, "fghilrs")) != EOF) X switch (opt) { X case 'f': X _O_srch = FIRST_MATCH; X break; X case 'g': X _O_srch = GLOBAL_MATCH; X break; X case 'l': X _O_srch = LAST_MATCH; X break; X case 'h': X _O_help = TRUE; X break; X case 'r': X#ifndef RMBIB X _O_rem = TRUE; X#endif X break; X case 'i': X#ifdef RMBIB X _O_inq = TRUE; X#endif X break; X case 's': X _O_silent = TRUE; X break; X case '?': X default: X _O_help = TRUE; X } X X if (_O_help) X { X (void) usage (); X return -1; X } X X#ifdef RMBIB X _O_rem = TRUE; X#endif X X _O_regexp = argv[optind]; X _O_files = (char **) malloc ((unsigned) (sizeof(char *) * (argc - optind + 1))); X if (_O_files == (char **) NULL) X { X perror (PROGSTR); X exit (-2); X } X X count = 0; X temp = _O_flist = _O_files; X for (i = ++optind; i < argc; i++) X { X *temp = argv[i]; X temp++; X count++; X } X *temp = (char *) NULL; X if (! *_O_flist) X *_O_flist = "-" /* stdin */; X if (count <= 1) _O_silent = TRUE; X store.isfull = FALSE; X X return 0; X} X X Xrestore_bakfile (file, fptr) Xchar *file; XFILE *fptr; X X{ Xchar tmpfn[20]; X X if (! fptr) X return 0; X X fclose (fptr); X Sprintf (tmpfn, "%s.bak", file); X (void) rename (tmpfn, file); X return 0; X} X X Xusage () X X{ X#ifndef RMBIB XFprintf (stderr, "usage: %s [-f] [-l] [-g] [-r] [-s] [-h] reg-expn file(s)\n", X PROGSTR); XFprintf (stderr, "\t-f\tGet first match only\n"); XFprintf (stderr, "\t-l\tGet last matching record only\n"); XFprintf (stderr, "\t-g\tGet all matches\n"); XFprintf (stderr, "\t-r\tDelete matching record\n"); XFprintf (stderr, "\t-s\tAct Silently, ie don't echo record to stdout\n"); XFprintf (stderr, "\t-h\tPrint this help\n"); X#else XFprintf (stderr, "usage: %s [-f] [-l] [-g] [-i] [-s] [-h] reg-expn file(s)\n", X PROGSTR); XFprintf (stderr, "\t-f\tDelete first matching record only\n"); XFprintf (stderr, "\t-l\tDelete last matching record only\n"); XFprintf (stderr, "\t-g\tDelete all matches\n"); XFprintf (stderr, "\t-i\tInquire before deleting record\n"); XFprintf (stderr, "\t-s\tAct Silently, ie don't echo record to stdout\n"); XFprintf (stderr, "\t-h\tPrint this help\n"); X#endif Xreturn 0; X} X X Xoutput_record (file, record) Xchar *file, *record; X X{ X if (! _O_silent) X Fprintf (stdout, "%s:\n", file); X#ifdef RMBIB X if (_O_inq) X { X Fprintf (stderr, "%s\n", record); X if (answer ("remove? ", NO)) X { X STASH (record); X return -1 /* deletion did not occur */; X } X else X Fprintf (stdout, "%s\n", record); X } X#else X Fprintf (stdout, "%s\n", record); X#endif X return 0; X} EOFile bibcent.c chmod u=rw+,g=r++,o=r++ bibcent.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibcent.h..." 1>&2 if test -f bibcent.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibcent.h' > bibcent.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "includes.h" X X#define FIRST_MATCH 1 /* -f flag, the default */ X#define GLOBAL_MATCH 2 /* -g flag */ X#define LAST_MATCH 4 /* -l flag */ X XREGEXP *REGCOMP(); X Xtypedef struct recd { X int isfull; X char *filename; X char *bibentry; X } record; X XDCL (char, _O_srch, FIRST_MATCH); XDCL (char, _O_rem, FALSE); /* -r flag, shent only */ X#ifdef RMBIB XDCL (char, _O_inq, FALSE); /* -i flag, rment only */ X#endif XDCL (char, _O_silent, FALSE); /* -s flag, shent only */ XDCL (char, _O_help, FALSE); /* -h flag */ X XDCLX (char, **_O_files); XDCLX (char, **_O_flist); XDCL (char , *_O_file, (char *) NULL); XDCL (char, *_O_regexp, (char *) NULL); X XDCLX (REGEXP, *regprog); XDCLX (FILE, *mytmpfile); X XDCLX (record, store); X X#ifdef RMBIB X#define STASH(str) fprintf (mytmpfile, "%s\n", str) X#else X#define STASH(str) if (mytmpfile) fprintf (mytmpfile, "%s\n", str) X#endif EOFile bibcent.h chmod u=rw+,g=r++,o=r++ bibcent.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibl.l..." 1>&2 if test -f bibl.l then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibl.l' > bibl.l X%{ X X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "bibc.h" X#undef YY_INPUT X#define YY_INPUT(buf,reslt,msize) my_input (buf, &reslt, msize) X Xmy_input (buf,reslt, size) Xchar *buf; Xint *reslt; Xint size; X X{ Xchar inputln[80]; X X bzero (inputln, 80); X if (! GETS (inputln, 80)) X Strcpy (buf, "EOF"); X else X Strncpy (buf, inputln, size); X Strcat (buf, "!"); X#ifdef FLEX_DEBUG X Fprintf (stderr, "buf contains: %s\n", buf); X#endif X return *reslt = strlen (buf); X} X X Xmy_yylex () X X{ X#define PROMPTSTR "\ XWhat kind of record would you like to enter (one of the following)?\n\ X article book booklet conference\n\ X inbook incollection inproceedings manual\n\ X mastersthesis msthesis misc phdthesis\n\ X proceedings techreport unpublished\n\ Xor EDIT quit\n" X X Fprintf (stderr, PROMPTSTR); X return yylex (); X} X X%} X X%% X"a!" return ARTICLE; X"ar!" return ARTICLE; X"art!" return ARTICLE; X"arti!" return ARTICLE; X"artic!" return ARTICLE; X"articl!" return ARTICLE; X"article!" return ARTICLE; X"book!" return BOOK; X"bookl!" return BOOKLET; X"bookle!" return BOOKLET; X"booklet!" return BOOKLET; X"c!" return CONFERENCE; X"co!" return CONFERENCE; X"con!" return CONFERENCE; X"conf!" return CONFERENCE; X"confe!" return CONFERENCE; X"confer!" return CONFERENCE; X"confere!" return CONFERENCE; X"conferen!" return CONFERENCE; X"conferenc!" return CONFERENCE; X"conference!" return CONFERENCE; X"inb!" return INBOOK; X"inbo!" return INBOOK; X"inboo!" return INBOOK; X"inbook!" return INBOOK; X"inc!" return INCOLLECTION; X"inco!" return INCOLLECTION; X"incol!" return INCOLLECTION; X"incoll!" return INCOLLECTION; X"incolle!" return INCOLLECTION; X"incollec!" return INCOLLECTION; X"incollect!" return INCOLLECTION; X"incollecti!" return INCOLLECTION; X"incollectio!" return INCOLLECTION; X"incollection!" return INCOLLECTION; X"inp!" return INPROCEEDINGS; X"inpr!" return INPROCEEDINGS; X"inpro!" return INPROCEEDINGS; X"inproc!" return INPROCEEDINGS; X"inproce!" return INPROCEEDINGS; X"inprocee!" return INPROCEEDINGS; X"inproceed!" return INPROCEEDINGS; X"inproceedi!" return INPROCEEDINGS; X"inproceedin!" return INPROCEEDINGS; X"inproceeding!" return INPROCEEDINGS; X"inproceedings!" return INPROCEEDINGS; X"man!" return MANUAL; X"manu!" return MANUAL; X"manua!" return MANUAL; X"manual!" return MANUAL; X"mas!" return MASTERSTHESIS; X"mast!" return MASTERSTHESIS; X"maste!" return MASTERSTHESIS; X"master!" return MASTERSTHESIS; X"masters!" return MASTERSTHESIS; X"masterst!" return MASTERSTHESIS; X"mastersth!" return MASTERSTHESIS; X"mastersthe!" return MASTERSTHESIS; X"mastersthes!" return MASTERSTHESIS; X"mastersthesi!" return MASTERSTHESIS; X"mastersthesis!" return MASTERSTHESIS; X"ms!" return MASTERSTHESIS; X"mst!" return MASTERSTHESIS; X"msth!" return MASTERSTHESIS; X"msthe!" return MASTERSTHESIS; X"msthes!" return MASTERSTHESIS; X"msthesi!" return MASTERSTHESIS; X"msthesis!" return MASTERSTHESIS; X"mi!" return MISC; X"mis!" return MISC; X"misc!" return MISC; X"ph!" return PHDTHESIS; X"phd!" return PHDTHESIS; X"phdt!" return PHDTHESIS; X"phdth!" return PHDTHESIS; X"phdthe!" return PHDTHESIS; X"phdthes!" return PHDTHESIS; X"phdthesi!" return PHDTHESIS; X"phdthesis!" return PHDTHESIS; X"pr!" return PROCEEDINGS; X"pro!" return PROCEEDINGS; X"proc!" return PROCEEDINGS; X"proce!" return PROCEEDINGS; X"procee!" return PROCEEDINGS; X"procees!" return PROCEEDINGS; X"proceesi!" return PROCEEDINGS; X"proceesin!" return PROCEEDINGS; X"proceesing!" return PROCEEDINGS; X"proceesings!" return PROCEEDINGS; X"t!" return TECHREPORT; X"te!" return TECHREPORT; X"tec!" return TECHREPORT; X"tech!" return TECHREPORT; X"techr!" return TECHREPORT; X"techre!" return TECHREPORT; X"techrep!" return TECHREPORT; X"techrepo!" return TECHREPORT; X"techrepor!" return TECHREPORT; X"techreport!" return TECHREPORT; X"u!" return UNPUBLISHED; X"un!" return UNPUBLISHED; X"unp!" return UNPUBLISHED; X"unpu!" return UNPUBLISHED; X"unpub!" return UNPUBLISHED; X"unpubl!" return UNPUBLISHED; X"unpubli!" return UNPUBLISHED; X"unpublis!" return UNPUBLISHED; X"unpublish!" return UNPUBLISHED; X"unpublishe!" return UNPUBLISHED; X"unpublished!" return UNPUBLISHED; X"quit!" return FLD_NULL; X"EOF!" return FLD_NULL; X"EDIT!" return FLD_EDITOR; X[a-zA-Z0-9]*! return FLD_ERROR; X%% X EOFile bibl.l chmod u=rw+,g=r++,o=r++ bibl.l echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibtools.man..." 1>&2 if test -f bibtools.man then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibtools.man' > bibtools.man X.\" @(#)bibtools.1 (beta version) Sept 15 89 X.TH BIBTOOLS 1 "15 September 1989" X.SH NAME X.sp1 X.nf X\fBbibtools\fP X \fBbibc\fP \- Create BibTeX and scribe style bibliographies X \fBbibv\fP \- Verify a series of BibTeX style bibliographies for X citation conflicts X \fBshbib\fP \- Display one or more records fromthe specified bib files X \fBrmbib\fP \- Delete one or more records fromthe specified bib files X.fi X.SH SYNOPSIS X.sp1 X.nf X\fBbibc\fP [-verify|-i] [-|+pester] [-|+verbose] [-file \fIfilename\fP] [-help] X\fBbibv\fP [-s <style>] [-h] [ \fIfilename\fP ... ] X\fBshbib\fP [-f|-g|-l] [-s] [-r] [-h] \fIregexp\fP [ \fIfilename\fP... ] X\fBrmbib\fP [-f|-g|-l] [-s] [-i] [-h] \fIregexp\fP [ \fIfilename\fP... ] X.fi X.SH DESCRIPTION X.sp 1 X\fIbibc\fP (mnemonic for BIB-Creator) is a prompt based tool for Xcreating bibliographies in the BibTeX format. \fIbibc\fP first queries the Xuser for the kind of record they wish to create. \fIbibc\fP understands Xthe various fields required for the kind of record specified, and will Xquery the user for the values for each of these fields. \fIbibc\fP can Xdistinguish between required and optional fields, and will, by default Xinsist once on the user specifying the required fields. X X.nf X Once it has obtained a complete record, it will write it to the X file specified using the \fB-file\fP option, or to stdout. X X \fIbibc\fP's insistence can be turned off by using the X \fB-pester\fP flag. Specifying \fB+pester\fP will reverse this X flag. Default is \fB+pester\fP. X X One can require \fIbibc\fP to confirm every record before it is X entered into the bib-file by using the \fB-verify,\fP or X \fB-i\fP option. The default is "do not verify". X X If the \fB-verbose\fP option is specified, \fIbibc\fP will not echo the X record to stdout. \fB+verbose\fP will cause every record to be X echoed. Default is \fB+verbose\fP. X X The \fB-help\fP option causes \fIbibc\fP to print out a short usage X summary, describing all the options available to it. X.fi X XTyping a '?' will cause \fIbibc\fP to print out one or two lines of help about Xthe concerned field. One can abort the current record, and restart a Xnew one by typing "xx" to a field. X XA field that begins with a '\\' is assumed to flag a macro, and will Xtherefore not be quoted in the output. X XSpecifying "EDIT" (case is important here), will cause \fIbibc\fP to fork an Xeditor on the current file. \fIbibc\fP will first attempt to fork off an Xeditor using the "TEXEDIT" environment variable. Then, it will Xsucessively try "VISUAL", and "EDITOR", failing which it will try to Xfork off a default editor, fixed by your system administrator. X XIt is possible for a user to define a maximum of 5 fields for Xthemselves. This is done by setting an environment variable called X\fBBIBCINIT\fP. The syntax of this variable is similar to the MAILPATH Xvariable in ksh, and is 'FIELD1?help_string1:FIELD2?help_string2:...' XThese fields are queried at the very end, the help_strings are the Xstrings put out when one types a '?' to get information on the specific Xfield. By default, these fields are considered optional. X XSee the USAGE section for more help. X X\fIbibv\fP (mnemonic for BIB Verifier) creates a small sample LaTeX file, Xcontaining just citations for every entry in the bib files specified, Xand runs this file sucessively through latex, bibtex, latex, latex to Xproduce bibtex.tex and bibtex.dvi files. The run through bibtex causes Xany duplicate citations to be flagged. One can print the dvi file, and Xget a hardcopy record of all the entries in the specified bib files. X X.nf X \fIbibv\fP uses a special kind of bst file, called X \fBspecl\fP. This style file causes the bibitem keys to be the X same as the \\cite-keys that are used in the bib files X themselves. This is a convenient style for keeping hardcopies X of the bibliographies for reference. X One can use the \fB-s\fP option to specify a different style to X be used. X X The \fB-h\fP option causes a brief help message to get printed out. X.fi X X\fIshbib\fP (mnemonic for SHow BIB entry) is used to view records in the Xgiven bib files. The records matching the specific regular expression Xare printed on stdout. X X.nf X The \fB-f\fP option specifies that only the first matching record is X to be printed out. This is the default. X X The \fB-g\fP option specifies the all records matching the expression X amongst all the files is to be printed out. This is a mnemonic X for "globally match". X X The \fB-l\fP option specifies that only the last matching record is X to be printed out. X X The \fB-r\fP option asks shbib to remove all records that get printed X out, from the respective files. Note that this option can be X dangerous when used carelessly, and is not always recommended. X X If more than one files is given to \fIshbib\fP, the file where the X corresponding match is made is also echoed to stdout. The \fB-s\fP X option, for silent, asks \fIshbib\fP not to do this echoing. X X The \fI-h\fP option causes a brief help message to get printed out. X.fi X X\fIrmbib\fP (mnemonic for ReMove BIB entry) is a tool to remove records Xmatching the given regular expression from the corresponding bib Xfiles. The records that are deleted are also echoed to stdout. X X.nf X The \fB-f\fP option, the default specifies that only the first X matching record is to be deleted. X X The \fB-g\fP option, requires all matching records are to be deleted. X X The \fB-l\fP option requires that only the last matching record is to X be deleted. X X The \fB-s\fP option asks \fIrmbib\fP not to echo the filename X matched, if more than one bibfile has been specified. X X The \fB-i\fP option requires \fIrmbib\fP to inquire the user before X deleting any record. X X The \fB-h\fP option causes a brief help message to get printed out. X.fi X X.sp1 X.SH USAGE X.sp1 X XSee the sample walkthrough of usage of \fIbibc\fP, and a brief use of X\fIshbib\fP. \fBBold\fP lettering indicates characters that the user Xtypes in. X X.nf XScript started on Sun Dec 3 00:47:28 1989 Xcheops Bibcreate. \fBbibc -help\fP XUsage: bibc [-i|-verify] [+|-verbose] [+|-pester] [-file <filename>] [-help] X -i Inquire whether to commit a record X -verify Same as above, a duplicate form X -verbose Turn off verbose flag X +verbose Turn on verbose flag X -pester Do not insist, even for required fields X +pester Insist once for required fields X -file <filename> Output bib entries to <filename> X -help Print this help output Xcheops Bibcreate. \fBbibc -file foo.bib\fP XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fBinb\fP XCITEKEY? \fBNAR88\fP XAUTHOR? \fBNarayan, R. K.\fP XTITLE? \fBA Writer's Nightmare\fP XCHAPTER? XERROR: CHAPTER is a REQUIRED FIELD for INBOOK. Let's try that again...sigh... XCHAPTER? XERROR: Frankly my dear, I don't give a damn... XPAGES (optional)? \fB164--166\fP XPUBLISHER? \fBPenguin Books\fP XYEAR? \fB1988\fP XVOLUME (optional)? \fB1\fP XSERIES (optional)? XADDRESS (optional)? XEDITION (optional)? XMONTH (optional)? XNOTE (optional)? XKEY (optional)? \fB?\fP XUsed for alphabetising and creating a label when the author and X editor fields are missing. XKEY (optional)? XCOMMENT (optional)? XCROSS-REFERENCE (optional)? X@INBOOK { NAR88 , X AUTHOR = "Narayan, R. K." , X PAGES = "164--166" , X PUBLISHER = "Penguin Books" , X TITLE = "A Writer's Nightmare" , X VOLUME = "1" , X YEAR = "1988" X } X XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fBin\fP XUh oh! no no no XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fBmi\fP XCITEKEY? \fBxx\fP XAbort? [y|n] \fBy\fP XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fB^D\fP Xcheops Bibcreate. \fBBIBCINIT="USR_FIELD1:USR_FIELD2?Bah Humbug" export BIBCINIT\fP Xcheops Bibcreate. \fBbibc -file foo.bib\fP XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fBa\fP XCITEKEY? \fBLAM78\fP XAUTHOR? \fBLamport, Leslie\fP XTITLE? \fBTime, Clocks, and the Ordering of Events in a Distributed System\fP XJOURNAL? \fB\\jacm\fP XYEAR? \fB1978\fP XVOLUME (optional)? \fB21\fP XNUMBER (optional)? \fB7\fP XPAGES (optional)? \fB558--565\fP XMONTH (optional)? \fB\\jul\fP XNOTE (optional)? XKEY (optional)? XCOMMENT (optional)? XCROSS-REFERENCE (optional)? XUSR_FIELD1 (optional)? \fB?\fP XYou asked for it, buster, so you figure it out... XUSR_FIELD1 (optional)? \fBThis wasn't in the jacm, sigh\fP XUSR_FIELD2 (optional)? \fB?\fP XBah Humbug XUSR_FIELD2 (optional)? \fBThere we go, it was in the cacm, so we can EDIT and change the entry\fP X@ARTICLE { LAM78 , X AUTHOR = "Lamport, Leslie" , X JOURNAL = jacm , X MONTH = jul , X NUMBER = "7" , X PAGES = "558--565" , X TITLE = "Time, Clocks, and the Ordering of Events in a Distributed System" , X VOLUME = "21" , X YEAR = "1978" , X USR_FIELD1 = "This wasn't in the jacm, sigh" , X USR_FIELD2 = "There we go, it was in the cacm, so we can EDIT and change the entry" X } X XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X\fB^D\fP Xcheops Bibcreate. \fBshbib lam78 foo.bib\fP X@ARTICLE { LAM78 , X AUTHOR = "Lamport, Leslie" , X JOURNAL = jacm , X MONTH = jul , X NUMBER = "7" , X PAGES = "558--565" , X TITLE = "Time, Clocks, and the Ordering of Events in a Distributed System" , X VOLUME = "21" , X YEAR = "1978" , X USR_FIELD1 = "This wasn't in the jacm, sigh" , X USR_FIELD2 = "There we go, it was in the cacm, so we can EDIT and change the entry" X } Xcheops Bibcreate. X Xscript done on Sun Dec 3 00:57:11 1989 X.fi X X.sp1 X.SH BUGS X.sp1 XThe order of entries in the bib file will not be the same as one had Xoriginally started out with if one uses the \fB-r -l\fP option to X\fIshbib\fP, or uses the \fB-l\fP option to \fIrmbib\fP. X XOne might like to have a tool for sorting entries in a file based on Xsome specified keys. X XExiting in the middle of a entering a record via \fBbibc\fP causes some Xunnecessary garbage to appear on the screen. The output file is always Xconsistent though. X XThese tools may crash if the bib files specified are not complete and Xconsistent. X XThe method of delineating records is to locate a '\\n@', ie, a newline Xfollowed by an '@' as the next character. X XThe \fB-i\fP option to \fIbibc\fP and \fIrmbib\fP will cause the record Xto be seemingly displayed twice. This is not so. The first time, the Xwrite is to stderr, the final write is to stdout. This is so one can Xredirect stdout to correct places, such as doing X X.nf X \fBrmbib -g -i -s Concurrency bib-files > concurrency.bib\fP X.fi X XHopefully, not much else. X X.sp1 X.SH AUTHOR X.sp1 X.LP X.nf X Kannan Varadhan - kannan@osc.edu X.fi X.sp1 X.SH SEE ALSO X.sp1 X.nf X\fBegrep(1)\fP, \fBmh(1)\fP, \fBprompter(1)\fP, \fBaddbib(1)\fP, \fPlookbib(1)\fP X.fi EOFile bibtools.man chmod u=rw+,g=+++,o=+++ bibtools.man echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibv.c..." 1>&2 if test -f bibv.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibv.c' > bibv.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#define GLOBALS X#include "bibv.h" X Xmain (argc, argv) Xint argc; Xchar *argv[]; X X{ Xextern int process_record(); X X if (process_args (argc, argv) == -1) X return -1 /* EXIT */; X X (void) set_signals_bibv (); X X Fprintf (texfile, PREAMBLE, style, userid); X (void) process_bibfiles (_O_flist, process_record, (int (*)()) NULL); X (void) finish_up (); X if (execute (OUTFILE) >= 0) X Fprintf (stderr, "Now printout %s.dvi to see the output\n", OUTFILE); X (void) cleanup (OUTFILE); X return 0; X} X X Xfinish_up () X X{ Xchar *temp; X X Fprintf (stderr, "FILE %s has %d records\n", _O_file, ctr); X temp = Rindex (bibrecd, ','); X *temp = '\0'; X Fprintf (texfile, EPILOGUE, bibrecd); X fflush (texfile); X return 0; X} X X Xprocess_record (file, string) Xchar *file, *string; X X{ Xchar *temp, *key; X X if (_O_file != file) X { X if (ctr) X Fprintf (stderr, "FILE %s has %d records\n", _O_file, ctr); X Fprintf (texfile, SECTIONHDR, file); X if (Strcmp ((file + strlen (file) - 4), ".bib") == SAME) X Strncat (bibrecd, file, (strlen(file) - 4)); X else X Strcat (bibrecd, file); X Strcat (bibrecd, ","); X _O_file = file; X ctr = 0; X } X X if (REGMATCH (regprog, string) == 1) X { X temp = Index (string, OPEN_BRACE) + 1; X while ((*temp == ' ') || (*temp == '\t') || (*temp == '\n')) X temp++; X key = temp; X while ((*temp != ' ') && (*temp != '\t') && (*temp != '\n') && X (*temp != ',')) X temp++; X *temp = '\0'; X Fprintf (texfile, CITE, key); X ctr++; X } X X return 0; X} X X Xprocess_args (argc, argv) Xint argc; Xchar *argv[]; X X{ Xint opt, count, i; Xextern char *optarg; Xextern int optind; Xchar **temp; Xchar outfile[100]; X X if (argc <= 1) X _O_help = TRUE; X X while ((opt = getopt (argc, argv, "hs:")) != EOF) X switch (opt) { X case 'h': X _O_help = TRUE; X break; X case 's': X style = optarg; X break; X case '?': X default: X _O_help = TRUE; X } X X if (_O_help) X { X usage (); X return -1; X } X X _O_files = (char **) malloc ((unsigned) (sizeof (char *) * (argc - optind + 1))); X if (_O_files == (char **) NULL) X { X perror (PROGSTR); X exit (-2); X } X X count = 1; X temp = _O_flist = _O_files; X for (i = optind; i < argc; i++) X { X *temp = argv[i]; X count += Strlen (*temp) + 1; X temp++; X } X *temp = (char *) NULL; X bibrecd = (char *) malloc ((unsigned) count); X bzero (bibrecd, count); X X pwentry = getpwuid (getuid()); X userid = pwentry->pw_name; X X Sprintf (outfile, "%s.tex", OUTFILE); X texfile = fopen (outfile, "w"); X X regprog = (REGEXP *) REGCOMP (KEYS); X return 0; X} X X Xusage () X X{ XFprintf (stderr, "usage: %s [-s style-file] [-h] [ filename ... ]\n", PROGSTR); Xreturn 0; X} X X Xexecute (outfile) Xchar *outfile; X X{ X if (run (LATEX, "latex", outfile, TRUE) < 0) X return -1; X if (run (BIBTEX, "bibtex", outfile, FALSE) < 0) X return -1; X if (run (LATEX, "latex", outfile, TRUE) < 0) X return -1; X if (run (LATEX, "latex", outfile, FALSE) < 0) X return -1; X return 0; X} X X Xcleanup (outfile) Xchar *outfile; X X{ Xchar fn[100]; X X Sprintf (fn, "%s.bbl", outfile); unlink (fn); X Sprintf (fn, "%s.aux", outfile); unlink (fn); X Sprintf (fn, "%s.log", outfile); unlink (fn); X Sprintf (fn, "%s.blg", outfile); unlink (fn); X return 0; X} X Xrun (progname, arg0, filename, fdstatus) Xchar *progname, *arg0, *filename; Xint fdstatus; X X{ Xint pid; Xchar emsg[100]; Xunion wait status; X X Sprintf (emsg, "Cannot run %s .. Aborting", arg0); X pid = vfork(); X if (pid < 0) /* ERROR */ X { X perror ("fork"); X return -1; X } X else if (pid == 0) /* CHILD */ X { X if (fdstatus) X { X close (0); open ("/dev/null", O_RDONLY); X close (1); open ("/dev/null", O_WRONLY); X close (2); open ("/dev/null", O_WRONLY); X } X execlp (progname, progname, filename, 0); X perror (emsg); X return -1; X } X else X (void) wait4 (pid, &status, 0, (struct rusage *) NULL); X X if (status.w_termsig != 0) X { X Fprintf (stderr, "%s error, signal %2d %s\n", arg0, X status.w_termsig, X (status.w_coredump ? ", core dumped" : "") X ); X return -1; X } X return 0; X} X Xset_signals_bibv () X X{ Xextern int hangup_bibv(), abort_bibv(); X X signal (SIGHUP, hangup_bibv); X signal (SIGINT, hangup_bibv); X signal (SIGQUIT, hangup_bibv); X signal (SIGTERM, hangup_bibv); X X signal (SIGILL, abort_bibv); X signal (SIGBUS, abort_bibv); X signal (SIGSEGV, abort_bibv); X signal (SIGSYS, abort_bibv); X signal (SIGPIPE, abort_bibv); X return -1; X} X Xhangup_bibv () X/* X * Nothing to do but cleanout bibtex.* files, and exit X */ X X{ Xchar fn[100]; X X Sprintf (fn, "%s.tex", OUTFILE); unlink (fn); X Sprintf (fn, "%s.dvi", OUTFILE); unlink (fn); X Sprintf (fn, "%s.bbl", OUTFILE); unlink (fn); X Sprintf (fn, "%s.aux", OUTFILE); unlink (fn); X Sprintf (fn, "%s.log", OUTFILE); unlink (fn); X Sprintf (fn, "%s.blg", OUTFILE); unlink (fn); X exit (-1); X} X X Xabort_bibv (sig, code, scp) X/* X * First print out a small message, then hangup_bibv() X */ X X{ XFprintf (stderr, "Unexpected error signal %d received..aborting\n", sig); Xhangup_bibv (); X/*NOT REACHED*/ X} EOFile bibv.c chmod u=rw+,g=r++,o=r++ bibv.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "bibv.h..." 1>&2 if test -f bibv.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile bibv.h' > bibv.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "includes.h" X#include <pwd.h> X X#define PROGSTR "bibv" X XREGEXP *REGCOMP(); X XDCLX (char, **_O_files); XDCLX (char, **_O_flist); XDCL (char, *_O_file, (char *) NULL); XDCL (char, *bibrecd, (char *) NULL); XDCL (char, *style, STYLE); XDCLX (struct passwd, *pwentry); XDCLX (char, *userid); XDCL (int, ctr, 0); X XDCLX (REGEXP, *regprog); XDCLX (FILE, *texfile); X XDCL (char, _O_help, FALSE); X X#define PREAMBLE "\\documentstyle{article}\n\ X\\begin{document}\n\ X\\bibliographystyle{%s}\n\ X\\title{Verifying Biblio files}\n\ X\\author{%s}\n\ X\\date{\\today}\n\ X\\maketitle\n" X X#define SECTIONHDR "\\section{FILE %s}\n\nCiting:\n" X#define CITE "\\cite {%s}\n" X#define COMMENTS "\ X%\n\ X% This is a sample tex file sillustrating, and verifying all the bib\n\ X% bib entries you have in the bib files you have specified.\n\ X%" X X#define EPILOGUE "\\bibliography{%s}\n\\end{document}" X X#define KEYS "@arti|@book|@conf|@inbo|@inco|@inpr|@manu|@mast|@misc|@phdt|@proc|@tech|@unpu" EOFile bibv.h chmod u=rw+,g=r++,o=r++ bibv.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "config.h..." 1>&2 if test -f config.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile config.h' > config.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X/* X * SAFE turns off the -pester flag by default, set it to TRUE unless X * you have absolutely pained users like me, who think they know what X * what they are doing....As to whether they (or I) actually know or X * not is not the issue here, is it? :-) X */ X#ifndef SAFE X#define SAFE TRUE X#endif X X/* maximum size of string a user is permitted to input */ X#define MAXLEN 391 X X/* The number of fields a user can define for himself... */ X#define USR_DEFNS_MAX 5 X X/* hmmm..... */ X#define DEFAULT_EDITOR "/usr/ucb/vi" X X/* X * If a user defines his own fields, but no help prompts, this is X * What I'd say ... ;-) X */ X#define DEFAULT_USERHLP "You asked for it, buster, so you figure it out..." X X/* X * bibv definitions X */ X/* style file to use for bibv */ X#define STYLE "specl" X X/* locations of latex and bibtex */ X#define LATEX "/usr/local/bin/latex" X#define BIBTEX "/usr/local/bin/bibtex" X X/* wait4() equivalent, if you don't have it */ X#define wait4(PID,STATUS,OPTS,RUSAGE) wait3 (STATUS, OPTS, RUSAGE) /* sigh */ X X/* Name of file output by bibv */ X#define OUTFILE "bibtex" X X/* X * REGULAR EXPRESSION HANDLING X * X * entry handling routines only, shent and rment X */ X X#define BUFSIZE 8000 X#define RECSIZE 800 X X#define NOCASE /* Perform caseless regular expression matching */ X/* X * Caseless regular expression matching is done simply by converting X * all strings to lower case, and then performing the comparison. X */ X X/* X * There are three defines X * REGEXP defines type of regular expression X * REGCOMP compile the r. e. into one of type REGEXP X * REGMATCH it to perform the match X */ X#define REGEXP regexp X X#ifdef NOCASE X#define REGCOMP my_rcomp X#define REGMATCH my_rexec X#else X#define REGCOMP regcomp X#define REGMATCH regexec X#endif X X X/* X * What routine to use for gets(). gets() has flaws in it's handling. X * I prefer to simulate gets() functionality using my_gets(), in gets.c X * X * If you don't trust it, you could use, gets() directly. X */ X X/*#define GETS(BUFF,SIZE) gets (BUFF) /* Rather not */ X#define GETS(BUFF,SIZE) my_gets (BUFF, SIZE) /* preferred */ EOFile config.h chmod u=rw+,g=r++,o=r++ config.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "foo.bib..." 1>&2 if test -f foo.bib then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile foo.bib' > foo.bib X@INBOOK { NAR88 , X AUTHOR = "Narayan, R. K." , X PAGES = "164--166" , X PUBLISHER = "Penguin Books" , X TITLE = "A Writer's Nightmare" , X VOLUME = "1" , X YEAR = "1988" X } X@ARTICLE { LAM78 , X AUTHOR = "Lamport, Leslie" , X JOURNAL = jacm , X MONTH = jul , X NUMBER = "7" , X PAGES = "558--565" , X TITLE = "Time, Clocks, and the Ordering of Events in a Distributed System" , X VOLUME = "21" , X YEAR = "1978" X } X@ARTICLE { lam23 , X AUTHOR = "asd" , X JOURNAL = "asd" , X TITLE = "asd" , X YEAR = "asd" X } X@ARTICLE { asd , X AUTHOR = "asd" , X JOURNAL = "fd" , X TITLE = "adsf" , X YEAR = "fsd" , X USR_FIELD2 = "help" X } EOFile foo.bib chmod u=rw+,g=r++,o=r++ foo.bib echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "gen_lex_file..." 1>&2 if test -f gen_lex_file then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile gen_lex_file' > gen_lex_file X#! /bin/sh X X# /* X# * This program has been written by Kannan Varadhan. You are welcome to X# * use, copy, modify, or circulate as you please, provided you do not X# * charge any fee for any of it, and you do not remove these header X# * comments from any of these files. X# * X# * -- kva Mon Dec 4 11:26:37 EST 1989 X# */ X Xcase $# in X0|1|2) Xecho usage: `basename $0` preamble_file rules_file postscript_file outputfile Xexit ;; Xesac X Xtrap 'rm $tmpfil; exit' 1 2 3 6 9 15 X Xpreamble=$1; Xrules=$2; Xpostscript=$3; Xoutput=$4; X Xcat $preamble Xegrep -v '^#' $rules | awk ' XBEGIN { printf "\n%%%%\n" ; } X{ token = $1; X min = length ($2); X max = length ($3); X key = $3; X for (i = min; i <= max; i++) X printf "\"%s!\"\t\treturn %s;\n", substr (key, 1, i), token X }' X Xcat $postscript Xexit EOFile gen_lex_file chmod u=rwx,g=r+x,o=r+x gen_lex_file echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "header..." 1>&2 if test -f header then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile header' > header X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ EOFile header chmod u=rw+,g=r++,o=r++ header echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "includes.h..." 1>&2 if test -f includes.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile includes.h' > includes.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include <stdio.h> X#include <sys/types.h> X#include <sys/file.h> X#include <sys/stat.h> X#include <ctype.h> X#include <assert.h> X#include <errno.h> X#include <signal.h> X#include <sys/wait.h> X#include <sys/time.h> X#include <sys/resource.h> X#include "strings.h" X#include "config.h" X#include "regexp.h" X Xextern int errno; X#ifdef GLOBALS X#define DCL(TYPE,VAR,VAL) TYPE VAR = VAL X#define DCLX(TYPE,VAR) TYPE VAR X#else X#define DCL(TYPE,VAR,VAL) extern TYPE VAR X#define DCLX(TYPE,VAR) extern TYPE VAR X#endif X X#define FALSE 0 X#define TRUE ! FALSE X X#define SAME 0 X X#ifdef EBUG X#define DEBUG X#endif X X#ifdef DEBUG X#define WRITE(STRING) write(2,STRING,strlen(STRING));write(2,"\n",1) X#define PRINT(FMT,VAR) fprintf (stderr, FMT, VAR) X#define DASSERT(COND) assert (COND) X#else X#define WRITE(STRING) X#define PRINT(FMT,VAR) X#define DASSERT(COND) X#endif X X#define QUOTE_CHAR '"' X#define OPEN_BRACE '{' X#define CLOSE_BRACE '}' X#define BSLASH '\\' X X#define YES 'y' X#define NO 'n' X X EOFile includes.h chmod u=rw+,g=r++,o=r++ includes.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "inits.c..." 1>&2 if test -f inits.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile inits.c' > inits.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "bibc.h" X Xresetall (bibitem) Xbibrec *bibitem; X X{ Xint i; X X RESET (bibitem, rectype); X RESET (bibitem, citekey); X RESET (bibitem, address); X RESET (bibitem, annote); X RESET (bibitem, author); X RESET (bibitem, booktitle); X RESET (bibitem, chapter); X RESET (bibitem, edition); X RESET (bibitem, edition); X RESET (bibitem, editor); X RESET (bibitem, howpublished); X RESET (bibitem, institution); X RESET (bibitem, journal); X RESET (bibitem, key); X RESET (bibitem, month); X RESET (bibitem, note); X RESET (bibitem, number); X RESET (bibitem, organisation); X RESET (bibitem, pages); X RESET (bibitem, publisher); X RESET (bibitem, school); X RESET (bibitem, series); X RESET (bibitem, title); X RESET (bibitem, type); X RESET (bibitem, volume); X RESET (bibitem, year); X RESET (bibitem, comment); X RESET (bibitem, cross_ref); X for (i = 0; i != usr_defns_ctr; i++) X RESET (bibitem, usr_defns[i]); X X return 0; X} X X Xinitialise (bibitem) Xbibrec *bibitem; X X{ Xchar *BIBCINIT, *getenv(); Xchar *qmark, *colon, *userhlp, *userkey, *nextkey; X X resetall (bibitem); X X#define STORHELP(VAR,FIELD,VALUE,HELP) \ X { \ X Strcpy ((VAR)->FIELD.prompt, VALUE); \ X Strcpy ((VAR)->FIELD.helpstring, HELP); \ X } X X STORHELP (bibitem, rectype, "", "" ); X STORHELP (bibitem, citekey, "CITEKEY", X"The key used to cross reference with the \cite command in the\n\ X main text." ); X STORHELP (bibitem, address, "ADDRESS", X"Publisher's address.For major publishing houses, just the city\n\ X is given, for smaller publishers, you might choose to give the\n\ X full address." ); X STORHELP (bibitem, author, "AUTHOR", X"The name(s) of the author(s). Separate multiple authors by the\n\ X keyword 'and'. See the LaTeX manual for more help." ); X STORHELP (bibitem, annote, "ANNOTE", X"An annotation. Not used in the standard bibliography styles, but\n\ X may be used by others." ); X STORHELP (bibitem, booktitle, "BOOKTITLE", X"Title of the book, part of which is being cited." ); X STORHELP (bibitem, chapter, "CHAPTER", X"A chapter number." ); X STORHELP (bibitem, edition, "EDITION", X"The edition of the book--for example, 'second'." ); X STORHELP (bibitem, editor, "EDITOR", X"Name(s) of editor(s), typed as in the author field. If the author\n\ X is also indicated, then this field gives the editor of the book or\n\ X collection in which the refernce appears." ); X STORHELP (bibitem, howpublished, "HOWPUBLISHED", X"How something strange has been published." ); X STORHELP (bibitem, institution, "INSTITUTION", X"The institution that published the work." ); X STORHELP (bibitem, journal, "JOURNAL", X"The name of a journal." ); X STORHELP (bibitem, key, "KEY", X"Used for alphabetising and creating a label when the author and\n\ X editor fields are missing." ); X STORHELP (bibitem, month, "MONTH", X"The month in which the work was published. For an unpublished\n\ X work, the month in which it was written." ); X STORHELP (bibitem, note, "NOTE", X"Any additional information that can help the reader." ); X STORHELP (bibitem, number, "NUMBER", X"The number of a journal, magazine or technical report." ); X STORHELP (bibitem, organisation, "ORGANISATION", X"The organisation sponsoring the conference." ); X STORHELP (bibitem, pages, "PAGES", X"One or more page numbers, or range of page numbers, as 42--111,\n\ X or 7,41,73--97." ); X STORHELP (bibitem, publisher, "PUBLISHER", X"The publisher's name." ); X STORHELP (bibitem, school, "SCHOOL", X"The name of the school in which the thesis was written." ); X STORHELP (bibitem, series, "SERIES", X"The name of a series or set of books." ); X STORHELP (bibitem, title, "TITLE", X"The work's title" ); X STORHELP (bibitem, type, "TYPE", X"The type of a technical report, for example, 'Research Note'." ); X STORHELP (bibitem, volume, "VOLUME", X"The volume of a journal or multivolume work." ); X STORHELP (bibitem, year, "YEAR", X"The year of publication, or for an unpublished work, the year in\n\ X which it was written." ); X STORHELP (bibitem, comment, "COMMENT", X"Any relevant info associated with this record that you would like\n\ X to store herein." ); X STORHELP (bibitem, cross_ref, "CROSS-REFERENCE", X"used to fill in missing field info in this record from the\n\ X cross-referenced bib-record..see BiBTeXing manual for more help."); X/* X * Now that the standard fields are defined, see if the user would like X * to define specific fields for themselves. Such fields are specified X * by the user in tthe BIBCINIT environment variables. The format of X * his variable shall be similiar to the MAILPATH variable used by the X * korn shell, as.... X * <fieldname>?<optional help string> X * multiple fields shall be separated by <COLON>s, ':' X * A maximum of USR_DEFNS_MAX is taken.... X */ X BIBCINIT = getenv ("BIBCINIT"); X if (BIBCINIT) X { X userkey = BIBCINIT; X while (userkey != (char *) NULL) X { X nextkey = (char *) NULL; X userhlp = DEFAULT_USERHLP; X if ((colon = Index (userkey, ':')) != (char *) NULL) X { X nextkey = colon + 1; X *colon = '\0'; X } X if ((qmark = Index (userkey, '?')) != (char *) NULL) X { X userhlp = qmark + 1; X *qmark = '\0'; X } X STORHELP (bibitem, usr_defns[usr_defns_ctr], userkey, userhlp); X usr_defns_ctr++; X if (usr_defns_ctr < USR_DEFNS_MAX) X userkey = nextkey; X else X userkey = (char *) NULL /* quit while we are ahead ;-) */; X if (qmark != (char *) NULL) *qmark = '?'; X if (colon != (char *) NULL) *colon = ':'; X qmark = colon = (char *) NULL; X } X } X#undef STORHELP X return 0; X} X X Xprocess_args (argc, argv) Xint argc; Xchar *argv[]; X X{ X#define SHIFT i++ X#define args(str) (! Strcmp (argv[i], str)) X Xint i; Xchar error[80]; X X for (i = 1; i < argc; SHIFT) X { X if (args ("-i") || args ("-verify")) X { _O_verify = _O_verbose = TRUE; continue; } X if args ("-verbose") X { _O_verbose = FALSE; continue; } X if args ("+verbose") X { _O_verbose = TRUE; continue; } X if args ("-pester") X { _O_pester_usr = FALSE; continue; } X if args ("+pester") X { _O_pester_usr = TRUE; continue; } X if args ("-help") X { _O_help = TRUE; continue; } X if args ("-file") X { SHIFT; X outfile = (FILE *) fopen (argv[i], "a"); X if (outfile) X Strcpy (_O_outfilename, argv[i]); X else X { X Sprintf (error, "bibc: file %s could not be opened", argv[i]); X perror (error); X outfile = stdout; X } X continue; X } X /* default: */ X { X Fprintf (stderr, "bibc: %s is an invalid argument\n", argv[i]); X _O_help = TRUE; X continue; X } X } X if (_O_help) X { X (void) usage (); X exit (0); X } X return 0; X#undef SHIFT X#undef args X} X#define USAGE "Usage: bibc [-i|-verify] [+|-verbose] [+|-pester] [-file <filename>] [-help]\n" X X Xusage () X X{ X Fprintf (stderr, USAGE); XFprintf (stderr, "\t-i\t\t\tInquire whether to commit a record\n"); XFprintf (stderr, "\t-verify\t\t\tSame as above, a duplicate form\n"); XFprintf (stderr, "\t-verbose\t\tTurn off verbose flag\n"); XFprintf (stderr, "\t+verbose\t\tTurn on verbose flag\n"); XFprintf (stderr, "\t-pester\t\t\tDo not insist, even for required fields\n"); XFprintf (stderr, "\t+pester\t\t\tInsist once for required fields\n"); XFprintf (stderr, "\t-file <filename>\tOutput bib entries to <filename>\n"); XFprintf (stderr, "\t-help\t\t\tPrint this help output\n"); X return 0; X} X EOFile inits.c chmod u=rw+,g=rw+,o=r++ inits.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "lex.yy.c..." 1>&2 if test -f lex.yy.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile lex.yy.c' > lex.yy.c X#define FLEX_COMPRESSED X/* A lexical scanner generated by flex */ X X/* scanner skeleton version: X * $Header: flex.skel,v 1.1 89/05/24 00:32:10 vern Locked $ X */ X X#include <stdio.h> X X#define FLEX_SCANNER X X/* returned upon end-of-file */ X#define YY_END_TOK 0 X X/* amount of stuff to slurp up with each read */ X#define YY_READ_BUF_SIZE 8192 X X#define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of input buffer */ X X/* number of characters one rule can match. One less than YY_BUF_SIZE to make X * sure we never access beyond the end of an array X */ X#define YY_BUF_MAX (YY_BUF_SIZE - 1) X X/* copy whatever the last rule matched to the standard output */ X X#define ECHO fputs( yytext, yyout ) X X/* gets input and stuffs it into "buf". number of characters read, or YY_NULL, X * is returned in "result". X */ X#define YY_INPUT(buf,result,max_size) \ X if ( (result = read( fileno(yyin), buf, max_size )) < 0 ) \ X YY_FATAL_ERROR( "read() in flex scanner failed" ); X#define YY_NULL 0 X X/* report a fatal error */ X#define YY_FATAL_ERROR(msg) \ X { \ X fputs( msg, stderr ); \ X putc( '\n', stderr ); \ X exit( 1 ); \ X } X X/* default yywrap function - always treat EOF as an EOF */ X#define yywrap() 1 X X/* enter a start condition. This macro really ought to take a parameter, X * but we do it the disgusting crufty way that old Unix-lex does it X */ X#define BEGIN yy_start = 1 + X X/* default declaration of generated scanner - a define so the user can X * easily add parameters X */ X#define YY_DECL int yylex() X X/* code executed at the end of each rule */ X#define YY_BREAK break; X X#define YY_END_OF_BUFFER_CHAR 0 X X/* done after the current pattern has been matched and before the X * corresponding action - sets up yytext X */ X#define YY_DO_BEFORE_ACTION \ X yytext = yy_bp; \ X yy_hold_char = *yy_cp; \ X *yy_cp = '\0'; \ X yy_c_buf_p = yy_cp; X X/* returns the length of the matched text */ X#define yyleng (yy_cp - yy_bp) X X#define EOB_ACT_RESTART_SCAN 0 X#define EOB_ACT_END_OF_FILE 1 X#define EOB_ACT_LAST_MATCH 2 X X/* return all but the first 'n' matched characters back to the input stream */ X#define yyless(n) \ X { \ X *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ X yy_c_buf_p = yy_cp = yy_bp + n; \ X YY_DO_BEFORE_ACTION; /* set up yytext again */ \ X } X X#define unput(c) yyunput( c, yy_bp ) X X#define YY_USER_ACTION X X# line 1 "bibl.l" X#define INITIAL 0 X# line 2 "bibl.l" X X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "bibc.h" X#undef YY_INPUT X#define YY_INPUT(buf,reslt,msize) my_input (buf, &reslt, msize) X Xmy_input (buf,reslt, size) Xchar *buf; Xint *reslt; Xint size; X X{ Xchar inputln[80]; X X bzero (inputln, 80); X if (! GETS (inputln, 80)) X Strcpy (buf, "EOF"); X else X Strncpy (buf, inputln, size); X Strcat (buf, "!"); X#ifdef FLEX_DEBUG X Fprintf (stderr, "buf contains: %s\n", buf); X#endif X return *reslt = strlen (buf); X} X X Xmy_yylex () X X{ X#define PROMPTSTR "\ XWhat kind of record would you like to enter (one of the following)?\n\ X article book booklet conference\n\ X inbook incollection inproceedings manual\n\ X mastersthesis msthesis misc phdthesis\n\ X proceedings techreport unpublished\n\ Xor EDIT quit\n" X X Fprintf (stderr, PROMPTSTR); X return yylex (); X} X X# line 54 "bibl.l" X#define YY_END_OF_BUFFER 116 Xtypedef int yy_state_type; Xstatic short int yy_accept[251] = X { 0, X 0, 0, 116, 115, 114, 115, 115, 115, 115, 115, X 115, 115, 115, 115, 115, 115, 114, 0, 0, 0, X 1, 0, 0, 12, 0, 0, 0, 0, 0, 0, X 0, 0, 90, 0, 100, 0, 0, 0, 2, 0, X 0, 13, 0, 0, 0, 0, 0, 0, 69, 0, X 62, 0, 72, 0, 80, 0, 0, 91, 0, 101, X 0, 0, 112, 3, 0, 0, 14, 0, 22, 0, X 26, 0, 36, 0, 47, 0, 51, 0, 70, 0, X 63, 0, 73, 0, 81, 0, 0, 92, 0, 102, X 0, 113, 4, 0, 8, 0, 15, 0, 23, 0, X X 27, 0, 37, 0, 48, 0, 52, 0, 71, 64, X 0, 74, 0, 82, 0, 111, 93, 0, 103, 0, X 5, 0, 9, 0, 16, 0, 24, 0, 28, 0, X 38, 0, 49, 0, 53, 0, 65, 0, 75, 0, X 83, 0, 94, 0, 104, 0, 6, 0, 10, 0, X 17, 0, 25, 29, 0, 39, 0, 50, 54, 0, X 66, 0, 76, 0, 84, 0, 95, 0, 105, 0, X 7, 11, 18, 0, 30, 0, 40, 0, 55, 0, X 67, 0, 77, 0, 85, 0, 96, 0, 106, 0, X 19, 0, 31, 0, 41, 0, 56, 0, 68, 78, X X 0, 86, 0, 97, 0, 107, 0, 20, 0, 32, X 0, 42, 0, 57, 0, 79, 87, 0, 98, 0, X 108, 0, 21, 33, 0, 43, 0, 58, 0, 88, X 0, 99, 109, 0, 34, 0, 44, 0, 59, 0, X 89, 110, 35, 45, 0, 60, 0, 46, 61, 0 X } ; X Xstatic char yy_ec[128] = X { 0, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, X 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, X 1, 1, 1, 1, 3, 3, 3, 4, 5, 6, X 3, 3, 7, 3, 3, 3, 3, 3, 8, 3, X 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, X 1, 1, 1, 1, 1, 1, 10, 11, 12, 13, X X 14, 15, 16, 17, 18, 3, 19, 20, 21, 22, X 23, 24, 25, 26, 27, 28, 29, 3, 3, 3, X 3, 3, 1, 1, 1, 1, 1 X } ; X Xstatic char yy_meta[30] = X { 0, X 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, X 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, X 2, 2, 2, 2, 2, 2, 2, 2, 2 X } ; X Xstatic short int yy_base[252] = X { 0, X 0, 0, 279, 280, 280, 276, 28, 29, 31, 33, X 35, 32, 36, 37, 38, 39, 280, 275, 41, 43, X 280, 42, 44, 280, 49, 61, 56, 62, 58, 63, X 45, 72, 280, 67, 280, 73, 75, 274, 280, 78, X 79, 280, 80, 85, 86, 89, 90, 92, 280, 91, X 280, 97, 280, 98, 280, 99, 100, 280, 104, 280, X 102, 273, 280, 280, 105, 103, 280, 108, 280, 110, X 280, 114, 280, 116, 280, 122, 280, 111, 280, 272, X 280, 127, 280, 125, 280, 133, 269, 280, 128, 280, X 134, 280, 280, 135, 280, 136, 280, 138, 280, 141, X X 280, 142, 280, 144, 280, 146, 280, 147, 280, 280, X 149, 280, 151, 280, 155, 280, 280, 156, 280, 157, X 280, 161, 280, 150, 280, 165, 280, 268, 280, 166, X 280, 169, 280, 267, 280, 159, 280, 170, 280, 172, X 280, 179, 280, 180, 280, 182, 280, 266, 280, 265, X 280, 183, 280, 280, 185, 280, 187, 280, 280, 188, X 280, 190, 280, 189, 280, 191, 280, 192, 280, 193, X 280, 280, 280, 196, 280, 194, 280, 200, 280, 201, X 280, 264, 280, 208, 280, 209, 280, 210, 280, 212, X 280, 219, 280, 221, 280, 222, 280, 223, 280, 280, X X 263, 280, 225, 280, 217, 280, 224, 280, 262, 280, X 226, 280, 228, 280, 230, 280, 280, 232, 280, 259, X 280, 240, 280, 280, 241, 280, 242, 280, 244, 280, X 258, 280, 280, 254, 280, 253, 280, 245, 280, 246, X 280, 280, 280, 280, 252, 280, 250, 280, 280, 280, X 249 X } ; X Xstatic short int yy_def[252] = X { 0, X 250, 1, 250, 250, 250, 251, 251, 251, 251, 251, X 251, 251, 251, 251, 251, 251, 250, 251, 251, 251, X 250, 251, 251, 250, 251, 251, 251, 251, 251, 251, X 251, 251, 250, 251, 250, 251, 251, 251, 250, 251, X 251, 250, 251, 251, 251, 251, 251, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 251, 250, 251, 250, X 251, 251, 250, 250, 251, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 251, 250, 251, 250, X 251, 250, 250, 251, 250, 251, 250, 251, 250, 251, X X 250, 251, 250, 251, 250, 251, 250, 251, 250, 250, X 251, 250, 251, 250, 251, 250, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 250, 251, 250, 251, 250, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 250, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 251, 250, 251, 250, 251, 250, 251, 250, 250, X X 251, 250, 251, 250, 251, 250, 251, 250, 251, 250, X 251, 250, 251, 250, 251, 250, 250, 251, 250, 251, X 250, 251, 250, 250, 251, 250, 251, 250, 251, 250, X 251, 250, 250, 251, 250, 251, 250, 251, 250, 251, X 250, 250, 250, 250, 251, 250, 251, 250, 250, 0, X 250 X } ; X Xstatic short int yy_nxt[310] = X { 0, X 4, 5, 6, 6, 7, 6, 6, 6, 6, 8, X 9, 10, 6, 6, 6, 6, 6, 11, 6, 6, X 12, 6, 6, 13, 14, 6, 6, 15, 16, 17, X 21, 19, 17, 17, 24, 20, 17, 17, 17, 33, X 35, 27, 17, 39, 17, 17, 55, 37, 38, 28, X 42, 34, 30, 23, 22, 25, 26, 17, 29, 51, X 36, 31, 17, 49, 53, 32, 41, 56, 58, 40, X 43, 44, 45, 17, 60, 54, 17, 47, 59, 64, X 17, 67, 48, 62, 46, 52, 69, 71, 50, 57, X 73, 75, 79, 77, 68, 65, 61, 66, 81, 83, X X 85, 17, 80, 90, 95, 88, 93, 70, 72, 97, X 86, 99, 107, 82, 74, 101, 94, 103, 76, 78, X 89, 98, 96, 105, 108, 84, 112, 87, 110, 117, X 91, 106, 100, 102, 114, 119, 121, 123, 104, 125, X 111, 113, 127, 129, 120, 131, 115, 133, 135, 124, X 137, 149, 139, 118, 122, 132, 141, 143, 145, 128, X 159, 130, 147, 126, 140, 134, 151, 154, 142, 144, X 156, 161, 136, 163, 148, 138, 146, 150, 152, 155, X 165, 167, 157, 169, 173, 160, 175, 162, 177, 179, X 183, 181, 185, 187, 189, 193, 176, 191, 164, 170, X X 178, 195, 197, 168, 174, 166, 184, 192, 186, 200, X 202, 204, 196, 206, 188, 180, 182, 198, 219, 190, X 208, 194, 210, 212, 214, 221, 217, 224, 207, 226, X 203, 228, 209, 230, 201, 205, 215, 222, 211, 213, X 218, 233, 235, 237, 220, 239, 244, 246, 225, 227, X 18, 249, 234, 248, 243, 242, 229, 238, 231, 241, X 232, 240, 236, 223, 216, 199, 172, 171, 158, 153, X 116, 245, 247, 109, 92, 63, 17, 17, 250, 3, X 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, X 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, X X 250, 250, 250, 250, 250, 250, 250, 250, 250 X } ; X Xstatic short int yy_chk[310] = X { 0, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, X 8, 7, 9, 12, 10, 7, 11, 13, 14, 15, X 16, 12, 19, 22, 20, 23, 31, 19, 20, 12, X 25, 15, 13, 9, 8, 10, 11, 27, 12, 29, X 16, 13, 26, 28, 30, 14, 23, 31, 34, 22, X 25, 26, 26, 32, 36, 30, 37, 27, 34, 40, X 41, 43, 27, 37, 26, 29, 44, 45, 28, 32, X 46, 47, 50, 48, 43, 40, 36, 41, 52, 54, X X 56, 57, 50, 61, 66, 59, 65, 44, 45, 68, X 56, 70, 78, 52, 46, 72, 65, 74, 47, 48, X 59, 68, 66, 76, 78, 54, 84, 57, 82, 89, X 61, 76, 70, 72, 86, 91, 94, 96, 74, 98, X 82, 84, 100, 102, 91, 104, 86, 106, 108, 96, X 111, 124, 113, 89, 94, 104, 115, 118, 120, 100, X 136, 102, 122, 98, 113, 106, 126, 130, 115, 118, X 132, 138, 108, 140, 122, 111, 120, 124, 126, 130, X 142, 144, 132, 146, 152, 136, 155, 138, 157, 160, X 164, 162, 166, 168, 170, 176, 155, 174, 140, 146, X X 157, 178, 180, 144, 152, 142, 164, 174, 166, 184, X 186, 188, 178, 190, 168, 160, 162, 180, 205, 170, X 192, 176, 194, 196, 198, 207, 203, 211, 190, 213, X 186, 215, 192, 218, 184, 188, 198, 207, 194, 196, X 203, 222, 225, 227, 205, 229, 238, 240, 211, 213, X 251, 247, 222, 245, 236, 234, 215, 227, 218, 231, X 220, 229, 225, 209, 201, 182, 150, 148, 134, 128, X 87, 238, 240, 80, 62, 38, 18, 6, 3, 250, X 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, X 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, X X 250, 250, 250, 250, 250, 250, 250, 250, 250 X } ; X X/* the intent behind this definition is that it'll catch X * any uses of REJECT which flex missed X */ X#define REJECT reject_used_but_not_detected X XFILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; X X/* these variables are all declared out here so that section 3 code can X * manipulate them X */ Xstatic char *yy_c_buf_p; /* points to current character in buffer */ Xstatic int yy_init = 1; /* whether we need to initialize */ Xstatic int yy_start = 0; /* start state number */ X X/* true when we've seen an EOF for the current input file */ Xstatic int yy_eof_has_been_seen; X Xstatic int yy_n_chars; /* number of characters read into yy_ch_buf */ X X/* yy_ch_buf has to be 2 characters longer than YY_BUF_SIZE because we need X * to put in 2 end-of-buffer characters (this is explained where it is X * done) at the end of yy_ch_buf X */ Xstatic char yy_ch_buf[YY_BUF_SIZE + 2]; X X/* yy_hold_char holds the character lost when yytext is formed */ Xstatic char yy_hold_char; Xchar *yytext; X Xstatic yy_state_type yy_last_accepting_state; Xstatic char *yy_last_accepting_cpos; X Xstatic yy_state_type yy_get_previous_state(); Xstatic int yy_get_next_buffer(); X Xstatic yyunput(); Xstatic input(); X XYY_DECL X { X register yy_state_type yy_current_state; X register char *yy_cp, *yy_bp; X register int yy_act; X X X X if ( yy_init ) X { X if ( ! yy_start ) X yy_start = 1; /* first start state */ X X if ( ! yyin ) X yyin = stdin; X X if ( ! yyout ) X yyout = stdout; X Xnew_file: X /* this is where we enter upon encountering an end-of-file and X * yywrap() indicating that we should continue processing X */ X X /* we put in the '\n' and start reading from [1] so that an X * initial match-at-newline will be true. X */ X X yy_ch_buf[0] = '\n'; X yy_n_chars = 1; X X /* we always need two end-of-buffer characters. The first causes X * a transition to the end-of-buffer state. The second causes X * a jam in that state. X */ X yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; X yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; X X yy_eof_has_been_seen = 0; X X yytext = yy_c_buf_p = &yy_ch_buf[1]; X yy_hold_char = *yy_c_buf_p; X yy_init = 0; X } X X while ( 1 ) /* loops until end-of-file is reached */ X { X yy_cp = yy_c_buf_p; X X /* support of yytext */ X *yy_cp = yy_hold_char; X X /* yy_bp points to the position in yy_ch_buf of the start of the X * current run. X */ X yy_bp = yy_cp; X X yy_current_state = yy_start; X do X { X register char yy_c = yy_ec[*yy_cp]; X if ( yy_accept[yy_current_state] ) X { X yy_last_accepting_state = yy_current_state; X yy_last_accepting_cpos = yy_cp; X } X while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) X { X yy_current_state = yy_def[yy_current_state]; X if ( yy_current_state >= 251 ) X yy_c = yy_meta[yy_c]; X } X yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; X ++yy_cp; X } X while ( yy_base[yy_current_state] != 280 ); X X /* bogus while loop to let YY_BACK_TRACK and EOB_ACT_LAST_MATCH X * actions branch here without introducing an optimizer-daunting X * goto X */ X while ( 1 ) X { X yy_act = yy_accept[yy_current_state]; X X YY_DO_BEFORE_ACTION; X YY_USER_ACTION; X X#ifdef FLEX_DEBUG X fprintf( stderr, "--accepting rule #%d (\"%s\")\n", X yy_act, yytext ); X#endif X switch ( yy_act ) X { X case 0: /* must backtrack */ X /* undo the effects of YY_DO_BEFORE_ACTION */ X *yy_cp = yy_hold_char; X yy_cp = yy_last_accepting_cpos; X yy_current_state = yy_last_accepting_state; X continue; /* go to "YY_DO_BEFORE_ACTION" */ X Xcase 1: X# line 55 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 2: X# line 56 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 3: X# line 57 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 4: X# line 58 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 5: X# line 59 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 6: X# line 60 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 7: X# line 61 "bibl.l" Xreturn ARTICLE; X YY_BREAK Xcase 8: X# line 62 "bibl.l" Xreturn BOOK; X YY_BREAK Xcase 9: X# line 63 "bibl.l" Xreturn BOOKLET; X YY_BREAK Xcase 10: X# line 64 "bibl.l" Xreturn BOOKLET; X YY_BREAK Xcase 11: X# line 65 "bibl.l" Xreturn BOOKLET; X YY_BREAK Xcase 12: X# line 66 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 13: X# line 67 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 14: X# line 68 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 15: X# line 69 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 16: X# line 70 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 17: X# line 71 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 18: X# line 72 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 19: X# line 73 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 20: X# line 74 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 21: X# line 75 "bibl.l" Xreturn CONFERENCE; X YY_BREAK Xcase 22: X# line 76 "bibl.l" Xreturn INBOOK; X YY_BREAK Xcase 23: X# line 77 "bibl.l" Xreturn INBOOK; X YY_BREAK Xcase 24: X# line 78 "bibl.l" Xreturn INBOOK; X YY_BREAK Xcase 25: X# line 79 "bibl.l" Xreturn INBOOK; X YY_BREAK Xcase 26: X# line 80 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 27: X# line 81 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 28: X# line 82 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 29: X# line 83 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 30: X# line 84 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 31: X# line 85 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 32: X# line 86 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 33: X# line 87 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 34: X# line 88 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 35: X# line 89 "bibl.l" Xreturn INCOLLECTION; X YY_BREAK Xcase 36: X# line 90 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 37: X# line 91 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 38: X# line 92 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 39: X# line 93 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 40: X# line 94 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 41: X# line 95 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 42: X# line 96 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 43: X# line 97 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 44: X# line 98 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 45: X# line 99 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 46: X# line 100 "bibl.l" Xreturn INPROCEEDINGS; X YY_BREAK Xcase 47: X# line 101 "bibl.l" Xreturn MANUAL; X YY_BREAK Xcase 48: X# line 102 "bibl.l" Xreturn MANUAL; X YY_BREAK Xcase 49: X# line 103 "bibl.l" Xreturn MANUAL; X YY_BREAK Xcase 50: X# line 104 "bibl.l" Xreturn MANUAL; X YY_BREAK Xcase 51: X# line 105 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 52: X# line 106 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 53: X# line 107 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 54: X# line 108 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 55: X# line 109 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 56: X# line 110 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 57: X# line 111 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 58: X# line 112 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 59: X# line 113 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 60: X# line 114 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 61: X# line 115 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 62: X# line 116 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 63: X# line 117 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 64: X# line 118 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 65: X# line 119 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 66: X# line 120 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 67: X# line 121 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 68: X# line 122 "bibl.l" Xreturn MASTERSTHESIS; X YY_BREAK Xcase 69: X# line 123 "bibl.l" Xreturn MISC; X YY_BREAK Xcase 70: X# line 124 "bibl.l" Xreturn MISC; X YY_BREAK Xcase 71: X# line 125 "bibl.l" Xreturn MISC; X YY_BREAK Xcase 72: X# line 126 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 73: X# line 127 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 74: X# line 128 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 75: X# line 129 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 76: X# line 130 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 77: X# line 131 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 78: X# line 132 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 79: X# line 133 "bibl.l" Xreturn PHDTHESIS; X YY_BREAK Xcase 80: X# line 134 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 81: X# line 135 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 82: X# line 136 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 83: X# line 137 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 84: X# line 138 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 85: X# line 139 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 86: X# line 140 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 87: X# line 141 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 88: X# line 142 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 89: X# line 143 "bibl.l" Xreturn PROCEEDINGS; X YY_BREAK Xcase 90: X# line 144 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 91: X# line 145 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 92: X# line 146 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 93: X# line 147 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 94: X# line 148 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 95: X# line 149 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 96: X# line 150 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 97: X# line 151 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 98: X# line 152 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 99: X# line 153 "bibl.l" Xreturn TECHREPORT; X YY_BREAK Xcase 100: X# line 154 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 101: X# line 155 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 102: X# line 156 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 103: X# line 157 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 104: X# line 158 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 105: X# line 159 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 106: X# line 160 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 107: X# line 161 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 108: X# line 162 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 109: X# line 163 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 110: X# line 164 "bibl.l" Xreturn UNPUBLISHED; X YY_BREAK Xcase 111: X# line 165 "bibl.l" Xreturn FLD_NULL; X YY_BREAK Xcase 112: X# line 166 "bibl.l" Xreturn FLD_NULL; X YY_BREAK Xcase 113: X# line 167 "bibl.l" Xreturn FLD_EDITOR; X YY_BREAK Xcase 114: X# line 168 "bibl.l" Xreturn FLD_ERROR; X YY_BREAK Xcase 115: X# line 169 "bibl.l" XECHO; X YY_BREAK X X case YY_END_OF_BUFFER: X /* undo the effects of YY_DO_BEFORE_ACTION */ X *yy_cp = yy_hold_char; X X yytext = yy_bp; X X switch ( yy_get_next_buffer() ) X { X case EOB_ACT_END_OF_FILE: X { X if ( yywrap() ) X { X /* note: because we've taken care in X * yy_get_next_buffer() to have set up yytext, X * we can now set up yy_c_buf_p so that if some X * total hoser (like flex itself) wants X * to call the scanner after we return the X * YY_NULL, it'll still work - another YY_NULL X * will get returned. X */ X yy_c_buf_p = yytext; X return ( YY_NULL ); X } X X else X goto new_file; X } X break; X X case EOB_ACT_RESTART_SCAN: X yy_c_buf_p = yytext; X yy_hold_char = *yy_c_buf_p; X break; X X case EOB_ACT_LAST_MATCH: X yy_c_buf_p = &yy_ch_buf[yy_n_chars]; X X yy_current_state = yy_get_previous_state(); X X yy_cp = yy_c_buf_p; X yy_bp = yytext; X continue; /* go to "YY_DO_BEFORE_ACTION" */ X } X break; X X default: X printf( "action # %d\n", yy_act ); X YY_FATAL_ERROR( "fatal flex scanner internal error" ); X } X X break; /* exit bogus while loop */ X } X } X } X X X/* yy_get_next_buffer - try to read in new buffer X * X * synopsis X * int yy_get_next_buffer(); X * X * returns a code representing an action X * EOB_ACT_LAST_MATCH - X * EOB_ACT_RESTART_SCAN - restart the scanner X * EOB_ACT_END_OF_FILE - end of file X */ X Xstatic int yy_get_next_buffer() X X { X if ( yy_c_buf_p != &yy_ch_buf[yy_n_chars + 1] ) X { X YY_FATAL_ERROR( "NULL in input" ); X /*NOTREACHED*/ X } X X else X { /* try to read more data */ X register char *dest = yy_ch_buf; X register char *source = yytext - 1; /* copy prev. char, too */ X register int number_to_move, i; X int ret_val; X X /* first move last chars to start of buffer */ X number_to_move = yy_c_buf_p - yytext; X X for ( i = 0; i < number_to_move; ++i ) X *(dest++) = *(source++); X X if ( yy_eof_has_been_seen ) X /* don't do the read, it's not guaranteed to return an EOF, X * just force an EOF X */ X yy_n_chars = 0; X X else X /* read in more data */ X YY_INPUT( (&yy_ch_buf[number_to_move]), yy_n_chars, X YY_BUF_SIZE - number_to_move - 1 ); X X if ( yy_n_chars == 0 ) X { X if ( number_to_move == 1 ) X ret_val = EOB_ACT_END_OF_FILE; X else X ret_val = EOB_ACT_LAST_MATCH; X X yy_eof_has_been_seen = 1; X } X X else X ret_val = EOB_ACT_RESTART_SCAN; X X yy_n_chars += number_to_move; X yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; X yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; X X /* yytext begins at the second character in X * yy_ch_buf; the first character is the one which X * preceded it before reading in the latest buffer; X * it needs to be kept around in case it's a X * newline, so yy_get_previous_state() will have X * with '^' rules active X */ X X yytext = &yy_ch_buf[1]; X X return ( ret_val ); X } X } X X X/* yy_get_previous_state - get the state just before the EOB char was reached X * X * synopsis X * yy_state_type yy_get_previous_state(); X */ X Xstatic yy_state_type yy_get_previous_state() X X { X register yy_state_type yy_current_state; X register char *yy_cp; X X yy_current_state = yy_start; X X for ( yy_cp = yytext; yy_cp < yy_c_buf_p; ++yy_cp ) X { X register char yy_c = yy_ec[*yy_cp]; X if ( yy_accept[yy_current_state] ) X { X yy_last_accepting_state = yy_current_state; X yy_last_accepting_cpos = yy_cp; X } X while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) X { X yy_current_state = yy_def[yy_current_state]; X if ( yy_current_state >= 251 ) X yy_c = yy_meta[yy_c]; X } X yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; X } X X return ( yy_current_state ); X } X X Xstatic yyunput( c, yy_bp ) Xint c; Xregister char *yy_bp; X X { X register char *yy_cp = yy_c_buf_p; X X *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ X X if ( yy_cp < yy_ch_buf + 2 ) X { /* need to shift things up to make room */ X register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ X register char *dest = &yy_ch_buf[YY_BUF_SIZE + 2]; X register char *source = &yy_ch_buf[number_to_move]; X X while ( source > yy_ch_buf ) X *--dest = *--source; X X yy_cp += dest - source; X yy_bp += dest - source; X X if ( yy_cp < yy_ch_buf + 2 ) X YY_FATAL_ERROR( "flex scanner push-back overflow" ); X } X X if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) X yy_cp[-2] = '\n'; X X *--yy_cp = c; X X YY_DO_BEFORE_ACTION; /* set up yytext again */ X } X X Xstatic int input() X X { X int c; X char *yy_cp = yy_c_buf_p; X X *yy_cp = yy_hold_char; X X if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) X { /* need more input */ X yytext = yy_c_buf_p; X ++yy_c_buf_p; X X switch ( yy_get_next_buffer() ) X { X /* this code, unfortunately, is somewhat redundant with X * that above X */ X case EOB_ACT_END_OF_FILE: X { X if ( yywrap() ) X { X yy_c_buf_p = yytext; X return ( EOF ); X } X X yy_ch_buf[0] = '\n'; X yy_n_chars = 1; X yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; X yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; X yy_eof_has_been_seen = 0; X yytext = yy_c_buf_p = &yy_ch_buf[1]; X yy_hold_char = *yy_c_buf_p; X X return ( input() ); X } X break; X X case EOB_ACT_RESTART_SCAN: X yy_c_buf_p = yytext; X break; X X case EOB_ACT_LAST_MATCH: X YY_FATAL_ERROR( "unexpected last match in input()" ); X } X } X X c = *yy_c_buf_p; X yy_hold_char = *++yy_c_buf_p; X X return ( c ); X } X# line 169 "bibl.l" X X EOFile lex.yy.c chmod u=rw+,g=r++,o=r++ lex.yy.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "lexstrings.lex..." 1>&2 if test -f lexstrings.lex then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile lexstrings.lex' > lexstrings.lex XARTICLE a article XBOOK book book XBOOKLET bookl booklet XCONFERENCE c conference XINBOOK inb inbook XINCOLLECTION inc incollection XINPROCEEDINGS inp inproceedings XMANUAL man manual XMASTERSTHESIS mas mastersthesis XMASTERSTHESIS ms msthesis XMISC mi misc XPHDTHESIS ph phdthesis XPROCEEDINGS pr proceesings XTECHREPORT t techreport XUNPUBLISHED u unpublished EOFile lexstrings.lex chmod u=rw+,g=r++,o=r++ lexstrings.lex echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "lib_bib.c..." 1>&2 if test -f lib_bib.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile lib_bib.c' > lib_bib.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "includes.h" X Xchar *curfile; Xchar **bibflist; Xchar *get_atsign(); X Xchar * Xmy_gets (buffer, size) X/* X * This is an emulation of gets() using fgets.3 X * This routine reads everything upto a newline, using fgets.3 X * X * OUTPUT: Returns buffer on exit, (char *) NULL on error X * The contents of buffer are the input string, a max of (size -1) X * characters are filled on exit, X * The buffer is zeroed and returned on EOF. X * X * This routine only deals with EOF as an error cleanly. On any other X * error returned by fgets.3, this routine will return will return X * (char *) NULL and a partially filled buffer....*sigh* X * X * if EMUL_GETS is turned on, (it probably should, neh? :-) then X * it converts any trailing NEWLINE character ('\n') to a NIL ('\0') X * character, else, it leaves them alone X */ Xchar *buffer; Xint size; X X#ifdef BUFSIZE X#undef BUFSIZE X#endif X#define BUFSIZE 512 X#define EMUL_GETS X X{ Xint sizeleft, cursize; Xchar lbuf[BUFSIZE]; /* These figures are unimportant...leave well alone */ Xchar *foo, *answer; Xint done; X X sizeleft = size - 1; X bzero (buffer, size); X answer = buffer; X done = 0; X X while (done != 1) X { X if (fgets (lbuf, BUFSIZE, stdin) == (char *) NULL) X { X done = 1 /* EOF or ERROR */ ; X answer = (char *) NULL; X } X else if ((foo = Index (lbuf, '\n')) != (char *) NULL) X { /* DONE */ X if (sizeleft > 0) X Strncat (answer, lbuf, sizeleft); X done = 1; X } X else if (sizeleft > 0) X { /* COPY */ X cursize = strlen (lbuf); X if (cursize <= sizeleft) X { X Strncat (answer, lbuf, cursize); X sizeleft -= cursize; X } X else X { X Strncat (answer, lbuf, sizeleft); X sizeleft = 0; X } X } X } X X#ifdef EMUL_GETS X if ((foo = Index (answer, '\n')) != (char *) NULL) X *foo = '\0'; X#endif X return answer; X} X X Xanswer (string, resp) X/* X * Display string, query user....return TRUE if answer = resp X */ Xchar *string; Xchar resp; X X{ Xchar buff[5]; X X Fprintf (stderr, "%s [%c|%c] ", string, YES, NO); X fflush (stderr); X (void) GETS (buff, 5); X return ((*buff == resp) ? TRUE : FALSE ); X} X X Xprocess_bibfiles (files, process_recd, onerror) X/* X * For each file in files, X * delineate_next_record X * process_record (file, record); X * if process_record() indicates error, X * onerror (open_file_descriptor); X * lseek to EOF X * cause exit() X */ Xchar **files; Xint (*process_recd)(), (*onerror)(); X X{ Xchar *delineate_recd(); Xint rdfd1; Xchar buffer[BUFSIZE+2], excess[RECSIZE], wkbuf[BUFSIZE + RECSIZE]; Xint done, cc; Xchar *start, *next; X X done = FALSE; X bibflist = files; X rdfd1 = -1; X X Strcpy (excess, ""); X while (! done) X { X bzero (buffer, sizeof(buffer)); X if ((cc = read (rdfd1, buffer, BUFSIZE)) <=0) X { X if ((rdfd1 = get_next_file (rdfd1)) <= 0) X done = TRUE; X DASSERT (*excess == '\0'); X continue; X } X Strcpy (wkbuf, excess); X Strncat (wkbuf, buffer, cc); X start = wkbuf; X while ((next = delineate_recd (start)) != (char *) NULL) X { X if ((*process_recd) (curfile, start) < 0) X { X (void) lseek (rdfd1, (long) (-1 * Strlen(next)), L_INCR); X if (onerror) X (*onerror) (rdfd1); X (void) lseek (rdfd1, 0L, L_XTND); X next = (char *) NULL; X done = TRUE; /* Abort; go to final cleanup, if any */ X } X start = next; X } X Strcpy (excess, (start ? start : "")); X } X return 0; X} X X Xget_next_file (curfd) X/* X * Close current file descriptor; X * get next bib file from bibflist X * open file, and return new file descriptor; X */ Xint curfd; X X{ Xint retfd; X X close (curfd); X curfile = *bibflist++; X if (! curfile) X retfd = -1; X else if (Strcmp (curfile, "-") == SAME) X retfd = 0 /* stdin */; X else X retfd = open (curfile, O_RDONLY); X X return retfd; X} X X Xchar * Xlcase (string) X/* X * Lower case the given string X */ Xchar *string; X X{ Xchar *str, c; X X for (str = string ; *str; str++) X if (isupper (*str)) X { X c = tolower (*str); /* I dunno, just being paranoid, I guess */ X *str = c; X } X return string; X} X X Xchar * Xreplstr (str) X/* X * replicate the given string. get storage, and return the new string. X */ Xchar *str; X X{ Xchar *temp, *malloc(); X X temp = (char *) malloc ((unsigned) (Strlen (str) + 1)); X Strcpy (temp, str); X return temp; X} X X Xchar * Xdelineate_recd (string) X/* X * Get next record, using '\n@' as a flag per record. X * Match all braces, X * If record found, delineate current record by placing '\0' at end of X * current record, and return address of next record. X * else return (char *) NULL; X */ Xchar *string; X X{ Xchar *atsign, *start, *end; Xchar acount; X X if ((! string) || (! *string)) X return (char *) NULL; X X start = Index (string, '@') + 1; X end = (char *) NULL; X atsign = get_atsign (start); X if (atsign) X *atsign = '\0'; X X acount = strcount (start, OPEN_BRACE); X if (acount && (acount == strcount (start, CLOSE_BRACE))) X { X end = Rindex (start, CLOSE_BRACE) + 1; X *end = '\0'; X if (atsign) X { X *atsign = '@'; X end = atsign; X } X } X else X { X DASSERT (atsign == (char *) NULL); X } X return end; X} X Xstrcount (str, c) X/* X * Count the number of occurences of character 'c' in string "str" X */ Xchar *str; Xchar c; X X{ Xchar *temp; Xint count; X X temp = str; X count = 0; X X while (temp = Index (temp +1, c)) X count++; X X return count; X} X X Xchar * Xget_atsign (str) X/* X * Get an atsign, check if it is preceeded by a newline X * If yes, return value, X * else repeat search X */ Xchar *str; X X{ Xchar *answer; X X answer = str; X while (answer = Index (answer, '@')) X if (*(answer-1) == '\n') X return answer; X else X answer++; X return answer; X} X X X#ifdef NOCASE XREGEXP * Xmy_rcomp (re) X/* X * STRATEGY: lcase the string inplace, and feed to regcomp(), return the X * value returned as is... X */ Xchar *re; X X{ X return regcomp (lcase (re)); X} X X Xmy_rexec (prog, str) Xregexp *prog; X/* X * my_rexec = TRUE, if lcase (copy of str) contains given re X * = FALSE otherwise. X */ Xchar *str; X X{ Xchar *temp; Xint retval; X X temp = (char *) replstr (str); X (void) lcase (temp); X retval = regexec (prog, temp); X free (temp); X return retval; X} X#endif NOCASE X EOFile lib_bib.c chmod u=rw+,g=r++,o=r++ lib_bib.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "misc/..." 1>&2 if test -f misc/ then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile misc/' > misc/ EOFile misc/ chmod otal 36 u=rw+,g=r++,o=r++ u=rw+,g=r++,o=r++ u=rwx,g=r+x,o=r+x u=rw+,g=r++,o=r++ misc/ echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "omega.lex..." 1>&2 if test -f omega.lex then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile omega.lex' > omega.lex X"quit!" return FLD_NULL; X"EOF!" return FLD_NULL; X"EDIT!" return FLD_EDITOR; X[a-zA-Z0-9]*! return FLD_ERROR; X%% X EOFile omega.lex chmod u=rw+,g=r++,o=r++ omega.lex echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "pyr.regexp.a..." 1>&2 if test -f pyr.regexp.a then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile pyr.regexp.a' > pyr.regexp.a X!<arch> Xregexp.o 621975704 1112 198 100644 9213 ` XP` $hpp@p$!0 @@@>P@!" 1@"$1"0A"(",!0@@~p1$1P0@@~h@0p$P@!F"0p,!0 P@@>P@A0"0$0`@@>#@cp$!0 `@@>P@!" 1@"$ApR\!",!0@@~ X|$p 1@@~`p 0 1@@~0@@~\ @ p$w@pA" TS!@" 2 &)p!0 |@@>P@p @p$A" 2 TpA" 2 T&)p$!0!@@>P@p !0!@@>P@PP@P@a0@@~ l#"p p0$0D@@~L @ p$P@S#1QP@"p$R#1Qp 01@@~ X"A" 2 Tp X#p01@@~<p l R&*p$01@@~p@@~`10@@~ 01@@~x0@@~410@@~Tp@@~10@@~8p J R&+p$ X#pp1@@~p = R&+p$0@@~4#0q@@~Pp@@~1@@~80@@~|1p@@~p@@~`10@@~p R&?p$01@@~X0@@~ 10@@~@p@@~#0q@@~ 0q@@~A" R!" 2 T&*p XA" TS!@" 2 0@@~,p BA" 2 T&-p$3A" S!@" R2 &]pA" 2 p$!0-@@~Hp A" B ~`A" 2!ApR p!0!P@@>P@p 0@@~l``p{A" R!" p XA" TS!@" 2 0@@~$A" 2 TpA" 2 T&]p$60@@~pA" 2 T&]p!0!d@@>P@A" S!@" 1#Qp *p1$1Tp@@~v$@ $p$P@ S#1QPp !0!t@@>P@p !0!@@>P@p A" 2 p$!0!@@>P@0@@~$A" R!" 2 0@@~<0@@~01#Qp kA" S!@" p!1!$@@~ "@"p,!0!0@@>P@A" 1r$2 #bp R&*p R&+p R&?p$ b1#Qbp$1#QP0@@~p$p A" R!" 2 0@@~$ b@"p,u0@@~p &p %0p&0$p~[&0(pt&0)p&0*p&0+p&0.p~Q&0?p~&0[p~T&0\p&0^p~;&0|pkp P@P@A ",&P "(p$A"0R!"0P@!R@!aa!aa!a!@",P@P@!"(FP",p A",TS!@",R@p A"0S!@"0P@!"(FP",p$A"0R!"0P@A ",A",S!@",ap a `!P`p,|bR@"ba"ba"bP@&P"(p$P@!p@@~P @ p$p !p x2 RRp$b bp b b0#"@!#"@!P@@p&P"(p2 pP@Ap0q@@~HP@@p@Qp$!0!D@@>P@B\&p!0!T@@>P@A@Tp`p 0A1TA2X@@>@0p$p X`AT2 10@@>@ p$n@ p$P@!@"8B Qp0q@@~$P@`B Ppp X01@@~x@0pPP@`B 1P0@@>@ p$qp XA"42 SpP@ X0@@>'gp X0A1"4 r@@>@0pP@ SD"4!@"4p 6A"42 p XA"42 1App@@>@0p$P@A"4R!"4p !A"42 Tp XA"42 qApp@@>@0pP@A"4S!@"4p p p 2 c#A%"40@@~~0@0pA"<1J4p$A"<Q X9RPP@p P@p t2 d$A&"40@@~}X@0pA"@1JDp$A"@Q XIPP@p P@p ^2 pAp`p A,"4App@@~}l@0pPP@!"4p@@~T!@ap2 RplP@p @"2 p$B "2 Rp$+p kA*"4App@@~d)p pA"42 p$0@@~|(@0pPP@ i1r!"4 Xip(lP@p PP@p !0!h@@>P@p Xp 0pw&0'p,tA0 0!@ap$!0!|@@>P@P@"A "4Ap!2 pp .0@@>" p /p b`2 S2 p{p 'p b`2 p2 1p@@>@0p$wp p b`2 p2 1p@@>@0pwp !0"@@>"p p ppx0p,vA0 0!"4P@P@&P"(p$P@B # B #`@ p$P@2 Sp$@1q4P@p 1rP@P@"!p `p 2 S`2 Sp$P@2 p$wba2 Sp$qP@P@8TXd0,\\444444444 X888NULL argumentregexp too bigout of spacetoo many ()unmatched ()unmatched ()junk on end*+ operand could be emptynested *?+invalid [] rangeunmatched []internal urp?+* follows nothingtrailing \^$.[()|?+*\internal disasterNULL param etercorrupted programmemory corruptioncorrupted pointersinternal foulup X$,4<@ X,< Xhpp`lt X@LDHXpx X$<D XX` X 8 X$@Xpx X ( 0 < X p X X X0 XH XT Xp X X( XD XL X Xx 4Dh X$ X$, X@PX Xx<HTpx X X ( X`(htX $<Xp|4LXt|,DP\l$@\l4D(8t$ XPhp X(x(<D Xht $(,048<@DHLPTX\`dhlptx| $(,04" "$"(!",*"03"4="8E"<P"@YblLrLwlx$-$8lB KVx_`hqxdx X_regparse_regnpar_regdummy_regcode_regsize_reginput_regbol_regstartp_regendp_regcomp_regerror_regc_reg_malloc_regnext_strlen_regnode_regbranch_regtail_regoptail_regpiece_regatom_reginsert_strcspn_regexec_strncmp_index_regtry_regmatch_regrepeat Xregsub.o 621975707 1112 198 100644 667 ` XP `$8@p@Qp@p$!0@@>P@B\&p!0@@>P@`"p H S&&p$$p S&\p$2 &0p2 &9p,`2 d$$Pp d@ $p( S&\p$2 &\p2 &&p$2 !`R@bbp 1JDpAp(1JDTpAp(1 XDc1 XD c01 XD1r@@>b@cp B p$!04@@>P@2 !` Sp$6a"bP@NULL parm to regsubdamaged regexp fed to regsubdamaged match string$DLLlt_regsub_regerror_strncpy Xregerror.o 622057384 1112 198 100644 243 ` XP@ 0 Ap0(!12@@>p@@>P@regexp(3): %s$#_regerror__iob_fprintf_exit EOFile pyr.regexp.a chmod u=rw+,g=r++,o=r++ pyr.regexp.a echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "specl.bst..." 1>&2 if test -f specl.bst then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile specl.bst' > specl.bst X% BibTeX `plain' family X% BibTeX style: spec(ia)l X% specl.bst is a special bst file, which is used for keeping a private X% hardcopy of your bib file. Every bibitem that is generated has the same X% identity as the original \cite-key that is in the bib X% file...ferinstance... X% X% If the bib file contained.. X% X% @BOOK{kn:gnus, X% foo, X% bar, X% baz} X% X% The bibitem record would look as X% X% \bibitem[kn:gnus]{rest of the stuff here} X% X% Hacked/Concieved/Designed by Kannan Varadhan 22/JUN/89 X% email: kannan@cis.ohio-state.edu or ...{backbone}!osu-cis!kannan X% voice: {Res.} (614) 297-8720 | {Off.} (614) 292-8234 or 4-9099 on campus X% snail: Kannan Varadhan 306, W. Lane Ave., # 15, Columbus, OH 43201 X% X% X % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09. X % Copyright (C) 1985, all rights reserved. X % Copying of this file is authorized only if either X % (1) you make absolutely no changes to your copy, including name, or X % (2) if you do make changes, you name it something other than X % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst. X % This restriction helps ensure that all standard styles are identical. X % The file btxbst.doc has the documentation for this style. X X X XENTRY X { address X author X booktitle X chapter X edition X editor X howpublished X institution X journal X key X month X note X number X organization X pages X publisher X school X series X title X type X volume X year X } X {} X { label extra.label sort.label } X XINTEGERS { output.state before.all mid.sentence after.sentence after.block } X XFUNCTION {init.state.consts} X{ #0 'before.all := X #1 'mid.sentence := X #2 'after.sentence := X #3 'after.block := X} X X XSTRINGS { s t } X XFUNCTION {output.nonnull} X{ 's := X output.state mid.sentence = X { ", " * write$ } X { output.state after.block = X { add.period$ write$ X newline$ X "\newblock " write$ X } X { output.state before.all = X 'write$ X { add.period$ " " * write$ } X if$ X } X if$ X mid.sentence 'output.state := X } X if$ X s X} X XFUNCTION {output} X{ duplicate$ empty$ X 'pop$ X 'output.nonnull X if$ X} X XFUNCTION {output.check} X{ 't := X duplicate$ empty$ X { pop$ "empty " t * " in " * cite$ * warning$ } X 'output.nonnull X if$ X} X XFUNCTION {output.bibitem} X{ newline$ X X "\bibitem[" write$ X label write$ X "]{" write$ X X cite$ write$ X "}" write$ X newline$ X "" X before.all 'output.state := X} X X XFUNCTION {fin.entry} X{ add.period$ X write$ X newline$ X} X XFUNCTION {new.block} X{ output.state before.all = X 'skip$ X { after.block 'output.state := } X if$ X} X XFUNCTION {new.sentence} X{ output.state after.block = X 'skip$ X { output.state before.all = X 'skip$ X { after.sentence 'output.state := } X if$ X } X if$ X} X X XFUNCTION {not} X{ { #0 } X { #1 } X if$ X} X XFUNCTION {and} X{ 'skip$ X { pop$ #0 } X if$ X} X XFUNCTION {or} X{ { pop$ #1 } X 'skip$ X if$ X} X X XFUNCTION {new.block.checka} X{ empty$ X 'skip$ X 'new.block X if$ X} X XFUNCTION {new.block.checkb} X{ empty$ X swap$ empty$ X and X 'skip$ X 'new.block X if$ X} X X XFUNCTION {new.sentence.checka} X{ empty$ X 'skip$ X 'new.sentence X if$ X} X XFUNCTION {new.sentence.checkb} X{ empty$ X swap$ empty$ X and X 'skip$ X 'new.sentence X if$ X} X X XFUNCTION {field.or.null} X{ duplicate$ empty$ X { pop$ "" } X 'skip$ X if$ X} X XFUNCTION {emphasize} X{ duplicate$ empty$ X { pop$ "" } X { "{\em " swap$ * "}" * } X if$ X} X XINTEGERS { nameptr namesleft numnames } X XFUNCTION {format.names} X{ 's := X #1 'nameptr := X s num.names$ 'numnames := X numnames 'namesleft := X { namesleft #0 > } X X { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := X X nameptr #1 > X { namesleft #1 > X { ", " * t * } X { numnames #2 > X { "," * } X 'skip$ X if$ X t "others" = X { " et~al." * } X { " and " * t * } X if$ X } X if$ X } X 't X if$ X nameptr #1 + 'nameptr := X namesleft #1 - 'namesleft := X } X while$ X} X XFUNCTION {format.authors} X{ author empty$ X { "" } X { author format.names } X if$ X} X XFUNCTION {format.editors} X{ editor empty$ X { "" } X { editor format.names X editor num.names$ #1 > X { ", editors" * } X { ", editor" * } X if$ X } X if$ X} X X XFUNCTION {format.title} X{ title empty$ X { "" } X X { title "t" change.case$ } X X if$ X} X X X XFUNCTION {n.dashify} X{ 't := X "" X { t empty$ not } X { t #1 #1 substring$ "-" = X { t #1 #2 substring$ "--" = not X { "--" * X t #2 global.max$ substring$ 't := X } X { { t #1 #1 substring$ "-" = } X { "-" * X t #2 global.max$ substring$ 't := X } X while$ X } X if$ X } X { t #1 #1 substring$ * X t #2 global.max$ substring$ 't := X } X if$ X } X while$ X} X X XFUNCTION {format.date} X{ year empty$ X { month empty$ X { "" } X { "there's a month but no year in " cite$ * warning$ X month X } X if$ X } X { month empty$ X 'year X { month " " * year * } X if$ X } X if$ X} X X XFUNCTION {format.btitle} X{ title emphasize X} X X XFUNCTION {tie.or.space.connect} X{ duplicate$ text.length$ #3 < X { "~" } X { " " } X if$ X swap$ * * X} X X XFUNCTION {either.or.check} X{ empty$ X 'pop$ X { "can't use both " swap$ * " fields in " * cite$ * warning$ } X if$ X} X X XFUNCTION {format.bvolume} X{ volume empty$ X { "" } X { "volume" volume tie.or.space.connect X series empty$ X 'skip$ X { " of " * series emphasize * } X if$ X "volume and number" number either.or.check X } X if$ X} X X XFUNCTION {format.number.series} X{ volume empty$ X { number empty$ X { series field.or.null } X { output.state mid.sentence = X { "number" } X { "Number" } X if$ X number tie.or.space.connect X series empty$ X { "there's a number but no series in " cite$ * warning$ } X { " in " * series * } X if$ X } X if$ X } X { "" } X if$ X} X X XFUNCTION {format.edition} X{ edition empty$ X { "" } X { output.state mid.sentence = X { edition "l" change.case$ " edition" * } X { edition "t" change.case$ " edition" * } X if$ X } X if$ X} X X XINTEGERS { multiresult } X XFUNCTION {multi.page.check} X{ 't := X #0 'multiresult := X { multiresult not X t empty$ not X and X } X { t #1 #1 substring$ X duplicate$ "-" = X swap$ duplicate$ "," = X swap$ "+" = X or or X { #1 'multiresult := } X { t #2 global.max$ substring$ 't := } X if$ X } X while$ X multiresult X} X X XFUNCTION {format.pages} X{ pages empty$ X { "" } X { pages multi.page.check X { "pages" pages n.dashify tie.or.space.connect } X { "page" pages tie.or.space.connect } X if$ X } X if$ X} X X XFUNCTION {format.vol.num.pages} X{ volume field.or.null X number empty$ X 'skip$ X { "(" number * ")" * * X volume empty$ X { "there's a number but no volume in " cite$ * warning$ } X 'skip$ X if$ X } X if$ X pages empty$ X 'skip$ X { duplicate$ empty$ X { pop$ format.pages } X { ":" * pages n.dashify * } X if$ X } X if$ X} X X X XFUNCTION {format.chapter.pages} X{ chapter empty$ X 'format.pages X { type empty$ X { "chapter" } X { type "l" change.case$ } X if$ X chapter tie.or.space.connect X pages empty$ X 'skip$ X { ", " * format.pages * } X if$ X } X if$ X} X X XFUNCTION {format.in.ed.booktitle} X{ booktitle empty$ X { "" } X { editor empty$ X { "In " booktitle emphasize * } X { "In " format.editors * ", " * booktitle emphasize * } X if$ X } X if$ X} X X XFUNCTION {empty.misc.check} X{ author empty$ title empty$ howpublished empty$ X month empty$ year empty$ note empty$ X and and and and and X X key empty$ not and X X { "all relevant fields are empty in " cite$ * warning$ } X 'skip$ X if$ X} X X XFUNCTION {format.thesis.type} X{ type empty$ X 'skip$ X { pop$ X type "t" change.case$ X } X if$ X} X X XFUNCTION {format.tr.number} X{ type empty$ X { "Technical Report" } X 'type X if$ X number empty$ X { "t" change.case$ } X { number tie.or.space.connect } X if$ X} X X XFUNCTION {format.article.crossref} X{ key empty$ X { journal empty$ X { "need key or journal for " cite$ * " to crossref " * crossref * X warning$ X "" X } X { "In {\em " journal * "\/}" * } X if$ X } X { "In " key * } X if$ X " \cite{" * crossref * "}" * X} X X XFUNCTION {format.crossref.editor} X{ editor #1 "{vv~}{ll}" format.name$ X editor num.names$ duplicate$ X #2 > X { pop$ " et~al." * } X { #2 < X 'skip$ X { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = X { " et~al." * } X { " and " * editor #2 "{vv~}{ll}" format.name$ * } X if$ X } X if$ X } X if$ X} X X XFUNCTION {format.book.crossref} X{ volume empty$ X { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ X "In " X } X { "Volume" volume tie.or.space.connect X " of " * X } X if$ X editor empty$ X editor field.or.null author field.or.null = X or X { key empty$ X { series empty$ X { "need editor, key, or series for " cite$ * " to crossref " * X crossref * warning$ X "" * X } X { "{\em " * series * "\/}" * } X if$ X } X { key * } X if$ X } X { format.crossref.editor * } X if$ X " \cite{" * crossref * "}" * X} X X XFUNCTION {format.incoll.inproc.crossref} X{ editor empty$ X editor field.or.null author field.or.null = X or X { key empty$ X { booktitle empty$ X { "need editor, key, or booktitle for " cite$ * " to crossref " * X crossref * warning$ X "" X } X { "In {\em " booktitle * "\/}" * } X if$ X } X { "In " key * } X if$ X } X { "In " format.crossref.editor * } X if$ X " \cite{" * crossref * "}" * X} X X XFUNCTION {article} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X crossref missing$ X { journal emphasize "journal" output.check X format.vol.num.pages output X format.date "year" output.check X } X { format.article.crossref output.nonnull X format.pages output X } X if$ X new.block X note output X fin.entry X} X XFUNCTION {book} X{ output.bibitem X author empty$ X { format.editors "author and editor" output.check } X { format.authors output.nonnull X crossref missing$ X { "author and editor" editor either.or.check } X 'skip$ X if$ X } X if$ X new.block X format.btitle "title" output.check X crossref missing$ X { format.bvolume output X new.block X format.number.series output X new.sentence X publisher "publisher" output.check X address output X } X { new.block X format.book.crossref output.nonnull X } X if$ X format.edition output X format.date "year" output.check X new.block X note output X fin.entry X} X X XFUNCTION {booklet} X{ output.bibitem X format.authors output X new.block X format.title "title" output.check X howpublished address new.block.checkb X howpublished output X address output X format.date output X new.block X note output X fin.entry X} X X X XFUNCTION {inbook} X{ output.bibitem X author empty$ X { format.editors "author and editor" output.check } X { format.authors output.nonnull X crossref missing$ X { "author and editor" editor either.or.check } X 'skip$ X if$ X } X if$ X new.block X format.btitle "title" output.check X crossref missing$ X { format.bvolume output X format.chapter.pages "chapter and pages" output.check X new.block X format.number.series output X new.sentence X publisher "publisher" output.check X address output X } X { format.chapter.pages "chapter and pages" output.check X new.block X format.book.crossref output.nonnull X } X if$ X format.edition output X format.date "year" output.check X new.block X note output X fin.entry X} X X XFUNCTION {incollection} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X crossref missing$ X { format.in.ed.booktitle "booktitle" output.check X format.bvolume output X format.number.series output X format.chapter.pages output X new.sentence X publisher "publisher" output.check X address output X format.edition output X format.date "year" output.check X } X { format.incoll.inproc.crossref output.nonnull X format.chapter.pages output X } X if$ X new.block X note output X fin.entry X} X X XFUNCTION {inproceedings} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X crossref missing$ X { format.in.ed.booktitle "booktitle" output.check X format.bvolume output X format.number.series output X format.pages output X address empty$ X { organization publisher new.sentence.checkb X organization output X publisher output X format.date "year" output.check X } X { address output.nonnull X format.date "year" output.check X new.sentence X organization output X publisher output X } X if$ X } X { format.incoll.inproc.crossref output.nonnull X format.pages output X } X if$ X new.block X note output X fin.entry X} X X XFUNCTION {conference} { inproceedings } X X XFUNCTION {manual} X{ output.bibitem X author empty$ X { organization empty$ X 'skip$ X { organization output.nonnull X address output X } X if$ X } X { format.authors output.nonnull } X if$ X new.block X format.btitle "title" output.check X author empty$ X { organization empty$ X { address new.block.checka X address output X } X 'skip$ X if$ X } X { organization address new.block.checkb X organization output X address output X } X if$ X format.edition output X format.date output X new.block X note output X fin.entry X} X X XFUNCTION {mastersthesis} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X "Master's thesis" format.thesis.type output.nonnull X school "school" output.check X address output X format.date "year" output.check X new.block X note output X fin.entry X} X X XFUNCTION {misc} X{ output.bibitem X format.authors output X title howpublished new.block.checkb X format.title output X howpublished new.block.checka X howpublished output X format.date output X new.block X note output X fin.entry X empty.misc.check X} X X XFUNCTION {phdthesis} X{ output.bibitem X format.authors "author" output.check X new.block X format.btitle "title" output.check X new.block X "PhD thesis" format.thesis.type output.nonnull X school "school" output.check X address output X format.date "year" output.check X new.block X note output X fin.entry X} X X XFUNCTION {proceedings} X{ output.bibitem X editor empty$ X { organization output } X { format.editors output.nonnull } X if$ X new.block X format.btitle "title" output.check X format.bvolume output X format.number.series output X address empty$ X { editor empty$ X { publisher new.sentence.checka } X { organization publisher new.sentence.checkb X organization output X } X if$ X publisher output X format.date "year" output.check X } X { address output.nonnull X format.date "year" output.check X new.sentence X editor empty$ X 'skip$ X { organization output } X if$ X publisher output X } X if$ X new.block X note output X fin.entry X} X X XFUNCTION {techreport} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X format.tr.number output.nonnull X institution "institution" output.check X address output X format.date "year" output.check X new.block X note output X fin.entry X} X X XFUNCTION {unpublished} X{ output.bibitem X format.authors "author" output.check X new.block X format.title "title" output.check X new.block X note "note" output.check X format.date output X fin.entry X} X X XFUNCTION {default.type} { misc } X X X X XMACRO {jan} {"January"} X XMACRO {feb} {"February"} X XMACRO {mar} {"March"} X XMACRO {apr} {"April"} X XMACRO {may} {"May"} X XMACRO {jun} {"June"} X XMACRO {jul} {"July"} X XMACRO {aug} {"August"} X XMACRO {sep} {"September"} X XMACRO {oct} {"October"} X XMACRO {nov} {"November"} X XMACRO {dec} {"December"} X X X X X X XMACRO {acmcs} {"ACM Computing Surveys"} X XMACRO {acta} {"Acta Informatica"} X XMACRO {cacm} {"Communications of the ACM"} X XMACRO {ibmjrd} {"IBM Journal of Research and Development"} X XMACRO {ibmsj} {"IBM Systems Journal"} X XMACRO {ieeese} {"IEEE Transactions on Software Engineering"} X XMACRO {ieeetc} {"IEEE Transactions on Computers"} X XMACRO {ieeetcad} X {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} X XMACRO {ipl} {"Information Processing Letters"} X XMACRO {jacm} {"Journal of the ACM"} X XMACRO {jcss} {"Journal of Computer and System Sciences"} X XMACRO {scp} {"Science of Computer Programming"} X XMACRO {sicomp} {"SIAM Journal on Computing"} X XMACRO {tocs} {"ACM Transactions on Computer Systems"} X XMACRO {tods} {"ACM Transactions on Database Systems"} X XMACRO {tog} {"ACM Transactions on Graphics"} X XMACRO {toms} {"ACM Transactions on Mathematical Software"} X XMACRO {toois} {"ACM Transactions on Office Information Systems"} X XMACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} X XMACRO {tcs} {"Theoretical Computer Science"} X X X X XREAD X X X X XFUNCTION {sortify} X{ purify$ X "l" change.case$ X} X XINTEGERS { len } X XFUNCTION {chop.word} X{ 's := X 'len := X s #1 len substring$ = X { s len #1 + global.max$ substring$ } X 's X if$ X} X X X X X X XINTEGERS { et.al.char.used } X XFUNCTION {initialize.et.al.char.used} X{ #0 'et.al.char.used := X} X XEXECUTE {initialize.et.al.char.used} X XFUNCTION {format.lab.names} X{ 's := X s num.names$ 'numnames := X numnames #1 > X { numnames #4 > X { #3 'namesleft := } X { numnames 'namesleft := } X if$ X #1 'nameptr := X "" X { namesleft #0 > } X { nameptr numnames = X { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = X { "{\etalchar{+}}" * X #1 'et.al.char.used := X } X { s nameptr "{v{}}{l{}}" format.name$ * } X if$ X } X { s nameptr "{v{}}{l{}}" format.name$ * } X if$ X nameptr #1 + 'nameptr := X namesleft #1 - 'namesleft := X } X while$ X numnames #4 > X { "{\etalchar{+}}" * X #1 'et.al.char.used := X } X 'skip$ X if$ X } X { s #1 "{v{}}{l{}}" format.name$ X duplicate$ text.length$ #2 < X { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } X 'skip$ X if$ X } X if$ X} X XFUNCTION {author.key.label} X{ author empty$ X { key empty$ X X { cite$ #1 #3 substring$ } X X { key #3 text.prefix$ } X if$ X } X { author format.lab.names } X if$ X} X XFUNCTION {author.editor.key.label} X{ author empty$ X { editor empty$ X { key empty$ X X { cite$ #1 #3 substring$ } X X { key #3 text.prefix$ } X if$ X } X { editor format.lab.names } X if$ X } X { author format.lab.names } X if$ X} X XFUNCTION {author.key.organization.label} X{ author empty$ X { key empty$ X { organization empty$ X X { cite$ #1 #3 substring$ } X X { "The " #4 organization chop.word #3 text.prefix$ } X if$ X } X { key #3 text.prefix$ } X if$ X } X { author format.lab.names } X if$ X} X XFUNCTION {editor.key.organization.label} X{ editor empty$ X { key empty$ X { organization empty$ X X { cite$ #1 #3 substring$ } X X { "The " #4 organization chop.word #3 text.prefix$ } X if$ X } X { key #3 text.prefix$ } X if$ X } X { editor format.lab.names } X if$ X} X XFUNCTION {calc.label} X{ X X cite$ cite$ X X 'label := X year field.or.null purify$ #-1 #4 substring$ X * X sortify 'sort.label := X} X X X X X X X X X XFUNCTION {sort.format.names} X{ 's := X #1 'nameptr := X "" X s num.names$ 'numnames := X numnames 'namesleft := X { namesleft #0 > } X { nameptr #1 > X { " " * } X 'skip$ X if$ X X s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := X X nameptr numnames = t "others" = and X { "et al" * } X { t sortify * } X if$ X nameptr #1 + 'nameptr := X namesleft #1 - 'namesleft := X } X while$ X} X X XFUNCTION {sort.format.title} X{ 't := X "A " #2 X "An " #3 X "The " #4 t chop.word X chop.word X chop.word X sortify X #1 global.max$ substring$ X} X X XFUNCTION {author.sort} X{ author empty$ X { key empty$ X { "to sort, need author or key in " cite$ * warning$ X "" X } X { key sortify } X if$ X } X { author sort.format.names } X if$ X} X XFUNCTION {author.editor.sort} X{ author empty$ X { editor empty$ X { key empty$ X { "to sort, need author, editor, or key in " cite$ * warning$ X "" X } X { key sortify } X if$ X } X { editor sort.format.names } X if$ X } X { author sort.format.names } X if$ X} X XFUNCTION {author.organization.sort} X{ author empty$ X { organization empty$ X { key empty$ X { "to sort, need author, organization, or key in " cite$ * warning$ X "" X } X { key sortify } X if$ X } X { "The " #4 organization chop.word sortify } X if$ X } X { author sort.format.names } X if$ X} X XFUNCTION {editor.organization.sort} X{ editor empty$ X { organization empty$ X { key empty$ X { "to sort, need editor, organization, or key in " cite$ * warning$ X "" X } X { key sortify } X if$ X } X { "The " #4 organization chop.word sortify } X if$ X } X { editor sort.format.names } X if$ X} X X XFUNCTION {presort} X X{ calc.label X sort.label X " " X * X type$ "book" = X X type$ "inbook" = X or X 'author.editor.sort X { type$ "proceedings" = X 'editor.organization.sort X { type$ "manual" = X 'author.organization.sort X 'author.sort X if$ X } X if$ X } X if$ X X * X X " " X * X year field.or.null sortify X * X " " X * X title field.or.null X sort.format.title X * X #1 entry.max$ substring$ X 'sort.key$ := X} X XITERATE {presort} X X XSORT X X X X X X X X XSTRINGS { longest.label last.sort.label next.extra } X XINTEGERS { longest.label.width last.extra.num } X XFUNCTION {initialize.longest.label} X{ "" 'longest.label := X #0 int.to.chr$ 'last.sort.label := X "" 'next.extra := X #0 'longest.label.width := X #0 'last.extra.num := X} X XFUNCTION {forward.pass} X{ last.sort.label sort.label = X { last.extra.num #1 + 'last.extra.num := X last.extra.num int.to.chr$ 'extra.label := X } X { "a" chr.to.int$ 'last.extra.num := X "" 'extra.label := X sort.label 'last.sort.label := X } X if$ X} X XFUNCTION {reverse.pass} X{ next.extra "b" = X { "a" 'extra.label := } X 'skip$ X if$ X label extra.label * 'label := X label width$ longest.label.width > X { label 'longest.label := X label width$ 'longest.label.width := X } X 'skip$ X if$ X extra.label 'next.extra := X} X XEXECUTE {initialize.longest.label} X XITERATE {forward.pass} X XREVERSE {reverse.pass} X X X X X X XFUNCTION {begin.bib} X X{ et.al.char.used X { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ } X 'skip$ X if$ X preamble$ empty$ X X 'skip$ X { preamble$ write$ newline$ } X if$ X "\begin{thebibliography}{" longest.label * "}" * write$ newline$ X} X XEXECUTE {begin.bib} X XEXECUTE {init.state.consts} X X XITERATE {call.type$} X X XFUNCTION {end.bib} X{ newline$ X "\end{thebibliography}" write$ newline$ X} X XEXECUTE {end.bib} EOFile specl.bst chmod u=rw+,g=r++,o=r++ specl.bst echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "strings.h..." 1>&2 if test -f strings.h then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile strings.h' > strings.h X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include <strings.h> X X#define Index (char *) index X#define Rindex (char *) rindex X#define Strcpy (void *) strcpy X#define Strncpy (void *) strncpy X#define Strcat (void *) strcat X#define Strncat (void *) strncat X#define Strcmp (int) strcmp X#define Strlen (int) strlen X X#define Sprintf (void) sprintf X#define Fprintf (void) fprintf EOFile strings.h chmod u=rw+,g=r++,o=r++ strings.h echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "sun.regexp.a..." 1>&2 if test -f sun.regexp.a then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile sun.regexp.a' > sun.regexp.a X!<arch> X__.SYMDEF 628639319 1112 198 100644 76 ` X J>$_regexec_regcomp_regsub_regerrorregexp.o 628639016 1112 198 100644 6781 ` X0@$hpNVlHW8J.fHy0ajXOp`\#np~#GtB9#|x|HxN9 HXOHn|B'N9POJg9mHy>a XOp`| 9~\P/apXO*@J XfR-Q.gFK~`4f"Hla~:XO0mGlHla~&XO.HTN94XO(@JfH+KR+GV XtmHyZa~PXOp`F.9tR9t rP/N9 XO*@`MHn|N9 XXO(@Jg J XXO(@Jfp`lHTHUN9 BPO.f nr~C n.r@ yp|g,J.g ~P`p/N9 XO&@HSHUN9 BPO(M`HSHTN9 XPOHTN94XO(@JfdJ.g$ ypR9p)gHyfa}LXOp`BJ.f: ypJg0 yp)fHysa}XOp`Hya}XOp` XN9 t`B*fdHUHxN9 tPOHxN9 XO/HUN9 XPOHUHUN9 XPOHxN9 XO/HUN9 BPOHx N9 XO/HUN9 B`X+f.gHUHxN9 t`:+fbHxN9 XO(@HTHUN9 BPOHUHxN9 XO/N9 BPOHxN9 XO/HTN9 BPOHx N9 XO/HUN9 B`P?fLHUHxN9 tPOHxN9 XO/HUN9 BPOHx N9 XO(@HTHUN9 BPOHTHUN9 XPOR9p yp*g yp+g yp?fHy&azFXOp` XOp` yp0xr>o*g+g?fS n| XBBSJnv .~[P/N9@XOJg n . n!y(p`pLn0tN^NuNVhHW0`*n`HUN94XO-@|I@~'0bj0; XN{,PdtR~26 2~~`````````:::::::::`vvvvvvvvv 909g X` yJgz` yJgR9``Im y0ffHTasnXO.|>o//9HTasTOoJf:_9` yJg$ yI@/HmasPOJf.` yJgx yI@/HmarrPOJfZR9`8`4`0I@~.(y/.|a~~XOJg( yJ0|f X y!|p`I@~.(y/.|a~BXOJgl yJ0|f X y!|p`R n|gAm-H|`"(yHma}zXOJfP#LHUN94XO*@J Xfp`p*(yHmN9~XO,<mLJg X y>f/.|a}XOJf\SAth#H`PHy:`*n|J XN{(FddHUaqBXO.[G`X0fRRR ZPf@"@*@0P>@D@R@d@z@@@B@`@n@~@@@"@.@4PF@P@\@bPn@tP@,@8@H@@ @@<@P@@ XP>@T@`@l@x@@@@(@F@Z@h@v@@@@$@0@D@P@\@h@v@@ @@@(@4@:P`@j@,@>@P@f@v@@@@$@>@L@X@^@j@t@@@P*@8@@@F@R@Z@h@p@|@P@N@TPb@hPv@@P@"@(@4@>@R@X@^@d@p@vP@@@L@R@^@n@ @ @ &@ 8@ N@ R@ Z@ d@ l@ ~@ @ @ @ @ @ L@ `@ X*@ Xh@ XnP X@ XP X.P XJ P X\@ Xl@ P@.@X@`@n@@*@T@D@J@X@h@t@@P$@,P<@F@R@b Pr@~@ @ @>Pd P P@P$@B@L @(|1p;DI~T[ Bd Hj Xuxt XN| t%.7.APJT^fnv X4_regtry_regnode_regmatch_strncmp_regcode_regparse_regsize_reg_regrepeat_index_regtail_regc_regoptail_regdummy_regnpar_regexec_strcspn_reginsert_regcomp_regendp_regpiece_regatom_regerror_reginput_regbol_malloc_strlen_regbranch_regstartp_regnext Xregsub.o 628639027 1112 198 100644 439 ` XdH$(NVlHW0`J.gJ.gJ.f XHyd` np(Zg XHyx`*n(n`\f\g&fGfnB``0m\9nVI@|0,mJ`| nJ0lgRJ0l(gL*0l(0l//0lHTaZOoYEJg,J,f&Hya>XOLn0`lN^Nu&g*\g `jNULL parm to regsubdamaged regexp fed to regsubdamaged match string@8@&P<@BP Xregerror.o 628639273 1112 198 100644 219 ` X80 NV_|HW/.Hy8Hy(a`OoHxaRXON^Nuregexp(3): %s@P P.P X#_exit_fprintf_regerror__iob EOFile sun.regexp.a chmod u=rw+,g=r++,o=r++ sun.regexp.a echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "templates.c..." 1>&2 if test -f templates.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile templates.c' > templates.c X/* X * This program has been written by Kannan Varadhan. You are welcome to X * use, copy, modify, or circulate as you please, provided you do not X * charge any fee for any of it, and you do not remove these header X * comments from any of these files. X * X * -- kva Mon Dec 4 11:26:37 EST 1989 X */ X X#include "bibc.h" X Xint i; X#define GET_USR_DEFNS \ X for (i = 0; i != usr_defns_ctr; i++) \ X GET (&bibitem, usr_defns[i], OPTIONAL) X Xget_article () X X{ X SET (&bibitem, rectype, "ARTICLE"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, journal, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, volume, OPTIONAL); X GET (&bibitem, number, OPTIONAL); X GET (&bibitem, pages, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X Xget_book () X X{ X SET (&bibitem, rectype, "BOOK"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, publisher, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, volume, OPTIONAL); X GET (&bibitem, series, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, edition, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X Xget_booklet () X X{ X SET (&bibitem, rectype, "BOOKLET"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, author, OPTIONAL); X GET (&bibitem, howpublished, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, year, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_inproceedings () X X{ X SET (&bibitem, rectype, "INPROCEEDINGS"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, booktitle, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, editor, OPTIONAL); X GET (&bibitem, pages, OPTIONAL); X GET (&bibitem, organisation, OPTIONAL); X GET (&bibitem, publisher, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_inbook () X X{ X SET (&bibitem, rectype, "INBOOK"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, chapter, REQUIRED); X GET (&bibitem, pages, OPTIONAL); X GET (&bibitem, publisher, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, volume, OPTIONAL); X GET (&bibitem, series, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, edition, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_incollection () X X{ X SET (&bibitem, rectype, "INCOLLECTION"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, booktitle, REQUIRED); X GET (&bibitem, publisher, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, editor, OPTIONAL); X GET (&bibitem, chapter, OPTIONAL); X GET (&bibitem, pages, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_manual () X X{ X SET (&bibitem, rectype, "MANUAL"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, author, OPTIONAL); X GET (&bibitem, organisation, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, edition, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_mastersthesis () X X{ X SET (&bibitem, rectype, "MASTERSTHESIS"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, school, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_misc () X X{ X SET (&bibitem, rectype, "MISC"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, OPTIONAL); X GET (&bibitem, title, OPTIONAL); X GET (&bibitem, howpublished, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, year, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_phdthesis () X X{ X SET (&bibitem, rectype, "PHDTHESIS"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, school, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_proceedings () X X{ X SET (&bibitem, rectype, "PROCEEDINGS"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, editor, OPTIONAL); X GET (&bibitem, publisher, OPTIONAL); X GET (&bibitem, organisation, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_techreport () X X{ X SET (&bibitem, rectype, "TECHREPORT"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, institution, REQUIRED); X GET (&bibitem, year, REQUIRED); X GET (&bibitem, type, OPTIONAL); X GET (&bibitem, number, OPTIONAL); X GET (&bibitem, address, OPTIONAL); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, note, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} X X Xget_unpublished () X X{ X SET (&bibitem, rectype, "UNPUBLISHED"); X GET (&bibitem, citekey, REQUIRED); X GET (&bibitem, author, REQUIRED); X GET (&bibitem, title, REQUIRED); X GET (&bibitem, note, REQUIRED); X GET (&bibitem, month, OPTIONAL); X GET (&bibitem, year, OPTIONAL); X GET (&bibitem, key, OPTIONAL); X GET (&bibitem, comment, OPTIONAL); X GET (&bibitem, cross_ref, OPTIONAL); X GET_USR_DEFNS; X return 0; X} EOFile templates.c chmod u=rw+,g=rw+,o=r++ templates.c echo '...done' 1>&2 if [ ! -d . ] ; then echo -n Directory . not found. Creating.... mkdir . if [ ! -d . ] ; then echo ...failed echo unable to create directory .. Please create the directory and try again exit fi echo ...done fi echo -n "typescript..." 1>&2 if test -f typescript then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile typescript' > typescript XScript started on Sun Dec 3 00:47:28 1989 Xcheops Bibcreate. bibc -help XUsage: bibc [-i|-verify] [+|-verbose] [+|-pester] [-file <filename>] [-help] X -i Inquire whether to commit a record X -verify Same as above, a duplicate form X -verbose Turn off verbose flag X +verbose Turn on verbose flag X -pester Do not insist, even for required fields X +pester Insist once for required fields X -file <filename> Output bib entries to <filename> X -help Print this help output Xcheops Bibcreate. bibc -file foo.bib XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit Xinb XCITEKEY? NAR88 XAUTHOR? Narayan, R. K. XTITLE? A Writer's Nightmare XCHAPTER? XERROR: CHAPTER is a REQUIRED FIELD for INBOOK. Let's try that again...sigh... XCHAPTER? XERROR: Frankly my dear, I don't give a damn... XPAGES (optional)? 164--166 XPUBLISHER? Penguin Books XYEAR? 1988 XVOLUME (optional)? 1 XSERIES (optional)? XADDRESS (optional)? XEDITION (optional)? XMONTH (optional)? XNOTE (optional)? XKEY (optional)? ? XUsed for alphabetising and creating a label when the author and X editor fields are missing. XKEY (optional)? XCOMMENT (optional)? XCROSS-REFERENCE (optional)? X@INBOOK { NAR88 , X AUTHOR = "Narayan, R. K." , X PAGES = "164--166" , X PUBLISHER = "Penguin Books" , X TITLE = "A Writer's Nightmare" , X VOLUME = "1" , X YEAR = "1988" X } X XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit Xin XUh oh! no no no XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit Xmi XCITEKEY? xx XAbort? [y|n] y XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X^D Xcheops Bibcreate. BIBCINIT="USR_FIELD1:USR_FIELD2?Bah Humbug" export BIBCINIT Xcheops Bibcreate. bibc -file foo.bib XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit Xa XCITEKEY? LAM78 XAUTHOR? Lamport, Leslie XTITLE? Time, Clocks, and the Ordering of Events in a Distributed System XJOURNAL? \jacm XYEAR? 1978 XVOLUME (optional)? 21 XNUMBER (optional)? 7 XPAGES (optional)? 558--565 XMONTH (optional)? \jul XNOTE (optional)? XKEY (optional)? XCOMMENT (optional)? XCROSS-REFERENCE (optional)? XUSR_FIELD1 (optional)? ? XYou asked for it, buster, so you figure it out... XUSR_FIELD1 (optional)? This wasn't in the jacm, sigh XUSR_FIELD2 (optional)? ? XBah Humbug XUSR_FIELD2 (optional)? There we go, it was in the cacm, so we can EDIT and change the entry X@ARTICLE { LAM78 , X AUTHOR = "Lamport, Leslie" , X JOURNAL = jacm , X MONTH = jul , X NUMBER = "7" , X PAGES = "558--565" , X TITLE = "Time, Clocks, and the Ordering of Events in a Distributed System" , X VOLUME = "21" , X YEAR = "1978" , X USR_FIELD1 = "This wasn't in the jacm, sigh" , X USR_FIELD2 = "There we go, it was in the cacm, so we can EDIT and change the entry" X } X XWhat kind of record would you like to enter (one of the following)? X article book booklet conference X inbook incollection inproceedings manual X mastersthesis msthesis misc phdthesis X proceedings techreport unpublished Xor EDIT quit X^D Xcheops Bibcreate. shbib lam78 foo.bib X@ARTICLE { LAM78 , X AUTHOR = "Lamport, Leslie" , X JOURNAL = jacm , X MONTH = jul , X NUMBER = "7" , X PAGES = "558--565" , X TITLE = "Time, Clocks, and the Ordering of Events in a Distributed System" , X VOLUME = "21" , X YEAR = "1978" , X USR_FIELD1 = "This wasn't in the jacm, sigh" , X USR_FIELD2 = "There we go, it was in the cacm, so we can EDIT and change the entry" X } Xcheops Bibcreate. X Xscript done on Sun Dec 3 00:57:11 1989 EOFile typescript chmod u=rw+,g=r++,o=r++ typescript echo '...done' 1>&2 if [ ! -d misc ] ; then echo -n Directory misc not found. Creating.... mkdir misc if [ ! -d misc ] ; then echo ...failed echo unable to create directory misc. Please create the directory and try again exit fi echo ...done fi echo -n "misc/Changes..." 1>&2 if test -f misc/Changes then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile misc/Changes' > misc/Changes XWed Jul 19 11:32:35 EDT 1989 X Xbibc now deals with prefixed blanks correct;y...sigh! What a stupid Xmiskate... X Xbibc now understands that some fields should not be quoted, as these Xare macros. This it figures, when the field is preceeded by a XBACKSLASH, as ferinstance.... X XJournal? \jacm X Xgets written out as X X JOURNAL = jacm X Xinstead of X X JOURNAL = "jacm" or JOURNAL = "\jacm" X Xearlier. X XThu Jul 20 08:26:44 EDT 1989 X XIntroduced a -pester flag, to quieten bibc's insistence about required Xfields, and toggle appropriately from the command line. X XFri Jul 21 11:28:47 EDT 1989 X Xbibv changed considerably, because it also accepts fields like... X X From: Armin Liebl <liebla%lan.informatik.tu-muenchen.dbp.de@RELAY.CS.NET> X Date: 20 Jul 89 14:09:00 B X X > 4.) Your bibv-tool creates entries like X > \nocite{osr=ACMOperatingSystemsReview} X > if I have an entry X > @STRING{osr="ACM Operating Systems Review"} X ack! You are right! :-) I didn't realise this earlier. Maybe, I'll just X chuck the sed expression in bibv, and put in a "\nocite{*}" there. X hmmmmmmmm......yeah, why not? Thanks, I'll do this rightaway... X XSat Jul 22 15:05:11 EDT 1989 X Xbibc now allows users to define their own fileds in addition to standard Xpredefined ones. The format of this is similiar to the MAILPATH Xvariable used by the korn shell... X/* X * Now that the standard fields are defined, see if the user would like X * to define specific fields for themselves. Such fields are specified X * by the user in tthe BIBCINIT environment variables. The format of X * his variable shall be similiar to the MAILPATH variable used by the X * korn shell, as.... X * <fieldname>?<optional help string> X * multiple fields shall be separated by <COLON>s, ':' X * A maximum of USR_DEFNS_MAX is taken.... X */ X From: Armin Liebl <liebla%lan.informatik.tu-muenchen.dbp.de@RELAY.CS.NET> X Date: 20 Jul 89 14:09:00 B X X > 3.) A good feature that I miss (or that I didn't discover) X > would be to allow the user to specify additional X > fields (I for example use the additional field "key" X > in my records). X I put in one such abitrary field, and called it "COMMENT". I have to X work out how to put in such fields. It isn't too difficult, just that I X haven't bothered. I'll look into it. X XSat Jul 22 16:51:49 EDT 1989 X XThe lex file, bibc.l is now generated automatically by gen_lex_file Xusing prologue.lex, lexstrings.lex and postscript.lex! This just made Xmy life a wee bit easier...;-). X XWith this, all valid prefixes are accepted by lex, ie, Xa, ar, art, .. etc.. are valid keys for article..... X XAlso, msthesis is now a valid input for mastersthesis, which too is Xaccepted... X XSat Sep 16 23:15:59 EDT 1989 X XGuess what, a replacement for gets.3 calls. All gets() calls are now Xreplaced by my_gets() in gets.c, which uses fgets() to get whole lines, Xpiecemeal, and return nil terminated strings chopped to size available. EOFile misc/Changes chmod u=rw+,g=r++,o=r++ misc/Changes echo '...done' 1>&2 if [ ! -d misc ] ; then echo -n Directory misc not found. Creating.... mkdir misc if [ ! -d misc ] ; then echo ...failed echo unable to create directory misc. Please create the directory and try again exit fi echo ...done fi echo -n "misc/README..." 1>&2 if test -f misc/README then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile misc/README' > misc/README XThis directorycontains various earlier attempts. X Xbibv.sh was a shell script attempt to do bibv XChanges shows some evolutions that these tools underwent. Xgets.c is the source to doing a gets() simulation with fgets() only EOFile misc/README chmod u=rw+,g=r++,o=r++ misc/README echo '...done' 1>&2 if [ ! -d misc ] ; then echo -n Directory misc not found. Creating.... mkdir misc if [ ! -d misc ] ; then echo ...failed echo unable to create directory misc. Please create the directory and try again exit fi echo ...done fi echo -n "misc/bibv.sh..." 1>&2 if test -f misc/bibv.sh then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile misc/bibv.sh' > misc/bibv.sh X#! /bin/sh X XFN=`basename $0` X Xcase $# in X0) echo "$FN: Usage: bibv [-style style-to-use] [ <filename> ... ]" X exit X ;; Xesac X XSTYLE=specl Xcase $1 in X"-style") STYLE=$2; shift ; shift ;; Xesac X Xcase $# in X0) echo "$FN: Usage: bibv [-style style-to-use] [ <filename> ... ]" X exit X ;; Xesac X X XFILE=bibtex XBIBFILE=${FILE}.bib XTEXFILE=${FILE}.tex XTMPFIL1=sysut1.$$ X Xtrap 'rm -f ${FILE}.bbl ${FILE}.aux ${FILE}.log ${FILE}.blg $TMPFIL1 ; exit' \ X 1 2 3 15 X XKEYS="@ARTI|@BOOK|@CONF|@INBO|@INCO|@INPR|@MANU|@MAST|@MISC|@PHDT|@PROC|@TECH|@UNPU" X X> $TEXFILE X> ${FILE}.bbl X> ${FILE}.aux X> ${FILE}.log X> ${FILE}.blg X> $TMPFIL1 X Xecho "\documentstyle{article}" >> $TEXFILE Xecho "\begin{document}" >> $TEXFILE Xecho "\bibliographystyle{$STYLE}" >> $TEXFILE Xecho "\title{Verifying Biblio files}" >> $TEXFILE Xecho "\author{$USER}" >> $TEXFILE Xecho "\date{\today}" >> $TEXFILE Xecho "\maketitle" >> $TEXFILE Xecho "" >> $TEXFILE Xecho "" >> $TEXFILE X XBIBRECD="" Xfor i Xdo X file="`echo $i | sed 's/\.bib//'`" X bibfile=${file}.bib X echo "\section{FILE $bibfile}" >> $TEXFILE X BIBRECD="${BIBRECD},${file}" X RECS=`tr [a-z] [A-Z] < $bibfile | egrep $KEYS | wc -l` X echo FILE $bibfile has $RECS records X sed -n '/^@s/d ; /^@S/d ; /^@.*{[ ]*\(.*\)[, ]*/\\cite {\1}/p' $bibfile >> $TMPFIL1 X# echo "%" >> $TMPFIL1 X# echo "% $bibfile" >> $TMPFIL1 X# echo "%" >> $TMPFIL1 X# This is not the exact sed expression to be used, but works in X# most cases...it is left as commented LaTeX output for convenience... X# sed -n 's/^@.*{[ ]*\(.*\)/%\\nocite {\1}/p' $bibfile | X# sed 's/[, ]//g' >> $TMPFIL1 X Xdone XBIBRECD="`echo $BIBRECD | sed 's/,//'`" X Xecho "\bibliography{$BIBRECD}" >> $TEXFILE Xcat $TMPFIL1 >> $TEXFILE Xecho "" >> $TEXFILE Xecho "\nocite{*}" >> $TEXFILE Xecho "" >> $TEXFILE Xecho "\end{document}" >> $TEXFILE Xexit X X# Do this run silently.... Xlatex $FILE 2>&- 1>&- </dev/null || { X echo "$FN: cannot run latex, see yah" X rm -f ${FILE}.bbl ${FILE}.aux ${FILE}.log ${FILE}.blg $TMPFIL1 X exit X } X Xbibtex $FILE Xlatex $FILE < /dev/null X X# Cleanup... Xrm -f ${FILE}.bbl ${FILE}.aux ${FILE}.log ${FILE}.blg $TMPFIL1 X Xecho "Now print out ${FILE}.dvi to see a hardcopy..." X Xexit EOFile misc/bibv.sh chmod u=rwx,g=r+x,o=r+x misc/bibv.sh echo '...done' 1>&2 if [ ! -d misc ] ; then echo -n Directory misc not found. Creating.... mkdir misc if [ ! -d misc ] ; then echo ...failed echo unable to create directory misc. Please create the directory and try again exit fi echo ...done fi echo -n "misc/gets.c..." 1>&2 if test -f misc/gets.c then case $# in 0) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac case $1 in -o) ;; *) echo 'exists, `sh filename -o'\'' to overwrite' exit 0;; esac fi sed 's/^X//' << 'EOFile misc/gets.c' > misc/gets.c X/* ugh...I know of no better way..*sigh* */ X#ifndef FILE X#include <stdio.h> X#endif X#include "strings.h" X Xchar * Xmy_gets (buffer, size) Xchar *buffer; Xint size; X X/* X * This is an emulation of gets() using fgets.3 X * This routine reads everything upto a newline, using fgets.3 X * X * OUTPUT: Returns buffer on exit, (char *) NULL on error X * The contents of buffer are the input string, a max of (size -1) X * characters are filled on exit, X * The buffer is zeroed and returned on EOF. X * X * This routine only deals with EOF as an error cleanly. On any other X * error returned by fgets.3, this routine will return will return X * (char *) NULL and a partially filled buffer....*sigh* X * X * if EMUL_GETS is turned on, (it probably should, neh? :-) then X * it converts any trailing NEWLINE character ('\n') to a NIL ('\0') X * character, else, it leaves them alone X */ X X#ifdef BUFSIZE X#undef BUFSIZE X#endif X#define BUFSIZE 512 X#define EMUL_GETS X X{ Xint sizeleft, cursize; Xchar lbuf[BUFSIZE]; /* These figures are unimportant...leave well alone */ Xchar *foo, *answer; Xint done; X X sizeleft = size - 1; X bzero (buffer, size); X answer = buffer; X done = 0; X X while (done != 1) X { X if (fgets (lbuf, BUFSIZE, stdin) == (char *) NULL) X { X done = 1 /* EOF or ERROR */ ; X answer = (char *) NULL; X } X else if ((foo = Index (lbuf, '\n')) != (char *) NULL) X { /* DONE */ X if (sizeleft > 0) X strncat (buffer, lbuf, sizeleft); X done = 1; X } X else if (sizeleft > 0) X { /* COPY */ X cursize = strlen (lbuf); X if (cursize <= sizeleft) X { X strncat (buffer, lbuf, cursize); X sizeleft -= cursize; X } X else X { X strncat (buffer, lbuf, sizeleft); X sizeleft = 0; X } X } X } X X#ifdef EMUL_GETS X if ((foo = Index (buffer, '\n')) != (char *) NULL) X *foo = '\0'; X#endif X return answer; X} EOFile misc/gets.c chmod u=rw+,g=r++,o=r++ misc/gets.c echo '...done' 1>&2 echo Now gitouttaere exit -=- Kannan Varadhan, Ohio Supercomputer Center, Columbus, OH 43212 [(614) 292-4137] email: kannan@osc.edu | osu-cis!oscsunb!kannan