#!/bin/sh # This is a shell archive (produced by GNU sharutils 4.2c). # To extract the files from this archive, save it to some FILE, remove # everything before the `!/bin/sh' line above, then type `sh FILE'. # # Made on 2004-09-23 15:20 MDT by . # Source directory was `/home/0077/sy/beebe/tex/bibparse/bibparse-1.06'. # # Existing files will *not* be overwritten unless `-c' is specified. # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 1762 -rwxr-xr-x BUILD-BIBPARSE.sh # 4593 -rw-r--r-- ChangeLog # 21108 -rw-r--r-- Makefile.in # 35106 -rw-rw-r-- README # 76436 -rw-r--r-- README.html # 202 -rw-r--r-- acconfig.h # 338 -rw-r--r-- args.h # 987 -rw-r--r-- bibdup.awk # 554 -rwxr-xr-x bibdup.sin # 4224 -rw-r--r-- bibdup.man # 777 -rw-r--r-- bibfiles.sok # 457 -r--r--r-- biblex.dat # 12993 -rw-r--r-- biblex.l # 6983 -rw-r--r-- biblex.man # 1622 -r--r--r-- biblex.ok # 15536 -rw-r--r-- bibparse.man # 13859 -rw-r--r-- bibparse.y # 9530 -rw-r--r-- bibunlex.l # 4014 -rw-r--r-- bibunlex.man # 1418 -rw-r--r-- bibyydcl.h # 183803 -rwxrwxr-x configure # 6242 -rw-r--r-- configure.in # 1847 -rw-rw-r-- config.hin # 1223 -rw-r--r-- lexmain.c # 1528 -rw-r--r-- token.h # 2418 -r--r--r-- test/check.bat # 1599 -r-xr-xr-x test/docheck.sh # 457 -r--r--r-- test/lex001.in # 331 -r--r--r-- test/lex002.in # 457 -r--r--r-- test/lex003.in # 427150 -r--r--r-- test/lex004.in # 81416 -r--r--r-- test/lex005.in # 0 -r--r--r-- test/okay/lex001.err # 1682 -r--r--r-- test/okay/lex001.out # 0 -r--r--r-- test/okay/lex002.err # 896 -r--r--r-- test/okay/lex002.out # 0 -r--r--r-- test/okay/lex003.err # 3576 -r--r--r-- test/okay/lex003.out # 0 -r--r--r-- test/okay/lex004.err # 1369101 -r--r--r-- test/okay/lex004.out # 0 -r--r--r-- test/okay/lex005.err # 242991 -r--r--r-- test/okay/lex005.out # 0 -r--r--r-- test/okay/parse001.err # 0 -r--r--r-- test/okay/parse001.out # 0 -r--r--r-- test/okay/parse002.err # 0 -r--r--r-- test/okay/parse002.out # 0 -r--r--r-- test/okay/parse003.err # 0 -r--r--r-- test/okay/parse003.out # 1298 -r--r--r-- test/okay/parse004.err # 0 -r--r--r-- test/okay/parse004.out # 0 -r--r--r-- test/okay/parse005.err # 0 -r--r--r-- test/okay/parse005.out # 84 -r--r--r-- test/okay/parse006.err # 0 -r--r--r-- test/okay/parse006.out # 55 -r--r--r-- test/okay/parse007.err # 0 -r--r--r-- test/okay/parse007.out # 0 -r--r--r-- test/okay/parse008.err # 0 -r--r--r-- test/okay/parse008.out # 0 -r--r--r-- test/okay/parse009.err # 0 -r--r--r-- test/okay/parse009.out # 0 -r--r--r-- test/okay/parse010.err # 0 -r--r--r-- test/okay/parse010.out # 55 -r--r--r-- test/okay/parse011.err # 0 -r--r--r-- test/okay/parse011.out # 55 -r--r--r-- test/okay/parse012.err # 0 -r--r--r-- test/okay/parse012.out # 0 -r--r--r-- test/okay/parse013.err # 0 -r--r--r-- test/okay/parse013.out # 0 -r--r--r-- test/okay/parse014.err # 0 -r--r--r-- test/okay/parse014.out # 0 -r--r--r-- test/okay/parse015.err # 0 -r--r--r-- test/okay/parse015.out # 0 -r--r--r-- test/okay/unlex001.err # 401 -r--r--r-- test/okay/unlex001.out # 0 -r--r--r-- test/okay/unlex002.err # 350 -r--r--r-- test/okay/unlex002.out # 0 -r--r--r-- test/okay/unlex003.err # 522 -r--r--r-- test/okay/unlex003.out # 0 -r--r--r-- test/okay/unlex004.err # 387933 -r--r--r-- test/okay/unlex004.out # 0 -r--r--r-- test/okay/unlex005.err # 74532 -r--r--r-- test/okay/unlex005.out # 1682 -r--r--r-- test/parse001.in # 896 -r--r--r-- test/parse002.in # 3576 -r--r--r-- test/parse003.in # 1369101 -r--r--r-- test/parse004.in # 242991 -r--r--r-- test/parse005.in # 275 -r--r--r-- test/parse006.in # 12 -r--r--r-- test/parse007.in # 311 -r--r--r-- test/parse008.in # 59076 -r--r--r-- test/parse009.in # 4170 -r--r--r-- test/parse010.in # 579 -r--r--r-- test/parse011.in # 126 -r--r--r-- test/parse012.in # 1287 -r--r--r-- test/parse013.in # 228690 -r--r--r-- test/parse014.in # 15060 -r--r--r-- test/parse015.in # 1682 -r--r--r-- test/unlex001.in # 896 -r--r--r-- test/unlex002.in # 3576 -r--r--r-- test/unlex003.in # 1369101 -r--r--r-- test/unlex004.in # 242991 -r--r--r-- test/unlex005.in # 1388 -r-xr-xr-x test/update.sh # 6775 -rw-rw-r-- bibdup.html # 9915 -rw-rw-r-- biblex.html # 19720 -rw-rw-r-- bibparse.html # 6487 -rw-rw-r-- bibunlex.html # 5064 -rw-r--r-- bibdup.pdf # 8415 -rw-r--r-- biblex.pdf # 15569 -rw-r--r-- bibparse.pdf # 4946 -rw-r--r-- bibunlex.pdf # 8908 -rw-rw-r-- bibdup.ps # 13701 -rw-rw-r-- biblex.ps # 24839 -rw-rw-r-- bibparse.ps # 8645 -rw-rw-r-- bibunlex.ps # 2229 -rw-rw-r-- bibdup.txt # 5267 -rw-rw-r-- biblex.txt # 13919 -rw-rw-r-- bibparse.txt # 1952 -rw-rw-r-- bibunlex.txt # 21083 -r--r--r-- save/Makefile # 27073 -r--r--r-- save/biblex.c # 20947 -r--r--r-- save/bibunlex.c # 30959 -r--r--r-- save/bibparse.c # 602 -r--r--r-- save/config.h # 82621 -r-xr-xr-x save/configure # save_IFS="${IFS}" IFS="${IFS}:" gettext_dir=FAILED locale_dir=FAILED first_param="$1" for dir in $PATH do if test "$gettext_dir" = FAILED && test -f $dir/gettext \ && ($dir/gettext --version >/dev/null 2>&1) then set `$dir/gettext --version 2>&1` if test "$3" = GNU then gettext_dir=$dir fi fi if test "$locale_dir" = FAILED && test -f $dir/shar \ && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) then locale_dir=`$dir/shar --print-text-domain-dir` fi done IFS="$save_IFS" if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED then echo=echo else TEXTDOMAINDIR=$locale_dir export TEXTDOMAINDIR TEXTDOMAIN=sharutils export TEXTDOMAIN echo="$gettext_dir/gettext -s" fi if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then shar_n= shar_c=' ' else shar_n=-n shar_c= fi else shar_n= shar_c='\c' fi touch -am 1231235999 $$.touch >/dev/null 2>&1 if test ! -f 1231235999 && test -f $$.touch; then shar_touch=touch else shar_touch=: echo $echo 'WARNING: not restoring timestamps. Consider getting and' $echo "installing GNU \`touch', distributed in GNU File Utilities..." echo fi rm -f 1231235999 $$.touch # $echo $shar_n 'x -' 'lock directory' "\`_sh13818': "$shar_c if mkdir _sh13818; then $echo 'created' else $echo 'failed to create' exit 1 fi # ============= BUILD-BIBPARSE.sh ============== if test -f 'BUILD-BIBPARSE.sh' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'BUILD-BIBPARSE.sh' '(file already exists)' else $echo 'x -' extracting 'BUILD-BIBPARSE.sh' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'BUILD-BIBPARSE.sh' && #! /bin/sh # This script configures and builds an optimized version of bibparse on # all local systems at the University of Utah Mathematics and Physics # Departments. # # Usage: # ./BUILD-BIBPARSE.sh # # [08-May-1999] X # Default C compiler CC=c89 YACC=yacc X # Adjustments for particular systems X case "`uname -s`" in X AIX) X CC=c89 X OPT='-O3 -qarch=ppc' X # Don't use -qarch=ppc: AIX doesn't emulate those extra instructions X # on older models that lack them, sigh... Sun does a much better job X OPT='-O3' X ;; X HP-UX) X CC=c89 X OPT='+O4' X ;; X IRIX) X CC='cc -cckr' X OPT='-O2' X # IRIX 5.3 yacc quits with ``Redeclaration of precedence of ASGNOP, line 75'' X # so switch to bison, sigh... X YACC='bison -y' X ;; X IRIX64) X CC=c89 X OPT='-O2' X ;; X Linux) X CC=gcc X OPT='-O3' X ;; X Mach) X CC=gcc X OPT='-O3 -m68030' X ;; X OSF1) X CC=c89 X OPT=-O4 X ;; X SunOS) X case "`uname -r`" in X 4.*) X CC='acc' X OPT='-O2 -dalign -libmil -cg89' X ;; X 5.5) X CC="gcc -ansi" X CC=c89 X OPT='-xO5 -dalign -xlibmil -fsimple=2 -fns -xsafe=mem -xtarget=ultra1/2200' X ;; X 5.*) X CC="gcc -ansi" X CC=c89 X OPT='-xO5 -dalign -xlibmil -fsimple=2 -fns -xsafe=mem -xtarget=ultra2/2300' X ;; X *) X echo "Unrecognized SunOS version...proceeding with defaults and fingers crossed :^)" X CC=c89 X OPT='-O' X ;; X esac X ;; X *) X echo "Unrecognized operating system...proceeding with defaults and fingers crossed :^)" X OPT='-O' X ;; esac X if test -f Makefile then X make distclean else X rm -f *.o config.cache config.log config.status awklex maketab \ X proctab.c ytab.c ytab.h fi X echo 'CC =' $CC echo 'OPT =' $OPT echo 'YACC =' $YACC X env CC="${CC}" ./configure && make OPT="$OPT" YACC="${YACC}" all check SHAR_EOF $shar_touch -am 0508145899 'BUILD-BIBPARSE.sh' && chmod 0755 'BUILD-BIBPARSE.sh' || $echo 'restore of' 'BUILD-BIBPARSE.sh' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'BUILD-BIBPARSE.sh:' 'MD5 check failed' b1f6627a14dc50f70449c1c64392f910 BUILD-BIBPARSE.sh SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'BUILD-BIBPARSE.sh'`" test 1762 -eq "$shar_count" || $echo 'BUILD-BIBPARSE.sh:' 'original size' '1762,' 'current size' "$shar_count!" fi fi # ============= ChangeLog ============== if test -f 'ChangeLog' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'ChangeLog' '(file already exists)' else $echo 'x -' extracting 'ChangeLog' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'ChangeLog' && 2004-09-23 14:55:19-0600 Nelson H. F. Beebe X X * Release version 1.06. Repackaging to update version number and X address, and use more recent autoconf. X 2001-10-06 17:30:16-0600 Nelson H. F. Beebe X X * Release version 1.05. X X * README.html: Minor tweaks. X X * TO-DO: Update with new bug items. X 1999-05-26 Nelson H. F. Beebe X X * Release version 1.04. Its major new feature for users is the X ability of bibparse to handle BibTeX files directly, as well as X the lexical token streams from biblex and bibclean that previous X versions expected. This version has been tested under more than X 460 combinations of lex (AT&T lex and GNU flex) and yacc (AT&T X yacc, Berkeley byacc, and GNU bison) implementations, and C and X C++ compilers, and the enhancements to the autoconfig process X make it likely to be successful on almost all UNIX platforms, as X well as providing for simple builds on Microsoft Windows 9x and X NT systems. Binaries are provided for IBM PC DOS and Windows X systems. X X * bibyydcl.h: add function prototype for yylex(void). X X * Makefile.in: substantial rewrite with many small changes X too numerous to document here. X X * bibdup.sin: new file from which bibdup.sh (installed as bibdup) X is derived automatically. X X * config.hin: add #undef statements for HAVE_LIBFL and HAVE_LIBL. X X * configure.in: substantial rewirte with many new checks for X programs, more complex tests for lex/flex library variations X to handle GNU/Linux and C++ variations better, and generation X of bibdup.sh from bibdup.sin. X X * biblex.l: token printing now happens only when global variable X do_lex_output is nonzero, so that biblex can be embedded in X bibparse. X X * biblex.l, bibparse.y, bibunlex.l: define YYLMAX in terms of X BIBYYLMAX, which is now set in just a single place, in X Makefile.in. X X * biblex.l: add test against EOF as well as EOFILE, so flex can be X used reliably in place of lex. X X * bibparse.y: extend docstring in file comment header. X X * bibparse.y: add support for direct internal parsing of BibTeX X files, using a renamed biblex() parser linked into bibparse, so X that either token streams or BibTeX files can be used as input; X recognition of the input type is automatic. X X * bibparse.y: add new function zzlex() to handle input of token X stream. Function xxlex() (renamed from yylex() at compile time X in biblex) handles input of BibTeX files. Simple lookahead at X file beginning distinguishes between the two input types, and X pyylex is set to either xxlex or zzlex, and yylex() is defined X to call (*pyylex)(), so that yyparse() continues to work X unmodified, without knowledge of how its token stream was X obtained. X X * *.man: update author address in file comment header and AUTHOR X section. X X * *.man: add additional cross-references to newer BibTeX tools in X SEE ALSO section. X X * bibparse.man: document new direct BibTeX-file input support. X X * bibparse.man: substantially extend DESCRIPTION section. X X * bibparse.man: add entirely new OPTIONS section. X X * bibparse.man: add entirely new BIBTEX GRAMMAR section, so that X the user does not need to refer to the original TUGboat paper, X or the bibparse source code, to find the grammar. X X * bibparse.man: add entirely new PERFORMANCE section. X 1998-06-01 Nelson H. F. Beebe X X * Update biblex/bibparse/bibunlex distribution to use GNU X autoconfigure. This work added new files Makefile.in and X configure.in, from which autoconf produces configure, and X autoheader produces config.hin. When configure is run at the X installer's site, it produces config.h and Makefile. X X * Add new file arg.h with common header code from biblex.l, X bibparse.y, bibunlex.l, and lexmain.c. X X * Add support for flex in place of lex, and bison in place of X yacc. The choice is made by configure, with lex being X preferred. However, some Linux systems lack lex and yacc. X This required a few minor changes in biblex.l to get a lex X description acceptable to both lex and flex, and additional X support in bibyydcl.h for flex. X X * Add subdirectory save/ with backup copies of generated files X Makefile, biblex.c, bibparse.c, bibunlex.c, config.h, and X configure from the author's Sun Solaris 2.6 system. X X * Add .html and .pdf files to the distribution. X X * Update Makefile.in targets to match current GNU conventions. X X * Add ChangeLog and INSTALL files to the distribution. X X * Move symbolic token names into new token.h file to avoid X duplication. SHAR_EOF $shar_touch -am 09231520104 'ChangeLog' && chmod 0644 'ChangeLog' || $echo 'restore of' 'ChangeLog' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'ChangeLog:' 'MD5 check failed' fbb8b72dae6b4226ae9c36128eb1f7f7 ChangeLog SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'ChangeLog'`" test 4593 -eq "$shar_count" || $echo 'ChangeLog:' 'original size' '4593,' 'current size' "$shar_count!" fi fi # ============= Makefile.in ============== if test -f 'Makefile.in' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'Makefile.in' '(file already exists)' else $echo 'x -' extracting 'Makefile.in' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'Makefile.in' && # ====================================================================== # Makefile for biblex (lexically analyze BibTeX file), bibparse (parse # BibTeX file according to prototype grammar), and bibunlex # (reconstruct BibTeX file from lexical token stream). biblex and # bibunlex are lex/flex-based, and bibparse is yacc/bison-based. # # Current target list: # all (default) make biblex and test # biblex lex-based BibTeX lexer # biblex.o # bibparse.c # bibparse.o # bibparse yacc-based BibTeX parser # bibparse.jar Java Jar distribution archive # bibparse.shr shar bundle of distribution archive # bibparse.tar UNIX tar distribution archive # bibparse.txt ASCII text of formatted manual pages # bibparse.zip InfoZIP distribution archive # bibparse.zoo Zoo distribution archive # bibunlex filter to convert biblex token stream to # BibTeX format # bibunlex.c # bibunlex.o # check same as check-programs # check-docs spelling and doubled-word checks on # documentation # check-programs run validation suite # clean clean up trash and object files # clobber same as distclean # configure regenerate configure script (NB: # requires GNU autoheader and autoconf) # configure.time-stamp dummy file to record that patches # have been applied to the configure script # distclean clean up everything for a rebuild or # redistribution # docs make HTML, PostScript, PDF, and formatted # text files from man pages # dw doubled-word check on manual pages # html-files make HTML files from manual pages # install install bibdup, biblex, bibparse, and # bibunlex in system directories # install-ftp install distributions at author's ftp site # lexmain.o # maintainer-clean remove everything that can be rebuilt # with tools available at the author's # site (for maintainer only: do NOT do this # yourself!) # mostlyclean same as clean # pdf-files make PDF files from PostScript files # programs compile and link executable programs # ps-files make PostScript files from man pages # spell spell check manual pages # TAGS GNU Emacs tags file for fast editing # test-version check version number extraction for # other make targets # txt-files make ASCII text files from man pages # uninstall remove all files installed in system # directories by "make install" # # [08-May-1999] -- update for bibparse version 1.04 release # [01-Jun-1998] -- update for use with GNU autoconfigure # [16-Jan-1993] # ====================================================================== X prefix = @prefix@ X # Change these to suit local conventions: BINDIR = $(prefix)/bin FTPDIR = /u/ftp/pub/bibparse SHRLIBDIR = $(prefix)/share/lib/bibdup MANDIR = $(prefix)/man MANEXT = 1 X # Use lcc or gcc with extra flags for extensive error checking, or use # C++ compiler (g++ or CC). DO NOT CHANGE ANY OF THESE VALUES: # instead, copy one of these to the end of the CC list to select your # compiler. You may also set the DEFINES value below too, though that # is rarely necessary. X ## # NB: On SGI IRIX 4.0.x, if you do not have C++, then you must use ## # 'CC = cc -cckr' to compile biblex.c and bibunlex.c, because the ## # lex-generated code contains a line ## # FILE *yyin = {stdin}, *yyout = {stdout}; ## # which will not compile when the c89 version of stdio.h is used. ## ## CC = c89 ## DEC Alpha OSF/1 Standard C compiler ## CC = cxx ## DEC Alpha OSF/1 C++ compiler ## CC = CC ## C++ for BSD 4.3 UNIX on HP 370 ## CC = CC +a1 -xansi +w ## C++ for SGI IRIX 4.0 (see LOADLIBES below) ## CC = cc -ansiposix -fullwarn -woff 22,24,183,205,262,269,302,303 ## ## C for SGI IRIX 4.0 ## CC = CC +a1 +p +w -D_POSIX_SOURCE -Hansi -D__STDC__ -D_BSD -D_AIX -Dps2 \ ## -DHAVE_TERMIO_H ## ## C++ on AIX 370 and PS/2: +a1 (ANSI ## ## declarations), +p (no anachronisms), +w ## ## (warnings) -D-BSD (to get toupper() and ## ## tolower() declared in ctype.h). ## ## Need -DHAVE_TERMIO_H because termios.h ## ## has wrong prototypes for C++ ## CC = CC +a1 +p +w -D_POSIX_SOURCE -Hansi -D__STDC__ -D_BSD -D_AIX -D_AIX370 ## ## C++ on AIX 370 ## CC = cc -Hansi -D_POSIX_SOURCE ## cc on AIX 370 and AIX PS/2 ## CC = /usr/CC/sun4/CC -I/usr/CC/incl -D__SUNCC__ ## C++ on SunOS 4.1.1 ## CC = acc -Xc -vc -strconst -D__ACC__ -D_POSIX_SOURCE -DHAVE_TERMIOS_H ## ## SunOS Standard C compiler (neither ## ## -DHAVE_SGTTY_H nor -DHAVE_TERMIO_H gives ## ## char-at-a-time input, sigh...; they work ## ## fine on other systems). ## CC = c89 -D_POSIX_SOURCE -D_ALL_SOURCE ## IBM RS/6000 ## CC = xlC ## IBM RS/6000 C++ ## CC = c89 -D_HPUX_SOURCE ## HP 9000/8xx HP-UX A.08 ## CC = cc ## most systems ## CC = cc ## Stardent (NB: remove -g in OPT below) ## CC = cc -systype bsd43 -D__CC__ ## MIPS RCxxxx RISCos 4.52 and 5.2: ## CC = cc $(GCCFLAGS) ## NeXT (cc is really GNU C compiler) ## CC = g++ $(GCCFLAGS) ## GNU C++ ## CC = lcc -A -A -n ## Princeton/AT&T Standard C compiler ## CC = gcc $(GCCFLAGS) ## GNU C ## ## # Compiler for this site: ## CC = g++ $(GCCFLAGS) ## GNU C++ ## CC = gcc $(GCCFLAGS) ## GNU C ## CC = cc -Xc -D__ACC__ -D__solaris ## Sun Solaris 2.x ## X # These values are set when configure is run: CC = @CC@ CXX = @CXX@ CFLAGS = @CFLAGS@ $(DEFINES) $(INCLUDES) $(OPT) CXXFLAGS = @CXXFLAGS@ $(DEFINES) $(INCLUDES) $(OPT) X # ====================================================================== # The remainder of this Makefile should not need changes X # Need new awk (nawk) or gawk here: AWK = @AWK@ X # Where the executables are during "make check": BIBLEX = ../biblex X BIBPARSE = ../bibparse X BIBUNLEX = ../bibunlex X # Because we need to support rather long BibTeX tokens (e.g., a long # abstract string), we need a MUCH larger yytext[] token buffer than the # default, which is often just 512 or 1024. # # Unfortunately, some lex implementations (e.g., Sun Solaris 2.x) emit # use of YYLMAX before the code from the %{...%} section of the .l file, # or without allowing a command-line definition to set it, so even # though biblex.l redefines YYLMAX internally, that definition may be # too late. # # Thus, we must also define it on the compiler command line, and use it # in $(SEDFILTER) below. # # These values MUST all match, so we call them all BIBYYLMAX. This # is now the ONLY place where the magic value is set, so it can be # trivially redefined at make time if needed. # # Note: For a long time, this value was 40960 (or 32768 on IBM PC # systems). However, a few bibliographies in the TeX User Group # collection have even longer strings, and setting it to 81920 proved # to be big enough for all of them. To allow for growth, we set it # even larger, to 128K. BIBYYLMAX = 131072 X CHMOD = @CHMOD@ X # Extra flags for gcc and g++ to get maximal checking GCCFLAGS = -Wall -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings X COMPRESS = @COMPRESS@ X CP = @CP@ X DEFINES = @DEFINES@ -DBIBYYLMAX=$(BIBYYLMAX) X DEROFF = @DEROFF@ X DIFF = @DIFF@ X DISTILL = @DISTILL@ X DITROFF = @DITROFF@ X ETAGS = @ETAGS@ X EXPAND = @EXPAND@ X INCLUDES = -I. X JAR = @JAR@ X LDFLAGS = @LDFLAGS@ X LIBS = @LIBS@ X # For flex, need to manually remove the %a and %o table size lines LEX = @LEX@ X LN = @LN@ -s X LS = @LS@ X # man2html is available at ftp://ftp.math.utah.edu/pub/sgml/man2html-x.yy.* MAN2HTML = @MAN2HTML@ X MKDIR = @MKDIR@ -p X MV = @MV@ X NROFF = @NROFF@ X # This variable defined to be empty, with the intent that the user can # set it on the make command line at build time to choose fancy # compiler-dependent optimization switches. OPT = X # NB: Put bibparse before biblex to avoid unnecessary recompilation # of biblex: bibparse creates a special temporary version of biblex.o PROGRAMS = bibparse biblex bibunlex X RM = @RM@ -f X RMDIR = @RMDIR@ X SED = @SED@ X # See above for why we need to substitute YYLMAX by BIBYYLMAX in the # first sed pattern. # # The peculiar second sed pattern removes a line generated by HP HP-UX # 10.x lex which causes a fatal compilation error because of an # argument mismatch with the real definition of main(). # # The third sed pattern resets any definition of YYLMAX to make it # equal to BIBYYLMAX, in case it gets used before it is reset later. # # The fourth sed pattern removes an erroneous declation of getenv() by # yacc on GNU/Linux systems. SEDFILTER = $(SED) -e 's/char *yytext *\[YYLMAX\]/char yytext[$(BIBYYLMAX)]/' \ X -e '/static void __yy__unused() { main(); }/d' \ X -e 's/\#[ ]*define[ ]*YYLMAX.*$$/\#define YYLMAX BIBYYLMAX/' \ X -e '/extern[ ]*char[ ]*[*]getenv[ ]*[(][ ]*[)]/d' X SHAR = @SHAR@ X # This variable is not used directly, but some make implementations # (e.g., SGI IRIX) use it to decide what shell to invoke commands in. # We require the original Bourne shell, sh (or a syntax-compatible # variant, such as ksh or bash). SHELL = /bin/sh X SPELL = @SPELL@ +bibfiles.sok X TAR = @TAR@ X TOUCH = @TOUCH@ X UNZIP = @UNZIP@ X VERSION = `$(AWK) '/^[ \t]*version *= *"[0-9.]+", *$$/ \ X { gsub(/[^0-9.]/,"",$$3); print $$3 }' bibparse.y` X YACC = @YACC@ X YFLAGS = -v @YFLAGS@ X ZIP = @ZIP@ X ZOO = @ZOO@ X #======================================================================= # File lists: X BASEPROGS = $(PROGRAMS) bibdup X CHECK-FILES = test/check.bat test/docheck.sh test/lex001.in \ X test/lex002.in test/lex003.in test/lex004.in test/lex005.in \ X test/okay/lex001.err test/okay/lex001.out \ X test/okay/lex002.err test/okay/lex002.out \ X test/okay/lex003.err test/okay/lex003.out \ X test/okay/lex004.err test/okay/lex004.out \ X test/okay/lex005.err test/okay/lex005.out \ X test/okay/parse001.err test/okay/parse001.out \ X test/okay/parse002.err test/okay/parse002.out \ X test/okay/parse003.err test/okay/parse003.out \ X test/okay/parse004.err test/okay/parse004.out \ X test/okay/parse005.err test/okay/parse005.out \ X test/okay/parse006.err test/okay/parse006.out \ X test/okay/parse007.err test/okay/parse007.out \ X test/okay/parse008.err test/okay/parse008.out \ X test/okay/parse009.err test/okay/parse009.out \ X test/okay/parse010.err test/okay/parse010.out \ X test/okay/parse011.err test/okay/parse011.out \ X test/okay/parse012.err test/okay/parse012.out \ X test/okay/parse013.err test/okay/parse013.out \ X test/okay/parse014.err test/okay/parse014.out \ X test/okay/parse015.err test/okay/parse015.out \ X test/okay/unlex001.err test/okay/unlex001.out \ X test/okay/unlex002.err test/okay/unlex002.out \ X test/okay/unlex003.err test/okay/unlex003.out \ X test/okay/unlex004.err test/okay/unlex004.out \ X test/okay/unlex005.err test/okay/unlex005.out \ X test/parse001.in test/parse002.in test/parse003.in \ X test/parse004.in test/parse005.in test/parse006.in \ X test/parse007.in test/parse008.in test/parse009.in \ X test/parse010.in test/parse011.in test/parse012.in \ X test/parse013.in test/parse014.in test/parse015.in \ X test/unlex001.in test/unlex002.in test/unlex003.in \ X test/unlex004.in test/unlex005.in test/update.sh X # These variables list the basenames of the test files. Those named XXX*.in # are input files for bibXXX, those named okay/XXX*.out contain correct # output on stdout from bibXXX for comparison with the .out files created by # "make check", and those named okay/XXX*.err contain correct output on # stderr from bibXXX for comparison with the XXX*.err files created by "make # check". All of these tests are done in the test subdirectory. X CHECK-NAMES-LEX = lex001 lex002 lex003 lex004 lex005 X CHECK-NAMES-PARSE = parse001 parse002 parse003 parse004 parse005 \ X parse006 parse007 parse008 parse009 parse010 \ X parse011 parse012 parse013 parse014 parse015 X CHECK-NAMES-UNLEX = unlex001 unlex002 unlex003 unlex004 unlex005 X # This is the list of everything that is distributed in the various # archive formats installed in the ftp tree: X DIST-FILES = BUILD-BIBPARSE.sh ChangeLog Makefile.in README README.html \ X acconfig.h args.h bibdup.awk bibdup.sin bibdup.man \ X bibfiles.sok biblex.dat biblex.l biblex.man biblex.ok \ X bibparse.man bibparse.y bibunlex.l bibunlex.man bibyydcl.h \ X configure configure.in config.hin lexmain.c token.h \ X $(CHECK-FILES) $(HTML-FILES) $(PDF-FILES) $(PS-FILES) \ X $(TXT-FILES) save/Makefile save/biblex.c save/bibunlex.c \ X save/bibparse.c save/config.h save/configure X HTML-FILES = $(MAN-FILES:.man=.html) X MAN-FILES = bibdup.man biblex.man bibparse.man bibunlex.man X PDF-FILES = $(MAN-FILES:.man=.pdf) X PS-FILES = $(MAN-FILES:.man=.ps) X TAGS-FILES = biblex.l bibparse.y bibunlex.l X TXT-FILES = $(MAN-FILES:.man=.txt) X #======================================================================= X X.SUFFIXES: .html .pdf .ps .txt .man .i .c .y X X.c.i: X $(CC) -E $(CFLAGS) $< >$@ X X.l.c: X $(LEX) -t $< | $(SEDFILTER) > $@ X X.man.html: X $(MAN2HTML) $< X X.ps.pdf: X $(DISTILL) $< X X.y.c: X $(YACC) $(YFLAGS) $< X $(SEDFILTER) < y.tab.c > $@ X -$(RM) y.tab.c X X.y.i: X $(MAKE) $*.c X $(MAKE) $*.i X -$(RM) $*.c X X.man.ps: X $(DITROFF) -Tps -man $? >$@ X X.man.txt: X $(DITROFF) -Tascii -man $? >$@ X #======================================================================= X all: programs X bibdup.sh: bibdup.sin Makefile X -$(RM) -f $@ X $(SED) -e 's=_LIBDIR_=$(SHRLIBDIR)=g' \ X -e 's=_BINDIR_=$(BINDIR)=g' \ X -e 's=_AWK_=$(AWK)=g' \ X $@ X $(CHMOD) 555 $@ X biblex: lexmain.c biblex.c args.h bibyydcl.h token.h X $(CC) $(CFLAGS) -o biblex lexmain.c biblex.c $(LDFLAGS) $(LIBS) X biblex.c: biblex.l X bibparse.c: bibparse.y X # We create a temporary empty yacc.h file to avoid a compilation # error from HP's version, and g++'s failure to find it at all. # This is harmless on other systems. bibparse.o: bibparse.c args.h bibyydcl.h X @$(TOUCH) yacc.h X $(CC) $(CFLAGS) -c bibparse.c X @-$(RM) yacc.h X # We make this dependency on biblex.c, not biblex.o, because we need # to recompile it with yylex changed to xxlex for use inside bibparse bibparse: bibparse.o biblex.c args.h bibyydcl.h token.h X $(CC) $(CFLAGS) -Dyylex=xxlex -o bibparse bibparse.o biblex.c $(LDFLAGS) $(LIBS) X @-$(RM) biblex.o X bibparse.jar: $(DIST-FILES) X -$(RM) bibparse.jar bibparse.jar-lst X $(JAR) cf bibparse.jar $(DIST-FILES) X -$(MKDIR) bibparse-$(VERSION) X cd bibparse-$(VERSION); $(JAR) xf ../bibparse.jar X $(JAR) cf bibparse-$(VERSION).jar bibparse-$(VERSION) X -$(RM) -rf bibparse-$(VERSION) X -$(RM) bibparse.jar X $(LN) bibparse-$(VERSION).jar bibparse.jar X # The shar bundle intentionally omits the leading directory name, # bibparse-x.y.z, because shar bundles can be extracted on other systems # (e.g., IBM PC DOS) which do not permit multiple periods in file names, or # seriously limit the length of file names. bibparse.shr: $(DIST-FILES) X -$(RM) bibparse*.shr X $(SHAR) $(DIST-FILES) >bibparse-$(VERSION).shr X $(LN) bibparse-$(VERSION).shr bibparse.shr X bibparse.tar: $(DIST-FILES) X -$(RM) bibparse.tar bibparse.tar-lst X $(TAR) chf bibparse.tar $(DIST-FILES) X -$(MKDIR) bibparse-$(VERSION) X cd bibparse-$(VERSION); tar xf ../bibparse.tar X $(TAR) cf bibparse-$(VERSION).tar bibparse-$(VERSION) X -$(RM) -r bibparse-$(VERSION) X -$(RM) bibparse.tar X $(LN) bibparse-$(VERSION).tar bibparse.tar X bibparse.txt: bibparse.man X $(NROFF) -man bibparse.man | col -b | $(EXPAND) >$@ X bibparse.zip: $(DIST-FILES) X -$(RM) bibparse*.zip bibparse*.zip-lst X $(ZIP) bibparse-$(VERSION).zip $(DIST-FILES) X $(UNZIP) -v bibparse-$(VERSION).zip >bibparse-$(VERSION).zip-lst X $(LN) bibparse-$(VERSION).zip bibparse.zip X bibparse.zoo: $(DIST-FILES) X -$(RM) bibparse*.zoo bibparse*.zoo-lst X $(ZOO) a bibparse-$(VERSION).zoo $(DIST-FILES) X $(ZOO) v bibparse-$(VERSION).zoo >bibparse-$(VERSION).zoo-lst X $(LN) bibparse-$(VERSION).zoo bibparse.zoo X bibunlex: bibunlex.c X $(CC) $(CFLAGS) -o bibunlex bibunlex.c $(LDFLAGS) $(LIBS) X bibunlex.c: bibunlex.l X check: check-programs X check-docs: dw spell X check-programs: check-biblex check-bibparse check-bibunlex X check-biblex: biblex X @echo "" X @echo "The following checks should produce no output, other than their names" X @cd test; ./docheck.sh $(BIBLEX) $(CHECK-NAMES-LEX) X check-bibparse: bibparse X @echo "" X @echo "The following checks should produce no output, other than their names" X @cd test; ./docheck.sh $(BIBPARSE) $(CHECK-NAMES-PARSE) X check-bibunlex: bibunlex X @echo "" X @echo "The following checks should produce no output, other than their names" X @cd test; ./docheck.sh $(BIBUNLEX) $(CHECK-NAMES-UNLEX) X clean: X -$(RM) *.i X -$(RM) *.o X -$(RM) *~ X -$(RM) \#* X -$(RM) biblex.tmp X -$(RM) bibparse.output X -$(RM) core X -$(RM) lex.yy.c X -$(RM) y.output X -$(RM) yacc.h X cleandist: X -$(RM) bibparse*.jar X -$(RM) bibparse*.jar-lst X -$(RM) bibparse*.shr X -$(RM) bibparse.tab.c X -$(RM) bibparse*.tar X -$(RM) bibparse*.tar-lst X -$(RM) bibparse*.zip X -$(RM) bibparse*.zip-lst X -$(RM) bibparse*.zoo X -$(RM) bibparse*.zoo-lst X clobber: distclean X configure: X autoconf X autoheader X -$(RM) config.cache X $(MAKE) configure.time-stamp X # Work around a serious flaw in GNU configure: it always inserts -g # -O2 in CFLAGS and CXXFLAGS. -g cannot be used with $(OPT) on many # systems, and -O2 is not supported on many systems. configure.time-stamp: configure Makefile.in X $(MV) configure configure.tmp X $(SED) \ X -e 's/CFLAGS=" *-g */CFLAGS="/' \ X -e 's/CFLAGS=" *-O2 */CFLAGS="/' \ X -e 's/CXXFLAGS=" *-g */CXXFLAGS="/' \ X -e 's/CXXFLAGS=" *-O2 */CXXFLAGS="/' \ X < configure.tmp > configure X $(CHMOD) 775 configure X $(TOUCH) configure.time-stamp X -$(RM) configure.tmp X dist: bibparse.jar bibparse.shr bibparse.tar bibparse.zip \ X bibparse.zoo X distclean: cleandist mostlyclean X -$(RM) $(PROGRAMS) bibdup.sh X -$(RM) Makefile X -$(RM) TAGS X -$(RM) bibparse.output X -$(RM) config.cache X -$(RM) config.h X -$(RM) config.log X -$(RM) config.status X -$(RM) y.output X -$(RM) y.tab.c X docs: html-files ps-files pdf-files txt-files X dw: X @for f in $(MAN-FILES) ; \ X do \ X echo "==================== doubled words in $$f\ ====================" ; \ X $(DEROFF) $$f | dw ; \ X done X html-files: $(HTML-FILES) X install: install-programs install-lib install-man install-show X install-ftp: dist uninstall-ftp X $(CP) bibparse-$(VERSION).jar $(FTPDIR) X $(JAR) tvf bibparse-$(VERSION).jar 2>$(FTPDIR)/bibparse-$(VERSION).jar-lst X $(CP) bibparse-$(VERSION).shr $(FTPDIR) X $(TAR) tvf bibparse-$(VERSION).tar >$(FTPDIR)/bibparse-$(VERSION).tar-lst X $(COMPRESS) $(FTPDIR)/bibparse-$(VERSION).tar.gz X $(CP) bibparse-$(VERSION).zip $(FTPDIR) X $(CP) bibparse-$(VERSION).zip-lst $(FTPDIR) X $(CP) bibparse-$(VERSION).zoo $(FTPDIR) X $(CP) bibparse-$(VERSION).zoo-lst $(FTPDIR) X $(LS) -l $(FTPDIR)/bibparse-$(VERSION)* X install-lib: uninstall-lib X -$(MKDIR) $(SHRLIBDIR) X $(CP) bibdup.awk $(SHRLIBDIR)/bibdup.awk X $(CHMOD) 664 $(SHRLIBDIR)/bibdup.awk X install-man: uninstall-man X for program in $(BASEPROGS) ; \ X do \ X $(CP) $$program.man $(MANDIR)/man$(MANEXT)/$$program.1 ; \ X $(CHMOD) 664 $(MANDIR)/man$(MANEXT)/$$program.1 ; \ X done X install-programs: $(PROGRAMS) bibdup.sh uninstall-programs X for program in $(PROGRAMS) ; \ X do \ X $(CP) $$program $(BINDIR)/$$program ; \ X $(CHMOD) 775 $(BINDIR)/$$program ; \ X done ; \ X $(CP) bibdup.sh $(BINDIR)/bibdup ; \ X $(CHMOD) 775 $(BINDIR)/bibdup X install-show: X @echo '' X @echo Installed files... X @for program in $(BASEPROGS) ; \ X do \ X $(LS) -l $(BINDIR)/$$program ; \ X done X @for program in $(BASEPROGS) ; \ X do \ X $(LS) -l $(MANDIR)/man$(MANEXT)/$$program.$(MANEXT) ; \ X done X @if test -d $(SHRLIBDIR) ; then $(LS) -lR $(SHRLIBDIR)/* ; fi X @echo '' X maintainer-clean: distclean X @echo "This command is intended for maintainers to use;" X @echo "it deletes files that may require special tools to rebuild." X -for f in $(PROGRAMS) ; \ X do \ X $(RM) $$.html ; \ X $(RM) $$.ps ; \ X $(RM) $$.pdf ; \ X $(RM) $$.txt ; \ X done X -$(RM) config.hin X -$(RM) configure X -$(RM) configure.time-stamp X mostlyclean: clean X -$(RM) biblex.c X -$(RM) bibparse.c X -$(RM) bibunlex.c X pdf-files: $(PDF-FILES) X programs: $(PROGRAMS) X ps-files: $(PS-FILES) X spell: X @for f in $(MAN-FILES) ; \ X do \ X echo "==================== spelling exceptions in $$f\ ====================" ; \ X $(DEROFF) $$f | $(SPELL) ; \ X done X TAGS: $(TAGS-FILES) X $(ETAGS) $(TAGS-FILES) X test-version: Makefile X @echo "Version number is ""'"$(VERSION)"'" X txt-files: $(TXT-FILES) X uninstall: uninstall-programs uninstall-lib uninstall-man X uninstall-ftp: X -$(RM) $(FTPDIR)/bibparse-$(VERSION).jar X -$(RM) $(FTPDIR)/bibparse-$(VERSION).jar-lst X -$(RM) $(FTPDIR)/bibparse-$(VERSION).shr X -$(RM) $(FTPDIR)/bibparse-$(VERSION).tar-lst X -$(RM) $(FTPDIR)/bibparse-$(VERSION).tar.gz X -$(RM) $(FTPDIR)/bibparse-$(VERSION).zip X -$(RM) $(FTPDIR)/bibparse-$(VERSION).zip-lst X -$(RM) $(FTPDIR)/bibparse-$(VERSION).zoo X -$(RM) $(FTPDIR)/bibparse-$(VERSION).zoo-lst X uninstall-lib: X -$(RM) $(SHRLIBDIR)/bibdup.awk X -$(RMDIR) $(SHRLIBDIR) X uninstall-man: X -for program in $(BASEPROGS) ; \ X do \ X $(RM) $(MANDIR)/man$(MANEXT)/$$program.1 ; \ X $(RM) $(MANDIR)/man$(MANEXT)/../cat$(MANEXT)/$$program.1 ; \ X done X uninstall-programs: X -for program in $(BASEPROGS) ; \ X do \ X $(RM) $(BINDIR)/$$program ; \ X done SHAR_EOF $shar_touch -am 09231515104 'Makefile.in' && chmod 0644 'Makefile.in' || $echo 'restore of' 'Makefile.in' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'Makefile.in:' 'MD5 check failed' 7cb3fb8289aa91c9ccf6a97214d63625 Makefile.in SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'Makefile.in'`" test 21108 -eq "$shar_count" || $echo 'Makefile.in:' 'original size' '21108,' 'current size' "$shar_count!" fi fi # ============= README ============== if test -f 'README' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'README' '(file already exists)' else $echo 'x -' extracting 'README' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'README' && X X README: Installation instruction for bibparse-1.06 X Table of contents X X * [1]Jump start X * [2]Introduction X * [3]Installation X * [4]Bug reports X * [5]UNIX Systems X * [6]IBM PC DOS X * [7]Test suite X * [8]Sample build output for UNIX X * [9]Implementation Notes X Jump start X X As with most GNUware, you can build, test, and install this program on X most UNIX systems by these simple steps csh et amici: X setenv CC ...your favorite C or C++ compiler... X ./configure && make all check install X sh et amici: X CC=...your favorite C or C++ compiler... X export CC X ./configure && make all check install X X Or in one line, if you have env (most modern UNIX systems do): X env CC=... ./configure && make all check install X X If you don't set the CC environment variable, then gcc (or cc, if gcc X is not available) will be assumed. X X If you wish to undo a make install, just do make uninstall; this will X remove any files in system directories put there by make install. X X See below for further details, and for instructions for non-UNIX X systems. X Introduction X X This directory contains bibparse, biblex, bibunlex, and bibdup, a X suite of programs for support of BibTeX bibliography files. They are X described in the following paper: @String{TUGboat = "TUGboat"} X @Article{Beebe:TB14-4-395, author = "Nelson Beebe", title = "{{Bibliography prettyprinting and syntax checking}}", journal = [10]TUGboat, year = "1993", volume = "14", number = "4", pages = "395--419", month = Dec, } X X The complete text of the TUGboat article is included with bibclean X 2.08 and later versions. X X You can find distributions of bibclean in a variety of formats in the X same place that you found the bibparse (et al) distribution. The X master location is ftp://ftp.math.utah.edu/pub/tex/bib. Via electronic X mail, a message with the body X help X send index from tex/bib X X to tuglib@math.utah.edu will get you started. X X Three files, biblex.c, bibparse.c, and bibunlex.c, are generated by X lex (or flex), and yacc (or bison). Copies of these files from the X author's site are preserved in the save subdirectory for manual X bootstrapping, but on UNIX systems, they should be generated X automatically as part of the installation process. X Installation X X Starting with version 1.03, bibparse has been adapted to use the GNU X autoconf automatic configuration system for UNIX installations. X X GNU autoconf is run at the author's site to produce the configure X script from configure.in. X X The configure script is run at each installer's UNIX site to produce X Makefile from Makefile.in , bibdup.sh from bibdup.sin, and config.h X from config.hin. The configure script is a large (2900+ lines) X automatically-generated Bourne shell program that investigates various X aspects of the local C implementation, and records its conclusions in X config.h. X X Should you do a make maintainer-clean [not recommended, except at the X author's site], the configure script will be deleted, and you will X need recent versions of both GNU m4 and autoconf correctly installed X to reconstruct things, which can be done this way: X autoheader # Regenerate config.hin X autoconf # Regenerate unedited configure X make configure.time-stamp # To fix configure script X X For convenience and safety, the distribution includes a subdirectory X named save that contains read-only copies of the files Makefile, X config.h, and configure created by autoconf and make configure, plus X the files biblex.c and bibunlex.c generated by lex, and the file X bibparse.c generated by yacc. This will allow recovery from a lost or X damaged configure file, and support manual bootstrapping on systems X that lack lex/flex and yacc/bison support, or have broken X implementations of those programs. X X Suitable hand-crafted config.h files are provided for non-UNIX X systems, and in the unlikely event of a failure of the configure X script on a UNIX system, config.h can be manually produced from a copy X of config.hin with a few seconds of editing work. If you do this, X remember to save a copy of your config.h under a different name, X because running configure will destroy it. If you have GNU autoconf X installed (the installation is very simple and source code is X available from X ftp://prep.ai.mit.edu/pub/gnu/autoconf/autoconf-x.y.tar.gz), (x.y = X 2.13 at the time of writing this), you might try augmenting X configure.in instead, then run autoheader, autoconf, and configure. X X Thus, on UNIX, installation normally consists of just two steps X (assuming a csh -compatible shell): X setenv CC ...your favorite C or C++ compiler... X ./configure && make all check install X X If you like, add OPT='your favorite optimization flags' to the make X command; by default, no optimization flags are set. X X The GNU standard installation directories /usr/local/bin for binaries, X and /usr/local/man/man1 for manual pages are assumed. The prefix X /usr/local can be overridden by providing an alternate definition for X the make variable, prefix, on the command line: X make prefix=/some/other/path install X X After installation, you can do X make distclean X X to restore the directories to their distribution state. You should X also do this between builds for different architectures from the same X source tree; neglecting to do so will almost certainly lead to X failure, because the config.cache file created by configure will lead X to an incorrect config.h and Makefile for the next build. X Bug reports X X Please report all problems, suggestions, and comments to the author: X X X Nelson H. F. Beebe X University of Utah X Department of Mathematics, 110 LCB X 155 S 1400 E RM 233 X Salt Lake City, UT 84112-0090 X USA X Tel: +1 801 581 5254 X FAX: +1 801 585 1640, +1 801 581 4148 X Email: [11]beebe@math.utah.edu , [12]beebe@acm.org , X [13]beebe@computer.org , [14]beebe@ieee.org (Internet) X WWW URL: [15]http://www.math.utah.edu/~beebe/ X UNIX Systems X X The code can be compiled with either C (K&R or ISO/ANSI Standard C) or X C++ compilers, although whether C++ can be used for the lex/flex- and X yacc/bison-generated code depends on how modern their versions are. X With some C++ compilers, it may be necessary to supply additional X switches for force the compiler to stay in C++ mode, rather than X reverting to C mode (e.g., on DEC Alpha OSF/1, you must do setenv CC X "cxx -x cxx"). X X On UNIX systems, the only variables that you are likely to need to X override on the make command line are the Makefile settings of CC and X OPT, and if you wish to do make install, the setting of prefix. X X If you are installing bibparse on a new system, you should definitely X run make check before installing it on your system. Sample output of X make check from a UNIX system is given below. X X These programs have been built, tested, and validated with two X independent lexers (flex and lex), and three independent parser X generators (bison, byacc, and yacc), using all available C and C++ X compilers on these 11 UNIX systems for the 1.04 release: 413 X successful builds, and 49 failures. Because some compilers are stored X in two different directories, or under two separate names, the actual X number of independent builds is somewhat less. X X While the large number of successful builds is gratifying, the X failures are potentially even more important if they can be traced to X deficiencies in my code. Close examination of the build logs shows X that they are not: they are entirely due to one of the following: X * Code from lex/flex and/or bison/byacc/yacc which is not X C++-compatible; there is no excuse for such vendor sloppiness, but X it exists. C has had an ANSI/ISO Standard since December 1989, and X the draft standard was stable at least two years before that, so X the target language has been publicly defined for about a dozen X years. All C-Standard-conforming code should compile without X problems under C++ (barring use of C++ reserved words). X * Lack of compiler support for the non-standard stack memory X allocator, alloca(), used in bison-generated code. X * Internal compiler errors (e.g., lcc on NeXT and SGI IRIX 6.x X systems). X * Broken vendor-provided yacc (SGI IRIX 5.3). X * Broken vendor-provided header file, alloca.h (pgCC). A bug report X about this to the vendor, The Portland Group X [16](http://www.pgroup.com), produced a prompt response with the X following patch: #ifdef __cplusplus extern "C" char * __builtin_alloca (int); #endif X *** /usr/pgi/linux86/include/alloca.h Thu Apr 22 18:57:51 1999 --- ./alloca.h Tue May 11 11:52:01 1999 *************** *** 36,41 **** --- 36,44 ---- X X # define __alloca(size) __builtin_alloca (size) X # define alloca(size) __alloca (size) + #ifdef __cplusplus + extern "C" char * __builtin_alloca (int); + #endif X X __END_DECLS X X Successes X X flex + bison (70 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/bin/c89 X /usr/bin/cc X /bin/cc X /bin/c89 X /bin/cxx -x cxx X /usr/ucb/cc X /usr/ccs/bin/cc X /usr/ccs/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X HP 9000/735 HP-UX 10.01 /usr/bin/c89 X /usr/ccs/bin/cc X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X /bin/cc X IBM PowerPC 43P AIX 4.2 /bin/xlC X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/c89 X /usr/bin/cc X /bin/cc X /bin/c89 X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/bin/cc X /usr/pgi/linux86/bin/pgcc X /usr/bin/gcc X /usr/bin/g++ X /usr/local/bin/gcc X /usr/local/bin/g++ X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X /usr/local/bin/lcc -A -A X /usr/local/bin/gcc X /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X SGI Challenge L IRIX 5.3 /bin/cc X /usr/bin/CC X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/CC X SGI Origin/200-4 IRIX 6.4 /bin/CC X /usr/bin/cc X /bin/cc X /bin/c89 X /usr/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/CC X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/cc X /usr/bin/gcc X /usr/bin/g++ X Sun SPARC LX Solaris 2.5 /opt/SUNWspro/bin/c89 X /usr/ucb/cc X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/local/bin/lcc -A -A X Sun Ultra Enterprise 5500 Solaris 2.6 /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/c89 X /opt/SUNWspro/bin/cc X /usr/ucb/cc X X flex + byacc (75 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/bin/c89 X /bin/c89 X /bin/cc X /usr/ccs/bin/c89 X /usr/ucb/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/cxx -x cxx X /usr/local/bin/lcc -A -A X /usr/ccs/bin/cc X /usr/bin/cc X HP 9000/735 HP-UX 10.01 /usr/bin/cc X /bin/cc X /usr/ccs/bin/cc X /usr/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X /usr/bin/CC X /bin/CC X IBM PowerPC 43P AIX 4.2 /bin/xlC X /usr/bin/c89 X /bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X /usr/bin/cc X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/bin/cc X /usr/pgi/linux86/bin/pgCC X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/pgi/linux86/bin/pgcc X /usr/bin/gcc X /usr/bin/g++ X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/local/bin/lcc -A -A X /usr/bin/gcc X /usr/bin/g++ X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/cc X NeXT Turbostation Mach 3.3 /bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X SGI Challenge L IRIX 5.3 /bin/cc X /usr/local/bin/gcc X /usr/local/bin/lcc -A -A X /usr/local/bin/g++ X /usr/bin/CC X /usr/bin/cc X /bin/CC X SGI Origin/200-4 IRIX 6.4 /bin/CC X /usr/bin/CC X /usr/bin/c89 X /bin/cc X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X Sun SPARC LX Solaris 2.5 /usr/ucb/cc X /opt/SUNWspro/bin/c89 X /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X Sun Ultra Enterprise 5500 Solaris 2.6 /usr/local/bin/lcc -A -A X /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X /opt/SUNWspro/bin/c89 X /usr/ucb/cc X X flex + yacc (66 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X /usr/ucb/cc X /bin/cxx -x cxx X /usr/ccs/bin/c89 X /usr/bin/cc X /usr/ccs/bin/cc X /usr/local/bin/lcc -A -A X /bin/cc X HP 9000/735 HP-UX 10.01 /bin/CC X /usr/ccs/bin/cc X /usr/bin/CC X /bin/cc X /usr/bin/cc X /bin/c89 X /usr/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X IBM PowerPC 43P AIX 4.2 /usr/bin/cc X /bin/cc X /bin/c89 X /bin/xlC X /usr/bin/c89 X /usr/local/bin/gcc X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/bin/gcc X /usr/bin/g++ X /usr/pgi/linux86/bin/pgCC X /usr/pgi/linux86/bin/pgcc X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/gcc X /usr/bin/g++ X /usr/local/bin/lcc -A -A X NeXT Turbostation Mach 3.3 /bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/CC X /bin/CC X /usr/bin/cc X /bin/cc X /bin/c89 X /usr/bin/c89 X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/cc X /usr/bin/gcc X /usr/bin/g++ X Sun SPARC LX Solaris 2.5 /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/cc X /usr/ucb/cc X /opt/SUNWspro/bin/c89 X /opt/SUNWspro/bin/CC X Sun Ultra Enterprise 5500 Solaris 2.6 /opt/SUNWspro/bin/c89 X /usr/ucb/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X X lex + bison (67 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/ccs/bin/cc X /usr/bin/c89 X /usr/ucb/cc X /usr/local/bin/gcc X /usr/ccs/bin/c89 X /bin/cc X /bin/c89 X /usr/bin/cc X HP 9000/735 HP-UX 10.01 /usr/bin/cc X /usr/ccs/bin/cc X /bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/cc X /usr/bin/c89 X IBM PowerPC 43P AIX 4.2 /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/c89 X /bin/c89 X /bin/xlC X /bin/cc X /usr/bin/cc X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X /usr/pgi/linux86/bin/pgcc X /usr/local/bin/gcc X /usr/local/bin/g++ X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/bin/cc X /usr/bin/gcc X /usr/bin/g++ X /usr/local/bin/gcc X /usr/local/bin/lcc -A -A X /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /usr/local/bin/gcc X /bin/cc X SGI Challenge L IRIX 5.3 /bin/CC X /usr/bin/CC X /bin/cc X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X SGI Origin/200-4 IRIX 6.4 /usr/bin/cc X /usr/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/CC X /bin/cc X /usr/bin/CC X /bin/c89 X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/cc X /usr/bin/gcc X /usr/bin/g++ X Sun SPARC LX Solaris 2.5 /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X /usr/ucb/cc X /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/c89 X Sun Ultra Enterprise 5500 Solaris 2.6 /opt/SUNWspro/bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/CC X /usr/ucb/cc X /opt/SUNWspro/bin/cc X /usr/local/bin/lcc -A -A X X lex + byacc (72 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /bin/cc X /usr/local/bin/gcc X /usr/local/bin/lcc -A -A X /usr/ccs/bin/cc X /usr/ucb/cc X /usr/bin/c89 X /usr/ccs/bin/c89 X /usr/bin/cc X /bin/c89 X HP 9000/735 HP-UX 10.01 /bin/CC X /bin/cc X /usr/ccs/bin/cc X /bin/c89 X /usr/bin/CC X /usr/local/bin/gcc X /usr/bin/cc X /usr/local/bin/g++ X /usr/bin/c89 X IBM PowerPC 43P AIX 4.2 /usr/bin/cc X /usr/bin/c89 X /bin/c89 X /bin/cc X /bin/xlC X /usr/local/bin/gcc X /usr/local/bin/g++ X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X /usr/pgi/linux86/bin/pgCC X /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/pgi/linux86/bin/pgcc X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/local/bin/lcc -A -A X /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /usr/local/bin/gcc X /bin/cc X SGI Challenge L IRIX 5.3 /usr/bin/cc X /usr/local/bin/lcc -A -A X /bin/CC X /bin/cc X /usr/local/bin/gcc X /usr/bin/CC X /usr/local/bin/g++ X SGI Origin/200-4 IRIX 6.4 /usr/bin/c89 X /usr/bin/CC X /usr/bin/cc X /bin/c89 X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/CC X /bin/cc X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X Sun SPARC LX Solaris 2.5 /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/CC X /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/cc X /usr/ucb/cc X /opt/SUNWspro/bin/c89 X Sun Ultra Enterprise 5500 Solaris 2.6 /usr/local/bin/lcc -A -A X /opt/SUNWspro/bin/c89 X /usr/ucb/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X X lex + yacc (63 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/ccs/bin/c89 X /usr/bin/c89 X /bin/c89 X /usr/ccs/bin/cc X /usr/local/bin/gcc X /usr/ucb/cc X /usr/local/bin/lcc -A -A X /bin/cc X /usr/bin/cc X HP 9000/735 HP-UX 10.01 /usr/ccs/bin/cc X /usr/bin/c89 X /usr/bin/CC X /bin/c89 X /usr/bin/cc X /bin/CC X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/cc X IBM PowerPC 43P AIX 4.2 /usr/bin/c89 X /usr/local/bin/gcc X /bin/cc X /bin/c89 X /bin/xlC X /usr/bin/cc X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/pgi/linux86/bin/pgcc X /usr/bin/gcc X /usr/local/bin/gcc X /usr/bin/g++ X /usr/local/bin/g++ X /usr/bin/cc X /usr/pgi/linux86/bin/pgCC X Intel Pentium II MMX GNU/Linux 2.0.35 /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/bin/gcc X /usr/bin/g++ X /usr/bin/cc X /usr/local/bin/lcc -A -A X NeXT Turbostation Mach 3.3 /bin/cc X /usr/local/bin/gcc X SGI Origin/200-4 IRIX 6.4 /bin/cc X /usr/bin/c89 X /usr/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/c89 X /bin/CC X /usr/bin/CC X Sun SPARC 10/412 GNU/Linux 2.0.35 /usr/bin/cc X /usr/bin/gcc X /usr/bin/g++ X Sun SPARC LX Solaris 2.5 /usr/local/bin/gcc X /usr/local/bin/g++ X /usr/ucb/cc X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/c89 X /opt/SUNWspro/bin/cc X Sun Ultra Enterprise 5500 Solaris 2.6 /usr/ucb/cc X /opt/SUNWspro/bin/CC X /opt/SUNWspro/bin/cc X /usr/local/bin/gcc X /usr/local/bin/g++ X /opt/SUNWspro/bin/c89 X /usr/local/bin/lcc -A -A X _________________________________________________________________ X X Failures X X flex + bison (7 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/local/bin/lcc -A -A X HP 9000/735 HP-UX 10.01 /usr/bin/CC X /bin/CC X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/pgi/linux86/bin/pgCC X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X SGI Challenge L IRIX 5.3 /usr/local/bin/lcc -A -A X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X X flex + byacc (2 compilers) X X Machine and model O/S Compilers X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X X flex + yacc (11 compilers) X X Machine and model O/S Compilers X IBM PowerPC 43P AIX 4.2 /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X SGI Challenge L IRIX 5.3 /usr/local/bin/lcc -A -A X /usr/local/bin/gcc X /bin/cc X /bin/CC X /usr/bin/cc X /usr/bin/CC X /usr/local/bin/g++ X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X Sun SPARC LX Solaris 2.5 /usr/local/bin/lcc -A -A X X lex + bison (10 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /usr/local/bin/g++ X /usr/local/bin/lcc -A -A X /bin/cxx -x cxx X HP 9000/735 HP-UX 10.01 /bin/CC X /usr/bin/CC X Intel Pentium II 450MHz GNU/Linux 2.1.132 /usr/pgi/linux86/bin/pgCC X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X /usr/local/bin/g++ X SGI Challenge L IRIX 5.3 /usr/local/bin/lcc -A -A X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X X lex + byacc (5 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /bin/cxx -x cxx X /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X /usr/local/bin/g++ X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X X lex + yacc (14 compilers) X X Machine and model O/S Compilers X DEC Alpha 2100-5/250 OSF/1 3.2 /bin/cxx -x cxx X /usr/local/bin/g++ X IBM PowerPC 43P AIX 4.2 /usr/local/bin/g++ X NeXT Turbostation Mach 3.3 /usr/local/bin/lcc -A -A X /usr/local/bin/g++ X SGI Challenge L IRIX 5.3 /usr/local/bin/gcc X /usr/local/bin/g++ X /bin/cc X /bin/CC X /usr/local/bin/lcc -A -A X /usr/bin/cc X /usr/bin/CC X SGI Origin/200-4 IRIX 6.4 /usr/local/bin/lcc -A -A X Sun SPARC LX Solaris 2.5 /usr/local/bin/lcc -A -A X IBM PC DOS X X Of all the compilers that I have available on the IBM PC under X Microsoft DOS and Windows (two versions of Turbo C, four of Microsoft X C, and two of Watcom C), none support 32-bit int data. This prevents X the use of the yacc version of bibparse.c, because it requires an X integer type that can hold values as large as -10000000. Had all such X data been given a type defined by a typedef, a one-line change from X int to long would permit the transfer of the code to an environment X with 32-bit long support. Sadly, such is not the case. Perhaps the X commercial Mortice-Kern MKS Tools package of UNIX tools on DOS X addresses this issue, but I do not yet have it. X X Another problem is that the parser tables are too big for the X obnoxious 64KB-segment limit of the Intel x86 architecture, and none X of the compilers, except for the Watcom 386 compiler, will compile the X code. X X Fortunately, the solution is simply to use bison instead of yacc. It X has been designed to work with integers as small as 16 bits, and its X parser tables are more compact. X X The three programs can be built standalone in this environment, X without the need for lex, flex, or yacc libraries, provided that the X symbol HAVE_IBMPC is defined in the config.h file, and the symbol X HAVE_FILENO is undefined there. This will enable a simple version of X the yywrap() function, and also reduce the memory requirements to fit X in the 64KB-segment limit. X X The ibmpc/dos/README file contains details of the builds and tests of X bibparse under several IBM PC DOS C and C++ compilers, and X instructions for building and testing bibparse with other compilers. X X Since bibparse uses no floating-point arithmetic, and PC DOS has no X shared libraries, I expect that the executables will run on any X version of DOS greater than 4.0. They may also run on earlier X versions. At the time of writing, MS-DOS 6.22 is current, and the X bibparse executables work fine on it. They also work on Caldera X OpenDOS 7.01, the version supplied by Sun under Solaris 2.6 for the X SunPC emulator, and on the Windows version of DOS under Windows 95. X Test suite X X The bibparse distribution includes a comprehensive test suite which is X run by X make check X X For use on other operating systems, the ibmpc/dos/check.bat file for X PC DOS may serve as a useful starting point for preparing a script to X run the tests. X X Please do run the validation suite at your site before installing the X program. Compilers are complex software systems that also have bugs, X so the fact that the program runs correctly somewhere else does not X mean that it will do so on a different system. X Sample build output for UNIX X X Here is a log of a successful build on Sun Solaris 2.6 using the X native C++ compiler, CC: env CC=/opt/SUNWspro/bin/CC ./configure && make creating cache ./config.cache checking for gcc... /opt/SUNWspro/bin/CC checking whether the C compiler (/opt/SUNWspro/bin/CC ) works... yes checking whether the C compiler (/opt/SUNWspro/bin/CC ) is a cross-compiler.. X. no checking whether we are using GNU C... no checking whether /opt/SUNWspro/bin/CC accepts -g... yes checking for c++... c++ checking whether the C++ compiler (c++ ) works... yes checking whether the C++ compiler (c++ ) is a cross-compiler... no checking whether we are using GNU C++... yes checking whether c++ accepts -g... yes checking for compiler language... C++ checking how to run the C preprocessor... /opt/SUNWspro/bin/CC -E checking for alloca.h... yes checking for stdlib.h... yes checking for nawk... nawk checking for chmod... chmod checking for gzip... /usr/local/bin/gzip checking for scp... scp -p checking for rcp... (cached) scp -p checking for cp... (cached) scp -p checking for deroff... deroff checking for diff... diff checking for distill... /usr/local/bin/distill checking for ditroff... no checking for groff... groff checking for etags... etags checking for expand... expand checking for jar... jar checking for lex... lex checking for flex... (cached) lex checking for ln... ln checking for ls... ls checking for man2html... /usr/local/bin/man2html checking for mkdir... mkdir checking for mv... mv checking for nroff... nroff checking for rm... rm checking for rmdir... rmdir checking for sed... sed checking for shar... shar checking for spell... spell checking for tar... tar checking for touch... touch checking for unzip... unzip checking for yacc... yacc checking for zip... zip checking for zoo... zoo checking for fileno... no checking for alloca in -lPW... no checking for lex/flex library... -ll checking for yacc library... -ly checking for bison flags... checking for preprocessor symbols needed on Sun Solaris... -D__EXTERN_C__ updating cache ./config.cache creating ./config.status creating Makefile creating bibdup.sh creating config.h yacc -v bibparse.y X conflicts: 6 shift/reduce sed -e 's/char *yytext *\[YYLMAX\]/char yytext[40960]/' -e '/static void __yy__ unused() { main(); }/d' -e 's/#[ ]*define[ ]*YYLMAX.*$/#define YY LMAX BIBYYLMAX/' -e '/extern[ ]*char[ ]*[*]getenv[ ]*[(][ ]*[)] /d' < y.tab.c > bibparse.c rm -f y.tab.c /opt/SUNWspro/bin/CC -D__EXTERN_C__ -DBIBYYLMAX=40960 -I. -c bibparse.c lex -t biblex.l | sed -e 's/char *yytext *\[YYLMAX\]/char yytext[40960]/' -e '/ static void __yy__unused() { main(); }/d' -e 's/#[ ]*define[ ]*YYLM AX.*$/#define YYLMAX BIBYYLMAX/' -e '/extern[ ]*char[ ]*[*]getenv[ X ]*[(][ ]*[)]/d' > biblex.c 136/1000 nodes(%e), 311/2500 positions(%p), 50/500 (%n), 3095 transitions, 188/10000 packed char classes(%k), 230/3000 packed transitions(%a), 265/6000 output slots(%o) /opt/SUNWspro/bin/CC -D__EXTERN_C__ -DBIBYYLMAX=40960 -I. -Dyylex=xxlex -o bi bparse bibparse.o biblex.c -ll -ly /opt/SUNWspro/bin/CC -D__EXTERN_C__ -DBIBYYLMAX=40960 -I. -o biblex lexmain.c X biblex.c -ll -ly lexmain.c: biblex.c: lex -t bibunlex.l | sed -e 's/char *yytext *\[YYLMAX\]/char yytext[40960]/' -e '/static void __yy__unused() { main(); }/d' -e 's/#[ ]*define[ ]*YYLM AX.*$/#define YYLMAX BIBYYLMAX/' -e '/extern[ ]*char[ ]*[*]getenv[ X ]*[(][ ]*[)]/d' > bibunlex.c /opt/SUNWspro/bin/CC -D__EXTERN_C__ -DBIBYYLMAX=40960 -I. -o bibunlex bibunle x.c -ll -ly X The following checks should produce no output, other than their names lex001 lex002 lex003 lex004 lex005 X The following checks should produce no output, other than their names parse001 parse002 parse003 parse004 parse005 parse006 parse007 parse008 parse009 parse010 parse011 parse012 parse013 parse014 parse015 X The following checks should produce no output, other than their names unlex001 unlex002 unlex003 unlex004 unlex005 X Implementation Notes X X While the GNU autoconfigure system is a great boon for end users, it X is a painful system for developers to implement for their code. X Despite already having adapted several other programs to use this X system, I spent two long and tedious days at bibparse 1.03 X experimenting with settings in the configure.in file before the tests X succeeded on a large enough number of systems that I can have some X confidence that the installations will go smoothly at most end-user X sites. X X At version 1.04, when I ported bibparse to even more systems, and a X new parser generator, byacc, it took another four days of tuning the X configure.in file to handle system peculiarities, notably on X GNU/Linux. X X A major problem with autoconfigure is that it is not sufficiently X C++-aware. The simple test files that it creates for probing features X of the host implementation lack correct prototypes, and compilation X failures then lead to incorrect setting of values in config.h and X Makefile. X X On most of the test systems, the vendor-provided lex is not C++-aware X either, so that compilation failures from missing prototypes, or X inconsistent or old-style function declarations, are common. X X One vendor, HP, generates a reference to an non-standard external X header file, yacc.h, in yacc output, but the location of that header X file is unknown to g++. In any event, that file is wrong anyway, X because it declares yyparse() to have C linkage, but the version in X the generated C file will be compiled with C++ linkage. This was X solved by created a temporary empty yacc.h file in the rules for X bibparse.o in Makefile.in. X X The same vendor, HP, generates a call to main() in lex output which X then fails to match the prototype, and causes compilation failure. X This was solved by an edit step in Makefile.in to removed the X offending line. X X Another problem for C++ use is that, on some systems, the normal lex X functions input() and output() must be renamed to avoid conflicts with X uses of those names in C++ header files. On Sun Solaris 2.x, they X become lex_input() and lex_output(), so bibyydcl.h has to handle this X case specially. I don't see any good way to do this with configure, X since it is very awkward to produce tests in languages other than C. X X The GNU/Linux (Caldera Light 2.0.30) system on which I tested bibparse X 1.03 had yacc, but not its library, -ly, so a more complex test had to X be generated in configure.in to handle that irregularity. X X The RedHat GNU/Linux systems on Intel Pentium and Sun SPARC hardware X on which I tested bibparse 1.04 have lex, but not its library, -ll, X and worse, that lex is really flex, which does not behave compatibly, X unless it is invoked with the compatibility-mode flag, -l. However, X that flag cannot be used with ordinary lex: on HP systems, it produces X a warning; on IBM systems, it produces garbage in the output C file; X on SGI systems, it causes lex to hang in an apparent I/O wait. It took X several tries on various systems before I settled on the code finally X used in configure.in to handle these variations. X X On SGI IRIX 5.3 systems, there is a bug in yacc which results in a X bogus complaint UX:yacc: ERROR: Redeclaration of precedence of TOKEN_EQUALS, line 210 X X Thus, on that system, either bison or byacc (Berkeley yacc) must be X used, and neither are provided by the vendor. X X You can get bison at the Free Software Foundation archive (or one of X its several [17]mirrors): X [18]ftp://ftp.gnu.org/gnu/bison/bison-1.28.tar.gz X X The most recent version of Berkeley byacc that I could find is at the X Cygnus FTP site: X [19]ftp://sourceware.cygnus.com/pub/gdb/infrastructure/byacc-940324.ta X r.gz That version has been make to run with an early version of GNU X autoconfig, and has bug fixes beyond the byacc version 1.9 of X 22-Feb-1993 that I found at the Berkeley BSD development site: X [20]ftp://ftp.cs.berkeley.edu/pub/4bsd/byacc.1.9.tar.Z Even though the X Cygnus version is newer (23-Mar-1994), it produces code that did not X compile under C++ until I made this patch: =================================================================== RCS file: byacc-940324/byacc/RCS/skeleton.c,v retrieving revision 1.1 diff -r1.1 byacc-940324/byacc/skeleton.c 98a99,102 > "#ifdef __cplusplus", > "extern \"C\"", > "#endif", > " extern char *getenv();", 105,108d108 < "#ifdef __cplusplus", < "extern \"C\"", < "#endif", < " extern char *getenv();", =================================================================== X X On Sun Solaris 2.x, the symbol __EXTERN_C__ must be defined in order X to expose certain function prototypes in the code generated by lex and X yacc. configure.in has a special test for this system to generate the X needed definition. X X The linkers on some UNIX systems do not search /usr/local/lib by X default, even though this has long been a standard location for X locally-installed libraries. Consequently, the configure.in rules add X this directory to the library search path when the flex library -lfl X is required. If your site has a non-standard location for this X library, where your linker cannot find it without help, then you'll X have to override the LDFLAGS value when you run make, e.g., make LDFLAGS='-L/my/private/lib' X References X X 1. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#Jump-start X 2. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#Introduction X 3. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#Installation X 4. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#Bug-reports X 5. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#UNIX-Systems X 6. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#IBM-PC-DOS X 7. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#test-suite X 8. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#Sample-build-output-for-UNIX X 9. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#implementation-notes X 10. file://localhost/home/0077/sy/beebe/tex/bibparse/bibparse-1.06/README.html#TUGboat X 11. mailto:beebe@math.utah.edu X 12. mailto:beebe@acm.org X 13. mailto:beebe@computer.org X 14. mailto:beebe@ieee.org X 15. http://www.math.utah.edu/~beebe/ X 16. http://www.pgroup.com/ X 17. http://www.gnu.org/server/list-mirrors.html X 18. ftp://ftp.gnu.org/gnu/bison/bison-1.28.tar.gz X 19. ftp://sourceware.cygnus.com/pub/gdb/infrastructure/byacc-940324.tar.gz X 20. ftp://ftp.cs.berkeley.edu/pub/4bsd/byacc.1.9.tar.Z SHAR_EOF $shar_touch -am 09231510104 'README' && chmod 0664 'README' || $echo 'restore of' 'README' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'README:' 'MD5 check failed' ae36eebf6dd3a641bb8f8fbdabb7c846 README SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'README'`" test 35106 -eq "$shar_count" || $echo 'README:' 'original size' '35106,' 'current size' "$shar_count!" fi fi # ============= README.html ============== if test -f 'README.html' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'README.html' '(file already exists)' else $echo 'x -' extracting 'README.html' '(binary)' sed 's/^X//' << 'SHAR_EOF' | uudecode && begin 600 README.html M/"$M+2`M*BUH=&UL+2HM("TM/@H\(2TM(%)%041-12`M+3X*/"$M+2!07-T96US(CX*("`@("`@ M("`@("`@("`@("`@("!53DE8(%-Y6]U6]U(&AA=F4@/%14/F5N=CPO5%0^("AM;W-T"B`@ M("`@("`@("`@(&UO9&5R;B!53DE8('-Y6]U('=I7-T96US+@H@("`@("`@(#PO4#X*("`@("`@ M("`\(2TM(#T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T] M/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/2`M+3X*("`@("`@("`\2#(^"B`@ M("`@("`@("`@(#Q!($Y!344](DEN=')O9'5C=&EO;B(^"B`@("`@("`@("`@ M("`@("!);G1R;V1U8W1I;VX*("`@("`@("`@("`@/"]!/@H@("`@("`@(#PO M2#(^"B`@("`@("`@/%`^"B`@("`@("`@("`@(%1H:7,@9&ER96-T;W)Y(&-O M;G1A:6YS(#Q45#YB:6)P87)S93PO5%0^+"`\5%0^8FEB;&5X/"]45#XL"B`@ M("`@("`@("`@(#Q45#YB:6)U;FQE>#PO5%0^+"!A;F0@/%14/F)I8F1U<#PO M5%0^+"!A('-U:71E(&]F('!R;V=R86US"B`@("`@("`@("`@(&9OT)I8FQI;V=R87!H>2!P0H@("`@("`@ M("`@("!O9B!F;W)M871S(&EN('1H92!S86UE('!L86-E('1H870@>6]U(&9O M=6YD('1H92`\5%0^8FEB<&%R"]B M:6(\+U14/BX@(%9I82!E;&5C=')O;FEC"B`@("`@("`@("`@(&UA:6PL(&$@ M;65S"!F"]B:6(*/"]04D4^"B`@("`@("`@/%`^ M"B`@("`@("`@("`@('1O(#Q45#YT=6=L:6)`;6%T:"YU=&%H+F5D=3PO5%0^ M('=I;&P@9V5T('EO=2!S=&%R=&5D+@H@("`@("`@(#PO4#X*("`@("`@("`\ M4#X*("`@("`@("`@("`@5&AR964@9FEL97,L(#Q45#YB:6)L97@N8SPO5%0^ M+"`\5%0^8FEB<&%R2`\5%0^;&5X/"]45#X@ M*&]R(#Q45#X*("`@("`@("`@("`@9FQE>#PO5%0^*2P@86YD(#Q45#YY86-C M/"]45#X@*&]R(#Q45#YB:7-O;CPO5%0^*2X@($-O<&EE2!F;W(@;6%N=6%L(&)O;W1S=')A<'!I;F2UG96YE6]U(&1O(&$@/$5- M/FUA:V4@;6%I;G1A:6YE"!C;VYF:6=U2P@=&AE(&1I2!N86UE9"`\5%0^"YC/"]45#X@86YD"B`@("`@("`@("`@(#Q45#YB:6)U;FQE>"YC/"]4 M5#X@9V5N97)A=&5D(&)Y(#Q45#YL97@\+U14/BP@86YD('1H92!F:6QE"B`@ M("`@("`@("`@(#Q45#YB:6)P87)S92YC/"]45#X@9V5N97)A=&5D(&)Y(#Q4 M5#YY86-C/"]45#XN("!4:&ES('=I;&P*("`@("`@("`@("`@86QL;W<@2!E=F5N="!O9B!A(&9A:6QU2!P2!O9B`\5%0^"B`@("`@ M("`@("`@(&-O;F9I9RYH:6X\+U14/B!W:71H(&$@9F5W('-E8V]N9',@;V8@ M961I=&EN9R!W;W)K+B`@268@>6]U"B`@("`@("`@("`@(&1O('1H:7,L(')E M;65M8F5R('1O('-A=F4@82!C;W!Y(&]F('EO=7(@/%14/F-O;F9I9RYH/"]4 M5#X*("`@("`@("`@("`@=6YD97(@82!D:69F97)E;G0@;F%M92P@8F5C875S M92!R=6YN:6YG(#Q45#YC;VYF:6=U"YY M/"]%33X\5%0^+G1ACPO5%0^*2P*("`@("`@("`@("`@*#Q45#YX+GD\ M+U14/B`](#(N,3,@870@=&AE('1I;64@;V8@=W)I=&EN9R!T:&ES*2P@>6]U M"B`@("`@("`@("`@(&UI9VAT('1R>2!A=6=M96YT:6YG(#Q45#YC;VYF:6=U M2!C;VYS:7-T6]U M2!P M2!L96%D('1O(&9A:6QU2`\ M5%0^8V]N9FEG=7)E/"]45#X*("`@("`@("`@("`@=VEL;"!L96%D('1O(&%N M(&EN8V]R2!O9B!5=&%H/$)2/@H@("`@ M("`@("`@("!$97!A2P@550@.#0Q,3(M,#`Y,#Q"4CX*("`@("`@ M("`@("`@55-!/$)2/@H@("`@("`@("`@("!496PZ("`K,2`X,#$@-3@Q(#4R M-30\0E(^"B`@("`@("`@("`@($9!6#H@("LQ(#@P,2`U.#4@,38T,"P@*S$@ M.#`Q(#4X,2`T,30X/$)2/@H@("`@("`@("`@("!%;6%I;#H*("`@("`@("`@ M("`@/$$@2%)%1CTB;6%I;'1O.F)E96)E0&UA=&@N=71A:"YE9'4B/@H@("`@ M("`@("`@("`@("`@8F5E8F5`;6%T:"YU=&%H+F5D=0H@("`@("`@("`@("`\ M+T$^+`H@("`@("`@("`@("`\02!(4D5&/2)M86EL=&\Z8F5E8F5`86-M+F]R M9R(^"B`@("`@("`@("`@("`@("!B965B94!A8VTN;W)G"B`@("`@("`@("`@ M(#PO03XL"B`@("`@("`@("`@(#Q!($A2148](FUA:6QT;SIB965B94!C;VUP M=71E7-T96US"B`@("`@("`@("`@(#PO03X*("`@("`@("`\+T@R/@H@("`@ M("`@(#Q0/@H@("`@("`@("`@("!4:&4@8V]D92!C86X@8F4@8V]M<&EL960@ M=VET:"!E:71H97(@0R`H2R9A;7`[4B!O#PO5%0^+2!A;F0*("`@("`@("`@("`@/%14/GEA M8V,\+U14/B\\5%0^8FES;VX\+U14/BUG96YE0H@("`@("`@("`@ M("!B92!N96-E'@@+7@@8WAX M)B,S-#L\+U14/BDN"B`@("`@("`@/"]0/@H@("`@("`@(#Q0/@H@("`@("`@ M("`@("!/;B!53DE8('-Y#PO5%0^+@H@("`@("`@ M(#PO4#X*("`@("`@("`\4#X*("`@("`@("`@("`@268@>6]U(&%R92!I;G-T M86QL:6YG(#Q45#YB:6)P87)S93PO5%0^(&]N(&$@;F5W('-Y6]U M"B`@("`@("`@("`@('-H;W5L9"!D969I;FET96QY(')U;B`\14T^;6%K92!C M:&5C:SPO14T^(&)E9F]R92!I;G-T86QL:6YG"B`@("`@("`@("`@(&ET(&]N M('EO=7(@&5R#PO5%0^*2P@86YD"B`@ M("`@("`@("`@('1H6%C8SPO5%0^*2P@=7-I;F<@86QL(&%V86EL86)L92!#"B`@ M("`@("`@("`@(&%N9"!#*RL@8V]M<&EL97)S(&]N('1H97-E(#$Q(%5.25@@ M6EN9RP*("`@("`@("`@("`@=&AE(&9A:6QU2!E=F5N(&UO2!A2!D=64@=&\@;VYE(&]F('1H92!F;VQL;W=I;F#PO5%0^(&%N9"]O<@H@("`@("`@("`@ M("`\5%0^8FES;VXO8GEA8V,O>6%C8SPO5%0^('=H:6-H(&ES(&YO="!#*RLM M8V]M<&%T:6)L93L*("`@("`@("`@("`@=&AE65A"!S>7-T96US*2X*("`@("`@("`@(#PO3$D^"B`@ M("`@("`@("`\3$D^"B`@("`@("`@("`@($)R;VME;B!V96YD;W(M<')O=FED M960@/%14/GEA8V,\+U14/B`H4T=)($E225@@-2XS*2X*("`@("`@("`@(#PO M3$D^"B`@("`@("`@("`\3$D^"B`@("`@("`@("`@($)R;VME;B!V96YD;W(M M<')O=FED960@:&5A9&5R(&9I;&4L(#Q45#YA;&QO8V$N:#PO5%0^("AP9T-# M*2X*("`@("`@("`@("`@02!B=6<@F4I("`@ M("`@(%]?8G5I;'1I;E]A;&QO8V$@*'-I>F4I"B`@(R!D969I;F4@86QL;V-A M*'-I>F4I(%]?86QL;V-A("AS:7IE*0HK("-I9F1E9B!?7V-P;'5S<&QU2!B>2`@+2T^"@D\(2TM("XO8G5I;&0M2YS:"`O=&UP+V)I8G!A"`K(&)I'@@+7@@8WAX/$)2/@H@("`@("`@("`@("`@("`@("`@("]U&Q#/$)2/@H@("`@("`@("`@("`@("`@("`@("]U M@H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@("`@("`@(#Q4 M1#X*("`@("`@("`@("`@("`@("`@("!'3E4O3&EN=7@@,BXQ+C$S,@H@("`@ M("`@("`@("`@("`@/"]41#X*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@ M("`@("`@("`@("`@("`O=7-R+V)I;B]C8SQ"4CX*("`@("`@("`@("`@("`@ M("`@("`O=7-R+W!G:2]L:6YU>#@V+V)I;B]P9V-C/$)2/@H@("`@("`@("`@ M("`@("`@("`@("]U"`R+C`N,S4*("`@("`@("`@("`@("`@ M(#PO5$0^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@ M("`@+W5S6%C8R`H-S4@8V]M<&EL M97)S*0H@("`@("`@(#PO2#0^"B`@("`@("`@/%1!0DQ%($)/4D1%4CTB,2(^ M"B`@("`@("`@("`@(#Q44CX*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@ M("`@("`@("`@("`@("`\0CY-86-H:6YE(&%N9"!M;V1E;#PO0CX*("`@("`@ M("`@("`@("`@(#PO5$0^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@ M("`@("`@("`@("`@/$(^3R]3/"]"/@H@("`@("`@("`@("`@("`@/"]41#X* M("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`\0CY# M;VUP:6QE"`M>"!C>'@\0E(^"B`@("`@("`@("`@("`@("`@("`@+W5S"`R+C`N,S4*("`@("`@("`@("`@("`@(#PO5$0^"B`@("`@ M("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@+W5S6%C8R`H-C8@8V]M<&EL97)S*0H@("`@ M("`@(#PO2#0^"B`@("`@("`@/%1!0DQ%($)/4D1%4CTB,2(^"B`@("`@("`@ M("`@(#Q44CX*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@ M("`@("`\0CY-86-H:6YE(&%N9"!M;V1E;#PO0CX*("`@("`@("`@("`@("`@ M(#PO5$0^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@ M("`@/$(^3R]3/"]"/@H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@ M("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`\0CY#;VUP:6QE#Q"4CX*("`@("`@("`@("`@("`@("`@("`O=7-R M+V-C&Q#/$)2/@H@("`@("`@("`@("`@("`@("`@("]U@H@("`@("`@("`@("`@("`@/"]4 M1#X*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("!' M3E4O3&EN=7@@,BXQ+C$S,@H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@ M("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`O=7-R+V)I;B]G M8V,\0E(^"B`@("`@("`@("`@("`@("`@("`@+W5S"`R+C`N M,S4*("`@("`@("`@("`@("`@(#PO5$0^"B`@("`@("`@("`@("`@("`\5$0^ M"B`@("`@("`@("`@("`@("`@("`@+W5S"`R+C$N,3,R"B`@("`@("`@("`@("`@("`\ M+U1$/@H@("`@("`@("`@("`@("`@/%1$/@H@("`@("`@("`@("`@("`@("`@ M("]U6%C8R`H-S(@8V]M<&EL97)S*0H@("`@("`@ M(#PO2#0^"B`@("`@("`@/%1!0DQ%($)/4D1%4CTB,2(^"B`@("`@("`@("`@ M(#Q44CX*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@ M("`\0CY-86-H:6YE(&%N9"!M;V1E;#PO0CX*("`@("`@("`@("`@("`@(#PO M5$0^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@ M/$(^3R]3/"]"/@H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@("`@ M("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`\0CY#;VUP:6QE"`R+C$N,3,R"B`@("`@("`@("`@("`@("`\+U1$/@H@("`@ M("`@("`@("`@("`@/%1$/@H@("`@("`@("`@("`@("`@("`@("]U@H@("`@("`@("`@("`@("`@ M/"]41#X*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@ M("!'3E4O3&EN=7@@,BXQ+C$S,@H@("`@("`@("`@("`@("`@/"]41#X*("`@ M("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`O=7-R+W!G M:2]L:6YU>#@V+V)I;B]P9V-C/$)2/@H@("`@("`@("`@("`@("`@("`@("]U M#@V+V)I;B]P9T-#"B`@("`@ M("`@("`@("`@("`\+U1$/@H@("`@("`@("`@("`\+U12/@H@("`@("`@("`@ M("`\5%(^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@ M("`@26YT96P@4&5N=&EU;2!)22!-35@*("`@("`@("`@("`@("`@(#PO5$0^ M"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@1TY5 M+TQI;G5X(#(N,"XS-0H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@ M("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`O=7-R+VQO8V%L+V)I M;B]G8V,\0E(^"B`@("`@("`@("`@("`@("`@("`@+W5S"`K(&)I"`K(&)Y86-C("@R(&-O;7!I;&5R6%C8R`H,3$@8V]M<&EL97)S*0H@("`@("`@(#PO2#0^"B`@ M("`@("`@/%1!0DQ%($)/4D1%4CTB,2(^"B`@("`@("`@("`@(#Q44CX*("`@ M("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("`\0CY-86-H M:6YE(&%N9"!M;V1E;#PO0CX*("`@("`@("`@("`@("`@(#PO5$0^"B`@("`@ M("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@/$(^3R]3/"]" M/@H@("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@("`@("`@(#Q41#X* M("`@("`@("`@("`@("`@("`@("`\0CY#;VUP:6QE`H@("`@("`@("`@ M("`@("`@/"]41#X*("`@("`@("`@("`@/"]44CX*("`@("`@("`@("`@/%12 M/@H@("`@("`@("`@("`@("`@/%1$/@H@("`@("`@("`@("`@("`@("`@($A0 M(#DP,#`O-S,U"B`@("`@("`@("`@("`@("`\+U1$/@H@("`@("`@("`@("`@ M("`@/%1$/@H@("`@("`@("`@("`@("`@("`@($A0+558(#$P+C`Q"B`@("`@ M("`@("`@("`@("`\+U1$/@H@("`@("`@("`@("`@("`@/%1$/@H@("`@("`@ M("`@("`@("`@("`@("]B:6XO0T,\0E(^"B`@("`@("`@("`@("`@("`@("`@ M+W5S@H@ M("`@("`@("`@("`@("`@/"]41#X*("`@("`@("`@("`@("`@(#Q41#X*("`@ M("`@("`@("`@("`@("`@("!'3E4O3&EN=7@@,BXQ+C$S,@H@("`@("`@("`@ M("`@("`@/"]41#X*("`@("`@("`@("`@("`@(#Q41#X*("`@("`@("`@("`@ M("`@("`@("`O=7-R+W!G:2]L:6YU>#@V+V)I;B]P9T-#"B`@("`@("`@("`@ M("`@("`\+U1$/@H@("`@("`@("`@("`\+U12/@H@("`@("`@("`@("`\5%(^ M"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@3F58 M5"!4=7)B;W-T871I;VX*("`@("`@("`@("`@("`@(#PO5$0^"B`@("`@("`@ M("`@("`@("`\5$0^"B`@("`@("`@("`@("`@("`@("`@36%C:"`S+C,*("`@ M("`@("`@("`@("`@(#PO5$0^"B`@("`@("`@("`@("`@("`\5$0^"B`@("`@ M("`@("`@("`@("`@("`@+W5S#Q"4CX*("`@("`@("`@("`@ M("`@("`@("`O=7-R+VQO8V%L+V)I;B]G*RL*("`@("`@("`@("`@("`@(#PO M5$0^"B`@("`@("`@("`@(#PO5%(^"B`@("`@("`@("`@(#Q44CX*("`@("`@ M("`@("`@("`@(#Q41#X*("`@("`@("`@("`@("`@("`@("!.95A4(%1U"`K('EA8V,@*#$T(&-O M;7!I;&5R"`M>"!C>'@\0E(^"B`@("`@("`@("`@("`@("`@("`@+W5S M7!E('1H870@8V%N(&AO M;&0@=F%L=65S(&%S(&QA7!E(&1E9FEN960@ M8GD@80H@("`@("`@("`@("`\5%0^='EP961E9CPO5%0^+"!A(&]N92UL:6YE M(&-H86YG92!F#@V"B`@("`@("`@("`@(&%R8VAI=&5C='5R92P@86YD(&YO;F4@ M;V8@=&AE(&-O;7!I;&5R6UB;VP@/%14/DA!5D5?24)-4$,\+U14/B!I7=R87`H*3PO5%0^(&9U;F-T M:6]N+"!A;F0*("`@("`@("`@("`@86QS;R!R961U8V4@=&AE(&UE;6]R>2!R M97%U:7)E;65N=',@=&\@9FET(&EN('1H90H@("`@("`@("`@("`V-$M"+7-E M9VUE;G0@;&EM:70N"B`@("`@("`@/"]0/@H@("`@("`@(#Q0/@H@("`@("`@ M("`@("!4:&4@/%14/FEB;7!C+V1O&5C=71A8FQE M2!M87D@86QS;R!R=6X@;VX@96%R;&EE M2!A;'-O('=O65S"F-H96-K:6YG(&9O'!A;F0N M+BX@97AP86YD"F-H96-K:6YG(&9O`IC:&5C:VEN9R!F;W(@;&XN+BX@;&X*8VAE8VMI;F<@9F]R(&QS+BXN(&QS M"F-H96-K:6YG(&9O6%C M8PIC:&5C:VEN9R!F;W(@>FEP+BXN('II<`IC:&5C:VEN9R!F;W(@>F]O+BXN M('IO;PIC:&5C:VEN9R!F;W(@9FEL96YO+BXN(&YO"F-H96-K:6YG(&9O2XN+B`M;&P*8VAE8VMI;F<@9F]R('EA8V,@;&EB2XN+B`M;'D* M8VAE8VMI;F<@9F]R(&)I6%C8R`M=B`@8FEB M<&%R0H*8V]N9FQI8W1S.B`V('-H:69T+W)E9'5C90IS960@+64@)W,O M8VAA7ET97AT("I<6UE93$U!6%Q=+V-H87(@>7ET97AT6S0P.38P72\G M("UE("5]?=6YUR!M86EN*"D[('TO M9"<@+64@)W,O(UL@("`@("`@("!=*F1E9FEN95L@("`@("`@72I964Q-05@N M*B0O(V1E9FEN92!964Q-05@@0DE"65E,34%8+R<@+64@)R]E>'1E"YL('P@7E?7W5N=7-E M9"@I('L@;6%I;B@I.R!]+V0G("UE("=S+R-;("`@("`@(%TJ9&5F:6YE6R`@ M("`@("!=*EE93$U!6"XJ)"\C9&5F:6YE(%E93$U!6"!"24)964Q-05@O)R`M M92`G+V5X=&5R;EL@("`@(%TJ8VAA"YC"C$S-B\Q,#`P(&YO M9&5S*"5E*2P@,S$Q+S(U,#`@<&]S:71I;VYS*"5P*2P@-3`O-3`P("@E;BDL M(#,P.34@=')A;G-I=&EO;G,L"C$X."\Q,#`P,"!P86-K960@8VAA7EL M97@]>'AL97@@+6\@8FEB<&%R0HO;W!T+U-53E=S<')O+V)I;B]#0R`@+41?7T585$523E]#7U\@+41" M24)964Q-05@]-#`Y-C`@+4DN("`M;R!B:6)L97@@;&5X;6%I;BYC(&)I8FQE M>"YC("`M;&P@+6QY"FQE>&UA:6XN8SH*8FEB;&5X+F,Z"FQE>"`M="!B:6)U M;FQE>"YL('P@7E?7W5N M=7-E9"@I('L@;6%I;B@I.R!]+V0G("UE("=S+R-;("`@("!=*F1E9FEN95L@ M("`@("`@72I964Q-05@N*B0O(V1E9FEN92!964Q-05@@0DE"65E,34%8+R<@ M+64@)R]E>'1E"YC"B]O<'0O4U5. M5W-P#`P,PIL97@P M,#0*;&5X,#`U"@I4:&4@9F]L;&]W:6YG(&-H96-K#`P,0IU;FQE>#`P,@IU;FQE>#`P,PIU M;FQE>#`P-`IU;FQE>#`P-0H\+U!213X*("`@("`@("`\(2TM(#T]/3T]/3T] M/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T] M/3T]/3T]/3T]/2`M+3X*("`@("`@("`\2#(^"B`@("`@("`@("`@(#Q!($Y! M344](FEM<&QE;65N=&%T:6]N+6YO=&5S(CX*("`@("`@("`@("`@("`@($EM M<&QE;65N=&%T:6]N($YO=&5S"B`@("`@("`@("`@(#PO03X*("`@("`@("`\ M+T@R/@H@("`@("`@(#Q0/@H@("`@("`@("`@("!7:&EL92!T:&4@1TY5(#Q4 M5#YA=71O8V]N9FEG=7)E/"]45#X@2!A="!M;W-T(&5N9"UU7-T96US+"!A;F0@82!N97<@<&%R7,@;V8@='5N:6YG('1H90H@("`@("`@("`@("`\5%0^ M8V]N9FEG=7)E+FEN/"]45#X@9FEL92!T;R!H86YD;&4@7!E7-T96US+"!T:&4@=F5N9&]R+7!R;W9I9&5D"B`@("`@ M("`@("`@(#Q45#YL97@\+U14/B!I7!E'1E6%C8SPO5%0^"B`@("`@("`@("`@ M(&]U='!U="P@8G5T('1H92!L;V-A=&EO;B!O9B!T:&%T(&AE861E7!A2!C7!E+`H@("`@("`@("`@ M("!A;F0@8V%U61C;"YH/"]4 M5#X@:&%S('1O(&AA;F1L90H@("`@("`@("`@("!T:&ES(&-A"!S M>7-T96US(&]N($EN=&5L(%!E;G1I=6T@86YD(%-U;@H@("`@("`@("`@("!3 M4$%20R!H87)D=V%R92!O;B!W:&EC:"!)('1E#PO5%0^+"!B=70@ M;F]T(&ET2`\5%0^;&5X/"]45#XZ(&]N($A0('-Y7-T96US+"!I="!C875S97,*("`@("`@ M("`@("`@/%14/FQE>#PO5%0^('1O(&AA;F<@:6X@86X@87!P87)E;G0@22]/ M('=A:70N("!)="!T;V]K"B`@("`@("`@("`@('-E=F5R86P@=')I97,@;VX@ M=F%R:6]U7-T96US(&)E9F]R92!)('-E='1L960@;VX@=&AE"B`@("`@ M("`@("`@(&-O9&4@9FEN86QL>2!U7-T96US+"!T:&5R92!I6%C8SPO M5%0^"B`@("`@("`@("`@('=H:6-H(')E7-T96TL(&5I=&AE6%C8RTY-#`S,C0N=&%R+F=Z(CX*("`@ M("`@("`@("`@("`@(&9T<#HO+W-O=7)C97=A2!V97)S:6]N(&]F"B`@("`@("`@ M("`@($=.52`\5%0^875T;V-O;F9I9SPO5%0^+"!A;F0@:&%S(&)U9R!F:7AE M6%C8SPO5%0^('9E2YE9'4O<'5B M+S1B2YE9'4O<'5B+S1B6%C8RTY-#`S M,C0O8GEA8V,O'1E'1E'1E'1E7!E M#PO5%0^(&%N9"`\5%0^>6%C8SPO5%0^+@H@("`@("`@("`@("`\5%0^8V]N M9FEG=7)E+FEN/"]45#X@:&%S(&$@2`\5%0^+6QF;#PO M5%0^(&ES(')E<75I6]U<@H@("`@("`@("`@("!S:71E(&AA M&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'README.html:' 'MD5 check failed' 501796dde8905738b8e5c09b52b43fca README.html SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'README.html'`" test 76436 -eq "$shar_count" || $echo 'README.html:' 'original size' '76436,' 'current size' "$shar_count!" fi fi # ============= acconfig.h ============== if test -f 'acconfig.h' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'acconfig.h' '(file already exists)' else $echo 'x -' extracting 'acconfig.h' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'acconfig.h' && /* This file is not included by any C file, but it is required by the GNU autoconfigure system to define additional symbols that might be referred to in the source code. */ X @BOTTOM@ X #undef HAVE_IBMPC SHAR_EOF $shar_touch -am 0602182398 'acconfig.h' && chmod 0644 'acconfig.h' || $echo 'restore of' 'acconfig.h' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'acconfig.h:' 'MD5 check failed' 7b981532a55135e63740fa90ab069556 acconfig.h SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'acconfig.h'`" test 202 -eq "$shar_count" || $echo 'acconfig.h:' 'original size' '202,' 'current size' "$shar_count!" fi fi # ============= args.h ============== if test -f 'args.h' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'args.h' '(file already exists)' else $echo 'x -' extracting 'args.h' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'args.h' && #if (defined(__cplusplus) || defined(__STDC__) || defined(c_plusplus)) #define NEW_STYLE 1 #define VOID void #define ARGS(parenthesized_list) parenthesized_list #else #define NEW_STYLE 0 #define VOID #define ARGS(parenthesized_list) () #define const #endif X #if !defined(EXIT_SUCCESS) #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #endif SHAR_EOF $shar_touch -am 0601095798 'args.h' && chmod 0644 'args.h' || $echo 'restore of' 'args.h' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'args.h:' 'MD5 check failed' 55c9505b974f991773b92dd0ab976a60 args.h SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'args.h'`" test 338 -eq "$shar_count" || $echo 'args.h:' 'original size' '338,' 'current size' "$shar_count!" fi fi # ============= bibdup.awk ============== if test -f 'bibdup.awk' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibdup.awk' '(file already exists)' else $echo 'x -' extracting 'bibdup.awk' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibdup.awk' && # /u/sy/beebe/tex/bibclean/lex/bibdup.awk, Thu Jan 14 07:14:47 1993 # Edit by Nelson H. F. Beebe # ======================================================================== # Find duplicate @string{...} definitions and duplicate citation keys # in a token stream from bibclean or biblex. # # Usage: # # bibclean -no-pretty bibfiles | tr A-Z a-z | nawk -f bibdup.awk # or # biblex bibfiles | tr A-Z a-z | nawk -f bibdup.awk # # [16-Jan-1993] # ======================================================================== X /^#/ { last_line = $0 } X $2 == "key" { X if ($3 in key) X printf("Duplicate key [%s]:\n\t%s\n\t%s\n", X $3, key[$3], last_line); X else X key[$3] = last_line; } X ($2 == "string") || ($2 == "entry") { last_entry = $3 } X ($2 == "abbrev") && (last_entry == "\"string\"") { X if ($3 in abbrev) X printf("Duplicate string abbreviation [%s]:\n\t%s\n\t%s\n", X $3, abbrev[$3], last_line); X else X abbrev[$3] = last_line; } SHAR_EOF $shar_touch -am 0116140893 'bibdup.awk' && chmod 0644 'bibdup.awk' || $echo 'restore of' 'bibdup.awk' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibdup.awk:' 'MD5 check failed' 910d0213b7288d18516daddfbb4d0bf0 bibdup.awk SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibdup.awk'`" test 987 -eq "$shar_count" || $echo 'bibdup.awk:' 'original size' '987,' 'current size' "$shar_count!" fi fi # ============= bibdup.sin ============== if test -f 'bibdup.sin' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibdup.sin' '(file already exists)' else $echo 'x -' extracting 'bibdup.sin' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibdup.sin' && #!/bin/sh # Find duplicate @string{...} definitions and duplicate citation keys # in one or more BibTeX .bib files. # # Usage: # bibdup bibfiles # # or # bibdup &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibdup.sin:' 'MD5 check failed' f62b60d0e29aefbe8a49cf12e4772807 bibdup.sin SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibdup.sin'`" test 554 -eq "$shar_count" || $echo 'bibdup.sin:' 'original size' '554,' 'current size' "$shar_count!" fi fi # ============= bibdup.man ============== if test -f 'bibdup.man' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibdup.man' '(file already exists)' else $echo 'x -' extracting 'bibdup.man' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibdup.man' && X.\" ==================================================================== X.\" @Troff-man-file{ X.\" author = "Nelson H. F. Beebe", X.\" version = "1.06", X.\" date = "23 September 2004", X.\" time = "15:01:05 MDT", X.\" filename = "bibdup.man", X.\" address = "University of Utah X.\" Department of Mathematics, 110 LCB X.\" 155 S 1400 E RM 233 X.\" Salt Lake City, UT 84112-0090 X.\" USA", X.\" telephone = "+1 801 581 5254", X.\" FAX = "+1 801 585 1640, +1 801 581 4148", X.\" URL = "http://www.math.utah.edu/~beebe", X.\" checksum = "23999 128 489 4224", X.\" email = "beebe@math.utah.edu, beebe@acm.org, X.\" beebe@computer.org (Internet)", X.\" codetable = "ISO/ASCII", X.\" keywords = "bibliography, BibTeX, lexical analysis", X.\" supported = "yes", X.\" docstring = "This file is the UNIX nroff/troff manual X.\" page documentation for bibdup, a tool for X.\" checking for duplicate abbreviations and X.\" keys in BibTeX bibliography data base X.\" files. X.\" X.\" The checksum field above contains a CRC-16 X.\" checksum as the first value, followed by the X.\" equivalent of the standard UNIX wc (word X.\" count) utility output of lines, words, and X.\" characters. This is produced by Robert X.\" Solovay's checksum utility.", X.\" } X.\"===================================================================== X.\" X.if t .ds Bi B\s-2IB\s+2T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X X.if n .ds Bi BibTeX X.\" X.\"===================================================================== X.TH BIBDUP 1 "23 September 2004" "Version 1.06" X.\"===================================================================== X.SH NAME bibdup \- check for duplicate abbreviations and entries in BibTeX \ bibliography data base files X.\"===================================================================== X.SH SYNOPSIS X.B bibdup X.I "outfile" X.nf or X.fi X.B bibdup X.I "bibfile1 bibfile2 bibfile3 .\|.\|." X.I ">outfile" X.\"===================================================================== X.SH DESCRIPTION X.B bibdup uses X.BR biblex (1) to lexically analyze \*(Bi files and X.BR nawk (1) to check for duplicate @String{.\|.\|.} abbreviations, and duplicate citation keys. Letter case is ignored in string comparisons, by the simple expedient of using X.BR tr (1) to convert the lexical token stream output by X.BR biblex (1) to lower case. X.PP Duplicates are displayed on the standard output in the form X.RS X.nf Duplicate string abbreviation ["pub-aw"]: X # line 1 "ll.bib" X # line 141 "master.bib" Duplicate key ["lamport:ldp85"]: X # line 4 "ll.bib" X # line 4172 "master.bib" \&.\|.\|. X.fi X.RE ANSI/ISO Standard C preprocessor lines identify the line number and file name where the duplicates are detected. X.\"===================================================================== X.SH "SEE ALSO" X.BR bibcheck (1), X.BR bibclean (1), X.BR bibextract (1), X.BR bibjoin (1), X.BR biblabel (1), X.BR biblex (1), X.BR biborder (1), X.BR bibparse (1), X.BR bibsort (1), X.BR bibtex (1), X.BR bibunlex (1), X.BR citefind (1), X.BR citesub (1), X.BR citetags (1), X.BR latex (1), X.BR nawk (1), X.BR scribe (1), X.BR tex (1), X.BR tr (1). X.\"===================================================================== X.SH AUTHOR X.nf Nelson H. F. Beebe University of Utah Department of Mathematics, 110 LCB 155 S 1400 E RM 233 Salt Lake City, UT 84112-0090 USA Email: \fCbeebe@math.utah.edu\fP, \fCbeebe@acm.org\fP, \fCbeebe@computer.org\fP (Internet) WWW URL: \fChttp://www.math.utah.edu/~beebe\fP Telephone: +1 801 581 5254 FAX: +1 801 581 4148 X.fi X.\"===================================================================== X.\" This is for GNU Emacs file-specific customization: X.\" Local Variables: X.\" fill-column: 50 X.\" End: SHAR_EOF $shar_touch -am 09231501104 'bibdup.man' && chmod 0644 'bibdup.man' || $echo 'restore of' 'bibdup.man' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibdup.man:' 'MD5 check failed' 3cfd0bd25ff2f150b95d7430a0a06387 bibdup.man SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibdup.man'`" test 4224 -eq "$shar_count" || $echo 'bibdup.man:' 'original size' '4224,' 'current size' "$shar_count!" fi fi # ============= bibfiles.sok ============== if test -f 'bibfiles.sok' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibfiles.sok' '(file already exists)' else $echo 'x -' extracting 'bibfiles.sok' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibfiles.sok' && 1.030s 2.403s 3.313s 3.786s 336MHz 4MB ABBREV BIBDUP BIBLEX BIBPARSE BIBT BIBTEX BIBUNLEX Bi BibTeX C CRC E Emacs Email F FAX H INLINE ISBN ISSN LBRACE LCB MDT MST NUL RBRACE S Sc Solovay's TUGboat Te TeX UPPERCASE URL UltraSPARC WWW XX XXSI acm.org aw awk beebe bibcheck bibclean bibdup bibdup.man bibextract bibfile1 bibfile2 bibfile3 bibindex bibjoin biblabel biblex biblex.man biblook biborder bibparse bibparse.man bibsearch bibsort bibtex bibunlex bibunlex.man citefind citesub citetags codetable conformant desktop docstring e email file1 file2 file3 g groff http ieee.org infile lamport:ldp85 lhs ll.bib lowercase master.bib math.utah.edu mylib.bib nawk new.bib nocite nonassoc prettyprint prettyprinted prettyprinters prettyprinting s tex texbook1.bib www.math.utah.edu SHAR_EOF $shar_touch -am 09231507104 'bibfiles.sok' && chmod 0644 'bibfiles.sok' || $echo 'restore of' 'bibfiles.sok' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibfiles.sok:' 'MD5 check failed' 7a7af6ef5c597ba555151e94d2a77e52 bibfiles.sok SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibfiles.sok'`" test 777 -eq "$shar_count" || $echo 'bibfiles.sok:' 'original size' '777,' 'current size' "$shar_count!" fi fi # ============= biblex.dat ============== if test -f 'biblex.dat' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'biblex.dat' '(file already exists)' else $echo 'x -' extracting 'biblex.dat' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'biblex.dat' && @Book{Lamport:LDP85, X title = "{\LaTeX}---A Document X Preparation System---User's X Guide and Reference Manual", } X @String{pub-AW = X "Ad{\-d}i{\-s}on-Wes{\-l}ey"} X @Book{Lamport:LDP85, X author = "Leslie Lamport", X title = "{\LaTeX}---A Document X Preparation System---User's X Guide and Reference Manual", X publisher = pub-AW, X year = "1985", X ISBN = "0-201-15790-X", } SHAR_EOF $shar_touch -am 0205103199 'biblex.dat' && chmod 0444 'biblex.dat' || $echo 'restore of' 'biblex.dat' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'biblex.dat:' 'MD5 check failed' 5caa60d5df2ec76301f1f66bdc825b10 biblex.dat SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'biblex.dat'`" test 457 -eq "$shar_count" || $echo 'biblex.dat:' 'original size' '457,' 'current size' "$shar_count!" fi fi # ============= biblex.l ============== if test -f 'biblex.l' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'biblex.l' '(file already exists)' else $echo 'x -' extracting 'biblex.l' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'biblex.l' && X /* bibparse - parse BibTeX file according to prototype grammar */ %{ X /********************************************************************** X @Lex-file{ X author = "Nelson H. F. Beebe", X version = "1.06", X date = "23 September 2004", X time = "15:05:42 MDT", X filename = "biblex.l", X address = "University of Utah X Department of Mathematics, 110 LCB X 155 S 1400 E RM 233 X Salt Lake City, UT 84112-0090 X USA", X telephone = "+1 801 581 5254", X FAX = "+1 801 581 4148", X URL = "http://www.math.utah.edu/~beebe", X checksum = "54607 623 1413 12993", X email = "beebe@math.utah.edu, beebe@acm.org, X beebe@computer.org (Internet)", X codetable = "ISO/ASCII", X keywords = "BibTeX, bibliography, lexical analysis, lexer", X supported = "yes", X docstring = "This lex file defines a lexical analyzer for X a prototype BibTeX grammar. X X The resulting program reads one or more X BibTeX files specified on the command line, X or standard input, and produces on the X standard output a stream of tokens of the X form X X X X This is similar to the format produced by X bibclean with the -no-prettyprint option. X X Such token lines are interspersed with X input line identifier lines of the form X used by the ANSI/ISO Standard C preprocessor X X # line 3 X X so that the error diagnostics can identify X the location in the input file(s). X X The output stream can be filtered by other X utilities, and reconstructed into a BibTeX X file with an associated software tool, X bibunlex. X X The checksum field above contains a CRC-16 X checksum as the first value, followed by the X equivalent of the standard UNIX wc (word X count) utility output of lines, words, and X characters. This is produced by Robert X Solovay's checksum utility.", X } X **********************************************************************/ X #include X #include #include #include X #if defined(HAVE_STDLIB_H) #include #endif X #include "args.h" #include "bibyydcl.h" X #include "token.h" X static void compact_space ARGS((void)); static void eof_error ARGS((void)); static int next_char ARGS((void)); static token_t out_braced_literal ARGS((void)); static token_t out_braced_string ARGS((void)); static token_t out_lbrace ARGS((void)); static token_t out_lparen ARGS((void)); static token_t out_protected_string ARGS((token_t t)); static token_t out_rbrace ARGS((void)); static token_t out_rparen ARGS((void)); static token_t out_string ARGS((void)); static token_t out_token ARGS((token_t t_)); static void overflow ARGS((void)); X static int brace_level = 0; int do_lex_output = 1; static token_t last_object = TOKEN_UNKNOWN; static token_t last_token = TOKEN_UNKNOWN; long line_number = 1L; /* global: used in lexmain() */ static int paren_level = 0; const char *the_filename = ""; /* global: used in lexmain() */ X #define BYTE_VAL(c) ((unsigned int)((c) & 0xff)) #define EOFILE 0 /* end-of-file from lex input() */ #define ISPRINT(c) isprint(BYTE_VAL(c)) /* ensure arg in 0..255 */ #define ISDIGIT(c) isdigit(BYTE_VAL(c)) #define ISSPACE(c) isspace(BYTE_VAL(c)) #define RETURN(n) return (1000 + (n)) /* bibparse.y biases by 1000 */ X #undef YYLMAX X #if defined(HAVE_IBMPC) #define YYLMAX 32760 #else #define YYLMAX BIBYYLMAX #endif X %} X /* increase transition and output table sizes */ %a 3000 %o 6000 X /* abbrev, entry, key, field name syntax */ N [A-Za-z][-A-Za-z0-9:.+/']* X /* BibTeX entry opening delimiter */ O [({] X /* one white space character */ X /* \013 == \v, but lex doesn't */ X /* recognize \v */ W [ \f\r\t\013] X /* optional `horizontal' space */ S {W}* X %% [@] RETURN (out_token(TOKEN_AT)); X [Cc][Oo][Mm][Mm][Ee][Nn][Tt] {RETURN ((last_token == TOKEN_AT) ? X out_token(TOKEN_COMMENT) : X out_token(TOKEN_ABBREV)); } X [Ii][Nn][Cc][Ll][Uu][Dd][Ee] {RETURN ((last_token == TOKEN_AT) ? X out_token(TOKEN_INCLUDE) : X out_token(TOKEN_ABBREV)); } X [Pp][Rr][Ee][Aa][Mm][Bb][Ll][Ee] { RETURN ((last_token == TOKEN_AT) ? X out_token(TOKEN_PREAMBLE) : X out_token(TOKEN_ABBREV)); } X [Ss][Tt][Rr][Ii][Nn][Gg] { RETURN ((last_token == TOKEN_AT) ? X out_token(TOKEN_STRING) : X out_token(TOKEN_ABBREV)); } X {N} { X if (last_object == TOKEN_STRING) X RETURN(out_token(TOKEN_ABBREV)); X switch (last_token) X { X case TOKEN_COMMA: X RETURN(out_token(TOKEN_FIELD)); X case TOKEN_LBRACE: X RETURN(out_token(TOKEN_KEY)); X case TOKEN_AT: X RETURN(out_token(TOKEN_ENTRY)); X default: X RETURN(out_token(TOKEN_ABBREV)); X } X } X [0-9]+ RETURN (out_token(TOKEN_VALUE)); X [%].*[\n]{S} RETURN (out_token(TOKEN_INLINE)); X [#] RETURN (out_token(TOKEN_SHARP)); X ["] RETURN (out_string()); X [{] RETURN (out_lbrace()); X [}] RETURN (out_rbrace()); X [(] RETURN (out_lparen()); X [)] RETURN (out_rparen()); X [=] RETURN (out_token(TOKEN_EQUALS)); X [,] RETURN (out_token(TOKEN_COMMA)); X [\n] RETURN (out_token(TOKEN_NEWLINE)); X {W}+ RETURN (out_token(TOKEN_SPACE)); X X. RETURN (out_token(TOKEN_LITERAL)); X %% static void compact_space(VOID) /* compact runs of space to single blank */ { X char *p; X char *q; X X for (p = q = (char*)&yytext[0]; *p ; ) X { X *q++ = ISSPACE(*p) ? ' ' : *p; X if (ISSPACE(*p)) X { X while (ISSPACE(*p)) X ++p; X } X else X ++p; X } X *q = '\0'; } X X static void eof_error(VOID) { X (void)fprintf(stderr,"End-of-file in value string\n"); X exit(EXIT_FAILURE); } X X static int next_char(VOID) { X int c; X X c = input(); X if ((c == EOFILE) || (c == EOF)) /* lex uses EOFILE, flex uses EOF */ X eof_error(); X else if (c == '\n') X line_number++; X X return (c); } X X static token_t out_braced_literal(VOID) { X int c; X int n; X int plevel = paren_level; X X for (n = 1; brace_level > 0; ) X { X c = next_char(); X if (c == EOF) X break; X if (n > (YYLMAX - 2)) X overflow(); X yytext[n++] = c; X switch (c) X { X case '(': X plevel++; X break; X case ')': X plevel--; X break; X case '{': X brace_level++; X break; X case '}': X brace_level--; X break; X default: X break; X } X if ((paren_level > 0) && (plevel == 0)) X break; X } X yytext[0] = '{'; X yytext[n-1] = '}'; X yytext[n] = '\0'; X return (out_token(TOKEN_LITERAL)); } X X static token_t out_braced_string(VOID) { /* convert braced to quoted string */ X int blevel; X int c; X int n; X X for (blevel = 1, n = 1; (blevel > 0); ) X { X c = next_char(); X if (c == EOF) X break; X if (n > (YYLMAX - 5)) X overflow(); X yytext[n++] = c; X switch (c) X { X case '{': X blevel++; X break; X X case '}': X blevel--; X break; X X case '"': X if (blevel == 1) X { X if (yytext[n-2] == '\\') X { X c = next_char(); X if (c == EOF) X break; X yytext[n-2] = '{'; X yytext[n-1] = '\\'; X yytext[n++] = '"'; X yytext[n++] = c; X yytext[n++] = '}'; X } X else X { X yytext[n-1] = '{'; X yytext[n++] = '"'; X yytext[n++] = '}'; X } X } X break; X X default: X break; X } X } X yytext[0] = '"'; X yytext[n-1] = '"'; X yytext[n] = '\0'; X return (out_token(TOKEN_VALUE)); } X X static token_t out_lbrace(VOID) { X if (brace_level == 0) X { X brace_level++; X switch (last_object) X { X case TOKEN_COMMENT: X case TOKEN_INCLUDE: X return (out_braced_literal()); X default: X return (out_token(TOKEN_LBRACE)); X } X } X else X return (out_braced_string()); } X X static token_t out_lparen(VOID) { X switch (last_token) X { X case TOKEN_ENTRY: X case TOKEN_PREAMBLE: X case TOKEN_STRING: X yytext[0] = '{'; X paren_level++; X brace_level++; X return (out_token(TOKEN_LBRACE)); X X case TOKEN_COMMENT: X case TOKEN_INCLUDE: X yytext[0] = '{'; X paren_level++; X brace_level++; X return (out_braced_literal()); X X default: X return (out_token(TOKEN_LITERAL)); X } } X X #if NEW_STYLE static token_t out_protected_string(token_t t) #else /* K&R style */ static token_t out_protected_string(t) token_t t; #endif /* NEW_STYLE */ { X char octal[4 + 1]; X const char *token = (const char*)&yytext[0]; X X if (*token == (char)'\0') /* ignore empty tokens */ X return (TOKEN_VALUE); X output('"'); X if ((yytext[0] != '"') && (t == TOKEN_VALUE)) X { /* supply missing quote delimiters */ X output('\\'); X output('\"'); X } X for (; *token; ++token) X { X switch (*token) X { X case '"': X case '\\': X output('\\'); X output(*token); X break; X case '\b': X output('\\'); X output('b'); X break; X case '\f': X output('\\'); X output('f'); X break; X case '\n': X output('\\'); X output('n'); X break; X case '\r': X output('\\'); X output('r'); X break; X case '\t': X output('\\'); X output('t'); X break; X case '\v': X output('\\'); X output('v'); X break; X default: X if (ISPRINT(*token)) X output(*token); X else X { X (void)sprintf(octal,"\\%03o",BYTE_VAL(*token)); X output(octal[0]); X output(octal[1]); X output(octal[2]); X output(octal[3]); X } X break; X } X } X if ((yytext[0] != '"') && (t == TOKEN_VALUE)) X { /* supply missing quote delimiters */ X output('\\'); X output('\"'); X } X output('"'); X output('\n'); X return (TOKEN_VALUE); } X X static token_t out_rbrace(VOID) { X if (brace_level == 1) X { X brace_level--; X return (out_token(TOKEN_RBRACE)); X } X else X return (out_token(TOKEN_LITERAL)); } X X static token_t out_rparen(VOID) { X paren_level--; X if (paren_level == 0) X { X yytext[0] = '}'; X brace_level--; X return (out_token(TOKEN_RBRACE)); X } X else X return (out_token(TOKEN_LITERAL)); } X X static token_t out_string(VOID) { X int blevel; X int c; X int n; X X for (blevel = 0, n = 1; ; ) X { X c = next_char(); X if (c == EOF) X break; X if (n > (YYLMAX - 2)) X overflow(); X yytext[n++] = c; X switch (c) X { X case '{': X blevel++; X break; X case '}': X blevel--; X break; X case '"': X if (blevel == 0) X goto LOOP_EXIT; X default: X break; X } X } X LOOP_EXIT: X yytext[n++] = '\0'; X return (out_token(TOKEN_VALUE)); } X X #if NEW_STYLE static token_t out_token(token_t t) #else /* K&R style */ static token_t out_token(t) token_t t; #endif /* NEW_STYLE */ { /* ALL token output is directed through this function */ X int n; X X if (do_lex_output) X (void)printf("%d\t%s\t", (int)t, type_name[(int)t]); X switch (t) X { X case TOKEN_AT: X last_object = TOKEN_UNKNOWN; X if (do_lex_output) X (void)printf("\"%s\"\n", yytext); X break; X X case TOKEN_VALUE: X if (do_lex_output) X { X if (ISDIGIT(yytext[0])) X { /* supply surrounding quotes */ X n = strlen((const char*)&yytext[0]); X if ((n + 3) > YYLMAX) X overflow(); X yytext[n+2] = '\0'; X yytext[n+1] = '"'; X for (; n > 0; --n) X yytext[n] = yytext[n-1]; X } X else X compact_space(); X out_protected_string(t); X } X break; X X case TOKEN_COMMENT: X case TOKEN_INCLUDE: X if (do_lex_output) X out_protected_string(t); X last_object = t; X break; X X case TOKEN_ENTRY: X case TOKEN_PREAMBLE: X case TOKEN_STRING: X if (do_lex_output) X (void)printf("\"%s\"\n", yytext); X last_object = t; X break; X X case TOKEN_FIELD: X case TOKEN_KEY: X if (do_lex_output) X (void)printf("\"%s\"\n", yytext); X break; X X case TOKEN_INLINE: X case TOKEN_NEWLINE: X line_number++; X if (do_lex_output) X { X out_protected_string(t); X (void)printf("# line %ld \"%s\"\n", line_number, the_filename); X } X break; X X case TOKEN_LITERAL: X default: X if (do_lex_output) X out_protected_string(t); X break; X } X if (!((t == TOKEN_INLINE) || X (t == TOKEN_SPACE) || X (t == TOKEN_NEWLINE))) X last_token = t; /* remember last non-space token type */ X return (t); } X X static void overflow(VOID) { X (void)fprintf(stderr, X "String too long for %ld-character buffer\n",YYLMAX); X exit (EXIT_FAILURE); } X X #if defined(HAVE_IBMPC) int yywrap(VOID) { X return 1; } #endif SHAR_EOF $shar_touch -am 09231505104 'biblex.l' && chmod 0644 'biblex.l' || $echo 'restore of' 'biblex.l' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'biblex.l:' 'MD5 check failed' 58d94488d851550183f59d209f03eece biblex.l SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'biblex.l'`" test 12993 -eq "$shar_count" || $echo 'biblex.l:' 'original size' '12993,' 'current size' "$shar_count!" fi fi # ============= biblex.man ============== if test -f 'biblex.man' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'biblex.man' '(file already exists)' else $echo 'x -' extracting 'biblex.man' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'biblex.man' && X.\"===================================================================== X.\" @Troff-man-file{ X.\" author = "Nelson H. F. Beebe", X.\" version = "1.06", X.\" date = "23 September 2004", X.\" time = "15:02:19 MDT", X.\" filename = "biblex.man", X.\" address = "University of Utah X.\" Department of Mathematics, 110 LCB X.\" 155 S 1400 E RM 233 X.\" Salt Lake City, UT 84112-0090 X.\" USA", X.\" telephone = "+1 801 581 5254", X.\" FAX = "+1 801 581 4148", X.\" URL = "http://www.math.utah.edu/~beebe", X.\" checksum = "18684 236 926 6983", X.\" email = "beebe@math.utah.edu, beebe@acm.org, X.\" beebe@computer.org (Internet)", X.\" codetable = "ISO/ASCII", X.\" keywords = "bibliography, BibTeX, lexical analysis", X.\" supported = "yes", X.\" docstring = "This file is the UNIX nroff/troff manual X.\" page documentation for biblex, a tool for X.\" lexically analyzing BibTeX bibliography X.\" data base files into a token stream that X.\" can be conveniently processed by other X.\" tools, or reconstructed into a BibTeX file X.\" by bibunlex. X.\" X.\" The checksum field above contains a CRC-16 X.\" checksum as the first value, followed by the X.\" equivalent of the standard UNIX wc (word X.\" count) utility output of lines, words, and X.\" characters. This is produced by Robert X.\" Solovay's checksum utility.", X.\" } X.\"===================================================================== X.\" X.if t .ds Bi B\s-2IB\s+2T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X X.if n .ds Bi BibTeX X.\" X.if t .ds Sc S\s-2CRIBE\s+2 X.if n .ds Sc Scribe X.\" X.\"===================================================================== X.TH BIBLEX 1 "23 September 2004" 1.06" X.\"===================================================================== X.SH NAME biblex \- lexically analyze BibTeX bibliography data base files X.\"===================================================================== X.SH SYNOPSIS X.B biblex X.I "outfile" X.nf or X.fi X.B biblex X.I "bibfile1 bibfile2 bibfile3 .\|.\|." X.I ">outfile" X.\"===================================================================== X.SH DESCRIPTION X.B biblex converts one or more bibliography data base files in \*(Bi format to a lexical token stream that is convenient for processing by other tools. X.PP The companion X.BR bibunlex (1) program can be used to recombine such a token stream back into a \*(Bi file. X.PP \*(Sc-format bibliography files can be handled as well if they are first converted to \*(Bi form by X.BR bibclean (1). X.PP Only minimal checks are made on the correctness of the input stream, and X.B biblex will happily carry out a lexical analysis of nonsensical input, without issuing warnings or errors of any kind, other than possible internal string buffer overflow. To verify that X.BR biblex 's output token stream is meaningful, the input files can be given to X.BR bibparse (1) for parsing analysis according to a proposed grammar for \*(Bi. X.\"===================================================================== X.SH "LEXICAL ANALYSIS" X.B biblex produces output in lines of the form X.PP X.RS X.nf "" X.fi X.RE X.PP Each output line contains a single complete token, identified by a small integer number for use by a computer program, a token type name for human readers, and a string value in quotes. X.PP Special characters in the token value string are represented with ANSI/ISO Standard C escape sequences, so all characters other than NUL are representable, and multi-line values can be represented in a single line. X.PP Here are the token numbers and token type names that can appear in the output: X.PP X.RS X.nf X 0 UNKNOWN X 1 ABBREV X 2 AT X 3 COMMA X 4 COMMENT X 5 ENTRY X 6 EQUALS X 7 FIELD X 8 INCLUDE X 9 INLINE 10 KEY 11 LBRACE 12 LITERAL 13 NEWLINE 14 PREAMBLE 15 RBRACE 16 SHARP 17 SPACE 18 STRING 19 VALUE X.fi X.RE X.PP Programs that parse such output should also be prepared for lines beginning with the warning prefix, %%, or the error prefix, ??, and for ANSI/ISO Standard C line number directives of the form X.RS # line 273 "texbook1.bib" X.RE which record the line number and file name of the current input file. X.PP As an example of the use of X.BR biblex , the UNIX command pipeline X.RS X.nf \fBbiblex\fP \fImylib.bib\fP | \e X \fBawk\fP '$2 == "KEY" {print $3}' | \e X \fBsed\fP -e 's/"//g' | \e X \fBsort\fP X.fi X.RE will extract a sorted list of all citation keys in the file X.IR mylib.bib . X.PP The LITERAL token type is used for arbitrary text that X.B biblex does not examine further, such as the contents of a @Preamble{.\|.\|.} or a @Comment{.\|.\|.}. X.PP The UNKNOWN token type should never appear in the output stream. It is used internally to initialize token type variables. X.\"===================================================================== X.SH BUGS Limitations of the X.BR lex (1) lexical analyzer generator used to construct X.B biblex prevent handling of files containing ASCII NUL; that character will be interpreted as an end-of-file condition. X.PP Older versions of X.BR lex (1) are not X.IR "8-bit clean" ; they will not reliably handle characters 128\(en255. This latter deficiency is being remedied by the XX/Open Consortium activities to internationalize and standard UNIX applications. X.\"===================================================================== X.SH "SEE ALSO" X.BR bibcheck (1), X.BR bibclean (1), X.BR bibdup (1), X.BR bibextract (1), X.BR bibjoin (1), X.BR biblabel (1), X.BR biborder (1), X.BR bibparse (1), X.BR bibsearch (1), X.BR bibsort (1), X.BR bibtex (1), X.BR bibunlex (1), X.BR citefind (1), X.BR citesub (1), X.BR citetags (1), X.BR latex (1), X.BR scribe (1), X.BR tex (1). X.br XX/Open Company, Ltd., X.IR "X/Open Portability Guide, XSI Commands and Utilities" , volume 1. Prentice-Hall, Englewood Cliffs, NJ 07632, USA, 1989. ISBN 0-13-685835-X. X.\"===================================================================== X.SH AUTHOR X.nf Nelson H. F. Beebe University of Utah Department of Mathematics, 110 LCB 155 S 1400 E RM 233 Salt Lake City, UT 84112-0090 USA Email: \fCbeebe@math.utah.edu\fP, \fCbeebe@acm.org\fP, \fCbeebe@computer.org\fP (Internet) WWW URL: \fChttp://www.math.utah.edu/~beebe\fP Telephone: +1 801 581 5254 FAX: +1 801 581 4148 X.fi X.\"===================================================================== X.\" This is for GNU Emacs file-specific customization: X.\" Local Variables: X.\" fill-column: 50 X.\" End: SHAR_EOF $shar_touch -am 09231502104 'biblex.man' && chmod 0644 'biblex.man' || $echo 'restore of' 'biblex.man' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'biblex.man:' 'MD5 check failed' 851fc7059f1b364aa92e591401b1f286 biblex.man SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'biblex.man'`" test 6983 -eq "$shar_count" || $echo 'biblex.man:' 'original size' '6983,' 'current size' "$shar_count!" fi fi # ============= biblex.ok ============== if test -f 'biblex.ok' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'biblex.ok' '(file already exists)' else $echo 'x -' extracting 'biblex.ok' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'biblex.ok' && # line 1 "stdin" 2 AT "@" 5 ENTRY "Book" 11 LBRACE "{" 10 KEY "Lamport:LDP85" 3 COMMA "," 13 NEWLINE "\n" # line 2 "stdin" 17 SPACE " " 7 FIELD "title" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 19 VALUE "\"{\\LaTeX}---A Document Preparation System---User's Guide and Reference Manual\"" 3 COMMA "," 13 NEWLINE "\n" # line 5 "stdin" 15 RBRACE "}" 13 NEWLINE "\n" # line 6 "stdin" 13 NEWLINE "\n" # line 7 "stdin" 2 AT "@" 18 STRING "String" 11 LBRACE "{" 1 ABBREV "pub-AW" 17 SPACE " " 6 EQUALS "=" 13 NEWLINE "\n" # line 8 "stdin" 17 SPACE " " 19 VALUE "\"Ad{\\-d}i{\\-s}on-Wes{\\-l}ey\"" 15 RBRACE "}" 13 NEWLINE "\n" # line 9 "stdin" 13 NEWLINE "\n" # line 10 "stdin" 2 AT "@" 5 ENTRY "Book" 11 LBRACE "{" 10 KEY "Lamport:LDP85" 3 COMMA "," 13 NEWLINE "\n" # line 11 "stdin" 17 SPACE " " 7 FIELD "author" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 19 VALUE "\"Leslie Lamport\"" 3 COMMA "," 13 NEWLINE "\n" # line 12 "stdin" 17 SPACE " " 7 FIELD "title" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 19 VALUE "\"{\\LaTeX}---A Document Preparation System---User's Guide and Reference Manual\"" 3 COMMA "," 13 NEWLINE "\n" # line 15 "stdin" 17 SPACE " " 7 FIELD "publisher" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 1 ABBREV "pub-AW" 3 COMMA "," 13 NEWLINE "\n" # line 16 "stdin" 17 SPACE " " 7 FIELD "year" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 19 VALUE "\"1985\"" 3 COMMA "," 13 NEWLINE "\n" # line 17 "stdin" 17 SPACE " " 7 FIELD "ISBN" 17 SPACE " " 6 EQUALS "=" 17 SPACE " " 19 VALUE "\"0-201-15790-X\"" 3 COMMA "," 13 NEWLINE "\n" # line 18 "stdin" 15 RBRACE "}" 13 NEWLINE "\n" # line 19 "stdin" SHAR_EOF $shar_touch -am 0205103199 'biblex.ok' && chmod 0444 'biblex.ok' || $echo 'restore of' 'biblex.ok' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'biblex.ok:' 'MD5 check failed' e748ed843ff2723b088a186e17945787 biblex.ok SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'biblex.ok'`" test 1622 -eq "$shar_count" || $echo 'biblex.ok:' 'original size' '1622,' 'current size' "$shar_count!" fi fi # ============= bibparse.man ============== if test -f 'bibparse.man' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibparse.man' '(file already exists)' else $echo 'x -' extracting 'bibparse.man' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibparse.man' && X.\" ==================================================================== X.\" @Troff-man-file{ X.\" author = "Nelson H. F. Beebe", X.\" version = "1.06", X.\" date = "23 September 2004", X.\" time = "15:02:52 MDT", X.\" filename = "bibparse.man", X.\" address = "University of Utah X.\" Department of Mathematics, 110 LCB X.\" 155 S 1400 E RM 233 X.\" Salt Lake City, UT 84112-0090 X.\" USA", X.\" telephone = "+1 801 581 5254", X.\" FAX = "+1 801 581 4148", X.\" URL = "http://www.math.utah.edu/~beebe", X.\" checksum = "15027 450 1781 15536", X.\" email = "beebe@math.utah.edu, beebe@acm.org, X.\" beebe@computer.org (Internet)", X.\" codetable = "ISO/ASCII", X.\" keywords = "bibliography, BibTeX, lexical analysis", X.\" supported = "yes", X.\" docstring = "This file is the UNIX nroff/troff manual X.\" page documentation for bibparse, a tool for X.\" parsing the lexical analysis output of X.\" bibclean or biblex from BibTeX and Scribe X.\" bibliography data base files, or BibTeX and X.\" Scribe files directly, to verify that they X.\" conform to a proposed grammar for BibTeX. X.\" X.\" The checksum field above contains a CRC-16 X.\" checksum as the first value, followed by the X.\" equivalent of the standard UNIX wc (word X.\" count) utility output of lines, words, and X.\" characters. This is produced by Robert X.\" Solovay's checksum utility.", X.\" } X.\"===================================================================== X.\" X.if t .ds Bi B\s-2IB\s+2T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X X.if n .ds Bi BibTeX X.\" X.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X X.if n .ds Te TeX X.\" X.\"===================================================================== X.TH BIBPARSE 1 "23 September 2004" "Version 1.06" X.\"===================================================================== X.SH NAME bibparse \- verify a bibclean or biblex lexical token stream, or BibTeX files X.\"===================================================================== X.SH SYNOPSIS X.B bibparse [ X.B \-d ] X.I "&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibparse.man:' 'MD5 check failed' fabd0c04f0df43dd38965c1cc4318fcd bibparse.man SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibparse.man'`" test 15536 -eq "$shar_count" || $echo 'bibparse.man:' 'original size' '15536,' 'current size' "$shar_count!" fi fi # ============= bibparse.y ============== if test -f 'bibparse.y' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibparse.y' '(file already exists)' else $echo 'x -' extracting 'bibparse.y' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibparse.y' && %{ X /********************************************************************** X @Yacc-file{ X author = "Nelson H. F. Beebe", X version = "1.06", X date = "23 September 2004", X time = "15:06:41 MDT", X filename = "bibparse.y", X address = "University of Utah X Department of Mathematics, 110 LCB X 155 S 1400 E RM 233 X Salt Lake City, UT 84112-0090 X USA", X telephone = "+1 801 581 5254", X FAX = "+1 801 581 4148", X URL = "http://www.math.utah.edu/~beebe", X checksum = "19519 556 1660 13859", X email = "beebe@math.utah.edu, beebe@acm.org, X beebe@computer.org (Internet)", X codetable = "ISO/ASCII", X keywords = "BibTeX, bibliography, lexical analysis, lexer, X parsing, parser", X supported = "yes", X docstring = "This yacc file defines a parser for a X prototype BibTeX grammar. X X The resulting program reads BibTeX data, X and/or BibTeX lexical token streams produced X by biblex or bibclean, from one or more files X specified on the command line, or standard X input, and parses the token stream to verify X its conformance to the BibTeX grammar. X X If a command-line -d (or -D) option is X specified, debug mode is selected, and X extensive commentary on the parsing actions X will be output. It will be necessary to X have a copy of the y.output file produced X by bison or lex in order to make sense out X of the state and rule numbers in this X output. X X The checksum field above contains a CRC-16 X checksum as the first value, followed by the X equivalent of the standard UNIX wc (word X count) utility output of lines, words, and X characters. This is produced by Robert X Solovay's checksum utility.", X } X **********************************************************************/ X #include X #include #include #include X #if defined(HAVE_STDLIB_H) #include #endif X #if HAVE_ALLOCA_H X /* needed for alloca() macro definition if bison is used instead of yacc */ #include #endif X #include "args.h" #include "bibyydcl.h" X static void doparse ARGS((void)); int main ARGS((int argc_, char *argv_[])); static int nextchar ARGS((void)); static void recognize ARGS((const char *s_)); int yyparse ARGS((void)); static void yywarning ARGS((const char *s_)); X #if defined(__cplusplus) extern "C" { #endif X static int (*pyylex) ARGS((void)); int xxlex ARGS((void)); int zzlex ARGS((void)); X #if defined(__cplusplus) } #endif X int error_count; char *program_name; /* for error messages */ X /* These variables are defined in biblex.c: */ extern int do_lex_output; extern long line_number; extern const char *the_filename; extern char yytext[BIBYYLMAX]; X #define ERROR_PREFIX "??" /* this prefixes all error messages */ #define WARNING_PREFIX "%%" /* this prefixes all warning messages */ X #define RECOGNIZE(s) recognize(s) X #define YYDEBUG 1 /* need for -d option support */ X #if defined(_CRAY) extern long yydebug; #else extern int yydebug; #endif X %} %token TOKEN_ABBREV 1 %token TOKEN_AT 2 %token TOKEN_COMMA 3 %token TOKEN_COMMENT 4 %token TOKEN_ENTRY 5 %token TOKEN_EQUALS 6 %token TOKEN_FIELD 7 %token TOKEN_INCLUDE 8 %token TOKEN_INLINE 9 %token TOKEN_KEY 10 %token TOKEN_LBRACE 11 %token TOKEN_LITERAL 12 %token TOKEN_NEWLINE 13 %token TOKEN_PREAMBLE 14 %token TOKEN_RBRACE 15 %token TOKEN_SHARP 16 %token TOKEN_SPACE 17 %token TOKEN_STRING 18 %token TOKEN_VALUE 19 X X /********************************************************************** X Without the following precedence specifications, the BibTeX grammar X is ambiguous, since the two productions X X bibtex_value: bibtex_value bibtex_space TOKEN_SHARP X bibtex_simple_value X X bibtex_assignment: bibtex_assignment_lhs TOKEN_EQUALS bibtex_value X X result in a shift/reduce conflict when the input stack contains X X bibtex_assignment_lhs TOKEN_EQUALS bibtex_value X X and the next token is one of the bibtex_space tokens. We could shift X that token to match the start of the bibtex_value production, or we X could reduce to bibtex_assignment using the second production. X X The way to remove the ambiguity is described in the book X X @String{pub-PH = "Pren{\-}tice-Hall"} X @String{pub-PH:adr = "Englewood Cliffs, NJ 07632, USA"} X X @Book{Holub:CDC90, X author = "Allen I. Holub", X title = "Compiler Design in {C}", X publisher = pub-PH, X address = pub-PH:adr, X year = "1990", X note = pub-PH # " Software Series, Editor: Brian W. X Kernighan.", X ISBN = "0-13-155045-4", X } X X on pp. 871--875. X X The authors of the book X X @String{pub-AW = "Ad{\-d}i{\-s}on-Wes{\-l}ey"} X @String{pub-AW:adr = "Reading, MA, USA"} X X @Book{Aho:CPT86, X author = "Alfred V. Aho and Ravi Sethi and Jeffrey D. Ullman", X title = "Compilers\emdash Prin\-ci\-ples, Techniques, and X Tools", X publisher = pub-AW, X address = pub-AW:adr, X year = "1986", X ISBN = "0-201-10088-6", X } X X on p. 201 point out that the ambiguity above is also met in the X (in)famous dangling else problem, where the productions X X stmt: IF expr THEN stmt X | IF expr THEN stmt ELSE stmt X | OTHER X X produce a shift/reduce conflict when the input stack contains X X IF expr THEN stmt X X and the next input item is ELSE, since we could reduce using the X first production, or shift using the second production. X X The grammar in this case is not LR(k) for any k, because there could X be an unending chain of "ELSE xxx" tokens following in the input X stream. X X The solution adopted by yacc and most other LALR(1) generators is to X warn of the conflict, then shift, rather than reduce, adopting a X "maximal munch" strategy that will match ELSE with the nearest X preceding THEN. X X In our case, we want the "maximal munch" operation to consume X X v # v # ... # v X X as a bibtex_value before doing an assignment. This is easily done by X declaring TOKEN_EQUALS to have LOWER precedence than space, and space X to have lower precedence than TOKEN_SHARP. X **********************************************************************/ X %nonassoc TOKEN_EQUALS %left TOKEN_SPACE TOKEN_INLINE TOKEN_NEWLINE %left TOKEN_SHARP X %% file: opt_space X {RECOGNIZE("file-1");} X | opt_space object_list opt_space X {RECOGNIZE("file-2");} X ; X object_list: object X {RECOGNIZE("object-1");} X | object_list opt_space object X {RECOGNIZE("object-2");} X ; X object: TOKEN_AT opt_space at_object X {RECOGNIZE("object");} X ; X at_object: comment X {RECOGNIZE("comment");} X | entry X {RECOGNIZE("entry");} X | include X {RECOGNIZE("include");} X | preamble X {RECOGNIZE("preamble");} X | string X {RECOGNIZE("string");} X | error TOKEN_RBRACE X {RECOGNIZE("error");} X ; X comment: TOKEN_COMMENT opt_space X TOKEN_LITERAL X {RECOGNIZE("comment");} X ; X entry: entry_head X assignment_list X TOKEN_RBRACE X {RECOGNIZE("entry-1");} X | entry_head X assignment_list X TOKEN_COMMA opt_space X TOKEN_RBRACE X {RECOGNIZE("entry-2");} X | entry_head TOKEN_RBRACE X {RECOGNIZE("entry-3");} X ; X entry_head: TOKEN_ENTRY opt_space X TOKEN_LBRACE opt_space X key_name opt_space X TOKEN_COMMA opt_space X {RECOGNIZE("entry_head");} X ; X key_name: TOKEN_KEY X {RECOGNIZE("key_name-1");} X | TOKEN_ABBREV X {RECOGNIZE("key_name-2");} X ; X include: TOKEN_INCLUDE opt_space X TOKEN_LITERAL X {RECOGNIZE("include");} X ; X preamble: TOKEN_PREAMBLE opt_space X TOKEN_LBRACE opt_space X value opt_space X TOKEN_RBRACE X {RECOGNIZE("preamble");} X ; X string: TOKEN_STRING opt_space X TOKEN_LBRACE opt_space X assignment X opt_space TOKEN_RBRACE X {RECOGNIZE("string");} X ; X value: simple_value X {RECOGNIZE("value-1");} X | value opt_space X {RECOGNIZE("value-1-1");} X TOKEN_SHARP X {RECOGNIZE("value-1-2");} X opt_space simple_value X {RECOGNIZE("value-2");} X ; X simple_value: TOKEN_VALUE X {RECOGNIZE("simple_value-1");} X | TOKEN_ABBREV X {RECOGNIZE("simple_value-2");} X ; X assignment_list: assignment X {RECOGNIZE("single assignment");} X | assignment_list X TOKEN_COMMA opt_space X assignment X {RECOGNIZE("assignment-list");} X ; X assignment: assignment_lhs opt_space X TOKEN_EQUALS opt_space X {RECOGNIZE("assignment-0");} X value opt_space X {RECOGNIZE("assignment");} X ; X assignment_lhs: TOKEN_FIELD X {RECOGNIZE("assignment_lhs-1");} X | TOKEN_ABBREV X {RECOGNIZE("assignment_lhs-2");} X ; X opt_space: /* empty */ X {RECOGNIZE("opt_space-1");} X | space X {RECOGNIZE("opt_space-2");} X ; X space: single_space X {RECOGNIZE("single space");} X | space single_space X {RECOGNIZE("multiple spaces");} X ; X single_space: TOKEN_SPACE X | TOKEN_INLINE X | TOKEN_NEWLINE X ; %% X /* end of grammar */ X static void doparse(VOID) { /* parse a complete BibTeX file or BibTeX token stream */ X int c; X X line_number = 1L; X X /* A single character lookahead distinguishes between a token X stream, which starts with a line number directive, and a BibTeX X file, which does not. We then pick a suitable lexical analyzer X function. */ X X c = getchar(); X (void)ungetc(c,stdin); X pyylex = (c == '#') ? zzlex : xxlex; X X yyparse(); /* this handles the entire file */ } X X #if NEW_STYLE int main(int argc, char *argv[]) #else /* K&R style */ int main(argc, argv) int argc; char *argv[]; #endif /* NEW_STYLE */ { X int code; /* error return code */ X int k; /* index into argv[] */ X int n; /* index into argv[] */ X FILE *fp; /* pointer to current input file */ X X do_lex_output = 0; /* prevent output from xxlex() */ X error_count = 0; X program_name = argv[0]; X X for (k = 1; k < argc; ++k) X { /* check for command-line options */ X if ((strcmp(argv[k],"-d") == 0) || (strcmp(argv[k],"-D") == 0)) X { X yydebug = 1; X do_lex_output = 1; X for (n = k; n < argc; ++n) /* shuffle remaining arguments down */ X argv[n] = argv[n+1]; X argc--; /* and reduce argument count */ X } X } X X if (argc > 1) /* files to parse named on command line */ X { X for (k = 1; k < argc; ++k) X { X fp = freopen(argv[k],"r",stdin); X if (fp == (FILE*)NULL) X { X (void)fprintf(stderr, X "\n%s Ignoring open failure on file [%s]\n", X ERROR_PREFIX, argv[k]); X (void)perror("perror() says"); X } X else X { X the_filename = argv[k]; X doparse(); X (void)fclose(fp); X } X } X } X else /* parse stdin */ X { X the_filename = "stdin"; X doparse(); X } X code = (error_count > 0) ? EXIT_FAILURE : EXIT_SUCCESS; X X exit(code); X return (code); /* NOT REACHED */ } X X static int nextchar (VOID) { X int c; X X c = getchar (); X if (yydebug) X putchar (c); X return (c); } X X X #if NEW_STYLE static void recognize(const char *s) #else static void recognize(s) const char *s; #endif { X if (yydebug) X printf("[%s]\n", s); } X X #if NEW_STYLE void yyerror(const char *s) #else void yyerror(s) const char *s; #endif { X error_count++; X (void)fflush(stdout); X (void)fprintf(stderr,"%s \"%s\", line %ld: %s\tNext token = \"%s\"\n", X ERROR_PREFIX, the_filename, line_number, s, yytext); X (void)fflush(stderr); } X X int yylex (VOID) { X int v; X X v = (*pyylex) (); X X /* xxlex() (== yylex() in biblex.c) biases token values by 1000, but X the token streams produced by biblex and "bibclean --no-prettyprint" X exclude that bias, for compact output. */ X X return ((pyylex == zzlex) ? v : (v - 1000)); } X X #if NEW_STYLE static void yywarning(const char *s) #else static void yywarning(s) const char *s; #endif { X (void)fflush(stdout); X (void)fprintf(stderr,"%s %s\tNext token = \"%s\"\n", X WARNING_PREFIX, s, yytext); X (void)fflush(stderr); } X X int zzlex (VOID) { X char buffer[BUFSIZ]; /* only needs space for a single number token */ X char *limit; /* how far we can store into buffer[] */ X char *p; /* pointer into buffer[] */ X int c; /* current input character */ X X limit = &buffer[sizeof(buffer) - 1]; /* address of last slot in buffer[] */ X X for (;;) /* `infinite' loop for ignoring comments and empty lines */ X { X while (((c = nextchar ()) > 0) && isspace (c)) X ; /* skip leading whitespace */ X X /* Collect first non-blank token on line, truncating if too big for buffer[] */ X p = &buffer[0]; X *p++ = c; X while (((c = nextchar ()) > 0) && !isspace (c)) X { X if (p < limit) X *p++ = c; X } X *p = '\0'; X X while ((c != '\n') && ((c = nextchar ()) > 0)) X ; /* skip rest of line */ X X if (c == '\n') /* should always be true */ X line_number++; X X if (buffer[0] == '#') /* comment: pseudo return tail-recursively */ X continue; X else if (isdigit ((int) buffer[0])) /* token number */ X return ((int) strtol ((const char *) &buffer[0], &limit, 10)); X else if (c == '\n') /* empty line: pseudo return tail-recursively */ X continue; X else if (feof (stdin)) /* assume end of file */ X return (0); /* standard lex end-of-file signal */ X else X return (-1); /* should never happen */ X } } SHAR_EOF $shar_touch -am 09231506104 'bibparse.y' && chmod 0644 'bibparse.y' || $echo 'restore of' 'bibparse.y' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibparse.y:' 'MD5 check failed' 53e48c31766d891ce514c3d9f66d7a1b bibparse.y SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibparse.y'`" test 13859 -eq "$shar_count" || $echo 'bibparse.y:' 'original size' '13859,' 'current size' "$shar_count!" fi fi # ============= bibunlex.l ============== if test -f 'bibunlex.l' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibunlex.l' '(file already exists)' else $echo 'x -' extracting 'bibunlex.l' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibunlex.l' && %{ X /********************************************************************** X @Lex-file{ X author = "Nelson H. F. Beebe", X version = "1.06", X date = "02 June 1998", X time = "17:56:46 MDT", X filename = "bibunlex.l", X address = "University of Utah X Department of Mathematics, 110 LCB X 155 S 1400 E RM 233 X Salt Lake City, UT 84112-0090 X USA", X telephone = "+1 801 581 5254", X FAX = "+1 801 581 4148", X URL = "http://www.math.utah.edu/~beebe", X checksum = "15084 502 1155 9600", X email = "beebe@math.utah.edu, beebe@acm.org, X beebe@computer.org (Internet)", X codetable = "ISO/ASCII", X keywords = "BibTeX, bibliography, lexical analysis, lexer", X supported = "yes", X docstring = "Convert a lexical token stream from biblex X or bibclean back into a BibTeX file on X stdout. X X Usage: X bibunlex < infile > outfile X or X bibunlex file(s) >outfile X X This utility can be conveniently used at X the end of a biblex or bibclean pipeline X that filters BibTeX files for some purpose. X X The checksum field above contains a CRC-16 X checksum as the first value, followed by the X equivalent of the standard UNIX wc (word X count) utility output of lines, words, and X characters. This is produced by Robert X Solovay's checksum utility.", X } X **********************************************************************/ X #include X #include #include #include X #if defined(HAVE_STDLIB_H) #include #endif X #include "args.h" #include "bibyydcl.h" #include "token.h" X /* Token types for biblex/bibclean token stream grammar */ X #if NEW_STYLE typedef enum t_list { X T_NUMBER = 2001, X T_NAME, X T_UNKNOWN, X T_VALUE } biblex_token_t; #else /* NOT NEW_STYLE */ typedef int biblex_token_t; #define T_NUMBER 2001 #define T_NAME 2002 #define T_UNKNOWN 2003 #define T_VALUE 2004 #endif /* NEW_STYLE */ X #define digval(c) ((int)((c) - '0')) #define isoctal(c) (isdigit(c) && ((c) != '8') && ((c) != '9')) #define ishexadecimal(c) (isdigit(c) || \ X (strchr("ABCDEFabcdef",(c)) != (char*)NULL)) X static void bad_token ARGS((void)); static void dounlex ARGS((void)); static int hexval ARGS((int c_)); int main ARGS((int argc_, char *argv_[])); static void out_s ARGS((char *s_)); static void out_space ARGS((int n_)); static void out_string ARGS((const char *s_)); static void out_token ARGS((token_t token_)); static char *unescape ARGS((char *s_)); X static long line_number = 1L; static long line_width = 0L; static const char *the_filename = ""; X #define ERROR_PREFIX "??" /* this prefixes all error messages */ X #define FIELD_INDENTATION 2 /* how far to indent "field = value," pairs */ X #if !defined(MAX_FIELD_LENGTH) #define MAX_FIELD_LENGTH 12 /* "howpublished" */ #endif /* !defined(MAX_FIELD_LENGTH) */ X #define VALUE_INDENTATION (FIELD_INDENTATION + MAX_FIELD_LENGTH + 3) X #undef YYLMAX X #if defined(HAVE_IBMPC) #define YYLMAX 32760 #else #define YYLMAX BIBYYLMAX #endif X X /* here is a lex grammar for the bibclean and biblex output token stream */ X %} X W [ \b\f\r\t\v] X %% ^[%?#].*$ ; /* ignore messages and line number directives */ X ^[0-9]+ return (T_NUMBER); X [A-Z]+ return (T_NAME); X {W} ; /* ignore horizontal space */ X ["].*$ return (T_VALUE); X [\n] line_number++; X X. return (T_UNKNOWN); %% static void bad_token(VOID) { X (void)fprintf(stderr,"%s \"%s\", line %ld: %s [%s].\n", X ERROR_PREFIX, X the_filename, X line_number, X "Unrecognized token", X yytext); } X X static void dounlex(VOID) { X biblex_token_t type; X token_t token = TOKEN_UNKNOWN; X X line_number = 1L; X while ((type = (biblex_token_t)yylex()) > 0) X { X switch (type) X { X case T_NUMBER: X token = (token_t)atoi((const char*)&yytext[0]); X break; X X case T_NAME: X break; /* discard name */ X X case T_VALUE: X out_token(token); X break; X X default: X case T_UNKNOWN: X bad_token(); X break; X } X } } X X #if NEW_STYLE static int hexval(int c) #else /* K&R style */ static int hexval(c) int c; #endif /* NEW_STYLE */ { X static const char *hexdigits = "0123456789abcdef"; X const char *p = (const char *)strchr(hexdigits, X isupper(c) ? tolower(c) : c); X X return ((p == (const char*)NULL) ? (-1) : (int)(p - hexdigits)); } X X #if NEW_STYLE int main(int argc, char *argv[]) #else /* K&R style */ int main(argc, argv) int argc; char *argv[]; #endif /* NEW_STYLE */ { X int k; X FILE *fp; X X if (argc > 1) /* files to unlex named on command line */ X { X for (k = 1; k < argc; ++k) X { X fp = freopen(argv[k],"r",stdin); X if (fp == (FILE*)NULL) X { X (void)fprintf(stderr, X "\n%s Ignoring open failure on file [%s]\n", X ERROR_PREFIX, argv[k]); X (void)perror("perror() says"); X } X else X { X the_filename = argv[k]; X dounlex(); X (void)fclose(fp); X } X } X } X else /* unlex stdin */ X { X the_filename = "stdin"; X dounlex(); X } X exit (EXIT_SUCCESS); X return (0); } X X #if NEW_STYLE static void out_s(char *s) /* output a string, wrapping long lines */ #else /* K&R style */ static void out_s(s) /* output a string, wrapping long lines */ char *s; #endif /* NEW_STYLE */ { /* s[] is modified on return */ X s[strlen(s)-1] = '\0'; /* zap final quote */ X out_string(unescape(s+1)); /* discard initial quote */ } X X #if NEW_STYLE static void out_space(int n) #else /* K&R style */ static void out_space(n) int n; #endif /* NEW_STYLE */ { X for ( ; n > 0 ; --n) X out_string(" "); } X X #if NEW_STYLE static void out_string(const char *s) #else /* K&R style */ static void out_string(s) const char *s; #endif /* NEW_STYLE */ { X for (; *s; ++s) X { X switch (*s) X { X case '\r': X case '\n': X line_width = 0L; X break; X X case '\t': X line_width = (line_width + 7L) & ~7L; X break; X X default: X line_width++; X break; X } X putchar(*s); X } } X X #if NEW_STYLE static void out_token(token_t token) #else /* K&R style */ static void out_token(token) token_t token; #endif /* NEW_STYLE */ { /* ALL token output is directed through this function */ X static token_t last_token = TOKEN_UNKNOWN; X X switch (token) X { X case TOKEN_ABBREV: X if (last_token == TOKEN_EQUALS) X out_space((int)(VALUE_INDENTATION - line_width)); X out_s((char*)&yytext[0]); X break; X X case TOKEN_AT: X out_s((char*)&yytext[0]); X break; X X case TOKEN_COMMA: X out_s((char*)&yytext[0]); X break; X X case TOKEN_COMMENT: X out_s((char*)&yytext[0]); X break; X X case TOKEN_ENTRY: X out_s((char*)&yytext[0]); X break; X X case TOKEN_EQUALS: X if (last_token != TOKEN_SPACE) X out_space(1); X out_s((char*)&yytext[0]); X break; X X case TOKEN_FIELD: X if (last_token != TOKEN_SPACE) X out_space(FIELD_INDENTATION); X out_s((char*)&yytext[0]); X break; X X case TOKEN_INCLUDE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_INLINE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_KEY: X out_s((char*)&yytext[0]); X break; X X case TOKEN_LBRACE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_LITERAL: X out_s((char*)&yytext[0]); X break; X X case TOKEN_NEWLINE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_PREAMBLE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_RBRACE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_SHARP: X if (last_token != TOKEN_SPACE) X out_space(1); X out_s((char*)&yytext[0]); X break; X X case TOKEN_SPACE: X out_s((char*)&yytext[0]); X break; X X case TOKEN_STRING: X out_s((char*)&yytext[0]); X break; X X case TOKEN_VALUE: X if (last_token != TOKEN_SPACE) X out_space((int)(VALUE_INDENTATION - line_width)); X out_s((char*)&yytext[0]); X break; X X case TOKEN_UNKNOWN: X default: X bad_token(); X break; X } X last_token = token; } X X #if NEW_STYLE static char* unescape(char *s) /* convert escape sequences to chars in place */ #else /* K&R style */ static char* unescape(s) char *s; #endif /* NEW_STYLE */ { X int c; X int n; X char *original = s; X char *t; /* target string (overwrites s[]) */ X X for (t = s ; *s; ) X { X switch (*s) X { X case '\\': X ++s; X switch (*s) X { X case '0': X case '1': X case '2': X case '3': X case '4': X case '5': X case '6': X case '7': X for (n = 0, c = digval(*s), ++s; (n < 3) && isoctal(*s); X n++, s++) X c = 8*c + digval(*s); X break; X X case 'a': X ++s; X c = '\007'; /* '\a' */ X break; X X case 'b': X ++s; X c = '\b'; X break; X X case 'f': X ++s; X c = '\f'; X break; X X case 'n': X ++s; X c = '\n'; X break; X X case 'r': X ++s; X c = '\r'; X break; X X case 't': X ++s; X c = '\t'; X break; X X case 'v': X ++s; X c = '\v'; X break; X X case 'x': X for (++s, c = hexval(*s); ishexadecimal(*s); ++s) X c = 16*c + hexval(*s); X break; X X default: X c = *s++; X } X *t++ = c; X break; X X default: X *t++ = *s++; X break; X } X } X *t = '\0'; X return (original); } X X #if defined(HAVE_IBMPC) int yywrap(VOID) { X return 1; } #endif SHAR_EOF $shar_touch -am 09231506104 'bibunlex.l' && chmod 0644 'bibunlex.l' || $echo 'restore of' 'bibunlex.l' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibunlex.l:' 'MD5 check failed' 31df0b97a0e3ba00bed6f9c84da4dfe7 bibunlex.l SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibunlex.l'`" test 9530 -eq "$shar_count" || $echo 'bibunlex.l:' 'original size' '9530,' 'current size' "$shar_count!" fi fi # ============= bibunlex.man ============== if test -f 'bibunlex.man' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibunlex.man' '(file already exists)' else $echo 'x -' extracting 'bibunlex.man' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibunlex.man' && X.\" ==================================================================== X.\" @Troff-man-file{ X.\" author = "Nelson H. F. Beebe", X.\" version = "1.05", X.\" date = "23 September 2004", X.\" time = "15:03:31 MDT", X.\" filename = "bibunlex.man", X.\" address = "University of Utah X.\" Department of Mathematics, 110 LCB X.\" 155 S 1400 E RM 233 X.\" Salt Lake City, UT 84112-0090 X.\" USA", X.\" telephone = "+1 801 581 5254", X.\" FAX = "+1 801 581 4148", X.\" URL = "http://www.math.utah.edu/~beebe", X.\" checksum = "32166 118 458 4014", X.\" email = "beebe@math.utah.edu, beebe@acm.org, X.\" beebe@computer.org (Internet)", X.\" codetable = "ISO/ASCII", X.\" keywords = "bibliography, BibTeX, lexical analysis", X.\" supported = "yes", X.\" docstring = "This file is the UNIX nroff/troff manual X.\" page documentation for bibunlex, a tool for X.\" reconstructing BibTeX bibliography data X.\" base files from the lexical analysis output X.\" of bibclean or biblex. X.\" X.\" The checksum field above contains a CRC-16 X.\" checksum as the first value, followed by the X.\" equivalent of the standard UNIX wc (word X.\" count) utility output of lines, words, and X.\" characters. This is produced by Robert X.\" Solovay's checksum utility.", X.\" } X.\"===================================================================== X.\" X.if t .ds Bi B\s-2IB\s+2T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X X.if n .ds Bi BibTeX X.\" X.\"===================================================================== X.TH BIBUNLEX 1 "23 September 2004" "Version 1.06" X.\"===================================================================== X.SH NAME bibunlex \- reconstruct a BibTeX bibliography data base file from \ bibclean or biblex lexical analysis output X.\"===================================================================== X.SH SYNOPSIS X.B bibunlex X.I "outfile" X.nf or X.fi X.B bibunlex X.I "file1 file2 file3 .\|.\|." X.I ">outfile" X.\"===================================================================== X.SH DESCRIPTION X.B bibunlex takes a lexical token stream from X.BR bibclean (1) or from X.BR biblex (1), and reconstructs a \*(Bi bibliography data base file on X.IR stdout . X.PP The reconstruction is simplistic with regard to obtaining nice spacing, and best results will be obtained if the output is prettyprinted by X.BR bibclean (1). For example, X.RS X.nf X.B "bibclean -no-prettyprint \fI*.bib\fP | some-filter | bibunlex | bibclean \ >new.bib" X.B "biblex \fI*.bib\fP | some-filter | bibunlex | bibclean >new.bib" X.fi X.RE X.\"===================================================================== X.SH "SEE ALSO" X.BR bibcheck (1), X.BR bibclean (1), X.BR bibdup (1), X.BR bibextract (1), X.BR bibjoin (1), X.BR biblabel (1), X.BR biblex (1), X.BR biborder (1), X.BR bibparse (1), X.BR bibsearch (1), X.BR bibsort (1), X.BR bibtex (1), X.BR citefind (1), X.BR citesub (1), X.BR citetags (1), X.BR latex (1), X.BR scribe (1), X.BR tex (1). X.\"===================================================================== X.SH AUTHOR X.nf Nelson H. F. Beebe University of Utah Department of Mathematics, 110 LCB 155 S 1400 E RM 233 Salt Lake City, UT 84112-0090 USA Email: \fCbeebe@math.utah.edu\fP, \fCbeebe@acm.org\fP, \fCbeebe@computer.org\fP (Internet) WWW URL: \fChttp://www.math.utah.edu/~beebe\fP Telephone: +1 801 581 5254 FAX: +1 801 581 4148 X.fi X.\"===================================================================== X.\" This is for GNU Emacs file-specific customization: X.\" Local Variables: X.\" fill-column: 50 X.\" End: SHAR_EOF $shar_touch -am 09231503104 'bibunlex.man' && chmod 0644 'bibunlex.man' || $echo 'restore of' 'bibunlex.man' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibunlex.man:' 'MD5 check failed' f99f9b514756559c679c280359f49b0a bibunlex.man SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibunlex.man'`" test 4014 -eq "$shar_count" || $echo 'bibunlex.man:' 'original size' '4014,' 'current size' "$shar_count!" fi fi # ============= bibyydcl.h ============== if test -f 'bibyydcl.h' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'bibyydcl.h' '(file already exists)' else $echo 'x -' extracting 'bibyydcl.h' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'bibyydcl.h' && /* /u/sy/beebe/tex/biblex/bibyydcl.h, Sat Jan 16 16:24:55 1993 */ /* Edit by Nelson H. F. Beebe */ X #ifndef BIBYYDCL_H #define BIBYYDCL_H X /*********************************************************************** This file contains function prototypes of lex library functions. X We need them because most current lex implementations do not generate prototypes in the output C code, making it impossible to compile the code with C++ compilers. X flex implementations do not require most of these prototypes. X There are also variations in the types of some of these functions which we must handle by preprocessor conditionals below. ***********************************************************************/ X #if defined(__cplusplus) extern "C" { #endif X extern void yyerror ARGS((const char *s_)); extern int yylex ARGS((void)); extern int yyparse ARGS((void)); extern int yywrap ARGS((void)); X #if defined(__cplusplus) } #endif X #if defined(FLEX_SCANNER) #define input yyinput #define output putchar X #if !defined(HAVE_FILENO) #define YY_NEVER_INTERACTIVE 1 /* suppresses need for isatty() and fileno() */ #endif X #else /* NOT defined(FLEX_SCANNER) */ X #if defined(__cplusplus) && defined(__sun) /* Sun Solaris 2.x lex changed the names of these functions under C++ */ #define input lex_input #define output lex_output #endif X #endif /* defined(FLEX_SCANNER) */ X #endif /* BIBYYDCL_H */ SHAR_EOF $shar_touch -am 0509135699 'bibyydcl.h' && chmod 0644 'bibyydcl.h' || $echo 'restore of' 'bibyydcl.h' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'bibyydcl.h:' 'MD5 check failed' f82fa319585cb6f905887e8b4f671016 bibyydcl.h SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'bibyydcl.h'`" test 1418 -eq "$shar_count" || $echo 'bibyydcl.h:' 'original size' '1418,' 'current size' "$shar_count!" fi fi # ============= configure ============== if test -f 'configure' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'configure' '(file already exists)' else $echo 'x -' extracting 'configure' '(binary)' sed 's/^X//' << 'SHAR_EOF' | uudecode && begin 600 configure M(R$@+V)I;B]S:`HC($=U97-S('9A;'5E7)I9VAT("A#*2`R,#`S M($9R964@4V]F='=A2P@9&ES=')I8G5T92!A;F0@;6]D:69Y(&ET+@HC(R`M+2TM+2TM+2TM M+2TM+2TM+2TM+2T@(R,*(R,@331S:"!);FET:6%L:7IA=&EO;BX@(",C"B,C M("TM+2TM+2TM+2TM+2TM+2TM+2TM+2`C(PH*(R!"92!";W5R;F4@8V]M<&%T M:6)L90II9B!T97-T("UN("(D>UI32%]615)324].*W-E='TB("8F("AE;75L M871E('-H*2`^+V1E=B]N=6QL(#(^)C$[('1H96X*("!E;75L871E('-H"B`@ M3E5,3$--1#TZ"B`@(R!:&ET*2`^ M+V1E=B]N=6QL(#(^)C$[('1H96X*("!A'!R(&$@.B`G7"AA7"DG(#XO9&5V+VYU;&P@,CXF,3L@=&AE;@H@(&%S M7V5X<'(]97AP<@IE;'-E"B`@87-?97AP'!R M(%@O(B0P(B`Z("+UU;7B]=*EPI+RHD)R!R!S+R]<,2\[('$[ M('T*("`)("`O7EA<+UPH7"]<+UPI)"][(',O+UPQ+SL@<3L@?0H@(`D@("]> M6%PO7"A<+UPI+BHO>R!S+R]<,2\[('$[('T*("`)("!S+RXJ+RXO.R!Q)V`* M"@HC(%!!5$@@;F5E9',@0U(L(&%N9"!,24Y%3D\@;F5E9',@0U(@86YD(%!! M5$@N"B,@079O:60@9&5P96YD:6YG('5P;VX@0VAA7HG"F%S M7V-R7TQ%5%1%4E,])T%"0T1%1D=(24I+3$U.3U!14E-455976%E:)PIAU!!5$A?4T5005)!5$]2*W-E='TB("$]('-E=#L@=&AE;@H@ M(&5C:&\@(B,A("]B:6XO&ES=&5N=#LN(CL@8V]N9B0D+G-H*2`^+V1E=B]N=6QL(#(^ M)C$[('1H96X*("`@(%!!5$A?4T5005)!5$]2/2<[)PH@(&5L"1A"1AB`B)&%S7V1I7-E;&8])&%S7V1IR!E8VAO("(D87-?;64Z(&5R7-E;&8[(')EB`B)&%S7V1I"1A"1A'!OT5.5BMS971](B`A/2!S970@?'P@>R!%3E8].R!E M>'!OS$K(B1`(GT*"2`@(&9I.SL*"2!E7-E;&8L(&)U="!W:71H("1,24Y% M3D\*("`C('5N:69O2!R97!L86-E9"!B>2!T:&4@;&EN92!N=6UB97(N M("!4:&4@9FER7"A;)R1A6R&ET(#$I.R!E>&ET(#$[('T[('T*"B`@(R!$;VXG M="!T&ET"GT* M"@IC87-E(&!E8VAO(")T97-T:6YG7&,B.R!E8VAO(#$L,BPS8"Q@96-H;R`M M;B!T97-T:6YG.R!E8VAO(#$L,BPS8"!I;@H@("IC*BPM;BHI($5#2$]?3CT@ M14-(3U]#/2<*)R!%0TA/7U0])PDG(#L["B`@*F,J+"H@("D@14-(3U]./2UN M($5#2$]?0ST@14-(3U]4/2`[.PH@("HI("`@("`@($5#2$]?3CT@14-(3U]# M/2=<8R<@14-(3U]4/2`[.PIE'!R(&$@.B`G7"AA7"DG(#XO M9&5V+VYU;&P@,CXF,3L@=&AE;@H@(&%S7V5X<'(]97AP<@IE;'-E"B`@87-? M97AP&4@8V]N9B0D M+F9I;&4*96-H;R`^8V]N9B0D+F9I;&4*:68@;&X@+7,@8V]N9B0D+F9I;&4@ M8V]N9B0D(#(^+V1E=B]N=6QL.R!T:&5N"B`@(R!792!C;W5L9"!J=7-T(&-H M96-K(&9O&4[('1H96X*("`@(",@1&]N)W0@=7-E(&QN(&%T M(&%L;#L@=V4@9&]N)W0@:&%V92!A;GD@;&EN:W,*("`@(&%S7VQN7W,])V-P M("UP)PH@(&5L24J)&%S7V-R7VQE='1E M7R1A7-T96US("A35E(S+C(L M($QI;G5X*2!R971UF%T:6]N#TO=7-R+VQO M8V%L"F%C7V-O;F9I9U]L:6)O8FI?9&ER/2X*8W)OT-/3D9)1U]3 M2$5,3"TO8FEN+W-H?0H*(R!-87AI;75M(&YU;6)E2!A8U]M87A?7,O2YH/@HC(&5N9&EF"B,@:6YC;'5D92`\&5C7W!R969I>"!P&5C9&ER(&1A=&%D:7(@2!O<'1I;VYS+@IA8U]I;FET7VAE;'`]"F%C M7VEN:71?=F5R#U. M3TY%"G!R;V=R86U?<')E9FEX/4Y/3D4*<')O9W)A;5]S=69F:7@]3D].10IP M"QX+`IS:6QE;G0]"G-I=&4]"G-R M8V1I%]I;F-L=61E2!O<'1I;VYS+@HC(%1H97-E M(&%R92!L969T('5N97AP86YD960@2!D969A=6QT('=I;&P@86-T=6%L;'D@8VAA;F=E+@HC(%5S92!B"1A8U]O<'1I;VXB(#H@)WA;7CU=*CU<*"XJ M7"DG8`H*("`C($%C8V5P="!T:&4@:6UP;W)T86YT($-Y9VYU'!R(")X)&%C7V]P=&EO;B(@.B`G>"TJ96YA8FQE M+5PH6UX]72I<*2=@"B`@("`C(%)E:F5C="!N86UE'!R(")X)&%C7V9E M871UR!E8VAO("(D87-?;64Z(&5R&ET(#$I.R!E>&ET(#$[ M('T[('T*("`@(&%C7V9E871U&5C+7!R969I(%P*("!\("TM97AE8RUP&5C+7!R92!\("TM97AE8RUP&5C+2!<"B`@ M?"`M+65X96,@?"`M+65X92!\("TM97@I"B`@("!A8U]P&5C+7!R93TJ('P@+2UE>&5C+7!R/2H@?"`M+65X96,M M<#TJ('P@+2UE>&5C+3TJ(%P*("!\("TM97AE8STJ('P@+2UE>&4]*B!\("TM M97@]*BD*("`@(&5X96-?<')E9FEX/21A8U]O<'1A65S(#L["@H@("UH96QP('P@+2UH96QP M('P@+2UH96P@?"`M+6AE('P@+6@I"B`@("!A8U]I;FET7VAE;'`];&]N9R`[ M.PH@("UH96QP/7(J('P@+2UH96QP/7(J('P@+2UH96P]&4@?"`M+6QI8F5X('P@+2UL:6)E*0H@("`@86-?<')E=CUL:6)E>&5C M9&ER(#L["B`@+6QI8F5X96-D:7(]*B!\("TM;&EB97AE8V1I&5C9&D]*B!\("TM;&EB97AE8V0]*B!\("TM;&EB97AE8STJ(%P*("!\ M("TM;&EB97AE/2H@?"`M+6QI8F5X/2H@?"`M+6QI8F4]*BD*("`@(&QI8F5X M96-D:7(])&%C7V]P=&%R9R`[.PH*("`M;&]C86QS=&%T961I"!\("TM<')E9FD@ M?"`M+7!R968@?"`M+7!R92!\("TM<'(@?"`M+7`I"B`@("!A8U]P"`[.PH@("UP#TD86-?;W!T87)G(#L["@H@("UP"!\("TM<')O M9W)A;2UP"`[.PH@ M("UP#TJ('P@+2UP#TJ('P@+2UP M7-C;VYF9"!\("TM7-C;VYF9&ER/2H@?"`M+7-Y7-C M;VYF9#TJ('P@+2US>7-C;VYF/2H@7`H@('P@+2US>7-C;VX]*B!\("TM7,]*B!\("TM'!R(")X)&%C7W!A M8VMA9V4B(#H@(BXJ6UXM7R1AR!E8VAO("(D87-?;64Z(&5R&ET(#$I.R!E>&ET(#$[ M('T[('T*("`@(&%C7W!A8VMA9V4]8&5C:&\@)&%C7W!A8VMA9V5\('-E9"`G M'!R(")X)&%C7W!A8VMA9V4B(#H@(BXJ6UXM M7R1AR!E8VAO("(D M87-?;64Z(&5R&ET(#$I.R!E>&ET(#$[('T[('T*("`@(&%C7W!A M8VMA9V4]8&5C:&\@)&%C7W!A8VMA9V4@?"!S960@)W,O+2]?+V"UI;F-L=61E"UI;F-L=61E"UI;F-L=61E('P@+2UX M+6EN8VQU9"!\("TM>"UI;F-L=2!<"B`@?"`M+7@M:6YC;"!\("TM>"UI;F,@ M?"`M+7@M:6X@?"`M+7@M:2D*("`@(&%C7W!R978]>%]I;F-L=61E"UI;F-L=61E M/2H@?"`M+7@M:6YC;'5D/2H@?"`M+7@M:6YC;'4]*B!<"B`@?"`M+7@M:6YC M;#TJ('P@+2UX+6EN8STJ('P@+2UX+6EN/2H@?"`M+7@M:3TJ*0H@("`@>%]I M;F-L=61E"UL M:6)R87)I97,@?"`M+7@M;&EB"UL:6)R87)I/2H@7`H@('P@+2UX+6QI8G)A%]L:6)R87)I97,])&%C7V]P=&%R9R`[.PH*("`M M*BD@>R!E8VAO("(D87-?;64Z(&5R2!<8"0P("TM:&5L<"<@9F]R(&UOR`H97AI="`Q*3L@97AI="`Q.R!].R!]"B`@("`[ M.PH*("`J/2HI"B`@("!A8U]E;G9V87(]8&5X<'(@(G@D86-?;W!T:6]N(B`Z M("=X7"A;7CU=*EPI/2=@"B`@("`C(%)E:F5C="!N86UE'!R(")X)&%C M7V5N=G9AR`H97AI="`Q*3L@97AI="`Q M.R!].R!]"B`@("!A8U]O<'1A"1A8U]O M<'1I;VXB(#H@(BXJ6UXM+E\D87-?8W)?86QN=6U=(B`^+V1E=B]N=6QL("8F M"B`@("`@(&5C:&\@(B1AV)U:6QD7V%L:6%S/21A8U]O M<'1I;VY]("1[:&]S=%]A;&EAW1AR!E8VAO("(D87-?;64Z(&5R&ET M(#$I.R!E>&ET(#$[('T[('T*9FD*"B,@0F4@`ID M;PH@(&5V86P@86-?=F%L/21@96-H;R`D86-?=F%R8`H@(&-A2!N86UE(&9O&ET(#$I.R!E>&ET(#$[('T[('T[.PH@(&5S86,*9&]N M90H*(R!"92!S=7)E('1O(&AA=F4@86)S;VQU=&4@<&%T:',N"F9O#L@=&AE;@H@(&EF('1E#L@=&AE;@H@("`@8W)O6)E"B`@("!E8VAO("(D87-?;64Z(%=!4DY)3D"1B=6EL9%]A;&EA#TD:&]S=%]A M;&EA65S("8F(&5X96,@-CXO9&5V+VYU M;&P*"@HC($9I;F0@=&AE('-O=7)C92!F:6QE2!T:&4@9&ER96-T;W)Y M(&-O;G1A:6YI;F<@=&AI+UU<*2\O*EM>+UU;7B]=*B\J)"<@7'P@ M7`H)(%@B)#`B(#H@)UA<*"\O7"E;7B]=)R!6%PH+BI;7B]=7"E<+UPO*EM>+UU;7B]=*EPO*B0O>R!S+R]<,2\[('$[ M('T*("`)("`O7EA<*%PO7"]<*5M>+UTN*B][(',O+UPQ+SL@<3L@?0H@(`D@ M("]>6%PH7"]<+UPI)"][(',O+UPQ+SL@<3L@?0H@(`D@("]>6%PH7"]<*2XJ M+WL@R`H97AI="`Q*3L@97AI="`Q.R!].R!]"B`@9FD*9FD**&-D("1S&ET(#$I.R!E>&ET(#$[('T[('T*7%PO75PI6UQ<+UTJ)"5<,24G8`IA8U]E;G9?8G5I M;&1?86QI87-?VAOW1AW1ATQ$1DQ!1U,KT-86$9,04=3*W-E='T*86-? M96YV7T-86$9,04=37W9A;'5E/21#6%A&3$%'4PIA8U]C=E]E;G9?0UA81DQ! M1U-?&ET"B`@ M("`@("TM:&5L<#US:&]R="`@("`@("`@9&ES<&QA>2!O<'1I;VYS('-P96-I M9FEC('1O('1H:7,@<&%C:V%G90H@("`@("`M+6AE;'`]#U04D5&25@@("`@("`@("!I;G-T86QL(&%R8VAI=&5C='5R92UI;F1E<&5N M9&5N="!F:6QE"]B:6XG+"!<8"1A M8U]D969A=6QT7W!R969I>"]L:6(G(&5T8RX@(%EO=2!C86X@0IA M;B!I;G-T86QL871I;VX@<')E9FEX(&]T:&5R('1H86X@7&`D86-?9&5F875L M=%]P#U<)$A/344G+@H*1F]R(&)E='1E&5C=71A8FQE7-T96T@861M:6X@97AE8W5T86)L97,@6T504D5&25@O2!A2`\;&EB(&1I2`\:6YC;'5D92!D:7(^"B`@0UA8("`@("`@("`@0RLK(&-O M;7!I;&5R(&-O;6UA;F0*("!#6%A&3$%'4R`@("!#*RL@8V]M<&EL97(@9FQA M9W,*("!#4%`@("`@("`@("!#('!R97!R;V-E#TO8&5C:&\@(B1A8U]D:7(B('P@"(@?"!S960@)W,L+UM>7%PO72HL+BXO+&#T@86-?=&]P7V)U:6QD9&ER/0IF:0H*8V%S M92`D#L*("`@(&%C7W1O<%]S MV%C7W1O<%]B=6EL9&1I6=N=7,@2!I="X*7T%#14]&"B`@97AI="`P"F9I"F5X96,@-3YC;VYF:62!C;VUP:6QE2!'3E4@075T;V-O;F8@,BXU.2X@($EN=F]C871I;VX@8V]M M;6%N9"!L:6YE('=APIC870@/#Q?05-5 M3D%-10HC(R`M+2TM+2TM+2T@(R,*(R,@4&QA=&9O'0]9F%L7"9<*EPH7"E<>UQ]7%Q'0@/2!TV%C7V-O;F9I9W5R95]AR!A8U]C;VYF:6=U'!O2X*(R!705).24Y'.B!"92!S=7)E(&YO="!T;R!UPH@("`@96-H;PH*("`@(&-A="`\/%Q?05-"3U@*(R,@+2TM+2TM+2TM+2TM M+2TM+2`C(PHC(R!#86-H92!V87)I86)L97,N(",C"B,C("TM+2TM+2TM+2TM M+2TM+2T@(R,*7T%30D]8"B`@("!E8VAO"B`@("`C(%1H92!F;VQL;W=I;F<@ M=V%Y(&]F('=R:71I;F<@=&AE(&-A8VAE(&UI7%PH6U\D87-?8W)?86QN=6U=*E]C=E];7R1A&ET M("1E>&ET7W-T871U2!S96QE8W1E9"!F:6QE('1O(&%U=&]M871I8V%L;'D@B`B)$-/3D9)1U]3251%(CL@=&AE;@H@ M(&EF('1E"]E=&,O M8V]N9FEG+G-I=&4B"B`@96QS90H@("`@0T].1DE'7U-)5$4](B1A8U]D969A M=6QT7W!R969I>"]S:&%R92]C;VYF:6+WP@+R<@(B1A8U]S:71E7V9I;&4B(#XF-0H@("`@+B`B)&%C M7W-I=&5?9FEL92(*("!F:0ID;VYE"@II9B!T97-T("UR("(D8V%C:&5?9FEL M92([('1H96X*("`C(%-O;64@=F5RR!E8VAO("(D87-?;64Z)$Q)3D5.3SH@ M;&]A9&EN9R!C86-H92`D8V%C:&5?9FEL92(@/B8U"F5C:&\@(B1AR!E8VAO("(D87-? M;64Z)$Q)3D5.3SH@8W)E871I;F<@8V%C:&4@)&-A8VAE7V9I;&4B(#XF-0IE M8VAO("(D87-?;64Z(&-R96%T:6YG(&-A8VAE("1C86-H95]F:6QE(B`^)C8[ M?0H@(#XD8V%C:&5?9FEL90IF:0H*(R!#:&5C:R!T:&%T('1H92!PV%C7W9AV%C7W9AV%C7W9AR!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@97)R;W(Z(%Q@)&%C7W9A"1A8U]O;&1?=F%L(B`A/2`B M>"1A8U]N97=?=F%L(CL@=&AE;@H)>R!E8VAO("(D87-?;64Z)$Q)3D5.3SH@ M97)R;W(Z(%Q@)&%C7W9AR!E8VAO("(D87-?;64Z)$Q)3D5.3SH@("!F;W)M97(@=F%L=64Z("`D86-? M;VQD7W9A;"(@/B8U"F5C:&\@(B1A7"9<*EPH7"E<>UQ] M7%QR!E8VAO("(D87-? M;64Z)$Q)3D5.3SH@97)R;W(Z(')U;B!<8&UA:V4@9&ES=&-L96%N)R!A;F0O M;W(@7&!R;2`D8V%C:&5?9FEL92<@86YD('-T87)T(&]V97(B(#XF-0IE8VAO M("(D87-?;64Z(&5R&ET(#$I.R!E>&ET(#$[('T[('T*9FD*"F%C7V5X=#UC"F%C7V-P<#TG M)$-04"`D0U!01DQ!1U,G"F%C7V-O;7!I;&4])R1#0R`M8R`D0T9,04=3("1# M4%!&3$%'4R!C;VYF=&5S="XD86-?97AT(#XF-2<*86-?;&EN:STG)$-#("UO M(&-O;F9T97-T)&%C7V5X965X="`D0T9,04=3("1#4%!&3$%'4R`D3$1&3$%' M4R!C;VYF=&5S="XD86-?97AT("1,24)3(#XF-2<*86-?8V]M<&EL97)?9VYU M/21A8U]C=E]C7V-O;7!I;&5R7V=N=0H*"@H*"@H*"@H*"@H*"@H*"@H*"B`@ M("`@("`@("!A8U]C;VYF:6=?:&5A9&5R'0@/B8U)PIA8U]L:6YK/2'0@)$Q)0E,@/B8U)PIA8U]C;VUP:6QE"([('1H96X*("`C($5X=')A8W0@=&AE(&9I&5C7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@ M(&EF("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]PV%C7W1O;VQ?<')E M9FEX?6=C8R(*("`@(&5C:&\@(B1AT5#2$]?5'TD0T,B(#XF-@IE;'-E"B`@96-H M;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5# M2$]?5'UN;R(@/B8V"F9I"@IF:0II9B!T97-T("UZ("(D86-?8W9?<')O9U]# M0R([('1H96X*("!A8U]C=%]#0STD0T,*("`C($5X=')A8W0@=&AE(&9IV%C7V-V7W!R;V=?86-?8W1?0T,K&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R;V=?86-?8W1?0T,](F=C M8R(*("`@(&5C:&\@(B1AT5#2$]?5'TD M86-?8W1?0T,B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')E MT5#2$]?5'UN;R(@/B8V"F9I"@H@($-# M/21A8U]C=%]#0PIE;'-E"B`@0T,](B1A8U]C=E]PB`B)$-#(CL@=&AE;@H@(&EF('1E"([('1H96X*("`C($5X=')A8W0@=&AE(&9I'UC8SL@ M86-?=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R M("1A8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C M7W=OB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT96YS:6]N'UC8R(*("`@(&5C:&\@(B1AT5#2$]?5'TD0T,B(#XF-@IE;'-E"B`@96-H M;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5# M2$]?5'UN;R(@/B8V"F9I"@IF:0II9B!T97-T("UZ("(D86-?8W9?<')O9U]# M0R([('1H96X*("!A8U]C=%]#0STD0T,*("`C($5X=')A8W0@=&AE(&9I&5C7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D M;PH@(&EF("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]PT5#2$]?5'TD86-? M8W1?0T,B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@($-#/21A M8U]C=%]#0PIE;'-E"B`@0T,](B1A8U]C=E]PB`B)$-#(CL@=&AE;@H@(",@17ATV%C7V-V7W!R;V=?0T,K&5C M7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF M("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!I9B!T97-T("(D87-?9&ER+R1A8U]W;W)D)&%C7V5X M96-?97AT(B`]("(O=7-R+W5C8B]C8R([('1H96X*("`@("`@(&%C7W!R;V=? M65S"B`@("`@("!C;VYT:6YU90H@("`@(&9I"B`@("!A8U]C M=E]P'1R86-T('1H92!F:7)S="!W;W)D(&]F("(D86-?=&]O;%]P'0@ M:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT96YS:6]N&5C7V5X="(@/B8U"B`@("!BV%C7V-V7W!R;V=?86-?8W1?0T,K&5C=71A8FQE7V5X=&5N M&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R;V=?86-?8W1? M0T,](B1A8U]P'0B(#XF-0H@("`@8G)E86L@ M,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*86-?8W1?0T,])&%C7V-V7W!R;V=? M86-?8W1?0T,*:68@=&5S="`M;B`B)&%C7V-T7T-#(CL@=&AE;@H@(&5C:&\@ M(B1AR!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@97)R;W(Z(&YO(&%C8V5P=&%B;&4@0R!C M;VUP:6QE&ET M(#$I.R!E>&ET(#$[('T[('T*"B,@4')O=FED92!S;VUE(&EN9F]R;6%T:6]N M(&%B;W5T('1H92!C;VUP:6QE(%TJ+R\G8`II9B![ M("AE=F%L(&5C:&\@(B1A&5E>'0]"B,@8BYO=70@ M:7,@8W)E871E9"!B>2!I.38P(&-O;7!I;&5R&-O9F8@?"`J+G1D'0@*0H)(R!4:&ES(&ES('1H92!S;W5R8V4@9FEL92X*"3L["B`@("!; M86)=+F]U="`I"@DC(%=E(&9O=6YD('1H92!D969A=6QT(&5X96-U=&%B;&4L M(&)U="!E>&5E>'0])R<@:7,@;6]S=`H)(R!C97)T86EN;'D@'!R("(D86-?9FEL M92(@.B`G6UXN72I<*%PN+BI<*2=@"@DC($9)6$U%.B!)(&)E;&EE=F4@=V4@ M97AP;W)T(&%C7V-V7V5X965X="!F;W(@3&EB=&]O;"P*"2,@8G5T(&ET('=O M=6QD(&)E(&-O;VP@=&\@9FEN9"!O=70@:68@:70GR![ M(&5C:&\@(B1A&ET(#T5#2$]?5'TD86-?9FEL92(@/B8V"@HC($-H96-K('1H92!C;VUP:6QE M&5C=71A8FQE3TG+B\D86-?9FEL92<*("![("AE=F%L(&5C:&\@ M(B1AR!E8VAO("(D87-? M;64Z)$Q)3D5.3SH@97)R;W(Z(&-A;FYO="!R=6X@0R!C;VUP:6QE9"!P6]U(&UE86YT('1O(&-R;W-S(&-O;7!I;&4L('5S92!<8"TM M:&]S="T5#2$]?5'UY97,B(#XF-@H*&4@ M8V]N9G1E&ET("1A8U]S=&%T=7,I.R!].R!T:&5N"B`@(R!)9B!B;W1H(&!C;VYF=&5S M="YE>&4G(&%N9"!@8V]N9G1E6=W:6XL(&!L&4G*2P@=VAI;&4@ M:70@=V]N)W0@=VET:`HC(&!R;2&-O9F8@?"`J+G1D'!R("(D86-?9FEL92(@.B`G6UXN72I<*%PN+BI< M*2=@"@D@(&5X<&]R="!A8U]C=E]E>&5E>'0*"2`@8G)E86L[.PH@("`@*B`I M(&)R96%K.SL*("!ER!E8VAO("(D87-?;64Z M)$Q)3D5.3SH@97)R;W(Z(&-A;FYO="!C;VUP=71E('-U9F9I>"!O9B!E>&5C M=71A8FQE&ET(#$I.R!E>&ET(#$[('T[ M('T*9FD*"G)M("UF(&-O;F9T97-T)&%C7V-V7V5X965X=`IE8VAO("(D87-? M;64Z)$Q)3D5.3SH@"!O9B!O8FIE8W0@9FEL97,N+BX@)$5#2$]?0R(@/B8V"FEF('1E M'0@?"`J M+GAC;V9F('P@*BYT9',@?"`J+F0@?"`J+G!D8B!\("HN>%-932!\("HN8F(@ M?"`J+F)B9R`I(#L["B`@("`J*2!A8U]C=E]O8FIE>'0]8&5X<'(@(B1A8U]F M:6QE(B`Z("+WP@+R<@8V]N9G1ER!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@97)R;W(Z(&-A;FYO="!C;VUP=71E('-U M9F9I>"!O9B!O8FIE8W0@9FEL97,Z(&-A;FYO="!C;VUP:6QE"E-E92!<8&-O M;F9I9RYL;V'0B(#XF-0IE8VAO("(D>T5#2$]?5'TD86-?8W9?;V)J97AT(B`^)C8* M3T)*15A4/21A8U]C=E]O8FIE>'0*86-?;V)J97AT/21/0DI%6%0*96-H;R`B M)&%S7VUE.B1,24Y%3D\Z(&-H96-K:6YG('=H971H97(@=V4@87)E('5S:6YG M('1H92!'3E4@0R!C;VUP:6QEV%C7V-V7V-?8V]M<&EL97)?9VYU M*W-E='TB(#T@("HK)R!C;VYF=&5S="YE M&ET("1A8U]S=&%T=7,I.R!]("8F"@D@ M>R!A8U]T3TG=&5S="`M5PB M(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871U+WP@+R<@8V]N9G1E65S("8F(&5C:&\@>65S8`IA8U]T M97-T7T-&3$%'4STD>T-&3$%'4RMS971]"F%C7W-A=F5?0T9,04=3/21#1DQ! M1U,*0T9,04=3/2(M9R(*96-H;R`B)&%S7VUE.B1,24Y%3D\Z(&-H96-K:6YG M('=H971H97(@)$-#(&%C8V5P=',@+63TG=&5S M="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T M871UR`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A M;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S M=&%T=7,I.R!].R!].R!T:&5N"B`@86-?8W9?<')O9U]C8U]G/7EE'0*9FD*96-H;R`B)&%S7VUE.B1,24Y%3D\Z M(')E65S.R!T:&5N"B`@("!#1DQ!1U,](BUG("U/,B(*("!E;'-E M"B`@("!#1DQ!1U,](BUG(@H@(&9I"F5LV%C7V-V7W!R;V=?8V-?7,O$A()R!H97@@8VAA2!T"<@86QW87ES(&-O;65S(&]U="!T#`P)ST],"!T;R!G970@'0*:68@>R`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?8V]M<&EL95PB(BD@/B8U"B`@ M*&5V86P@)&%C7V-O;7!I;&4I(#(^8V]N9G1ER`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D M86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?'0*9&]N M90IR;2`M9B!C;VYF=&5S="XD86-?97AT(&-O;F9T97-T+B1A8U]O8FIE>'0* M0T,])&%C7W-A=F5?0T,*"F9I"@IC87-E(")X)&%C7V-V7W!R;V=?8V-?3TG=&5S="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@ M,CXF-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B M*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@9F]R(&%C7V1E8VQA M'1E'0@/#Q?04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J+PHD86-?9&5C;&%R M871I;VX*(VEN8VQU9&4@/'-T9&QI8BYH/@II;G0*;6%I;B`H*0I["F5X:70@ M*#0R*3L*("`["B`@'0*:68@>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@ M7"(D86-?8V]M<&EL95PB(BD@/B8U"B`@*&5V86P@)&%C7V-O;7!I;&4I(#(^ M8V]N9G1ER`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A M;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S M=&%T=7,I.R!].R!]("8F"@D@>R!A8U]T'0@/B8U"@IC;VYT:6YU M90IF:0IR;2`M9B!C;VYF=&5S="YE'0@/#Q? M04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J+PHD86-?9&5C;&%R871I;VX* M:6YT"FUA:6X@*"D*>PIE>&ET("@T,BD["B`@.PH@(')E='5R;B`P.PI]"E]! M0T5/1@IR;2`M9B!C;VYF=&5S="XD86-?;V)J97AT"FEF('L@*&5V86P@96-H M;R`B)&%S7VUE.B1,24Y%3D\Z(%PB)&%C7V-O;7!I;&5<(B(I(#XF-0H@("AE M=F%L("1A8U]C;VUP:6QE*2`R/F-O;F9T97-T+F5R,0H@(&%C7W-T871U3TG=&5S="`M M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871U MR`H979A;"!E8VAO M("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D M86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T M=7,I.R!].R!].R!T:&5N"B`@8G)E86L*96QS90H@(&5C:&\@(B1A+WP@+R<@8V]N9G1E M+WP@ M+R<@8V]N9G1E'0*86-?97AT M/6,*86-?8W!P/2'0@/B8U)PIA8U]L M:6YK/2'0@)$Q)0E,@/B8U)PIA8U]C M;VUP:6QE'0]8V,* M86-?8W!P/2'0@/B8U)PIA M8U]L:6YK/2'0@)$Q)0E,@/B8U M)PIA8U]C;VUP:6QE%]C;VUP:6QE"!C8RLK(&-L($9#0R!+ M0T,@4D-#('AL0U]R('AL0PH@(&1O"B`@("`C($5X=')A8W0@=&AE(&9I"1A8U]P"1A8U]PB`B)&%S7V1I M'0@:6X@)R<@)&%C7V5X M96-U=&%B;&5?97AT96YS:6]N"1A8U]P'0B(#XF-0H@("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD* M9FD*0UA8/21A8U]C=E]PT5#2$]?5'TD0UA8(B`^)C8*96QS90H@(&5C:&\@(B1A&Q#7W(@>&Q#"F1O"B`@(R!%>'1R86-T('1H92!F M:7)S="!W;W)D(&]F("(D86-?<')O9R(L('-O(&ET(&-A;B!B92!A('!R;V=R M86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2`D86-?<')O9SL@86-?=V]R M9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A8U]W M;W)D(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O&5C M=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V M7W!R;V=?86-?8W1?0UA8/2(D86-?<')O9R(*("`@(&5C:&\@(B1A'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@("HO"E]!0T5/1@IC870@ M8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0*8V%T(#X^8V]N9G1E'0*:68@>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@ M7"(D86-?8V]M<&EL95PB(BD@/B8U"B`@*&5V86P@)&%C7V-O;7!I;&4I(#(^ M8V]N9G1E3TG=&5S="`M2D@,CXF-0H@(&%C M7W-T871U+WP@+R<@8V]N9G1E%]C;VUP:6QE%]C;VUP M:6QET5#2$]?5'TD86-?8W9?8WAX7V-O;7!I M;&5R7V=N=2(@/B8V"D=86#U@=&5S="`D86-?8V]M<&EL97)?9VYU(#T@>65S M("8F(&5C:&\@>65S8`IA8U]T97-T7T-86$9,04=3/21[0UA81DQ!1U,K'A?9RMS971](B`]('-E=#L@=&AE;@H@(&5C:&\@)$5#2$]? M3B`B*&-A8VAE9"D@)$5#2$]?0R(@/B8V"F5L'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@("HO"E]!0T5/1@IC M870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0*8V%T(#X^8V]N9G1E M("HK)R!C;VYF=&5S="YE&ET("1A M8U]S=&%T=7,I.R!]("8F"@D@>R!A8U]T'A? M=V5R5PB(BD@ M/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z M)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R M/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!] M.R!T:&5N"B`@86-?8W9?<')O9U]C>'A?9SUY97,*96QS90H@(&5C:&\@(B1A M+WP@+R<@ M8V]N9G1E'0@8V]N9G1E M'A?9R(@/B8U"F5C:&\@(B1[14-(3U]4?21A8U]C=E]P M%]G(B`^)C8*:68@=&5S="`B)&%C7W1E%]G(#T@>65S.R!T:&5N"B`@:68@=&5S="`B M)$=86"(@/2!Y97,[('1H96X*("`@($-86$9,04=3/2(M9R`M3S(B"B`@96QS M90H@("`@0UA81DQ!1U,](BUG(@H@(&9I"F5L'1E&ET("AI;G0I('1H'1E&ET("AI;G0I.R!U'1E M&ET("AI;G0I.R<@7`H@("`G=F]I9"!E>&ET("AI;G0I M.R<*9&\*("!C870@/F-O;F9T97-T+B1A8U]E>'0@/#Q?04-%3T8*+RH@8V]N M9F1E9G,N:"X@("HO"E]!0T5/1@IC870@8V]N9F1E9G,N:"`^/F-O;F9T97-T M+B1A8U]E>'0*8V%T(#X^8V]N9G1E("HK)R!C;VYF=&5S="YE&ET("1A8U]S=&%T=7,I.R!]("8F"@D@>R!A8U]T M'A?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF M-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^ M)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@.@IE;'-E"B`@96-H;R`B M)&%S7VUE.B!F86EL960@<')O9W)A;2!W87,Z(B`^)C4*'0@8V]N9G1E M("HK)R!C;VYF=&5S="YE&ET("1A8U]S M=&%T=7,I.R!]("8F"@D@>R!A8U]T'A?=V5R M5PB(BD@/B8U M"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z)$Q) M3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U M"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T M:&5N"B`@8G)E86L*96QS90H@(&5C:&\@(B1A+WP@+R<@8V]N9G1E'0*9&]N90IR;2`M9B!C;VYF=&5S="H*:68@=&5S M="`M;B`B)&%C7V1E8VQA'0@/B8U)PIA8U]L:6YK/2'0@)$Q)0E,@/B8U)PIA8U]C;VUP:6QE'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N M:"X@("HO"E]!0T5/1@IC870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E M>'0*8V%T(#X^8V]N9G1EWT["FEN=`IM86EN("@I"GL*"B`@ M.PH@(')E='5R;B`P.PI]"E]!0T5/1@IR;2`M9B!C;VYF=&5S="XD86-?;V)J M97AT"FEF('L@*&5V86P@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(%PB)&%C7V-O M;7!I;&5<(B(I(#XF-0H@("AE=F%L("1A8U]C;VUP:6QE*2`R/F-O;F9T97-T M+F5R,0H@(&%C7W-T871U3TG=&5S="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R M>2D@,CXF-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y M7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@8V-?;&%N9STB M0RLK(@H)96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')E+WP@+R<@8V]N9G1E M'0*"F%C7V5X=#UC"F%C7V-P<#TG)$-04"`D0U!01DQ!1U,G M"F%C7V-O;7!I;&4])R1#0R`M8R`D0T9,04=3("1#4%!&3$%'4R!C;VYF=&5S M="XD86-?97AT(#XF-2<*86-?;&EN:STG)$-#("UO(&-O;F9T97-T)&%C7V5X M965X="`D0T9,04=3("1#4%!&3$%'4R`D3$1&3$%'4R!C;VYF=&5S="XD86-? M97AT("1,24)3(#XF-2<*86-?8V]M<&EL97)?9VYU/21A8U]C=E]C7V-O;7!I M;&5R7V=N=0IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@:&]W('1O M(')U;B!T:&4@0R!PB`B)$-04"([('1H96X*("!I9B!T M97-T("(D>V%C7V-V7W!R;V=?0U!0*W-E='TB(#T@6YT87@@97)R;W(B(&ES(&AE'0@/B8U"@H@(",@0G)O:V5N.B!F86EL M'0*"B`@(R!/2RP@=V]R:W,@;VX@&ES=&5N="!H96%D97)S M"B`@(R!C86X@8F4@9&5T96-T960@86YD(&AO=RX*("!C870@/F-O;F9T97-T M+B1A8U]E>'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@("HO"E]!0T5/1@IC M870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0*8V%T(#X^8V]N9G1E M&ES=&5N="YH/@I?04-%3T8*:68@>R`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?8W!P(&-O;F9T97-T+B1A8U]E M>'1<(B(I(#XF-0H@("AE=F%L("1A8U]C<'`@8V]N9G1E("HK M)R!C;VYF=&5S="YE&ET("1A8U]S=&%T M=7,I.R!](#XO9&5V+VYU;&P[('1H96X*("!I9B!T97-T("US(&-O;F9T97-T M+F5RB`B)&%C7V-P<%]E+WP@+R<@8V]N9G1ET5#2$]?5'TD0U!0(B`^)C8*86-?<')E<')O8U]O:SUF86QS90IF;W(@86-? M8U]P'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@("HO"E]!0T5/ M1@IC870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0*8V%T(#X^8V]N M9G1E"!ER`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D M86-?8W!P(&-O;F9T97-T+B1A8U]E>'1<(B(I(#XF-0H@("AE=F%L("1A8U]C M<'`@8V]N9G1E("HK)R!C;VYF=&5S="YE&ET("1A8U]S=&%T=7,I.R!](#XO9&5V+VYU;&P[('1H96X* M("!I9B!T97-T("US(&-O;F9T97-T+F5RB`B M)&%C7V-P<%]E'0@/#Q? M04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J+PHC:6YC;'5D92`\86-?;F]N M97AI'0I(#(^8V]N9G1E65S"F9I"FEF M('1E'0@/B8U"@H@(",@4&%S'0*:68@)&%C M7W!R97!R;V-?;VL[('1H96X*("`Z"F5L'0@/B8U)PIA8U]L:6YK/2'0@)$Q)0E,@/B8U)PIA8U]C;VUP:6QEV%C7V-V7W!R;V=?96=R97`K MT5#2$]?5'TD86-?8W9?<')O9U]E M9W)E<"(@/B8V"B!%1U)%4#TD86-?8W9?<')O9U]E9W)E<`H*"F5C:&\@(B1A M'0@/#Q?04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J+PHC:6YC;'5D M92`\3TG=&5S="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R M>2D@,CXF-0H@(&%C7W-T871UR`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y M7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@86-?8W9?:&5A M9&5R7W-T9&,]>65S"F5L'0@ M/B8U"@IA8U]C=E]H96%D97)?'0*8V%T(#X^8V]N9G1E65S.R!T M:&5N"B`@(R!)4T,@,BXP+C(@2!T;R!!3E-)+@H@(&-A="`^8V]N9G1E'0B*2`R/B8U('P*("`D14=215`@(F9R964B(#XO9&5V+VYU;&P@ M,CXF,3L@=&AE;@H@(#H*96QS90H@(&%C7V-V7VAE861E65S.R!T:&5N"B`@(R`O8FEN+V-C(&EN($ER:7@M-"XP+C4@9V5T M65S.R!T:&5N"B`@.@IE M;'-E"B`@8V%T(#YC;VYF=&5S="XD86-?97AT(#P\7T%#14]&"B\J(&-O;F9D M969S+F@N("`J+PI?04-%3T8*8V%T(&-O;F9D969S+F@@/CYC;VYF=&5S="XD M86-?97AT"F-A="`^/F-O;F9T97-T+B1A8U]E>'0@/#Q?04-%3T8*+RH@96YD M(&-O;F9D969S+F@N("`J+PHC:6YC;'5D92`\8W1Y<&4N:#X*(VEF("@H)R`G M("8@,'@P1D8I(#T](#!X,#(P*0HC(&1E9FEN92!)4TQ/5T52*&,I("@G82<@ M/#T@*&,I("8F("AC*2`\/2`G>BB&ET("@P*3L*?0I?04-%3T8*'0@/B8U"@HH(&5X:70@)&%C7W-T871U M&5E>'0@8V]N9G1E65S.R!T:&5N"@IC870@/CYC;VYF M9&5F7!ER1A'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@ M("HO"E]!0T5/1@IC870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0* M8V%T(#X^8V]N9G1E'0*:68@ M>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?8V]M<&EL95PB M(BD@/B8U"B`@*&5V86P@)&%C7V-O;7!I;&4I(#(^8V]N9G1ER`H979A;"!E8VAO("(D87-?;64Z)$Q) M3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U M"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!]("8F M"@D@>R!A8U]T+WP@+R<@8V]N9G1E'0*9FD*96-H M;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'U@979A;"!E8VAO M("RT5#2$]?5'U@979A;"!E8VAO("R2XN+B`D14-(3U]#(B`^)C8*8V%T(#YC;VYF M=&5S="XD86-?97AT(#P\7T%#14]&"B\J(&-O;F9D969S+F@N("`J+PI?04-% M3T8*8V%T(&-O;F9D969S+F@@/CYC;VYF=&5S="XD86-?97AT"F-A="`^/F-O M;F9T97-T+B1A8U]E>'0@/#Q?04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J M+PHD86-?:6YC;'5D97-?9&5F875L=`HC:6YC;'5D92`\)&%C7VAE861E'0*:68@>R`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?8V]M<&EL95PB(BD@/B8U"B`@ M*&5V86P@)&%C7V-O;7!I;&4I(#(^8V]N9G1ER`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D M86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?65S"F5L M'0@/B8U"@IA8U]H96%D97)? M8V]M<&EL97(];F\*9FD*'0@8V]N9G1E+WP@+R<@8V]N9G1E'0*96-H;R`B)&%S7VUE.B1, M24Y%3D\Z(')E65S.FYO.B`I"B`@("![(&5C:&\@(B1A2!T:&4@8V]M<&EL97(L(')E M:F5C=&5D(&)Y('1H92!P2!T:&4@8V]M<&EL M97(L(')E:F5C=&5D(&)Y('1H92!PR!E8VAO("(D87-?;64Z)$Q)3D5.3SH@5T%23DE.1SH@)&%C7VAE861ER1ARV%C7V-V7W!R;V=?05=+*W-E='TB(#T@&5C7V5X="!I;B`G)R`D M86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C=71A M8FQE7W`@(B1A'0B.R!T:&5N"B`@ M("!A8U]C=E]P&5C7V5X="(@ M/B8U"B`@("!BT5#2$]?5'UN;R(@/B8V"F9I"@H@('1E MV%C7V-V7W!R;V=?0TA-3T0K&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X* M("`@(&%C7V-V7W!R;V=?0TA-3T0](B1A8U]P'0B(#XF-0H@("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*0TA- M3T0])&%C7V-V7W!R;V=?0TA-3T0*:68@=&5S="`M;B`B)$-(34]$(CL@=&AE M;@H@(&5C:&\@(B1AV%C7V-V7W!A=&A?0T]- M4%)%4U,KB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT96YS:6]N M&5C7V5X="(*("`@(&5C:&\@(B1AB`B)&%S7V1I M'0@:6X@)R<@)&%C7V5X M96-U=&%B;&5?97AT96YS:6]N'0B(#XF-0H@("`@ M8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*0U`])&%C7V-V7W!R;V=? M0U`*:68@=&5S="`M;B`B)$-0(CL@=&AE;@H@(&5C:&\@(B1AB`B)&%S M7V1I'0@:6X@)R<@)&%C M7V5X96-U=&%B;&5?97AT96YS:6]N'0B(#XF-0H@ M("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*0U`])&%C7V-V7W!R M;V=?0U`*:68@=&5S="`M;B`B)$-0(CL@=&AE;@H@(&5C:&\@(B1AV%C7V-V7W!R;V=?0U`K&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@ M(&%C7V-V7W!R;V=?0U`](F-P(@H@("`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z M(&9O=6YD("1A'0B(#XF-0H@("`@ M8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*0U`])&%C7V-V7W!R;V=? M0U`*:68@=&5S="`M;B`B)$-0(CL@=&AE;@H@(&5C:&\@(B1A'1R86-T('1H92!F:7)S="!W;W)D(&]F("(D M86-?<')O9R(L('-O(&ET(&-A;B!B92!A('!R;V=R86T@;F%M92!W:71H(&%R M9W,N"G-E="!D=6UM>2`D86-?<')O9SL@86-?=V]R9#TD,@IE8VAO("(D87-? M;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^)C4*96-H;R`D M14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O&5C=71A8FQE7V5X=&5N&5C7V5X M="([('1H96X*("`@(&%C7V-V7W!R;V=?1$523T9&/2(D86-?<')O9R(*("`@ M(&5C:&\@(B1AV%C7V-V7W!R M;V=?1$E&1BMS971](B`]('-E=#L@=&AE;@H@(&5C:&\@)$5#2$]?3B`B*&-A M8VAE9"D@)$5#2$]?0R(@/B8V"F5LB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT M96YS:6]NB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U M=&%B;&5?97AT96YS:6]N'0B(#XF-0H@("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N M90H*("`[.PIET5#2$]?5'TD M1$E35$E,3"(@/B8V"F5L'1R86-T('1H92!F:7)S="!W;W)D(&]F("(D86-?<')O M9R(L('-O(&ET(&-A;B!B92!A('!R;V=R86T@;F%M92!W:71H(&%R9W,N"G-E M="!D=6UM>2`D86-?<')O9SL@86-?=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q) M3D5.3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^)C4*96-H;R`D14-(3U]. M(")C:&5C:VEN9R!F;W(@)&%C7W=O&5C7V5X M="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A M&5C=71A8FQE7W`@(B1A'0B M.R!T:&5N"B`@("!A8U]C=E]P'0B(#XF-0H@("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H* M9FD*9FD*1$E44D]&1CTD86-?8W9?<')O9U]$25123T9&"FEF('1ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1EV%C M7V-V7W!R;V=?151!1U,K&5C M=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V M7W!R;V=?151!1U,](B1A8U]P'0B(#XF-0H@ M("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*151!1U,])&%C7V-V M7W!R;V=?151!1U,*:68@=&5S="`M;B`B)$5404=3(CL@=&AE;@H@(&5C:&\@ M(B1AV%C7V-V7W!R;V=?15A004Y$*W-E='TB(#T@ M&5C7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D M;PH@(&EF("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]P&5C7V5X="(@/B8U"B`@("!BT5#2$]?5'UN;R(@/B8V"F9I"@H@('1E'1R86-T('1H92!F:7)S="!W;W)D(&]F("(D86-?<')O9R(L M('-O(&ET(&-A;B!B92!A('!R;V=R86T@;F%M92!W:71H(&%R9W,N"G-E="!D M=6UM>2`D86-?<')O9SL@86-?=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5. M3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C M:&5C:VEN9R!F;W(@)&%C7W=O&5C=71A M8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R M;V=?2D%2/2(D86-?<')O9R(*("`@(&5C:&\@(B1A&!U;F%M92`M#L@86-?=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5. M3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C M:&5C:VEN9R!F;W(@)&%C7W=O&5C=71A M8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R M;V=?3$58/2)L97@@+6PB"B`@("!E8VAO("(D87-?;64Z)$Q)3D5.3SH@9F]U M;F0@)&%S7V1I&5C7V5X="(@/B8U"B`@("!BT5#2$]?5'UN;R(@/B8V"F9I"@IE;'-E"@DC($5X=')A8W0@ M=&AE(&9I"(L('-O(&ET(&-A;B!B92!A('!R;V=R M86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2!L97@[(&%C7W=OV%C7V-V7W!R;V=?3$58*W-E='TB(#T@ M&5C7V5X M="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A M&5C=71A8FQE7W`@(B1A'0B M.R!T:&5N"B`@("!A8U]C=E]P'0B(#XF-0H@("`@8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*9FD*9FD*3$58 M/21A8U]C=E]PT5#2$]?5'TD3$58(B`^)C8*96QS90H@(&5C:&\@(B1A"(L('-O(&ET M(&-A;B!B92!A('!R;V=R86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2!F M;&5X.R!A8U]W;W)D/20R"F5C:&\@(B1AB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT96YS M:6]N&5C7V5X="(@/B8U"B`@("!BT5#2$]?5'UN;R(@/B8V"F9I"@H*9F]R(&%C7W!R;V<@:6X@;&X*9&\*("`C M($5X=')A8W0@=&AE(&9I&5C7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I M;VYS.R!D;PH@(&EF("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]PT5#2$]?5'TD3$XB(#XF-@IE;'-E"B`@96-H;R`B M)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]? M5'UN;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G M)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C M=71A8FQE7W`@(B1A'0B.R!T:&5N M"B`@("!A8U]C=E]PT5#2$]? M5'TD3%,B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1E'1R86-T('1H92!F:7)S="!W M;W)D(&]F(")M86XR:'1M;"(L('-O(&ET(&-A;B!B92!A('!R;V=R86T@;F%M M92!W:71H(&%R9W,N"G-E="!D=6UM>2!M86XR:'1M;#L@86-?=V]R9#TD,@IE M8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^ M)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O&5C M7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF M("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]P871H7TU!3C)(5$U,/2(D87-?9&ER+R1A M8U]W;W)D)&%C7V5X96-?97AT(@H@("`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z M(&9O=6YD("1A'0B(#XF-0H@("`@ M8G)E86L@,@H@(&9I"F1O;F4*9&]N90H*("!T97-T("UZ("(D86-?8W9?<&%T M:%]-04XR2%1-3"(@)B8@86-?8W9?<&%T:%]-04XR2%1-3#TB96-H;R!.;R!M M86XM=&\M:'1M;"!C;VYV97)T97(@879A:6QA8FQE.B(*("`[.PIE&5C7V5X="!I;B`G M)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C M=71A8FQE7W`@(B1A'0B.R!T:&5N M"B`@("!A8U]C=E]PT5#2$]?5'TD34M$25(B(#XF-@IE;'-E"B`@96-H;R`B)&%S M7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN M;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G M)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C M=71A8FQE7W`@(B1A'0B.R!T:&5N M"B`@("!A8U]C=E]PT5#2$]? M5'TD358B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G M)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C M=71A8FQE7W`@(B1A'0B.R!T:&5N M"B`@("!A8U]C=E]PT5#2$]?5'TD3E)/1D8B(#XF-@IE;'-E"B`@96-H;R`B)&%S M7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN M;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G M)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C M=71A8FQE7W`@(B1A'0B.R!T:&5N M"B`@("!A8U]C=E]PT5#2$]? M5'TD4DTB(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G)R`D86-? M97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C=71A8FQE M7W`@(B1A'0B.R!T:&5N"B`@("!A M8U]C=E]PT5#2$]?5'TD4DU$25(B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1, M24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V M"F9I"@H@('1E'1R86-T('1H92!F:7)S="!W;W)D(&]F M("(D86-?<')O9R(L('-O(&ET(&-A;B!B92!A('!R;V=R86T@;F%M92!W:71H M(&%R9W,N"G-E="!D=6UM>2`D86-?<')O9SL@86-?=V]R9#TD,@IE8VAO("(D M87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A8U]W;W)D(B`^)C4*96-H M;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X* M("`@(&%C7V-V7W!R;V=?4T5$/2(D86-?<')O9R(*("`@(&5C:&\@(B1AV%C7V-V7W!R;V=?4TA!4BMS971](B`]('-E=#L@=&AE M;@H@(&5C:&\@)$5#2$]?3B`B*&-A8VAE9"D@)$5#2$]?0R(@/B8V"F5LB`B)&%S7V1I'0@:6X@ M)R<@)&%C7V5X96-U=&%B;&5?97AT96YS:6]N&5C M7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF M("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]PT5#2$]?5'TD4U!%3$PB(#XF-@IE;'-E"B`@ M96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1E'1R86-T('1H M92!F:7)S="!W;W)D(&]F("(D86-?<')O9R(L('-O(&ET(&-A;B!B92!A('!R M;V=R86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2`D86-?<')O9SL@86-? M=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A M8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O M&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R;V=?5$%2/2(D86-?<')O9R(* M("`@(&5C:&\@(B1A&5C7V5X="!I;B`G)R`D86-?97AE8W5T86)L95]E>'1E;G-I;VYS.R!D M;PH@(&EF("1A&5C=71A8FQE7W`@(B1A'0B.R!T:&5N"B`@("!A8U]C=E]PT5#2$]?5'TD5$]50T@B(#XF-@IE M;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y%3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I"@H@('1E&5C7V5X="!I;B`G)R`D86-?97AE M8W5T86)L95]E>'1E;G-I;VYS.R!D;PH@(&EF("1A&5C=71A8FQE7W`@ M(B1A'0B.R!T:&5N"B`@("!A8U]C M=E]PT5#2$]?5'TD54Y:25`B(#XF-@IE;'-E"B`@96-H;R`B)&%S7VUE.B1,24Y% M3D\Z(')ET5#2$]?5'UN;R(@/B8V"F9I M"@H@('1E6%C8R!B:7-O;B!B>6%C8PID;PH@(",@17ATV%C7V-V7W!R;V=?64%#0RMS971] M(B`]('-E=#L@=&AE;@H@(&5C:&\@)$5#2$]?3B`B*&-A8VAE9"D@)$5#2$]? M0R(@/B8V"F5LB`B)&%S7V1I'0@:6X@)R<@)&%C7V5X96-U=&%B;&5?97AT96YS:6]NFEP(&9A;'-E"F1O"B`@(R!%>'1R86-T M('1H92!F:7)S="!W;W)D(&]F("(D86-?<')O9R(L('-O(&ET(&-A;B!B92!A M('!R;V=R86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2`D86-?<')O9SL@ M86-?=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R M("1A8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C M7W=O&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R;V=?6DE0/2(D86-?<')O M9R(*("`@(&5C:&\@(B1AF]O(&9A;'-E"F1O"B`@(R!%>'1R86-T('1H M92!F:7)S="!W;W)D(&]F("(D86-?<')O9R(L('-O(&ET(&-A;B!B92!A('!R M;V=R86T@;F%M92!W:71H(&%R9W,N"G-E="!D=6UM>2`D86-?<')O9SL@86-? M=V]R9#TD,@IE8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R("1A M8U]W;W)D(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@)&%C7W=O M&5C=71A8FQE7V5X=&5N&5C7V5X="([('1H96X*("`@(&%C7V-V7W!R;V=?6D]//2(D86-?<')O9R(* M("`@(&5C:&\@(B1A&%M<&QE+"!(4"U56"`Q,6D@/&QI;6ET2X@ M("HO"F-H87(@)&%C7V9U;F,@*"D["B\J(%1H92!'3E4@0R!L:6)R87)Y(&1E M9FEN97,@=&AIR`H979A;"!E8VAO("(D87-?;64Z)$Q) M3D5.3SH@7"(D86-?;&EN:UPB(BD@/B8U"B`@*&5V86P@)&%C7VQI;FLI(#(^ M8V]N9G1ER`H979A;"!E M8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A M;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S M=&%T=7,I.R!].R!]("8F"@D@>R!A8U]T5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T M871U65S(@IE;'-E"B`@96-H;R`B)&%S7VUE.B!F86EL M960@<')O9W)A;2!W87,Z(B`^)C4*'0@7`H@("`@("!C;VYF=&5S M="1A8U]E>&5E>'0@8V]N9G1ERR'0@/#Q?04-%3T8*+RH@8V]N9F1E M9G,N:"X@("HO"E]!0T5/1@IC870@8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A M8U]E>'0*8V%T(#X^8V]N9G1E7!E(&]F(&$@9V-C M,@H@("!B=6EL=&EN(&%N9"!T:&5N(&ETPIA;&QO8V$@*"D["B`@.PH@(')E='5R;B`P.PI]"E]!0T5/1@IR M;2`M9B!C;VYF=&5S="XD86-?;V)J97AT(&-O;F9T97-T)&%C7V5X965X=`II M9B![("AE=F%L(&5C:&\@(B1A("HK)R!C;VYF=&5S="YE&ET("1A8U]S=&%T=7,I.R!]("8F"@D@>R!A8U]T3TG=&5S="`M&5E>'0G"B`@>R`H979A M;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H M979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A M8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@86-?8W9?;&EB7U!77V%L;&]C83UY M97,*96QS90H@(&5C:&\@(B1A+WP@+R<@8V]N9G1E'0@7`H@("`@("!C;VYF=&5S="1A8U]E>&5E>'0@8V]N M9G1E65S.R!T M:&5N"B`@8V%T(#X^8V]N9F1E9G,N:"`\/%]!0T5/1@HC9&5F:6YE($A!5D5? M3$E"4%<@,0I?04-%3T8*"B`@3$E"4STB+6Q05R`D3$E"4R(*"F9I"@H*3$58 M/2(D86-?8W9?<')O9U],15@B"FEF('1E'AL97@B M"G1H96X*("`@(&EF('1E"!L:6)R87)Y(B`^)C4*96-H;R`D14-(3U].(")C:&5C:VEN9R!F;W(@ M;&5X+V9L97@@;&EB2XN+B`D14-(3U]#(B`^)C8*"5-!5D5,24)3/2(D M3$E"4R(*"4Q)0E,](B13059%3$E"4R`M;&PB"@EC870@/F-O;F9T97-T+B1A M8U]E>'0@/#Q?04-%3T8*+RH@8V]N9F1E9G,N:"X@("HO"E]!0T5/1@IC870@ M8V]N9F1E9G,N:"`^/F-O;F9T97-T+B1A8U]E>'0*8V%T(#X^8V]N9G1E&5E>'0*:68@>R`H979A M;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?;&EN:UPB(BD@/B8U"B`@ M*&5V86P@)&%C7VQI;FLI(#(^8V]N9G1ER`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-? M=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!]("8F"@D@>R!A8U]T5PB(BD@/B8U"B`@*&5V86P@)&%C M7W1R>2D@,CXF-0H@(&%C7W-T871U'0@/#Q?04-%3T8*+RH@96YD(&-O;F9D969S+F@N M("`J+PH*:6YT"FUA:6X@*"D*>PH*("`["B`@'0@8V]N9G1E3TG=&5S="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@ M(&%C7W-T871U'0@/B8U"@I,3#T*9FD*'0@7`H@("`@("!C;VYF=&5S="1A M8U]E>&5E>'0@8V]N9G1E7EW7EW7!E('1O(&%V;VED(&%N(&5R7!E('=O=6QD('-T:6QL(&%P<&QY+B`@*B\*8VAA7=R87`@*"D["FEN M=`IM86EN("@I"GL*>7EW&5E M>'0*:68@>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?;&EN M:UPB(BD@/B8U"B`@*&5V86P@)&%C7VQI;FLI(#(^8V]N9G1ER`H979A;"!E8VAO("(D87-?;64Z)$Q) M3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D86-?=')Y*2`R/B8U M"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!]("8F M"@D@>R!A8U]T5PB(BD@/B8U M"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871U+WP@+R<@8V]N9G1E7=R M87`B(#XF-@II9B!T97-T("1A8U]C=E]L:6)?;%]Y>7=R87`@/2!Y97,[('1H M96X*("!C870@/CYC;VYF9&5F7EW7=R87`@:6X@+6QF M;"XN+B`D14-(3U]#(B`^)C8*:68@=&5S="`B)'MA8U]C=E]L:6)?9FQ?>7EW M2!G8V,R(&EN=&5R;F%L('!R;W1O='EP92!T;R!A=F]I9"!A;B!E M'1E2X@("HO"F-H M87(@>7EW'0@ M8V]N9G1E3TG=&5S="`M>B`B)&%C7V-?=V5R5PB(BD@/B8U"B`@*&5V M86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871U7EW7=R87`B(#XF-0IE8VAO("(D>T5#2$]? M5'TD86-?8W9?;&EB7V9L7WEY=W)A<"(@/B8V"FEF('1E7=R87`@/2!Y97,[('1H96X*("!C870@/CYC;VYF9&5F("HK)R!C;VYF=&5S="YE&ET("1A8U]S=&%T=7,I.R!]("8F"@D@>R!A M8U]T3TG=&5S="`M&5E>'0G"B`@ M>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^ M)C4*("`H979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@3$P]+6QF;`IE;'-E"B`@ M96-H;R`B)&%S7VUE.B!F86EL960@<')O9W)A;2!W87,Z(B`^)C4*'0*"4Q)0E,](B13059%3$E" M4R`D3$PB"@EE8VAO("(D87-?;64Z)$Q)3D5.3SH@T5#2$]?5'TD3$PB(#XF-@H@("`@96QS90H*96-H;R`B)&%S M7VUE.B1,24Y%3D\Z(&-H96-K:6YG(&9O7=R87`@:6X@+6QF;"(@/B8U M"F5C:&\@)$5#2$]?3B`B8VAE8VMI;F<@9F]R('EY=W)A<"!I;B`M;&9L+BXN M("1%0TA/7T,B(#XF-@II9B!T97-T("(D>V%C7V-V7VQI8E]F;%]Y>7=R87`K M'0@ M/#Q?04-%3T8*+RH@96YD(&-O;F9D969S+F@N("`J+PH*+RH@3W9E7!E('1O(&%V;VED(&%N(&5R7!E('=O=6QD('-T:6QL(&%P<&QY+B`@*B\*8VAA7=R87`@*"D["FEN=`IM86EN("@I"GL*>7EW&5E>'0*:68@>R`H979A;"!E8VAO("(D87-?;64Z)$Q)3D5. M3SH@7"(D86-?;&EN:UPB(BD@/B8U"B`@*&5V86P@)&%C7VQI;FLI(#(^8V]N M9G1ER`H979A;"!E8VAO M("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H979A;"`D M86-?=')Y*2`R/B8U"B`@86-?&ET("1A8U]S=&%T M=7,I.R!].R!]("8F"@D@>R!A8U]T5PB(BD@/B8U"B`@*&5V86P@)&%C7W1R>2D@,CXF-0H@(&%C7W-T871U M7=R87`]>65S"F5L'0@/B8U"@IA8U]C=E]L:6)?9FQ?>7EW'0*3$E"4STD86-?8VAE8VM? M;&EB7W-A=F5?3$E"4PIF:0IE8VAO("(D87-?;64Z)$Q)3D5.3SH@7EW'@D3$58(B`](")X M>&9L97@B"G1H96X*("`@($Q%6#TB9FQE>"`M;"(*96QI9B!T97-T(")X>"1, M15@B(#T@(GAX;&5X(@IT:&5N"B`@("!I9B!T97-T(")X>&!U;F%M92`M"YY>2YC(#(^+V1E=B]N=6QL"F9I"@IE M8VAO("(D87-?;64Z)$Q)3D5.3SH@8VAE8VMI;F<@9F]R('EA8V,@;&EB2(@/B8U"F5C:&\@)$5#2$]?3B`B8VAE8VMI;F<@9F]R('EA8V,@;&EB2XN+B`D14-(3U]#(B`^)C8*64%#0STB)&%C7V-V7W!R;V=?64%#0R(*64%# M0TQ)0CT*:68@=&5S="`B>'@D64%#0R(@/2`B>'AY86-C(@IT:&5N"B`@("!A M8U]S879E7TQ)0E,](B1,24)3(@H@("`@3$E"4STM;'D*("`@(&-A="`^8V]N M9G1E("HK)R!C;VYF=&5S="YE&ET("1A8U]S=&%T=7,I.R!]("8F"@D@>R!A8U]T3TG=&5S="`M&5E>'0G"B`@>R`H979A M;"!E8VAO("(D87-?;64Z)$Q)3D5.3SH@7"(D86-?=')Y7"(B*2`^)C4*("`H M979A;"`D86-?=')Y*2`R/B8U"B`@86-?&ET("1A M8U]S=&%T=7,I.R!].R!].R!T:&5N"B`@64%#0TQ)0CTM;'D*96QS90H@(&5C M:&\@(B1A M+WP@+R<@8V]N9G1E'0*("`@($Q)0E,](B1A8U]S879E7TQ) M0E,B"F9I"DQ)0E,](B1,24)3("1904-#3$E"(@IE8VAO("(D87-?;64Z)$Q) M3D5.3SH@'@D64%#0R(@/2`B>'AB:7-O;B(*=&AE;@H@ M("`@649,04=3/2(D649,04=3("UY(@H@("`@96-H;R`B)&%S7VUE.B1,24Y% M3D\Z(')ET5#2$]?5'TM>2(@/B8V"F5L M6UB;VQS(&YE961E9"!O;B!3 M=6X@4V]L87)I6UB;VQS(&YE961E9"!O;B!3=6X@4V]L87)I'A3=6Y/4R(*=&AE;@H@("`@1$5& M24Y%4STB)$1%1DE.15,@+41?7T585$523E]#7U\B"B`@("!E8VAO("(D87-? M;64Z)$Q)3D5.3SH@7,@871T96YT:6]N('1O('1H92!C86-H92!F M:6QE(&EF('EO=2!G:79E(&ET"B,@=&AE("TM2!O9B!W2P*(R!A M;F0@PH@("AS970I(#(^)C$@?`H@("`@ M8V%S92!@*&%C7W-P86-E/2<@)SL@7%PH6U\D87-?8W)?86QN=6U=*E]C=E];7R1A M86-?8W9?96YV+R%S M+UY<*%M>/5TJ7"D]7"@N*EPI)"]<,3TD>UPQ/5PR?2\*("`@("`Z(&5N9"<@ M/CYC;VYF8V%C:&4*:68@9&EF9B`D8V%C:&5?9FEL92!C;VYF8V%C:&4@/B]D M978O;G5L;"`R/B8Q.R!T:&5N(#H[(&5L"(@/2!X M3D].12`F)B!PW!R969I>'TG"@HC(%90051((&UA>2!C M875S92!TW-R8V1IPIS+SHJ7"0H7"A;7CU=*CU;"2!=*EPI.BHO M7#$O.PIS+SHJ)"\O.PIS+UY;7CU=*CU;"2!=*B0O+SL*?2<*9FD*"D1%1E,] M+41(059%7T-/3D9)1U]("@IA8U]L:6)O8FIS/0IA8U]L=&QI8F]B:G,]"F9O M'1E;G-I;VXL(&%N9"`D M52!I9B!A;')E861Y(&EN'0B"B`@86-?;'1L:6)O8FIS/2(D86-?;'1L:6)O8FIS M("1A8U]I(BUI32%]615)324].*W-E M='TB("8F("AE;75L871E('-H*2`^+V1E=B]N=6QL(#(^)C$[('1H96X*("!E M;75L871E('-H"B`@3E5,3$--1#TZ"B`@(R!:&ET*2`^+V1E=B]N=6QL(#(^)C$[('1H96X*("!A'!R(&$@.B`G7"AA7"DG(#XO9&5V+VYU;&P@,CXF M,3L@=&AE;@H@(&%S7V5X<'(]97AP<@IE;'-E"B`@87-?97AP'!R(%@O(B0P(B`Z("+UU;7B]=*EPI+RHD)R!< M?"!<"@D@6"(D,"(@.B`G6%PH+R]<*20G(%Q\(%P*"2!8(B0P(B`Z("=87"@O M7"DD)R!R!S+R]<,2\[('$[('T*("`)("`O7EA<+UPH7"]<+UPI)"][(',O+UPQ+SL@ M<3L@?0H@(`D@("]>6%PO7"A<+UPI+BHO>R!S+R]<,2\[('$[('T*("`)("!S M+RXJ+RXO.R!Q)V`*"@HC(%!!5$@@;F5E9',@0U(L(&%N9"!,24Y%3D\@;F5E M9',@0U(@86YD(%!!5$@N"B,@079O:60@9&5P96YD:6YG('5P;VX@0VAA7HG"F%S7V-R7TQ%5%1%4E,])T%"0T1%1D=(24I+3$U.3U!14E-4 M55976%E:)PIAU!!5$A?4T5005)!5$]2*W-E='TB("$] M('-E=#L@=&AE;@H@(&5C:&\@(B,A("]B:6XO&ES=&5N=#LN(CL@8V]N9B0D+G-H*2`^ M+V1E=B]N=6QL(#(^)C$[('1H96X*("`@(%!!5$A?4T5005)!5$]2/2<[)PH@ M(&5L"1A"1AB`B)&%S7V1I7-E;&8])&%S7V1IR![(&5C:&\@(B1A7-E;&8[(')ER`H97AI="`Q*3L@97AI="`Q.R!].R!]"B`@9FD* M("!C87-E("1#3TY&24=?4TA%3$P@:6X*("`G)RD*("`@(&%S7W-A=F5?2493 M/21)1E,[($E&4STD4$%42%]315!!4D%43U(*9F]R(&%S7V1I'!R("1AR!"05-(7T5.5CT[(&5X<&]R="!"05-(7T5.5CL@?0H)("`@("`D M87-?=6YS970@14Y6('Q\('1E&5C("(D0T].1DE'7U-(14Q,(B`B)#`B("1[,2LB)$`B?0H)("`@9FD[.PH) M(&5S86,*("`@("`@(&1O;F4*9&]N90H[.PH@(&5S86,*"B`@(R!#6YT87@N("`Z+2D*("!S960@)STG(#PD M87-?;7ES96QF('P*("`@('-E9"`G"B`@("`@($X*("`@("`@R![(&5C:&\@(B1AR`H97AI="`Q*3L@97AI="`Q.R!].R!] M"@H@(",@1&]N)W0@=')Y('1O(&5X96,@87,@:70@8VAA;F=E&ET('-T871U'!R/65X<'(* M96QS90H@(&%S7V5X<'(]9F%L6UL:6YK&5C=71A8FQE7W`](G1E'!R97-S:6]N M('1O(&UA<"!A('-T'!R97-S M:6]N('1O(&UA<"!A('-T2!T:&%T(&]R9&5R+@IA&5C(#8^)C$*"B,@3W!E;B!T:&4@;&]G(')E86P@+BXN+R,C("\["<@/#Q?05-"3U@*(R,@4G5N;FEN9R`D87-?;64N M(",C"E]!4T)/6`I](#XF-0IC870@/B8U(#P\7T-314]&"@I4:&ES(&9I;&4@ M=V%S(&5X=&5N9&5D(&)Y("1A2!'3E4@075T;V-O;F8@,BXU.2X@($EN=F]C871I;VX@8V]M;6%N9"!L:6YE M('=A&ET"B`@+58L("TM=F5R&ET"B`@+7$L("TM<75I970@("`@("!D;R!N;W0@<')I;G0@ M<')O9W)E2!T:&4@=7-E'!R(")X)#$B(#H@)WA<*%M>/5TJ7"D])V`* M("`@(&%C7V]P=&%R9SU@97AP"0Q(B`Z("=X6UX]72H]7"@N*EPI)V`* M("`@(&%C7W-H:69T/3H*("`@(#L["B`@+2HI"B`@("!A8U]O<'1I;VX])#$* M("`@(&%C7V]P=&%R9STD,@H@("`@86-?2!<8"0P("TM:&5L<"<@9F]R(&UO&ET(#$I.R!E>&ET(#$[('T[('T[.PH@("TM M:&5L<"!\("TM:&5L('P@+6@@*0H@("`@96-H;R`B)&%C7V-S7W5S86=E(CL@ M97AI="`P(#L["B`@+2UD96)U9R!\("TM9"H@?"`M9"`I"B`@("!D96)U9STZ M(#L["B`@+2UF:6QE('P@+2UF:6P@?"`M+69I('P@+2UF("D*("`@("1A8U]S M:&EF=`H@("`@0T].1DE'7T9)3$53/2(D0T].1DE'7T9)3$53("1A8U]O<'1A M2!<8"0P("TM:&5L M<"<@9F]R(&UO&ET(#$I M.R!E>&ET(#$[('T[('T@.SL*"B`@*BD@86-?8V]N9FEG7W1A'1R85]A'1R85]AR![(&5C M:&\@(B1AR`H97AI="`Q*3L@97AI="`Q.R!].R!].SL*("!E2!T:&]S92!T:&%T(&%R92!N M;W0N"B,@5V4@=7-E('1H92!L;VYG(&9O'1R96UE;'D*(R!B:7IAT-/3D9)1U]&24Q%4RMS971](B`]('-E="!\?"!#3TY&24=? M1DE,15,])&-O;F9I9U]F:6QE2!D:7)E8W1O2!B96-A=7-E('1H97)E(&ES(&YO M(')E87-O;B!T;R!P=70@:70@:&5R92P@86YD(&EN(&%D9&ET:6]N+`HC(&-R M96%T:6YG(&%N9"!M;W9I;F<@9FEL97,@9G)O;2`O=&UP(&-A;B!S;VUE=&EM M97,@8V%U2P@86YD(&AO;VL@9F]R(&ETR`H97AI M="`Q*3L@97AI="`Q.R!])R`Q(#(@,3,@,34*?0H*(R!#PH@("!E8VAO("(D;64Z M(&-A;FYO="!C&ET(#$I.R!E>&ET(#$[('T*?0H*7T%#14]&"@IC870@/CXD M0T].1DE'7U-405154R`\/%]!0T5/1@H*(PHC($-/3D9)1U]&24Q%4R!S96-T M:6]N+@HC"@HC($YO(&YE960@=&\@9V5N97)A=&4@=&AE('-C7-C;VYF9&ER+#MT M('0*%]S961? M;&EN97,]-#@*("!A8U]S961?9G)A9STQ(",@3G5M8F5R(&]F(&-U%]S961?;&EN97,@(R!,:6YE(&%F=&5R(&QA MV%C M7V)E9WUD.R`D>V%C7V5N9'UQ(B`D=&UP+W-U8G,ND$M6E]=6V$M>D$M6E\P+3E=*D`O M(6(G("8F(&-A="`D=&UP+W-U8G,N9G)A9RD@/B1T;7`O'!R("1A8U]S961?9G)A9R`K(#%@"B`@ M("`@(&%C7V)E9STD86-?96YD"B`@("`@(&%C7V5N9#U@97AP%]S961?;&EN97-@"B`@("!F:0H@(&1O;F4*("!I9B!T97-T M("UZ("(D86-?"1A8U]F:6QE(B`]('@Z("8F(&-O M;G1I;G5E"B`@(R!3=7!P;W)T(")O=71F:6QE6SII;F9I;&5;.FEN9FEL92XN M+EU=(BP@9&5F875L=&EN9R!I;F9I;&4](F]U=&9I;&4N:6XB+@H@(&-A.ETJ.BPL)V`*"6%C7V9I;&4]8&5C:&\@(B1A M8U]F:6QE(B!\('-E9"`G.ETJ.BPL)V`*"6%C7V9I M;&4]8&5C:&\@(B1A8U]F:6QE(B!\('-E9"`GR!S+R]<,2\[('$[ M('T*("`)("`O7EA<*%PO7"]<*20O>R!S+R]<,2\[('$[('T*("`)("`O7EA< M*%PO7"DN*B][(',O+UPQ+SL@<3L@?0H@(`D@(',O+BHO+B\[('$G8`H@('L@ M:68@)&%S7VUK9&ER7W`[('1H96X*("`@(&UK9&ER("UP("(D86-?9&ER(@H@ M(&5L+UU<*2\O*EM>+UU;7B]=*B\J)"<@7'P@7`H)(%@B)&%S7V1I+UTG(%Q\(%P*"2!8(B1A+UU<*5PO7"\J6UXO75M>+UTJ7"\J)"][(',O+UPQ M+SL@<3L@?0H@(`D@("]>6%PH7"]<+UPI6UXO72XJ+WL@R!S+R]<,2\[('$[('T*("`)("!S+RXJ+RXO.R!Q)V`*("`@(&1O M;F4*("`@('1ER![(&5C:&\@(B1A2!<(B1A8U]D M:7)<(B(@/B8R.WT*("`@>R`H97AI="`Q*3L@97AI="`Q.R!].R!].R!]"@H@ M(&%C7V)U:6QD9&ER/2X*"FEF('1E2!I;B`D M86-?9&ER7W-U9F9I>"X*("!A8U]T;W!?8G5I;&1D:7(]8&5C:&\@(B1A8U]D M:7)?B`B)&%C7W1O<%]B=6EL9&1I2!N;W0@ M97AIV%C7W1O<%]B=6EL9&1I"(D86-?9FEL92(@(3T@>"T[('1H96X*("`@('L@96-H;R`B M)&%S7VUE.B1,24Y%3D\Z(&-R96%T:6YG("1A8U]F:6QE(B`^)C4*96-H;R`B M)&%S7VUE.B!C6QE+"!AR![(&5C:&\@(B1A MR`H97AI="`Q*3L@97AI="`Q.R!].R!] M"@D@96-H;R`B)&8B.SL*("`@("`@*BD@(R!296QA=&EV90H)(&EF('1ER!E8VAO("(D87-?;64Z)$Q)3D5.3SH@97)R M;W(Z(&-A;FYO="!F:6YD(&EN<'5T(&9I;&4Z("1F(B`^)C4*96-H;R`B)&%S M7VUE.B!ER`H97AI="`Q*3L@97AI="`Q.R!]"E]!0T5/1@IC M870@/CXD0T].1DE'7U-405154R`\/%]!0T5/1@H@('-E9"`B)&%C7W9P'1R87-U8@I?04-%3T8*8V%T(#X^)$-/3D9)1U]35$%455,@/#Q<7T%# M14]&"CIT"B]`6V$M>D$M6E]=6V$M>D$M6E\P+3E=*D`O(6(*"(D86-? M9FEL92(@(3T@>"T@)B8@>R!E8VAO("(D87-?;64Z)$Q)3D5.3SH@8W)E871I M;F<@)&%C7V9I;&4B(#XF-0IE8VAO("(D87-?;64Z(&-R96%T:6YG("1A8U]F M:6QE(B`^)C8[?0H*("`C($9I&ET(#$I M.R!E>&ET(#$[('T[('T*"2`C($1O('%U;W1E("1F+"!T;R!P&ET(#$I.R!E>&ET M(#$[('T[('T*"2!F:3L["B`@("`@(&5S86,*("`@(&1O;F5@('Q\('L@*&5X M:70@,2D[(&5X:70@,3L@?0H@(",@4F5M;W9E('1H92!T2!M86-R;R!D969I;FET:6]N6PD@72HC6PD@72ID969I;F5;"2!=6PD@ M72I<*%M>"2`H75M>"2`H72I<*5PH*%M>*5TJ*5PI6PD@72I<*"XJ7"DD+"1[ M86-?9$%]7#$D>V%C7V1"?5PQ7#(D>V%C7V1#?5PS)'MA8U]D1'TL9W`*="!E M;F0*6PD@72HC6PD@72ID969I;F5;"2!=6PD@72I<*%M>"2!=6UX)(%TJ M7"E;"2!=*EPH+BI<*20L)'MA8U]D07U<,21[86-?9$)]7#$D>V%C7V1#?5PR M)'MA8U]D1'TL9W`*.B!E;F0*7T%#14]&"B,@268@2!N;W0@=V%N="!T;PHC('-O7-T96US('=H M97)E(&-O;F9I9W5R92!W:6QL(&YO="!D96-I9&4@=&\@9&5F:6YE(&ET+@IC M870@/CYC;VYF=&5S="YU;F1E9G,@/#Q<7T%#14]&"G,L7EL)(%TJ(UL)(%TJ M=6YD969;"2!=6PD@72I;82UZ02U:7UU;82UZ02U:7S`M.5TJ+"\J("8@*B\L M"E]!0T5/1@H*(R!"6PD@72HC6PD@72ID M969I;F4O(6(G(#X^)$-/3D9)1U]35$%455,*("`C(%=OV%C7VUA>%]H M97)E7VQI;F5S?60@8V]N9G1E+UU<*2\O*EM>+UU;7B]=*B\J M)"<@7'P@7`H)(%@B)&%C7V9I;&4B(#H@)UA<*"\O7"E;7B]=)R!6%PH+BI;7B]=7"E< M+UPO*EM>+UU;7B]=*EPO*B0O>R!S+R]<,2\[('$[('T*("`)("`O7EA<*%PO M7"]<*5M>+UTN*B][(',O+UPQ+SL@<3L@?0H@(`D@("]>6%PH7"]<+UPI)"][ M(',O+UPQ+SL@<3L@?0H@(`D@("]>6%PH7"]<*2XJ+WL@+UU<*2\O*EM>+UU; M7B]=*B\J)"<@7'P@7`H)(%@B)&%S7V1I+UTG(%Q\ M(%P*"2!8(B1A+UU< M*5PO7"\J6UXO75M>+UTJ7"\J)"][(',O+UPQ+SL@<3L@?0H@(`D@("]>6%PH M7"]<+UPI6UXO72XJ+WL@R!S+R]<,2\[('$[ M('T*("`)("!S+RXJ+RXO.R!Q)V`*("`@(&1O;F4*("`@('1ER![(&5C:&\@ M(B1A2!<(B1A8U]D:7)<(B(@/B8R.WT*("`@>R`H M97AI="`Q*3L@97AI="`Q.R!].R!].R!]"@H@("`@("!R;2`M9B`D86-?9FEL M90H@("`@("!M=B`D=&UP+V-O;F9I9RYH("1A8U]F:6QE"B`@("!F:0H@(&5L M#H@)B8@8V]N=&EN=64*("!A8U]D97-T/6!E8VAO("(D86-?9FEL M92(@?"!S960@)W,L.BXJ+"PG8`H@(&%C7W-O=7)C93U@96-H;R`B)&%C7V9I M;&4B('P@.ETJ.BPL)V`*("!A8U]D:7(]8"AD:7)N86UE("(D M86-?9&5S="(I(#(^+V1E=B]N=6QL('Q\"B1A'!R(%@B)&%C7V1E+UTJ+RHD)R!+UTG(%Q\(%P*"2!8(B1A8U]D97-T(B`Z("=8 M7"@O+UPI)"<@7'P@7`H)(%@B)&%C7V1E+UU<*5PO7"\J6UXO75M>+UTJ7"\J M)"][(',O+UPQ+SL@<3L@?0H@(`D@("]>6%PH7"]<+UPI6UXO72XJ+WL@R!S+R]<,2\[('$[('T*("`)("!S+RXJ+RXO.R!Q M)V`*("![(&EF("1A'!R(%@B)&%S7V1I M6%PH+BI;7B]=7"E<+UPO*EM>+UU;7B]=*EPO*B0O M>R!S+R]<,2\[('$[('T*("`)("`O7EA<*%PO7"]<*5M>+UTN*B][(',O+UPQ M+SL@<3L@?0H@(`D@("]>6%PH7"]<+UPI)"][(',O+UPQ+SL@<3L@?0H@(`D@ M("]>6%PH7"]<*2XJ+WL@R!E8VAO("(D87-?;64Z)$Q)3D5.3SH@97)R M;W(Z(&-A;FYO="!C#TO8&5C:&\@(B1A8U]D:7(B('P@"(@?"!S960@)W,L+UM>7%PO72HL+BXO+&#T@86-?=&]P7V)U:6QD9&ER/0IF:0H*8V%S M92`D#L*("`@(&%C7W1O<%]S MV%C7W1O<%]B=6EL9&1I2!C;&]S M:6YG(&-O;F9I9RYL;V2`H65S.R!T:&5N"B`@86-?8W-?65S("8F"B`@("!A8U]C M;VYF:6=?&5C(#4^+V1E=B]N=6QL"B`@)%-(14Q,("1#3TY&24=?4U1! M5%53("1A8U]C;VYF:6=?R`H 797AI="`Q*3L@97AI="`Q.R!]"F9I"@H@ ` end SHAR_EOF $shar_touch -am 09231508104 'configure' && chmod 0775 'configure' || $echo 'restore of' 'configure' 'failed' if ( md5sum --help &1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version &1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'configure:' 'MD5 check failed' 9ee8c78a21393e89b8dc0d719dc790b7 configure SHAR_EOF else shar_count="`LC_ALL=C wc -c < 'configure'`" test 183803 -eq "$shar_count" || $echo 'configure:' 'original size' '183803,' 'current size' "$shar_count!" fi fi # ============= configure.in ============== if test -f 'configure.in' && test "$first_param" != -c; then $echo 'x -' SKIPPING 'configure.in' '(file already exists)' else $echo 'x -' extracting 'configure.in' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'configure.in' && dnl Process this file with autoconf to produce a configure script. AC_INIT(bibparse.y) X AC_CONFIG_HEADER(config.h:config.hin) X dnl Checks for compiler AC_PROG_CC AC_PROG_CXX AC_MSG_CHECKING(for compiler language) AC_TRY_COMPILE([extern "C" {};],[], X [cc_lang="C++" X AC_MSG_RESULT(C++)], X [cc_lang="C" X AC_MSG_RESULT(C)]) X dnl Checking for header files AC_CHECK_HEADERS(alloca.h stdlib.h) X dnl Checking for programs X AC_CHECK_PROGS(AWK, nawk gawk mawk bawk awk) X AC_CHECK_PROGS(CHMOD, chmod) X AC_PATH_PROGS(COMPRESS, [gzip compress]) X dnl We want a copy command that has the -p (preserve time stamp) flag, dnl but older cp implementations lack it. scp an