Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

REPOST: v04i002: csize - csize-part1of4, Part01/04

6 views
Skip to first unread message

Christopher Lott

unread,
Oct 17, 1994, 5:29:13 PM10/17/94
to
Submitted-by: lo...@informatik.uni-kl.de (Christopher Lott)
Posting-number: Volume 4, Issue 2
Archive-name: csize/part01
Environment: ANSI C,FLEX


Blurb: Csize performs lexical analysis on C source files to
collect various size measures. Both old-style (K&R) and
new-style (ANSI) C files are accepted.

#!/bin/sh
# This is csize, a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 10/11/1994 15:46 UTC by lo...@informatik.uni-kl.de
# Source directory /home/bogner/lott/Src/c/c-metrics/csize
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 3731 -rw-r--r-- README
# 9283 -rw-r--r-- INSTALL
# 7540 -rw-r--r-- csize.man
# 4455 -rw-r--r-- Makefile.in
# 548 -rw-r--r-- configure.in
# 623 -rw-r--r-- aclocal.m4
# 20740 -rwxr-xr-x configure
# 2186 -rwxr-xr-x install.sh
# 1035 -rw-r--r-- csize.h
# 3694 -rw-r--r-- csize.c
# 1881 -rw-r--r-- scan.h
# 19720 -rw-r--r-- scan.l
# 383 -rw-r--r-- patchlevel.h
# 10770 -rw-r--r-- ansi2knr.c
# 910 -rw-r--r-- ansi2knr.1
# 17983 -rw-r--r-- COPYING
# 6667 -rw-r--r-- ChangeLog
# 67608 -rw-r--r-- scan.c.flex
# 29900 -rw-r--r-- t-dir.tar.Z.uu
#
# ============= README ==============
if test -f 'README' -a X"$1" != X"-c"; then
echo 'x - skipping README (File already exists)'
else
echo 'x - extracting README (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'README' &&
X
X$Id: README,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X
XThis is csize, a program to measure the size of C source files.
XCopyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
XFB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X
XThis program is free software; you can redistribute it and/or modify
Xit under the terms of the GNU General Public License as published by
Xthe Free Software Foundation. See the file COPYING for more details.
X
X---
X
XThis directory holds the code for csize, a program that measures the
Xsize of C programs. See the man page for a detailed discussion of the
Xmeasures, their definitions, and their pitfalls. No complexity
Xmeasures are computed.
X
XThe measures are purely syntactical; the program has no understanding of
Xthe C grammar. Measures such as declaration or executable statement counts
Xrequire an understanding of the semantics of C. Although these measures
Xwould be valuable, computing them would require the scanner to differentiate
Xbetween /identifiers/ and /type names/; i.e., csize would need the type
Xsystem from a C compiler. See p. 234 of Kernighan and Ritchie, 2nd edn.,
X2nd paragraph, 2nd-to-last sentence.
X
XThe scanner-generator flex is required; see the INSTALL file for the
Xexact version that is required. I use flex to generate a scanner that
Xrecognizes tokens from the C language. The scanner is arguably
Xunderutilized. However, I much prefer using flex because I think it
Xmakes the code which I must write far simpler to maintain. The code
Xsize is hardly a problem, and I don't think that I can generate a
Xscanner that runs faster than a flex scanner. The file scan.l holds
Xthe source used by flex to generate the scanner for C. The old unix
Xutility lex will not work; it complains about the file:
X "scan.l", line 401: (Error) Too many right contexts
XIf you simply remove the first token ("auto"), then lex dumps core on
Xmy machine. Neither behavior is acceptable and I refuse to code
Xaround bugs in lex when flex is available, reliable, and free.
X
XThe foundation for this code was a rudimentary C parser distributed
Xoriginally by Jeff Lee (see README attached below). The scan.h file
Xin this distribution was actually generated by yacc from that grammar.
X
XChristopher Lott <lo...@informatik.uni-kl.de>, 21 August 1994
X
X
X
X----- Begin: README from Jeff Lee
X
XThe files in this directory contain the ANSI C grammar from the April 30, 1985
Xdraft of the proposed standard. This copy also incorporates all bug fixes I
Xhave seen since the last two postings. With a little work this grammar can
Xbe made to parse the C that most of us know and love (sort of).
X
XThere is one bug fix to the grammar that is in this posting. On line 295
Xof gram.y it previously read declaration_specifiers instead of
Xtype_specifier_list as it does now. I believe the folks at the ANSI committee
Xmade a mistake since if you replace the line with what the original read
Xyou will end up with 16 shift/reduce errors and 2 reduce/reduce errors
X(the good ones). As it is, it only has 1 shift/reduce error that occurs
Xon the if/else construct. YACC creates the correct parser and I don't want
Xto ugly my grammar up.
X
XAnyway, all cumquats unite and generate this sucker. Then just sit and play
Xwith it. Remember, the grammar accepts things like
X
X "Hello, world"++;
X --1.23456;
X *'a'
X
Xbut this is not a bug, but simply a shuffling of the checking into the
Xsemantic analysis. If you want to hack it up to do lvalue and rvalue
Xchecking, I'm sure the ANSI committee would be glad to have your changes.
XDon't send'em to me though. I don't want'em. Wear this in good health.
X
XJeff Lee
Xgatech!jeff jeff@gatech jeff%gatech...@CSNet-Relay.ARPA
X
X----- End: README from Jeff Lee
SHAR_EOF
chmod 0644 README ||
echo 'restore of README failed'
Wc_c="`wc -c < 'README'`"
test 3731 -eq "$Wc_c" ||
echo 'README: original size 3731, current size' "$Wc_c"
fi
# ============= INSTALL ==============
if test -f 'INSTALL' -a X"$1" != X"-c"; then
echo 'x - skipping INSTALL (File already exists)'
else
echo 'x - extracting INSTALL (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'INSTALL' &&
X
X$Id: INSTALL,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X
XINSTALLATION OF CSIZE:
X
XQuick Summary:
X
X 1. Build Makefile:
X ./configure
X 2. Compile csize:
X make
X 3. Extract regression tests:
X make t-dir
X 4. Run regression tests:
X make check
X 5. Install program and man page:
X make install
X
XThe Complete Instructions:
X
X0. Attached at the end of this file are the complete INSTALL instructions
X supplied as part of autoconf. They will help you use use the various
X features supported by the configure script.
X
X1. These instructions are written with UNIX strongly in mind. If you
X have a PC and can send me revised instructions, I would welcome
X the addition.
X
X2. Version 2.4.7 of the scanner-generator ``flex'' is required.
X Older versions exhibit markedly different behavior. The standard
X UNIX command "lex" refuses the file scan.l. If you don't have
X flex installed on your system, now is the time to do so. I can
X send the sources if you lack ftp access.
X
X However, just in case you really, really can't get and install
X flex, I have included a generated version of the scanner in file
X scan.c.flex; *copy* it to file scan.c and continue.
X
X3. It's best if you use a compiler that supports ANSI C such as gcc.
X If you don't have one, the program ansi2knr (supplied) will covert
X function prototypes into a form acceptable to an old C compiler.
X
X4. Type "./configure" to build the necessary Makefile. Generic and
X lengthy instructions about configure are attached below.
X
X5. Type "make" to build csize. Please use gnumake, if possible, to
X eliminate problems caused by different versions of make. For example,
X some makes don't understand the "-k" flag (for "keep going on error").
X
X6. Type "make t-dir" to extract the test suite. Because one of my
X test data files lacks a newline on the last line, I was forced to use
X tar, compress, and uuencode to pack up the test suite. Shar simply
X can't handle a file with no newline at the end. If the steps encoded
X in the Makefile don't work on your Unix system, please tell me how I
X can fix the problem or at least explain it.
X
X7. Type "make check" to reassure yourself that csize works. This will
X run my regression test suite and compare the results obtained on my
X system with the results generated by the newly compiled version.
X
X One possible but unimportant source of deviations from the expected
X output is getopt(), the function that processes command-line arguments.
X Different implementations of getopt() may give different error messages
X in response to an illegal option, and these will show up as differences
X from the expected output. This is nothing to worry about. Two examples:
X
X 377c377
X < csize: Error: Illegal option -- u
X ---
X > csize: illegal option -- u
X
X Or:
X
X 377c377
X < ../csize: illegal option -- u
X ---
X > csize: illegal option -- u
X
X8. Format and print the man page. I use the following command:
X "groff -man csize.man | lpr -Plaser". Substitute your *roff
X formatter, print-queue program, and printer name as appropriate.
X
X9. Check the Makefile again, then consider typing "make install"
X to copy the program and the man page to system directories.
X
XThat really should be all that is necessary. Unfortunately, I only had
Xthe opportunity to test the program on Sun sparcs running SunOS 4.1.3_U1
Xand Solaris 2.3. I welcome all fixes for better portability.
X
XChristopher Lott <lo...@informatik.uni-kl.de>, 2 September 1994
X
X--
X
X
XThis is a generic INSTALL file for utilities distributions.
XIf this package does not come with, e.g., installable documentation or
Xdata files, please ignore the references to them below.
X
XTo compile this package:
X
X1. Configure the package for your system. In the directory that this
Xfile is in, type `./configure'. If you're using `csh' on an old
Xversion of System V, you might need to type `sh configure' instead to
Xprevent `csh' from trying to execute `configure' itself.
X
XThe `configure' shell script attempts to guess correct values for
Xvarious system-dependent variables used during compilation, and
Xcreates the Makefile(s) (one in each subdirectory of the source
Xdirectory). In some packages it creates a C header file containing
Xsystem-dependent definitions. It also creates a file `config.status'
Xthat you can run in the future to recreate the current configuration.
X
XRunning `configure' takes a minute or two. While it is running, it
Xprints some messages that tell what it is doing. If you don't want to
Xsee the messages, run `configure' with its standard output redirected
Xto `/dev/null'; for example, `./configure >/dev/null'.
X
XTo compile the package in a different directory from the one
Xcontaining the source code, you must use a version of `make' that
Xsupports the VPATH variable, such as GNU `make'. `cd' to the directory
Xwhere you want the object files and executables to go and run
X`configure'. `configure' automatically checks for the source code in
Xthe directory that `configure' is in and in `..'. If for some reason
X`configure' is not in the source code directory that you are
Xconfiguring, then it will report that it can't find the source code.
XIn that case, run `configure' with the option `--srcdir=DIR', where
XDIR is the directory that contains the source code.
X
XBy default, `make install' will install the package's files in
X/usr/local/bin, /usr/local/lib, /usr/local/man, etc. You can specify
Xan installation prefix other than /usr/local by giving `configure' the
Xoption `--prefix=PATH'. Alternately, you can do so by giving a value
Xfor the `prefix' variable when you run `make', e.g.,
X make prefix=/usr/gnu
X
XYou can specify separate installation prefixes for
Xarchitecture-specific files and architecture-independent files. If
Xyou give `configure' the option `--exec-prefix=PATH' or set the
X`make' variable `exec_prefix' to PATH, the package will use PATH as
Xthe prefix for installing programs and libraries. Data files and
Xdocumentation will still use the regular prefix. Normally, all files
Xare installed using the regular prefix.
X
XAnother `configure' option is useful mainly in `Makefile' rules for
Xupdating `config.status' and `Makefile'. The `--no-create' option
Xfigures out the configuration for your system and records it in
X`config.status', without actually configuring the package (creating
X`Makefile's and perhaps a configuration header file). Later, you can
Xrun `./config.status' to actually configure the package. You can also
Xgive `config.status' the `--recheck' option, which makes it re-run
X`configure' with the same arguments you used before. This option is
Xuseful if you change `configure'.
X
XSome packages pay attention to `--with-PACKAGE' options to `configure',
Xwhere PACKAGE is something like `gnu-libc' or `x' (for X windows).
XThe README should mention any --with- options that the package recognizes.
X
X`configure' ignores any other arguments that you give it.
X
XIf your system requires unusual options for compilation or linking
Xthat `configure' doesn't know about, you can give `configure' initial
Xvalues for some variables by setting them in the environment. In
XBourne-compatible shells, you can do that on the command line like
Xthis:
X CC='gcc -traditional' DEFS=-D_POSIX_SOURCE ./configure
X
XThe `make' variables that you might want to override with environment
Xvariables when running `configure' are:
X
X(For these variables, any value given in the environment overrides the
Xvalue that `configure' would choose:)
XCC C compiler program.
X Default is `cc', or `gcc' if `gcc' is in your PATH.
XINSTALL Program to use to install files.
X Default is `install' if you have it, `cp' otherwise.
X
X(For these variables, any value given in the environment is added to
Xthe value that `configure' chooses:)
XDEFS Configuration options, in the form `-Dfoo -Dbar ...'
X Do not use this variable in packages that create a
X configuration header file.
XLIBS Libraries to link with, in the form `-lfoo -lbar ...'
X
XIf you need to do unusual things to compile the package, we encourage
Xyou to figure out how `configure' could check whether to do them, and
Xmail diffs or instructions to the address given in the README so we
Xcan include them in the next release.
X
X2. Type `make' to compile the package. If you want, you can override
Xthe `make' variables CFLAGS and LDFLAGS like this:
X
X make CFLAGS=-O2 LDFLAGS=-s
X
X3. If the package comes with self-tests and you want to run them,
Xtype `make check'. If you're not sure whether there are any, try it;
Xif `make' responds with something like
X make: *** No way to make target `check'. Stop.
Xthen the package does not come with self-tests.
X
X4. Type `make install' to install programs, data files, and
Xdocumentation.
X
X5. You can remove the program binaries and object files from the
Xsource directory by typing `make clean'. To also remove the
XMakefile(s), the header file containing system-dependent definitions
X(if the package uses one), and `config.status' (all the files that
X`configure' created), type `make distclean'.
X
XThe file `configure.in' is used as a template to create `configure' by
Xa program called `autoconf'. You will only need it if you want to
Xregenerate `configure' using a newer version of `autoconf'.
SHAR_EOF
chmod 0644 INSTALL ||
echo 'restore of INSTALL failed'
Wc_c="`wc -c < 'INSTALL'`"
test 9283 -eq "$Wc_c" ||
echo 'INSTALL: original size 9283, current size' "$Wc_c"
fi
# ============= csize.man ==============
if test -f 'csize.man' -a X"$1" != X"-c"; then
echo 'x - skipping csize.man (File already exists)'
else
echo 'x - extracting csize.man (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'csize.man' &&
X.\" $Id: csize.man,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X.\" Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X.TH CSIZE 1 "September 2, 1994"
X.SH NAME
Xcsize \- measure the size of C source files
X.SH SYNOPSIS
X.B csize
X[
X.B \-ehv
X]
X.I filename.c
X[
X\&.\|.\|.
X]
X.SH DESCRIPTION
X.B csize
Xperforms lexical analysis on the named C source files to
Xcollect several size measures, keeping a total count for all
Xfiles.
XUse of
X.B csize
Xis superior to
X.B wc
Xbecause in addition to newline counts, the user can measure
Xcode density, commenting, and use of the preprocessor.
XBoth old-style (K&R) and new-style (ANSI) C files are accepted.
XThe C preprocessor is
X.I not
Xrun, and preprocessor directives are counted instead of being
Xexpanded. The program was designed to measure the source as the
Xprogrammer sees it.
XThe input is expected to be acceptable for a C compiler;
Xlexically incorrect input will cause unreliable output ("GIGO").
XThe program has much of the functionality of a C preprocessor.
XThe logically successive phases described in K&Rrev2 which a
Xpreprocessor must implement are implemented in the form of a single
Xpass over the input.
X.SH OPTIONS
X.TP
X.B \-e
XEcho the input file while it is being processed.
X.TP
X.B \-h
XInclude a descriptive header when printing the results.
X.TP
X.B \-v
XReport version information (all other arguments are ignored).
X.SH MEASURES
X.B csize
Xcollects data for the following size measures of C source code:
Xtotal lines, blank lines, lines with comments, nonblank noncomment
Xlines, semicolons, and preprocessor directives.
XA line is defined as the sequence of characters between two
Xnewline characters. The sole exception to this definition is the
Xfirst line of a file, which starts at the beginning of the input file.
XThe last line is expected to be terminated by a newline character.
X.TP
X.B total lines
XThe number of newline characters in the file.
XThis is identical to the result computed by
X.I wc
Xwith the lines ("\-l") option.
X(However, if it were sufficient to use
X.I wc ,
Xthis program would be wholly unnecessary!)
X
XPitfalls: arguably a poor measure of a file's size, because this
Xmeasure is heavily influenced by bracing style, spacing, and
Xcontinuation lines.
X.TP
X.B blank lines
XThe number of lines in the file with nothing but white-space
Xcharacters between the previous newline character and the newline that
Xterminates the line. A white-space character is defined as a blank, a
Xhorizontal tab, a vertical tab, or a form-feed character.
X
XPitfalls: blank lines within comments are counted as lines with
Xcomments. A blank line as a preprocessor continuation line will
Xterminate the directive and is therefore counted not as a blank line
Xbut as a nonblank noncomment line.
X.TP
X.B lines with comments
XThe number of lines on which a comment occurs.
XThe appearance of a comment anywhere on a line causes that line to be
Xmarked as having a comment.
XAny number of comments, each with its own start token ("/*")
Xand end token ("*/"), may occur on a single line; the line will only
Xbe counted once.
XIf a comment extends over multiple lines, each line is counted as
Xhaving a comment.
X
XPitfalls: in C, unlike FORTRAN, there is no such thing as a pure
Xcomment line. Comments can appear before, within, or after normal C
Xstatements on the same line as the statements, as well as on lines of
Xtheir own. Therefore the sum of the measures "lines with comments,"
X"blank lines," and "noncomment nonblank lines" will only sometimes be
Xequal to the measure "number of newlines," and then only by chance.
XSee also the discussions in
X.B blank lines
Xand
X.B preprocessor directives
Xin regard to counting lines with comments.
X.TP
X.B nonblank noncomment lines
XThe number of lines that are not blank and do not consist entirely of
Xa comment.
XThis includes preprocessor directives.
XThis measure approximates the number of nonblank, noncommentary source
Xlines (often labeled NCSL) in a C source file.
X
XPitfalls: This measure includes lines with nothing but curly braces,
Xso choosing a different bracing style can affect this measure
Xsignificantly.
X.TP
X.B semicolons
XThe number of semicolons that do not appear in string constants.
XThis measure approximates the number of variable declarations,
Xfunction prototypes, and executable statements in a C source file.
X
XPitfalls: Although most statements are terminated with a semicolon,
Xfunction headers have no semicolons, "while" statements and
X"case" statements can be written with a bare minimum of semicolons,
Xand a single for statement has a minimum of two semicolons.
XSee also the discussion in
X.B preprocessor directives
Xin regard to counting semicolons.
X
X.TP
X.B preprocessor directives
XThe number of occurrences of the hash sign ("#"), followed by optional
Xwhite-space characters, followed by a preprocessor keyword, followed
Xby any characters up to the next nonescaped newline. The following
Xkeywords are recognized: define, undef, include, line, error, pragma,
Xendif, if, ifdef, ifndef, elif, or else, include_next, import,
Xwarning, sccs, ident, assert, unassert.
XAgain, the preprocessor is not run: included files are not pulled in,
Xno macro substitutions are done, etc.
X
XPitfalls: The hash sign does not have to be the first non-white-space
Xcharacter on a line.
XComments that begin on the same line as a preprocessor directive are
Xprocessed until the closing comment token, and then processing of the
Xpreprocessor directive resumes.
XOther than comments, all characters between the preprocessor keyword
Xand the next nonescaped newline are ignored, so any other preprocessor
Xdirectives or semicolons on the same line are not counted.
XSee also the discussion in
X.B blank lines
Xin regard to counting preprocessor directives.
X.SH EXAMPLE
XA version of the hello, world program is measured in this example.
X.nf
X.ta .5i
X.sp
X% cat hello.c
X/* hello, world */
X
X#include <stdio.h>
Xint main(argc, argv) /* what about envp? */
Xint argc;
Xchar **argv;
X{
X printf("hello, world.\n");
X}
X% csize -h hello.c
X total blank lines w/ nb, nc semi- preproc. file
X lines lines comments lines colons direct.
X--------+--------+--------+--------+--------+--------+----
X 9 1 2 7 3 1 hello.c
X.fi
X.SH DIAGNOSTICS
XThe program will complain about lexical errors such as an unescaped
Xnewline character inside a string constant or an end-of-file
Xcondition within a comment.
X.SH BUGS
XThis entire program can justifiably be considered called a bug,
Xbecause these measures should be computed by the C compiler.
XCompiler support is required to count declarations and executable
Xstatements.
X
XThe measures are strongly tied to the newline character.
XIf the last character in the file is not a newline (users of
X.I emacs
Xshould be familiar with this phenomenon), then the last line will
Xnot be counted in accordance with one's intuition. In other words,
Xnonblank noncomment text on the last line will not cause the
Xappropriate counter to be incremented.
X
XANSI-style trigraphs are not supported.
XNeither dollar signs ($) nor at signs (@) are accepted in identifiers.
X
XThere are certainly pathological cases out there that will
Xconfuse the program, although they are accepted by a C
Xcompiler. The author would much appreciate being told of
Xsuch cases and any possible remedies.
X.SH SEE ALSO
Xwc(1), lc(1) by Brian Marick, kdsi(1) by Brian Renaud, _The C
XProgramming Language_ by Brian W. Kernighan and Dennis M. Ritchie,
XPrentice Hall, 1988.
X.SH AUTHOR
XChristopher Lott <lo...@informatik.uni-kl.de>
SHAR_EOF
chmod 0644 csize.man ||
echo 'restore of csize.man failed'
Wc_c="`wc -c < 'csize.man'`"
test 7540 -eq "$Wc_c" ||
echo 'csize.man: original size 7540, current size' "$Wc_c"
fi
# ============= Makefile.in ==============
if test -f 'Makefile.in' -a X"$1" != X"-c"; then
echo 'x - skipping Makefile.in (File already exists)'
else
echo 'x - extracting Makefile.in (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.in' &&
X#
X# $Id: Makefile.in,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X#
X# Makefile.in for csize, a program to measure the size of C source files
X# Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X# FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X#
X# This program is free software; you can redistribute it and/or modify
X# it under the terms of the GNU General Public License as published by
X# the Free Software Foundation. See the file COPYING for more details.
X#
X
X#
X# to be safe
X#
XSHELL = /bin/sh
X@SET_MAKE@
X
X#
X# a trick to decide whether to invoke ansi2knr or not
X#
XU = @U@
X
X#
X# in case source and binaries are split
X#
Xsrcdir = @srcdir@
X
X#
X# an ANSI C compiler is required because of function prototypes
X# Flex is required. Lex refuses to accept the file scan.l
X#
XCC = @CC@
XDEFS = @DEFS@
XCFLAGS = @CFLAGS@
XLDFLAGS = @LDFLAGS@
XLIBS = @LIBS@
XLEX = @LEX@
X
X#
X# how to install program and man page
X#
XINSTALL = @INSTALL@
XINSTALL_PROGRAM = @INSTALL_PROGRAM@
XINSTALL_DATA = @INSTALL_DATA@
X
X#
X# where to install the program and man page
X#
X
Xprefix = /usr/local
Xexec_prefix = $(prefix)
Xbindir = $(exec_prefix)/bin
Xmandir = $(prefix)/man/man1
Xmanext = .1
X
XCPPFLAGS = -I. -I$(srcdir) $(DEFS)
X
X.c.o:
X $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
X
X.l.c:
X $(LEX) -t $< > $@
X
X#
X# source files for the program, both documentation and code
X# all of these files are kept under version control
X#
XSRCFILES = README INSTALL csize.man \
X Makefile.in configure.in aclocal.m4 configure install.sh \
X csize.h csize.c scan.h scan.l patchlevel.h \
X ansi2knr.c ansi2knr.1 COPYING ChangeLog
X
X#
X# files needed to build the program
X# the $U macro will be empty if the compiler supports prototypes,
X# and have just an underscore if it does not - see targets below
X#
X
XSRCS = scan.l csize.c
XOBJS = $Uscan.o $Ucsize.o
XHDRS = scan.h
XLIBS =
X
Xall: csize
X
Xcsize: $(OBJS)
X $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
X
X
X$(OBJS): csize.h
Xscan.o: scan.h
X
X#
X# targets to help people without ANSI C compilers
X#
Xansi2knr: ansi2knr.c
X $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(srcdir)/ansi2knr.c
X
X_csize.c: csize.c ansi2knr
X ./ansi2knr $(srcdir)/csize.c > $@
X
X_scan.c: scan.c ansi2knr
X ./ansi2knr $(srcdir)/scan.c > $@
X
X#
X# pattern that describes files from test directory
X# that should be packed into a tar file
X# need to leave out directory by name of RCS
X#
XTESTDIR = t-dir
XTESTDIRFILES = $(TESTDIR)/README $(TESTDIR)/[A-QS-Za-z]*
X
X#
X# files that can be made and hence nuked
X#
XEXTRAFILES = scan.c.flex $(TESTDIR).tar.Z.uu
X
X#
X# files to include in the shar archive
X#
XSHARFILES = $(SRCFILES) $(EXTRAFILES)
X
X#
X# Sun's make appears to process the timestamp on a directory differently
X# from the the timestamp on a file: it does not recognize that the unpacked
X# directory is newer than the source file. So I put the process in the
X# user's hands, which I feel is acceptable for an infrequently executed task.
X# Gnumake *does* recognize that the directory is newer, but I didn't want
X# to require gnumake.
X#
Xcheck: csize
X @if [ -d $(TESTDIR) ] ; then \
X echo "Running tests in subdirectory $(TESTDIR)"; \
X cd $(TESTDIR); $(MAKE) -k; \
X else \
X echo "Please type 'make $(TESTDIR)' to unpack the test files, then 'make $@' again."; \
X fi
X
X$(TESTDIR):
X uudecode $(TESTDIR).tar.Z.uu
X uncompress $(TESTDIR).tar.Z
X tar xf $(TESTDIR).tar
X rm -f $(TESTDIR).tar
X
X$(TESTDIR).tar.Z.uu: $(TESTDIRFILES)
X tar cf $(TESTDIR).tar $(TESTDIRFILES)
X compress $(TESTDIR).tar
X uuencode $(TESTDIR).tar.Z < $(TESTDIR).tar.Z > $@
X rm -f $(TESTDIR).tar.Z
X
Xinstall: csize
X $(INSTALL_PROGRAM) csize $(bindir)
X $(INSTALL_DATA) csize.man $(mandir)/csize$(manext)
X
Xuninstall:
X rm -f $(bindir)/csize
X rm -f $(mandir)/csize$(manext)
X
Xcheckin:
X ci -f -l $(SRCFILES)
X
Xscan.c.flex: scan.c
X mv $? $@
X
Xclean:
X cd $(TESTDIR); $(MAKE) $@
X rm -f scan.c _csize.c _scan.c *.o csize
X
Xdistclean: clean
X rm -f Makefile config.status ansi2knr
X
Xrealclean: distclean
X rm -f $(EXTRAFILES) csize.shar*
X
X#
X# pack all files into one shar file
X#
Xcsize.shar: $(SHARFILES)
X shar -F $(SHARFILES) > $@
X
X#
X# pack all files into shar files of a size that is suitable for distributing
X#
Xshar: $(SHARFILES)
X shar -a -F -n csize -s lo...@informatik.uni-kl.de -o csize.shar.part -l 80 $(SHARFILES)
X
X#
X# for configuration etc.
X#
XMakefile: Makefile.in config.status
X $(SHELL) config.status
Xconfig.status: configure
X $(SHELL) config.status --recheck
Xconfigure: configure.in
X cd $(srcdir); autoconf
SHAR_EOF
chmod 0644 Makefile.in ||
echo 'restore of Makefile.in failed'
Wc_c="`wc -c < 'Makefile.in'`"
test 4455 -eq "$Wc_c" ||
echo 'Makefile.in: original size 4455, current size' "$Wc_c"
fi
# ============= configure.in ==============
if test -f 'configure.in' -a X"$1" != X"-c"; then
echo 'x - skipping configure.in (File already exists)'
else
echo 'x - extracting configure.in (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'configure.in' &&
Xdnl Configure template for csize
Xdnl Process this file with autoconf to produce a configure script.
Xdnl
XAC_INIT(csize.c)
X
XAC_SET_MAKE
X
XCFLAGS=${CFLAGS--O}
XAC_VERBOSE(setting CFLAGS to $CFLAGS)AC_SUBST(CFLAGS)
X
XLDFLAGS=${LDFLAGS-}
XAC_VERBOSE(setting LDFLAGS to $LDFLAGS)AC_SUBST(LDFLAGS)
X
XAC_PROG_INSTALL
X
XAC_PROG_CC
X
XAC_PROTOTYPES
X
XAC_PROG_LEX
X
Xcase "$LEX" in
Xflex)
X echo "NOTE: I found flex, but didn't check the version number."
X ;;
Xlex)
X echo "NOTE: Sorry, flex is required, and I couldn't find it."
X exit 1
X ;;
Xesac
X
XAC_OUTPUT(Makefile)
SHAR_EOF
chmod 0644 configure.in ||
echo 'restore of configure.in failed'
Wc_c="`wc -c < 'configure.in'`"
test 548 -eq "$Wc_c" ||
echo 'configure.in: original size 548, current size' "$Wc_c"
fi
# ============= aclocal.m4 ==============
if test -f 'aclocal.m4' -a X"$1" != X"-c"; then
echo 'x - skipping aclocal.m4 (File already exists)'
else
echo 'x - extracting aclocal.m4 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'aclocal.m4' &&
Xdnl Local additions to Autoconf macros.
Xdnl reused wholsale from the GNU m-1.2 distribution
Xdnl
Xdnl Copyright (C) 1992, 1994 Free Software Foundation, Inc.
Xdnl Francois Pinard <pin...@iro.umontreal.ca>, 1992.
Xdnl
Xdnl Check for function prototypes.
Xdnl With ideas from Brook G. Milligan <br...@trillium.botany.utexas.edu>.
Xdnl
Xdefine(AC_PROTOTYPES,
X[AC_COMPILE_CHECK([function prototypes],
X[#ifndef __STDC__
XKaBoom!
X#endif],
X[extern int test (int i, double x);
Xstruct s1 {int (*f) (int a);};
Xstruct s2 {int (*f) (double a);};],
XU=
XAC_VERBOSE(setting U to be empty),
XU=_
XAC_VERBOSE(setting U to _)
X)AC_SUBST(U)])dnl
Xdnl
Xdnl
SHAR_EOF
chmod 0644 aclocal.m4 ||
echo 'restore of aclocal.m4 failed'
Wc_c="`wc -c < 'aclocal.m4'`"
test 623 -eq "$Wc_c" ||
echo 'aclocal.m4: original size 623, current size' "$Wc_c"
fi
# ============= configure ==============
if test -f 'configure' -a X"$1" != X"-c"; then
echo 'x - skipping configure (File already exists)'
else
echo 'x - extracting configure (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'configure' &&
X#!/bin/sh
X# Guess values for system-dependent variables and create Makefiles.
X# Generated automatically using autoconf version 1.11
X# Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
X
X# This configure script is free software; you can redistribute it and/or
X# modify it under the terms of the GNU General Public License as published
X# by the Free Software Foundation; either version 2, or (at your option)
X# any later version.
X
X# This script is distributed in the hope that it will be useful, but
X# WITHOUT ANY WARRANTY; without even the implied warranty of
X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
X# Public License for more details.
X
X# You should have received a copy of the GNU General Public License
X# along with this program; if not, write to the Free Software
X# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
X
X# Save the original args to write them into config.status later.
Xconfigure_args="$*"
X
X# Only options that might do something get documented.
Xac_usage="Usage: configure [options] [host]
XOptions: [defaults in brackets after descriptions]
X--build=BUILD configure for building on BUILD [BUILD=HOST]
X--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
X--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
X--exec-prefix=PREFIX install host dependent files in PREFIX [/usr/local]
X--help print this message
X--host=HOST configure for HOST [guessed]
X--prefix=PREFIX install host independent files in PREFIX [/usr/local]
X--quiet, --silent do not print \`checking for...' messages
X--srcdir=DIR find the sources in DIR [configure dir or ..]
X--target=TARGET configure for TARGET [TARGET=HOST]
X--verbose print results of checks
X--version print the version of autoconf that created configure
X--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
X--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
X--x-includes=DIR X include files are in DIR
X--x-libraries=DIR X library files are in DIR"
X
X# Initialize some variables set by options.
X# The variables have the same names as the options, with
X# dashes changed to underlines.
Xbuild=NONE
Xexec_prefix=
Xhost=NONE
Xno_create=
Xnonopt=NONE
Xnorecursion=
Xprefix=
Xprogram_prefix=
Xprogram_suffix=
Xprogram_transform_name=
Xsilent=
Xsrcdir=
Xtarget=NONE
Xverbose=
Xx_includes=
Xx_libraries=
X
Xac_prev=
Xfor ac_option
Xdo
X
X # If the previous option needs an argument, assign it.
X if test -n "$ac_prev"; then
X eval "$ac_prev=\$ac_option"
X ac_prev=
X continue
X fi
X
X # Accept (but ignore some of) the important Cygnus configure
X # options, so we can diagnose typos.
X
X case "$ac_option" in
X -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
X *) ac_optarg= ;;
X esac
X
X case "$ac_option" in
X
X -build | --build | --buil | --bui | --bu | --b)
X ac_prev=build ;;
X -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
X build="$ac_optarg" ;;
X
X -disable-* | --disable-*)
X ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
X echo "configure: $ac_feature: invalid feature name" >&2; exit 1
X fi
X ac_feature=`echo $ac_feature| sed 's/-/_/g'`
X eval "enable_${ac_feature}=no" ;;
X
X -enable-* | --enable-*)
X ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
X echo "configure: $ac_feature: invalid feature name" >&2; exit 1
X fi
X ac_feature=`echo $ac_feature| sed 's/-/_/g'`
X case "$ac_option" in
X *=*) ;;
X *) ac_optarg=yes ;;
X esac
X eval "enable_${ac_feature}='$ac_optarg'" ;;
X
X # For backward compatibility, recognize -exec-prefix and --exec_prefix.
X -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
X | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
X | --exec | --exe | --ex)
X ac_prev=exec_prefix ;;
X -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
X | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
X | --exec=* | --exe=* | --ex=*)
X exec_prefix="$ac_optarg" ;;
X
X -gas | --gas | --ga | --g)
X with_gas=yes ;; # Obsolete; use --with-gas.
X
X -help | --help | --hel | --he)
X cat << EOF
X$ac_usage
XEOF
X exit 0 ;;
X
X -host | --host | --hos | --ho)
X ac_prev=host ;;
X -host=* | --host=* | --hos=* | --ho=*)
X host="$ac_optarg" ;;
X
X -nfp | --nfp | --nf)
X with_fp=no ;; # Obsolete; use --without-fp.
X
X -no-create | --no-create | --no-creat | --no-crea | --no-cre \
X | --no-cr | --no-c)
X no_create=yes ;;
X
X -norecursion | --norecursion | --norecursio | --norecursi \
X | --norecurs | --norecur | --norecu | --norec | --nore | --nor)
X norecursion=yes ;;
X
X -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
X ac_prev=prefix ;;
X -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
X prefix="$ac_optarg" ;;
X
X -program-prefix | --program-prefix | --program-prefi | --program-pref \
X | --program-pre | --program-pr | --program-p)
X ac_prev=program_prefix ;;
X -program-prefix=* | --program-prefix=* | --program-prefi=* \
X | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
X program_prefix="$ac_optarg" ;;
X
X -program-suffix | --program-suffix | --program-suffi | --program-suff \
X | --program-suf | --program-su | --program-s)
X ac_prev=program_suffix ;;
X -program-suffix=* | --program-suffix=* | --program-suffi=* \
X | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
X program_suffix="$ac_optarg" ;;
X
X -program-transform-name | --program-transform-name \
X | --program-transform-nam | --program-transform-na \
X | --program-transform-n | --program-transform- \
X | --program-transform | --program-transfor \
X | --program-transfo | --program-transf \
X | --program-trans | --program-tran \
X | --progr-tra | --program-tr | --program-t)
X ac_prev=program_transform_name ;;
X -program-transform-name=* | --program-transform-name=* \
X | --program-transform-nam=* | --program-transform-na=* \
X | --program-transform-n=* | --program-transform-=* \
X | --program-transform=* | --program-transfor=* \
X | --program-transfo=* | --program-transf=* \
X | --program-trans=* | --program-tran=* \
X | --progr-tra=* | --program-tr=* | --program-t=*)
X program_transform_name="$ac_optarg" ;;
X
X -q | -quiet | --quiet | --quie | --qui | --qu | --q \
X | -silent | --silent | --silen | --sile | --sil)
X silent=yes ;;
X
X -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
X ac_prev=srcdir ;;
X -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
X srcdir="$ac_optarg" ;;
X
X -target | --target | --targe | --targ | --tar | --ta | --t)
X ac_prev=target ;;
X -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
X target="$ac_optarg" ;;
X
X -v | -verbose | --verbose | --verbos | --verbo | --verb)
X verbose=yes ;;
X
X -version | --version | --versio | --versi | --vers)
X echo "configure generated by autoconf version 1.11"
X exit 0 ;;
X
X -with-* | --with-*)
X ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
X echo "configure: $ac_package: invalid package name" >&2; exit 1
X fi
X ac_package=`echo $ac_package| sed 's/-/_/g'`
X case "$ac_option" in
X *=*) ;;
X *) ac_optarg=yes ;;
X esac
X eval "with_${ac_package}='$ac_optarg'" ;;
X
X -without-* | --without-*)
X ac_package=`echo $ac_option|sed -e 's/-*without-//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
X echo "configure: $ac_package: invalid package name" >&2; exit 1
X fi
X ac_package=`echo $ac_package| sed 's/-/_/g'`
X eval "with_${ac_package}=no" ;;
X
X --x) with_x=yes ;; # Obsolete; use --with-x.
X
X -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
X | --x-incl | --x-inc | --x-in | --x-i)
X ac_prev=x_includes ;;
X -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
X | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
X x_includes="$ac_optarg" ;;
X
X -x-libraries | --x-libraries | --x-librarie | --x-librari \
X | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
X ac_prev=x_libraries ;;
X -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
X | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
X x_libraries="$ac_optarg" ;;
X
X -*) echo "configure: $ac_option: invalid option; use --help to show usage" >&2; exit 1
X ;;
X
X *)
X if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
X echo "configure: warning: $ac_option: invalid host type" >&2
X fi
X if test "x$nonopt" != xNONE; then
X echo "configure: can only configure for one host and one target at a time" >&2; exit 1
X fi
X nonopt="$ac_option"
X ;;
X
X esac
Xdone
X
Xif test -n "$ac_prev"; then
X echo "configure: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" >&2; exit 1
Xfi
X
Xtrap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
Xtrap 'rm -fr confdefs* $ac_clean_files' 0
X
X# Save the original args if we used an alternate arg parser.
Xac_configure_temp="${configure_args-$*}"
X# Strip out --no-create and --norecursion so they don't pile up.
Xconfigure_args=
Xfor ac_arg in $ac_configure_temp; do
X case "$ac_arg" in
X -no-create | --no-create | --no-creat | --no-crea | --no-cre \
X | --no-cr | --no-c) ;;
X -norecursion | --norecursion | --norecursio | --norecursi \
X | --norecurs | --norecur | --norecu | --norec | --nore | --nor) ;;
X *) configure_args="$configure_args $ac_arg" ;;
X esac
Xdone
X
X# NLS nuisances.
X# These must not be set unconditionally because not all systems understand
X# e.g. LANG=C (notably SCO).
Xif test "${LC_ALL+set}" = 'set'; then LC_ALL=C; export LC_ALL; fi
Xif test "${LANG+set}" = 'set'; then LANG=C; export LANG; fi
X
X# confdefs.h avoids OS command line length limits that DEFS can exceed.
Xrm -rf conftest* confdefs.h
X# AIX cpp loses on an empty file, so make sure it contains at least a newline.
Xecho > confdefs.h
X
X# A filename unique to this package, relative to the directory that
X# configure is in, which we can look for to find out if srcdir is correct.
Xac_unique_file=csize.c
X
X# Find the source files, if location was not specified.
Xif test -z "$srcdir"; then
X ac_srcdir_defaulted=yes
X # Try the directory containing this script, then `..'.
X ac_prog=$0
X ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
X test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
X srcdir=$ac_confdir
X if test ! -r $srcdir/$ac_unique_file; then
X srcdir=..
X fi
Xfi
Xif test ! -r $srcdir/$ac_unique_file; then
X if test x$ac_srcdir_defaulted = xyes; then
X echo "configure: can not find sources in ${ac_confdir} or .." >&2; exit 1
X else
X echo "configure: can not find sources in ${srcdir}" >&2; exit 1
X fi
Xfi
Xac_ext=c
X# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
Xac_cpp='${CPP}'
Xac_compile='${CC-cc} $CFLAGS $LDFLAGS conftest.${ac_ext} -o conftest $LIBS >/dev/null 2>&1'
X
X
X
Xcat > conftestmake <<'EOF'
Xall:
X @echo 'ac_maketemp="${MAKE}"'
XEOF
X# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
Xeval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
Xif test -n "$ac_maketemp"; then SET_MAKE=
Xelse SET_MAKE="MAKE=${MAKE-make}"; fi
Xrm -f conftestmake
X
X
XCFLAGS=${CFLAGS--O}
Xtest -n "$verbose" && echo " setting CFLAGS to $CFLAGS"
X
XLDFLAGS=${LDFLAGS-}
Xtest -n "$verbose" && echo " setting LDFLAGS to $LDFLAGS"
X
X# Make sure to not get the incompatible SysV /etc/install and
X# /usr/sbin/install, which might be in PATH before a BSD-like install,
X# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
X# or the AFS install, which mishandles nonexistent args, or
X# /usr/ucb/install on SVR4, which tries to use the nonexistent group
X# `staff', or /sbin/install on IRIX which has incompatible command-line
X# syntax. Sigh.
X#
X# On most BSDish systems install is in /usr/bin, not /usr/ucb
X# anyway.
X# This turns out not to be true, so the mere pathname isn't an indication
X# of whether the program works. What we really need is a set of tests for
X# the install program to see if it actually works in all the required ways.
X#
X# Avoid using ./install, which might have been erroneously created
X# by make from ./install.sh.
Xif test -z "${INSTALL}"; then
X test -n "$silent" || echo "checking for a BSD compatible install"
X IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
X for ac_dir in $PATH; do
X case "$ac_dir" in
X ''|.|/etc|/sbin|/usr/sbin|/usr/etc|/usr/afsws/bin|/usr/ucb) ;;
X *)
X # OSF1 and SCO ODT 3.0 have their own names for install.
X for ac_prog in installbsd scoinst install; do
X if test -f $ac_dir/$ac_prog; then
X if test $ac_prog = install &&
X grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
X # AIX install. It has an incompatible calling convention.
X # OSF/1 installbsd also uses dspmsg, but is usable.
X :
X else
X INSTALL="$ac_dir/$ac_prog -c"
X break 2
X fi
X fi
X done
X ;;
X esac
X done
X IFS="$ac_save_ifs"
Xfi
X
Xif test -z "$INSTALL"; then
X # As a last resort, use the slow shell script.
X for ac_dir in ${srcdir} ${srcdir}/.. ${srcdir}/../..; do
X if test -f $ac_dir/install.sh; then
X INSTALL="$ac_dir/install.sh -c"; break
X fi
X done
Xfi
Xif test -z "$INSTALL"; then
X echo "configure: can not find install.sh in ${srcdir} or ${srcdir}/.. or ${srcdir}/../.." >&2; exit 1
Xfi
Xtest -n "$verbose" && echo " setting INSTALL to $INSTALL"
X
X# Use test -z because SunOS4 sh mishandles ${INSTALL_PROGRAM-'${INSTALL}'}.
X# It thinks the first close brace ends the variable substitution.
Xtest -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
Xtest -n "$verbose" && echo " setting INSTALL_PROGRAM to $INSTALL_PROGRAM"
X
Xtest -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
Xtest -n "$verbose" && echo " setting INSTALL_DATA to $INSTALL_DATA"
X
X
Xif test -z "$CC"; then
X # Extract the first word of `gcc', so it can be a program name with args.
X set ac_dummy gcc; ac_word=$2
X test -n "$silent" || echo "checking for $ac_word"
X IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
X for ac_dir in $PATH; do
X test -z "$ac_dir" && ac_dir=.
X if test -f $ac_dir/$ac_word; then
X CC="gcc"
X break
X fi
X done
X IFS="$ac_save_ifs"
Xfi
Xtest -z "$CC" && CC="cc"
Xtest -n "$CC" && test -n "$verbose" && echo " setting CC to $CC"
X
X# Find out if we are using GNU C, under whatever name.
Xcat > conftest.c <<EOF
X#ifdef __GNUC__
X yes
X#endif
XEOF
X${CC-cc} -E conftest.c > conftest.out 2>&1
Xif egrep yes conftest.out >/dev/null 2>&1; then
X GCC=1 # For later tests.
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for function prototypes"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#ifndef __STDC__
XKaBoom!
X#endif
Xint main() { return 0; }
Xint t() { extern int test (int i, double x);
Xstruct s1 {int (*f) (int a);};
Xstruct s2 {int (*f) (double a);};; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X U=
Xtest -n "$verbose" && echo " setting U to be empty"
X
Xelse
X rm -rf conftest*
X U=_
Xtest -n "$verbose" && echo " setting U to _"
X
Xfi
Xrm -f conftest*
X
X
Xif test -z "$LEX"; then
X # Extract the first word of `flex', so it can be a program name with args.
X set ac_dummy flex; ac_word=$2
X test -n "$silent" || echo "checking for $ac_word"
X IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
X for ac_dir in $PATH; do
X test -z "$ac_dir" && ac_dir=.
X if test -f $ac_dir/$ac_word; then
X LEX="flex"
X break
X fi
X done
X IFS="$ac_save_ifs"
Xfi
Xtest -z "$LEX" && LEX="lex"
Xtest -n "$LEX" && test -n "$verbose" && echo " setting LEX to $LEX"
X
Xif test -z "$LEXLIB"
Xthen
X case "$LEX" in
X flex*) ac_save_LIBS="${LIBS}"
XLIBS="${LIBS} -lfl"
Xac_have_lib=""
Xtest -n "$silent" || echo "checking for -lfl"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X
Xint main() { return 0; }
Xint t() { main();; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X ac_have_lib="1"
X
Xfi
Xrm -f conftest*
XLIBS="${ac_save_LIBS}"
Xif test -n "${ac_have_lib}"; then
X :; LEXLIB="-lfl"
Xelse
X :;
Xfi
X ;;
X *) LEXLIB="-ll" ;;
X esac
Xfi
Xtest -n "$verbose" && echo " setting LEXLIB to $LEXLIB"
X
X
Xcase "$LEX" in
Xflex)
X echo "NOTE: I found flex, but didn't check the version number."
X ;;
Xlex)
X echo "NOTE: Sorry, flex is required, and I couldn't find it."
X exit 1
X ;;
Xesac
X
X
X# The preferred way to propogate these variables is regular @ substitutions.
Xif test -n "$prefix"; then
X ac_prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%"
Xelse
X prefix=/usr/local
Xfi
Xif test -n "$exec_prefix"; then
X ac_prsub="$ac_prsub
Xs%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%exec_prefix\\1=\\2$exec_prefix%"
Xelse
X exec_prefix='${prefix}' # Let make expand it.
Xfi
X
X# Any assignment to VPATH causes Sun make to only execute
X# the first set of double-colon rules, so remove it if not needed.
X# If there is a colon in the path, we need to keep it.
Xif test "x$srcdir" = x.; then
X ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
Xfi
X
X# Quote sed substitution magic chars in DEFS.
Xcat >conftest.def <<EOF
X$DEFS
XEOF
Xac_escape_ampersand_and_backslash='s%[&\\]%\\&%g'
XDEFS=`sed "$ac_escape_ampersand_and_backslash" <conftest.def`
Xrm -f conftest.def
X# Substitute for predefined variables.
X
Xtrap 'rm -f config.status; exit 1' 1 2 15
Xecho creating config.status
Xrm -f config.status
Xcat > config.status <<EOF
X#!/bin/sh
X# Generated automatically by configure.
X# Run this file to recreate the current configuration.
X# This directory was configured as follows,
X# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
X#
X# $0 $configure_args
X
Xac_cs_usage="Usage: config.status [--recheck] [--version] [--help]"
Xfor ac_option
Xdo
X case "\$ac_option" in
X -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
X echo running \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create
X exec \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create ;;
X -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
X echo "config.status generated by autoconf version 1.11"
X exit 0 ;;
X -help | --help | --hel | --he | --h)
X echo "\$ac_cs_usage"; exit 0 ;;
X *) echo "\$ac_cs_usage"; exit 1 ;;
X esac
Xdone
X
Xtrap 'rm -f Makefile; exit 1' 1 2 15
XSET_MAKE='$SET_MAKE'
XCFLAGS='$CFLAGS'
XLDFLAGS='$LDFLAGS'
XINSTALL='$INSTALL'
XINSTALL_PROGRAM='$INSTALL_PROGRAM'
XINSTALL_DATA='$INSTALL_DATA'
XCC='$CC'
XU='$U'
XLEX='$LEX'
XLEXLIB='$LEXLIB'
XLIBS='$LIBS'
Xsrcdir='$srcdir'
Xtop_srcdir='$top_srcdir'
Xprefix='$prefix'
Xexec_prefix='$exec_prefix'
XDEFS='$DEFS'
Xac_prsub='$ac_prsub'
Xac_vpsub='$ac_vpsub'
Xextrasub='$extrasub'
XEOF
Xcat >> config.status <<\EOF
X
Xac_given_srcdir=$srcdir
X
XCONFIG_FILES=${CONFIG_FILES-"Makefile"}
Xfor ac_file in .. ${CONFIG_FILES}; do if test "x$ac_file" != x..; then
X # Remove last slash and all that follows it. Not all systems have dirname.
X ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
X if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
X # The file is in a subdirectory.
X test ! -d "$ac_dir" && mkdir "$ac_dir"
X ac_dir_suffix="/$ac_dir"
X else
X ac_dir_suffix=
X fi
X
X # A "../" for each directory in $ac_dir_suffix.
X ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
X case "$ac_given_srcdir" in
X .) srcdir=.
X if test -z "$ac_dir_suffix"; then top_srcdir=.
X else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
X /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
X *) # Relative path.
X srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
X top_srcdir="$ac_dots$ac_given_srcdir" ;;
X esac
X
X echo creating "$ac_file"
X rm -f "$ac_file"
X comment_str="Generated automatically from `echo $ac_file|sed 's|.*/||'`.in by configure."
X case "$ac_file" in
X *.c | *.h | *.C | *.cc | *.m ) echo "/* $comment_str */" > "$ac_file" ;;
X * ) echo "# $comment_str" > "$ac_file" ;;
X esac
X sed -e "
X$ac_prsub
X$ac_vpsub
X$extrasub
Xs%@SET_MAKE@%$SET_MAKE%g
Xs%@CFLAGS@%$CFLAGS%g
Xs%@LDFLAGS@%$LDFLAGS%g
Xs%@INSTALL@%$INSTALL%g
Xs%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
Xs%@INSTALL_DATA@%$INSTALL_DATA%g
Xs%@CC@%$CC%g
Xs%@U@%$U%g
Xs%@LEX@%$LEX%g
Xs%@LEXLIB@%$LEXLIB%g
Xs%@LIBS@%$LIBS%g
Xs%@srcdir@%$srcdir%g
Xs%@top_srcdir@%$top_srcdir%g
Xs%@prefix@%$prefix%g
Xs%@exec_prefix@%$exec_prefix%g
Xs%@DEFS@%$DEFS%
X" $ac_given_srcdir/${ac_file}.in >> $ac_file
Xfi; done
X
X
Xexit 0
XEOF
Xchmod +x config.status
X# Some shells look in PATH for config.status without the "./".
Xtest -n "$no_create" || ${CONFIG_SHELL-/bin/sh} ./config.status
X
SHAR_EOF
chmod 0755 configure ||
echo 'restore of configure failed'
Wc_c="`wc -c < 'configure'`"
test 20740 -eq "$Wc_c" ||
echo 'configure: original size 20740, current size' "$Wc_c"
fi
# ============= install.sh ==============
if test -f 'install.sh' -a X"$1" != X"-c"; then
echo 'x - skipping install.sh (File already exists)'
else
echo 'x - extracting install.sh (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'install.sh' &&
X#!/bin/sh
X
X#
X# install - install a program, script, or datafile
X# This comes from X11R5; it is not part of GNU.
X#
X# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
X#
X# This script is compatible with the BSD install script, but was written
X# from scratch.
X#
X
X
X# set DOITPROG to echo to test this script
X
X# Don't use :- since 4.3BSD and earlier shells don't like it.
Xdoit="${DOITPROG-}"
X
X
X# put in absolute paths if you don't have them in your path; or use env. vars.
X
Xmvprog="${MVPROG-mv}"
Xcpprog="${CPPROG-cp}"
Xchmodprog="${CHMODPROG-chmod}"
Xchownprog="${CHOWNPROG-chown}"
Xchgrpprog="${CHGRPPROG-chgrp}"
Xstripprog="${STRIPPROG-strip}"
Xrmprog="${RMPROG-rm}"
X
Xinstcmd="$mvprog"
Xchmodcmd=""
Xchowncmd=""
Xchgrpcmd=""
Xstripcmd=""
Xrmcmd="$rmprog -f"
Xmvcmd="$mvprog"
Xsrc=""
Xdst=""
X
Xwhile [ x"$1" != x ]; do
X case $1 in
X -c) instcmd="$cpprog"
X shift
X continue;;
X
X -m) chmodcmd="$chmodprog $2"
X shift
X shift
X continue;;
X
X -o) chowncmd="$chownprog $2"
X shift
X shift
X continue;;
X
X -g) chgrpcmd="$chgrpprog $2"
X shift
X shift
X continue;;
X
X -s) stripcmd="$stripprog"
X shift
X continue;;
X
X *) if [ x"$src" = x ]
X then
X src=$1
X else
X dst=$1
X fi
X shift
X continue;;
X esac
Xdone
X
Xif [ x"$src" = x ]
Xthen
X echo "install: no input file specified"
X exit 1
Xfi
X
Xif [ x"$dst" = x ]
Xthen
X echo "install: no destination specified"
X exit 1
Xfi
X
X
X# If destination is a directory, append the input filename; if your system
X# does not like double slashes in filenames, you may need to add some logic
X
Xif [ -d $dst ]
Xthen
X dst="$dst"/`basename $src`
Xfi
X
X# Make a temp file name in the proper directory.
X
Xdstdir=`dirname $dst`
Xdsttmp=$dstdir/#inst.$$#
X
X# Move or copy the file name to the temp name
X
X$doit $instcmd $src $dsttmp
X
X# and set any options; do chmod last to preserve setuid bits
X
Xif [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
Xif [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
Xif [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
Xif [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
X
X# Now rename the file to the real destination.
X
X$doit $rmcmd $dst
X$doit $mvcmd $dsttmp $dst
X
X
Xexit 0
SHAR_EOF
chmod 0755 install.sh ||
echo 'restore of install.sh failed'
Wc_c="`wc -c < 'install.sh'`"
test 2186 -eq "$Wc_c" ||
echo 'install.sh: original size 2186, current size' "$Wc_c"
fi
# ============= csize.h ==============
if test -f 'csize.h' -a X"$1" != X"-c"; then
echo 'x - skipping csize.h (File already exists)'
else
echo 'x - extracting csize.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'csize.h' &&
X
X#ifndef CSIZEDOTH
X
X#define CSIZEDOTH
X
X/*
X * $Id: csize.h,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *
X * This program is free software; you can redistribute it and/or modify
X * it under the terms of the GNU General Public License as published by
X * the Free Software Foundation. See the file COPYING for more details.
X *
X * The scanner and the functions in csize.c communicate via the global
X * variables declared here (types) and defined in the scanner (storage).
X *
X */
X
X#ifndef _
X#ifdef __STDC__
X#define _(proto) proto
X#else
X#define _(proto) ()
X#endif
X#endif
X
Xextern long
X C_newlines,
X C_blank_lines,
X C_lines_w_comments,
X C_pp_directives,
X C_nb_nc_lines,
X C_semicolons;
X
Xextern int Echo;
Xextern int Lex_errors;
X
Xextern void init_scanner _((FILE *, char *));
Xextern int yylex _((void));
X
X#endif
SHAR_EOF
chmod 0644 csize.h ||
echo 'restore of csize.h failed'
Wc_c="`wc -c < 'csize.h'`"
test 1035 -eq "$Wc_c" ||
echo 'csize.h: original size 1035, current size' "$Wc_c"
fi
# ============= csize.c ==============
if test -f 'csize.c' -a X"$1" != X"-c"; then
echo 'x - skipping csize.c (File already exists)'
else
echo 'x - extracting csize.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'csize.c' &&
X#include <stdio.h>
X
X#include <csize.h>
X#include <patchlevel.h>
X
X/*
X * $Id: csize.c,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *
X * This program is free software; you can redistribute it and/or modify
X * it under the terms of the GNU General Public License as published by
X * the Free Software Foundation. See the file COPYING for more details.
X *
X * This file holds functions to open files, add total counts,
X * and print summaries. All the real work is done in the scanner.
X * All global variables are likewise declared in the scanner;
X * they are also declared externally in the the header file.
X *
X */
X
Xvoid
Xprint_results(long nl,
X long bl,
X long lwc,
X long nbncl,
X long semi,
X long pp,
X char *filename)
X{
X (void) printf("%8ld %8ld %8ld %8ld %8ld %8ld %s\n",
X nl, bl, lwc, nbncl, semi, pp, filename);
X}
X
X
Xint
Xprocess_file(char *filename)
X{
X FILE *fp;
X int rc;
X
X fp = fopen(filename, "r");
X if (fp == NULL) {
X perror(filename);
X rc = -1;
X }
X else {
X if (Echo) (void) printf("--start of file--\n");
X /* process the input */
X init_scanner(fp, filename);
X while (yylex() != 0)
X ;
X if (Echo) (void) printf("--end of file--\n");
X (void) fclose(fp);
X rc = Lex_errors;
X }
X
X return rc;
X}
X
X
Xint
Xmain(int argc, char ** argv)
X{
X extern int optind;
X
X int c,
X rc,
X errflg = 0,
X hflg = 0,
X verflg = 0,
X nfiles = 0;
X long total_newlines = 0,
X total_blank_lines = 0,
X total_lines_w_comments = 0,
X total_nb_nc_lines = 0,
X total_semicolons = 0,
X total_pp_directives = 0;
X
X while ((c = getopt(argc, argv, "ehv")) != -1)
X switch (c) {
X case 'e':
X ++Echo;
X break;
X case 'h':
X ++hflg;
X break;
X case 'v':
X ++verflg;
X break;
X default:
X ++errflg;
X }
X
X /* If -v was given then ignore other args, print version info, and exit */
X if (verflg) {
X fprintf(stderr, "csize version information: %s\n", CSIZE_VERSION);
X return 0;
X }
X
X /* invalid arguments */
X if (argc == 1 || optind == argc || errflg) {
X (void)fprintf(stderr, "usage: %s [ -ehv ] file.c [ file.c ... ]\n", *argv);
X (void)fprintf(stderr, " -e == echo the input files\n");
X (void)fprintf(stderr, " -h == print a header before the data\n");
X (void)fprintf(stderr, " -v == report version information\n");
X return -1;
X }
X
X /* arguments are ok, do some work */
X for (; optind < argc; optind++) {
X rc = process_file(argv[optind]);
X if (rc == 0) {
X if (hflg) {
X (void)printf(" total blank lines w/ nb, nc semi- preproc. file\n");
X (void)printf(" lines lines comments lines colons direct.\n");
X (void)printf("--------+--------+--------+--------+--------+--------+----\n");
X hflg = 0; /* only print the header once */
X }
X print_results(C_newlines, C_blank_lines, C_lines_w_comments,
X C_nb_nc_lines, C_semicolons, C_pp_directives,
X argv[optind]);
X total_newlines += C_newlines;
X total_blank_lines += C_blank_lines;
X total_lines_w_comments += C_lines_w_comments;
X total_nb_nc_lines += C_nb_nc_lines;
X total_semicolons += C_semicolons;
X total_pp_directives += C_pp_directives;
X ++nfiles;
X }
X }
X if (nfiles > 1) {
X print_results(total_newlines, total_blank_lines,
X total_lines_w_comments, total_nb_nc_lines,
X total_semicolons, total_pp_directives, "total");
X }
X
X return rc;
X}
SHAR_EOF
chmod 0644 csize.c ||
echo 'restore of csize.c failed'
Wc_c="`wc -c < 'csize.c'`"
test 3694 -eq "$Wc_c" ||
echo 'csize.c: original size 3694, current size' "$Wc_c"
fi
# ============= scan.h ==============
if test -f 'scan.h' -a X"$1" != X"-c"; then
echo 'x - skipping scan.h (File already exists)'
else
echo 'x - extracting scan.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'scan.h' &&
X
X#ifndef SCANDOTH
X
X#define SCANDOTH
X
X/*
X * $Id: scan.h,v 1.12 1994/10/11 15:45:22 lott Exp lott $
X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *
X * This program is free software; you can redistribute it and/or modify
X * it under the terms of the GNU General Public License as published by
X * the Free Software Foundation. See the file COPYING for more details.
X *
X * This header file defines numeric values for the tokens recognized by
X * the scanner; it was actually generated by yacc.
X *
X */
X
X# define IDENTIFIER 257
X# define CONSTANT 258
X# define STRING_LITERAL 259
X# define SIZEOF 260
X# define PTR_OP 261
X# define INC_OP 262
X# define DEC_OP 263
X# define LEFT_OP 264
X# define RIGHT_OP 265
X# define LE_OP 266
X# define GE_OP 267
X# define EQ_OP 268
X# define NE_OP 269
X# define AND_OP 270
X# define OR_OP 271
X# define MUL_ASSIGN 272
X# define DIV_ASSIGN 273
X# define MOD_ASSIGN 274
X# define ADD_ASSIGN 275
X# define SUB_ASSIGN 276
X# define LEFT_ASSIGN 277
X# define RIGHT_ASSIGN 278
X# define AND_ASSIGN 279
X# define XOR_ASSIGN 280
X# define OR_ASSIGN 281
X# define TYPE_NAME 282
X# define TYPEDEF 283
X# define EXTERN 284
X# define STATIC 285
X# define AUTO 286
X# define REGISTER 287
X# define CHAR 288
X# define SHORT 289
X# define INT 290
X# define LONG 291
X# define SIGNED 292
X# define UNSIGNED 293
X# define FLOAT 294
X# define DOUBLE 295
X# define CONST 296
X# define VOLATILE 297
X# define VOID 298
X# define STRUCT 299
X# define UNION 300
X# define ENUM 301
X# define ELIPSIS 302
X# define RANGE 303
X# define CASE 304
X# define DEFAULT 305
X# define IF 306
X# define ELSE 307
X# define SWITCH 308
X# define WHILE 309
X# define DO 310
X# define FOR 311
X# define GOTO 312
X# define CONTINUE 313
X# define BREAK 314
X# define RETURN 315
X
X#endif
SHAR_EOF
chmod 0644 scan.h ||
echo 'restore of scan.h failed'
Wc_c="`wc -c < 'scan.h'`"
test 1881 -eq "$Wc_c" ||
echo 'scan.h: original size 1881, current size' "$Wc_c"
fi
true || echo 'restore of scan.l failed'
echo End of part 1, continue with part 2
exit 0

exit 0 # Just in case...

Christopher Lott

unread,
Oct 17, 1994, 5:30:39 PM10/17/94
to
Submitted-by: lo...@informatik.uni-kl.de (Christopher Lott)
Posting-number: Volume 4, Issue 3
Archive-name: csize/part02
Environment: ANSI C,FLEX


#!/bin/sh
# This is part 02 of csize
# ============= scan.l ==============
if test -f 'scan.l' -a X"$1" != X"-c"; then
echo 'x - skipping scan.l (File already exists)'
else
echo 'x - extracting scan.l (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'scan.l' &&
X
XD [0-9]
XL [a-zA-Z_]
XH [a-fA-F0-9]
XE [Ee][+-]?{D}+
XFS (f|F|l|L)
XIS (u|U|l|L)*
Xws [ \t\v\f]
Xnl [\n]
X
X%{
X
X/* $Id: scan.l,v 1.12 1994/10/11 15:45:22 lott Exp lott $


X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *
X * This program is free software; you can redistribute it and/or modify
X * it under the terms of the GNU General Public License as published by
X * the Free Software Foundation. See the file COPYING for more details.
X *

X * This file holds the source used by flex to generate the scanner for C.
X * SEE THE FILE "INSTALL" FOR THE REQUIRED FLEX VERSION. Sorry to
X * shout, but different versions of flex exhibit different behavior.
X *
X * Why flex? Because lex complains about this file as follows:
X * "scan.l", line xxx: (Error) Too many right contexts
X * If you simply remove the first token ("auto"), then lex dumps core
X * on my machine. Neither behavior is acceptable and I refuse to code
X * around bugs in lex when flex is available, reliable, and free.
X *
X */
X
X#include <stdio.h>
X#include <scan.h>
X#include <csize.h>
X
X/* variables supplied by flex


X *
X */
X

Xextern int yyleng;
Xextern char *yytext;
Xextern FILE *yyin;
X
X/* global variables
X * variables beginning with C_ are referenced in main and
X * Echo is set in main; all appear in csize.h


X *
X */
X

Xint Echo,
X Lex_errors;
X
Xlong C_newlines, /* incremented at the *end* of a line */
X C_blank_lines,
X C_lines_w_comments,
X C_nb_nc_lines, /* incremented when first nbnc is seen */
X C_semicolons,
X C_pp_directives;
X
X/*
X * variables used only in this file
X */
X
Xstatic char *Filename;
Xstatic int Column;
Xstatic long prev_line_with_text;
Xstatic long prev_line_with_comment;
X
X/*
X * functions defined and used only in this file
X */
X
Xstatic int check_type _((void));
Xstatic void count_nb_nc_lines _((void));
Xstatic void count _((void));
Xstatic void semicolon _((void));
Xstatic void string_lit _((void));
Xstatic void count_line_w_comment _((void));
Xstatic void comment _((int));
Xstatic void pp_dir _((void));
Xstatic void count_ws _((void));
Xstatic void whitespace_line _((void));
Xstatic void newline _((void));
Xstatic void scan_error _((char *));
Xstatic void bad_char _((void));
X
X%}
X
X%%
X
X"auto" { count(); return(AUTO); }
X"break" { count(); return(BREAK); }
X"case" { count(); return(CASE); }
X"char" { count(); return(CHAR); }
X"const" { count(); return(CONST); }
X"continue" { count(); return(CONTINUE); }
X"default" { count(); return(DEFAULT); }
X"do" { count(); return(DO); }
X"double" { count(); return(DOUBLE); }
X"else" { count(); return(ELSE); }
X"enum" { count(); return(ENUM); }
X"extern" { count(); return(EXTERN); }
X"float" { count(); return(FLOAT); }
X"for" { count(); return(FOR); }
X"goto" { count(); return(GOTO); }
X"if" { count(); return(IF); }
X"int" { count(); return(INT); }
X"long" { count(); return(LONG); }
X"register" { count(); return(REGISTER); }
X"return" { count(); return(RETURN); }
X"short" { count(); return(SHORT); }
X"signed" { count(); return(SIGNED); }
X"sizeof" { count(); return(SIZEOF); }
X"static" { count(); return(STATIC); }
X"struct" { count(); return(STRUCT); }
X"switch" { count(); return(SWITCH); }
X"typedef" { count(); return(TYPEDEF); }
X"union" { count(); return(UNION); }
X"unsigned" { count(); return(UNSIGNED); }
X"void" { count(); return(VOID); }
X"volatile" { count(); return(VOLATILE); }
X"while" { count(); return(WHILE); }
X
X{L}({L}|{D})* { count(); return(check_type()); }
X
X0[xX]{H}+{IS}? { count(); return(CONSTANT); }
X0{D}+{IS}? { count(); return(CONSTANT); }
X{D}+{IS}? { count(); return(CONSTANT); }
X'(\\.|[^\\'\n])+' { count(); return(CONSTANT); }
X
X{D}+{E}{FS}? { count(); return(CONSTANT); }
X{D}*"."{D}+({E})?{FS}? { count(); return(CONSTANT); }
X{D}+"."{D}*({E})?{FS}? { count(); return(CONSTANT); }
X
X">>=" { count(); return(RIGHT_ASSIGN); }
X"<<=" { count(); return(LEFT_ASSIGN); }
X"+=" { count(); return(ADD_ASSIGN); }
X"-=" { count(); return(SUB_ASSIGN); }
X"*=" { count(); return(MUL_ASSIGN); }
X"/=" { count(); return(DIV_ASSIGN); }
X"%=" { count(); return(MOD_ASSIGN); }
X"&=" { count(); return(AND_ASSIGN); }
X"^=" { count(); return(XOR_ASSIGN); }
X"|=" { count(); return(OR_ASSIGN); }
X">>" { count(); return(RIGHT_OP); }
X"<<" { count(); return(LEFT_OP); }
X"++" { count(); return(INC_OP); }
X"--" { count(); return(DEC_OP); }
X"->" { count(); return(PTR_OP); }
X"&&" { count(); return(AND_OP); }
X"||" { count(); return(OR_OP); }
X"<=" { count(); return(LE_OP); }
X">=" { count(); return(GE_OP); }
X"==" { count(); return(EQ_OP); }
X"!=" { count(); return(NE_OP); }
X";" { count(); semicolon(); return(';'); }
X"{" { count(); return('{'); }
X"}" { count(); return('}'); }
X"," { count(); return(','); }
X":" { count(); return(':'); }
X"=" { count(); return('='); }
X"(" { count(); return('('); }
X")" { count(); return(')'); }
X"[" { count(); return('['); }
X"]" { count(); return(']'); }
X"." { count(); return('.'); }
X"&" { count(); return('&'); }
X"!" { count(); return('!'); }
X"~" { count(); return('~'); }
X"-" { count(); return('-'); }
X"+" { count(); return('+'); }
X"*" { count(); return('*'); }
X"/" { count(); return('/'); }
X"%" { count(); return('%'); }
X"<" { count(); return('<'); }
X">" { count(); return('>'); }
X"^" { count(); return('^'); }
X"|" { count(); return('|'); }
X"?" { count(); return('?'); }
X
X\" { count(); string_lit(); return(STRING_LITERAL); }
X
X"#"{ws}*"define" { count(); pp_dir(); /* from K&R 2/e p. 239 */ }
X"#"{ws}*"undef" { count(); pp_dir(); }
X"#"{ws}*"include" { count(); pp_dir(); }
X"#"{ws}*"line" { count(); pp_dir(); }
X"#"{ws}*"error" { count(); pp_dir(); }
X"#"{ws}*"pragma" { count(); pp_dir(); }
X
X"#"{ws}*"endif" { count(); pp_dir(); }
X"#"{ws}*"if" { count(); pp_dir(); }
X"#"{ws}*"ifdef" { count(); pp_dir(); }
X"#"{ws}*"ifndef" { count(); pp_dir(); }
X"#"{ws}*"elif" { count(); pp_dir(); }
X"#"{ws}*"else" { count(); pp_dir(); }
X
X"#"{ws}*"include_next" { count(); pp_dir(); /* from GCC's cccp.c */ }
X"#"{ws}*"import" { count(); pp_dir(); }
X"#"{ws}*"warning" { count(); pp_dir(); }
X"#"{ws}*"sccs" { count(); pp_dir(); }
X"#"{ws}*"ident" { count(); pp_dir(); }
X"#"{ws}*"assert" { count(); pp_dir(); }
X"#"{ws}*"unassert" { count(); pp_dir(); }
X
X"\\" { count(); /* backslash processing is weak */ }
X
X"/*" { comment(1); }
X{ws}+ { count_ws(); }
X^{ws}+$ { whitespace_line(); }
X{nl} { newline(); }
X. { bad_char(); }
X
X%%
X
X
X/* init_scanner
X * initialize necessary variables and set up the input file pointer
X * before processing a file.
X *
X * Called from csize.c


X *
X */
X
Xvoid

Xinit_scanner(FILE *fp, char *filename)
X{
X C_newlines = 0;
X C_blank_lines = 0;
X C_lines_w_comments = 0;
X C_nb_nc_lines = 0;
X C_semicolons = 0;
X C_pp_directives = 0;
X
X Lex_errors = 0;
X prev_line_with_comment = -1;
X prev_line_with_text = -1;
X
X Filename = filename;
X
X /* although the flex documentation states that assigning
X * to yyin like this:
X * yyin = fp;
X * should be equivalent to
X * yyrestart(fp);
X * the run-time behavior of scanners generated with flex 2.4.6
X * is different; with only the assignment, the scanner complains
X * of an illegal characater at line 1, character 1 of subsequent
X * files. So this is a workaround.
X */
X yyrestart(fp);
X}
X
X
X/* count_nb_nc_lines
X * count nonblank noncomment lines in the input, but
X * ensure that we don't count the same line twice by
X * checking and/or updating the appropriate variable
X *
X * called by functions; no dependence on yytext


X *
X */
X

Xstatic void
Xcount_nb_nc_lines(void)
X{
X if (C_newlines != prev_line_with_text) {
X ++C_nb_nc_lines;
X prev_line_with_text = C_newlines;
X }
X}
X
X
X/* count
X * count columns for lines with *nonblank noncomment* text.
X * Optionally echo the buffer yytext, and call count_nb_nc_lines
X * to count the line.
X *
X * called by lexer with the *nonblank noncomment* token in yytext


X *
X */
X

Xstatic void
Xcount(void)
X{
X Column += yyleng;
X if (Echo)
X ECHO;
X count_nb_nc_lines();
X}
X
X
X/* semicolon
X * saw a semicolon in the input, just bump the appropriate counter
X *
X * count() is called before this function
X *
X * called by lexer but has no dependence on yytext


X *
X */
X

Xstatic void
Xsemicolon(void)
X{
X ++C_semicolons;
X}
X
X
X/* pp_dir
X * Read characters until the terminating newline ('\n') is found. Count the
X * number of directives. Even though no text may appear after a directive
X * on a line, count columns so that the function newline() can be used.
X *
X * Complications:
X * Escaped backslash characters ('\\'). These do nothing.
X * Escaped newline characters (continuation lines). These force the
X * function to update newline and nonblank noncomment line counts.
X * Note that a continuation line can consist of a single newline,
X * or only whitespace and a newline; in both cases the continuation
X * line terminates the preprocessor directive. The algorithm makes
X * provisions to treat both cases identically. Those blank-ish
X * continuation lines, although they look blank, are counted as
X * nonblank noncomment lines.
X * Comments that begin on the pp_dir's line. These must be processed
X * until the closing * and / is found, after which processing of
X * the pp resumes. See the part in K&Rrev2, p. 229, about
X * logically successive preprocessor phases.
X * The terminating newline must be given back via unput so that
X * the lexer can correctly identify the beginning of lines
X * for rules that use the caret ('^')
X *
X * Input errors:
X * EOF condition before the terminating newline
X *
X * count() is called before this function, which marks the first line of
X * the preprocessor directive as having nonblank noncomment text.
X *
X * Called by the lexer, but no dependence on yytext


X *
X */
X

Xstatic void
Xpp_dir(void)
X{
X char c;
X int in_pp_dir = 1;
X int saw_forwslash = 0;
X int apply_backslash = 0;
X
X ++C_pp_directives;
X
X while (in_pp_dir && (c = input()) != EOF) {
X
X if (c == '\n') { /* first take care of newline chars */
X if (apply_backslash) {
X apply_backslash = 0;
X newline(); /* register the newline globally */
X count_nb_nc_lines(); /* count the new nb nc line */
X }
X else {
X if (Column == 0) /* if Column has value 0, newline() will */
X ++Column; /* count the line as blank; don't let it */
X unput(c); /* give back the nl */
X in_pp_dir = 0; /* done with this pp dir */
X }
X }
X else {
X
X if (Echo) /* only do echo processing for non-newlines */
X putchar(c);
X ++Column;
X
X switch (c) {
X case '\\':
X if (apply_backslash) {
X apply_backslash = 0;
X }
X else {
X apply_backslash = 1;
X }
X saw_forwslash = 0;
X break;
X case '/':
X saw_forwslash = 1;
X apply_backslash = 0;
X break;
X case '*':
X if (saw_forwslash) {
X comment(0); /* 0 means don't echo the start token again */
X }
X saw_forwslash = 0;
X apply_backslash = 0;
X break;
X default:
X apply_backslash = 0; /* any char after f/b-slash turns off the flags */
X saw_forwslash = 0;
X break;
X }
X }
X
X } /* while */
X
X if (c == EOF)
X scan_error("EOF in preprocessor directive");
X}
X
X
X/* string_lit
X * Read characters until the closing quote ('"') is found. Do not count
X * string literals. Count columns because a string literal may be followed
X * by other text on a line.
X *
X * Complications:
X * Escaped backslash characters ('\\'). These do nothing.
X * Escaped quote characters ('\"'). These do not terminate
X * the string literal.
X * Escaped newline characters (continuation lines). These force the
X * function to update newline and nonblank noncomment line counts.
X * Note that a continuation line can never be entirely blank -
X * either it has another escaped newline, or it has the terminating
X * quote. This prevents the anomaly of counting a blank line as
X * something else, as is the case for preprocessor directives.
X *
X * Input errors:
X * unescaped newline before the terminating quote
X * EOF condition before the terminating quote
X *
X * count() is called before this function, which marks the first line of
X * the string literal line as having nonblank noncomment text.
X *
X * Called by the lexer, but no dependence on yytext


X *
X */
X

Xstatic void
Xstring_lit(void)
X{
X char c;
X int in_string_lit = 1;
X int apply_backslash = 0; /* apply backslash to the next char seen */
X
X while (in_string_lit && (c = input()) != EOF) {
X
X if (c == '\n') { /* first take care of newline chars */
X if (apply_backslash) {
X apply_backslash = 0;
X newline(); /* register the newline globally */
X count_nb_nc_lines(); /* count the new nb nc line */
X }
X else {
X scan_error("newline in string literal");
X unput(c); /* give back the newline */
X in_string_lit = 0; /* give up on this string literal */
X }
X }
X else { /* prev char was not a newline */
X switch (c) {
X case '\\':
X if (apply_backslash)
X apply_backslash = 0;
X else
X apply_backslash = 1;
X break;
X case '"':
X if (apply_backslash)
X apply_backslash = 0;
X else
X in_string_lit = 0; /* finished with this string literal */
X break;
X default:
X if (apply_backslash) /* any char after bslash turns off the flag */
X apply_backslash = 0;
X break;
X }
X
X if (Echo) /* only do echo processing for non-newlines */
X putchar(c);
X ++Column;
X }
X
X } /* while */
X
X if (c == EOF)
X scan_error("EOF in string literal");
X}
X
X
X/* count_ws
X * count the columns in the buffer yytext (only white space, never nl)
X * adjusting for tabs
X *
X * called by the lexer with the whitespace in yytext


X *
X */
X

Xstatic void
Xcount_ws(void)
X{
X int i;
X
X if (Echo)
X ECHO;
X
X for (i = 0; yytext[i] != '\0'; i++)
X if (yytext[i] == '\t')
X Column += 8 - (Column % 8);
X else
X Column++;
X}
X
X
X/* whitespace_line
X * Process a line that is not empty but only has whitespace.
X * The newline is *not* part of yytext at this point.
X * Do not do *anything* except echo the line, if desired.
X * Because the Column variable is not changed, it will be
X * 0 when newline is called, which will count the blank line.
X *
X * called by the lexer with the whitespace in yytext


X *
X */
X

Xstatic void
Xwhitespace_line(void)
X{
X if (Echo)
X ECHO;
X}
X
X
X/* newline
X * Count all newline characters. Also check the value of the Column
X * variable to catch lines with nothing but whitespace (blank lines).
X *
X * Note that blank lines are somewhat difficult to catch with a lex
X * pattern, because the pattern ``^"\n"'', meaning match a newline that
X * occurs first on a line, doesn't seem to work.
X *
X * Note also that if the lex pattern to match a line with only whitespace
X * fires, then the Column variable will not be incremented, and this
X * function will be called with Column = 0. I call this a virtual
X * column 0, because newline really didn't occur as the first character
X * on the line, we just pretend that it did.
X *
X * Called by the lexer *and* other functions; no dependence on yytext


X *
X */
X

Xstatic void
Xnewline(void)
X{
X if (Echo)
X putchar('\n');
X ++C_newlines;
X if (Column == 0) {
X ++C_blank_lines;
X }
X Column = 0;
X}
X
X
X/* count_line_w_comment
X * Cuarantee that we don't count a line as having a comment twice
X *
X * Called by functions; no dependence on yytext


X *
X */
X

Xstatic void
Xcount_line_w_comment(void)
X{
X if (C_newlines != prev_line_with_comment) {
X ++C_lines_w_comments;
X prev_line_with_comment = C_newlines;
X }
X}
X
X
X/* comment
X * Read characters until the closing two-character sequence '*' and '/'
X * is found. Count the lines with comments. Count columns because a
X * comment may be followed by other text on a line.
X *
X * Complications:
X * Newline characters. These force the function to update the counts
X * of newlines and the number of lines with comments. A line
X * within a comment that has zero or more whitespace characters
X * and a newline, although blank, will be counted as a comment line.
X * Input errors:
X * EOF condition before the terminating token
X *
X * This fn implements a simple FSA to recognize the end of a comment.
X * The original code was reused from Jeff Lee's distribution and
X * amended to count lines. While I don't much like gotos, his
X * implementation is highly concise and keeps code redundancy to a
X * minimum. This code is far more concise than, for example, the
X * code from the flexdoc(1) man page, when you consider all the
X * intermediate cases in which characters must be counted.
X *
X * Called by the lexer with the comment start token in yytext,
X * and also called by pp_dir with garbage in yytext, so don't
X * depend on yytext (and don't use ECHO). Argument tells whether
X * it should echo the comment start token.


X *
X */
X

Xstatic void
Xcomment(int echo_start)
X{
X register int c, lookahead;
X
X if (Echo && echo_start) {
X putchar('/');
X putchar('*');
X }
X Column += yyleng;
X
X /* starting a comment, count the line if necessary */
X count_line_w_comment();
X
X /* deal with all characters in this while loop */
X loop:
X while ((c = input()) != EOF) { /* find a star */
X
X if (c == '\n') {
X if (Column == 0) /* if Column has value 0, newline() will count */
X ++Column; /* the line as blank, which we don't want */
X newline();
X count_line_w_comment();


X }
X else {
X if (Echo)

X putchar(c);
X ++Column;
X }
X
X if (c == '*') /* found one, leave the while loop */
X break;
X }
X
X if (c != EOF && (lookahead = input()) != '/') { /* check for a slash */
X unput(lookahead);
X goto loop;
X }
X
X if (c == EOF) {
X scan_error("EOF in comment");


X }
X else {
X if (Echo)

X putchar('/');
X }
X}
X
X
X/* check_type
X * pseudo code --- this is what it should check
X *
X * if (yytext == type_name)
X * return(TYPE_NAME);
X * else
X * return(IDENTIFIER);
X *
X * If it did, it would be easy to build a C language
X * recognizer, and then trivial to count declarations
X * and executable statements.
X *
X * However, the function only returns IDENTIFIER


X *
X */
X

Xstatic int
Xcheck_type(void)
X{
X return(IDENTIFIER);
X}
X
X
X/* scan_error
X * print an informative error message with file, line info.
X * if echoing is on, indicate the column where the error
X * was found by using the Column variable


X *
X */
X

Xstatic void
Xscan_error(char *s)
X{
X fflush(stdout);
X ++Lex_errors;
X if (Echo)
X printf("\n%*s\n%*s\n", Column, "^", Column, s);
X else
X printf("\"%s\", line %d: %s\n", Filename, C_newlines + 1, s);
X}
X
X
X/* bad_char
X * bump up the column count and call the error function
X *
X * Called by the lexer with the unrecognized character in yytext


X *
X */
X

Xstatic void
Xbad_char(void)
X{
X int i;
X
X if (Echo)
X ECHO;
X ++Column;
X scan_error("bad character");
X if (Echo) /* restore output to column where we left off */
X for (i = 0; i < Column; ++i)
X putchar(' ');
X}
X
X
X/* yywrap
X * supply a trivial version of yywrap
X * to eliminate the need to link against libfl
X * the value 1 means stop at the end of the file
X * (the file pointer has not been aimed at a new file)
X *
X * Called by the lexer at the end of the input


X *
X */
X

Xint
Xyywrap(void)
X{
X return 1;
X}
SHAR_EOF
chmod 0644 scan.l ||


echo 'restore of scan.l failed'

Wc_c="`wc -c < 'scan.l'`"
test 19720 -eq "$Wc_c" ||
echo 'scan.l: original size 19720, current size' "$Wc_c"
fi
# ============= patchlevel.h ==============
if test -f 'patchlevel.h' -a X"$1" != X"-c"; then
echo 'x - skipping patchlevel.h (File already exists)'
else
echo 'x - extracting patchlevel.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'patchlevel.h' &&
X
X#ifndef PATCHLEVELDOTH
X
X#define PATCHLEVELDOTH
X
X/*
X * $Id: patchlevel.h,v 1.12 1994/10/11 15:45:22 lott Exp lott $


X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *

X */
X
X#define CSIZE_VERSION "$Revision: 1.12 $"
X
X#endif
SHAR_EOF
chmod 0644 patchlevel.h ||
echo 'restore of patchlevel.h failed'
Wc_c="`wc -c < 'patchlevel.h'`"
test 383 -eq "$Wc_c" ||
echo 'patchlevel.h: original size 383, current size' "$Wc_c"
fi
# ============= ansi2knr.c ==============
if test -f 'ansi2knr.c' -a X"$1" != X"-c"; then
echo 'x - skipping ansi2knr.c (File already exists)'
else
echo 'x - extracting ansi2knr.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ansi2knr.c' &&
X/* Copyright (C) 1989, 1991, 1993, 1994 Aladdin Enterprises. All rights reserved. */
X
X/* ansi2knr.c */
X/* Convert ANSI function declarations to K&R syntax */
X
X/*
Xansi2knr is distributed in the hope that it will be useful, but
XWITHOUT ANY WARRANTY. No author or distributor accepts responsibility
Xto anyone for the consequences of using it or for whether it serves any
Xparticular purpose or works at all, unless he says so in writing. Refer
Xto the GNU General Public License for full details.
X
XEveryone is granted permission to copy, modify and redistribute
Xansi2knr, but only under the conditions described in the GNU
XGeneral Public License. A copy of this license is supposed to have been
Xgiven to you along with ansi2knr so you can know your rights and
Xresponsibilities. It should be in a file named COPYING. Among other
Xthings, the copyright notice and this notice must be preserved on all
Xcopies.
X*/
X
X/*
X * Usage:
X ansi2knr input_file [output_file]
X * If no output_file is supplied, output goes to stdout.
X * There are no error messages.
X *
X * ansi2knr recognizes function definitions by seeing a non-keyword
X * identifier at the left margin, followed by a left parenthesis,
X * with a right parenthesis as the last character on the line.
X * It will recognize a multi-line header provided that the last character
X * of the last line of the header is a right parenthesis,
X * and no intervening line ends with a left brace or a semicolon.
X * These algorithms ignore whitespace and comments, except that
X * the function name must be the first thing on the line.
X * The following constructs will confuse it:
X * - Any other construct that starts at the left margin and
X * follows the above syntax (such as a macro or function call).
X * - Macros that tinker with the syntax of the function header.
X */
X
X/*
X * Change history:
X lpd 89-xx-xx original version
X lpd 94-07-16 added some conditionals to help GNU `configure',
X suggested by Francois Pinard <pin...@iro.umontreal.ca>;
X properly erase prototype args in function parameters,
X contributed by Jim Avera <ji...@netcom.com>;
X correct error in writeblanks (it shouldn't erase EOLs)
X */
X
X/* Most of the conditionals here are to make ansi2knr work with */
X/* the GNU configure machinery. */
X
X#ifdef HAVE_CONFIG_H
X# ifdef CONFIG_BROKETS
X/*
X We use <config.h> instead of "config.h" so that a compilation
X using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
X (which it would do because it found this file in $srcdir).
X */
X# include <config.h>
X# else
X# include "config.h"
X# endif
X#endif
X
X#include <stdio.h>
X#include <ctype.h>
X
X#ifdef HAVE_CONFIG_H
X
X/*
X For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
X This will define HAVE_CONFIG_H and so, activate the following lines.
X */
X
X# if STDC_HEADERS || HAVE_STRING_H
X# include <string.h>
X# else
X# include <strings.h>
X# endif
X
X#else /* not HAVE_CONFIG_H */
X
X/*
X Without AC_CONFIG_HEADER, merely use <string.h> as in the original
X Ghostscript distribution. This loses on older BSD systems.
X */
X
X# include <string.h>
X
X#endif /* not HAVE_CONFIG_H */
X
X#ifdef STDC_HEADERS
X# include <stdlib.h>
X#else
X/*
X malloc and free should be declared in stdlib.h,
X but if you've got a K&R compiler, they probably aren't.
X */
Xchar *malloc();
Xvoid free();
X#endif
X
X/* Scanning macros */
X#define isidchar(ch) (isalnum(ch) || (ch) == '_')
X#define isidfirstchar(ch) (isalpha(ch) || (ch) == '_')
X
X/* Forward references */
Xchar *skipspace();
Xvoid writeblanks();
Xint test1();
Xint convert1();
X
X/* The main program */
Xint
Xmain(argc, argv)
X int argc;
X char *argv[];
X{ FILE *in, *out;
X#define bufsize 5000 /* arbitrary size */
X char *buf;
X char *line;
X switch ( argc )
X {
X default:
X printf("Usage: ansi2knr input_file [output_file]\n");
X exit(0);
X case 2:
X out = stdout; break;
X case 3:
X out = fopen(argv[2], "w");
X if ( out == NULL )
X { fprintf(stderr, "Cannot open %s\n", argv[2]);
X exit(1);
X }
X }
X in = fopen(argv[1], "r");
X if ( in == NULL )
X { fprintf(stderr, "Cannot open %s\n", argv[1]);
X exit(1);
X }
X fprintf(out, "#line 1 \"%s\"\n", argv[1]);
X buf = malloc(bufsize);
X line = buf;
X while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
X { switch ( test1(buf) )
X {
X case 2: /* a function header */
X convert1(buf, out, 1);
X break;
X case 1: /* a function */
X convert1(buf, out, 0);
X break;
X case -1: /* maybe the start of a function */
X line = buf + strlen(buf);
X if ( line != buf + (bufsize - 1) ) /* overflow check */
X continue;
X /* falls through */
X default: /* not a function */
X fputs(buf, out);
X break;
X }
X line = buf;
X }
X if ( line != buf ) fputs(buf, out);
X free(buf);
X fclose(out);
X fclose(in);


X return 0;
X}
X

X/* Skip over space and comments, in either direction. */
Xchar *
Xskipspace(p, dir)
X register char *p;
X register int dir; /* 1 for forward, -1 for backward */
X{ for ( ; ; )
X { while ( isspace(*p) ) p += dir;
X if ( !(*p == '/' && p[dir] == '*') ) break;
X p += dir; p += dir;
X while ( !(*p == '*' && p[dir] == '/') )
X { if ( *p == 0 ) return p; /* multi-line comment?? */
X p += dir;
X }
X p += dir; p += dir;
X }
X return p;
X}
X
X/*
X * Write blanks over part of a string.
X * Don't overwrite end-of-line characters.
X */
Xvoid
Xwriteblanks(start, end)
X char *start;
X char *end;
X{ char *p;
X for ( p = start; p < end; p++ )
X if ( *p != '\r' && *p != '\n' ) *p = ' ';
X}
X
X/*
X * Test whether the string in buf is a function definition.
X * The string may contain and/or end with a newline.
X * Return as follows:
X * 0 - definitely not a function definition;
X * 1 - definitely a function definition;
X * 2 - definitely a function prototype (NOT USED);
X * -1 - may be the beginning of a function definition,
X * append another line and look again.
X * The reason we don't attempt to convert function prototypes is that
X * Ghostscript's declaration-generating macros look too much like
X * prototypes, and confuse the algorithms.
X */
Xint
Xtest1(buf)
X char *buf;
X{ register char *p = buf;
X char *bend;
X char *endfn;
X int contin;
X if ( !isidfirstchar(*p) )
X return 0; /* no name at left margin */
X bend = skipspace(buf + strlen(buf) - 1, -1);
X switch ( *bend )
X {
X case ';': contin = 0 /*2*/; break;
X case ')': contin = 1; break;
X case '{': return 0; /* not a function */
X default: contin = -1;
X }
X while ( isidchar(*p) ) p++;
X endfn = p;
X p = skipspace(p, 1);
X if ( *p++ != '(' )
X return 0; /* not a function */
X p = skipspace(p, 1);
X if ( *p == ')' )
X return 0; /* no parameters */
X /* Check that the apparent function name isn't a keyword. */
X /* We only need to check for keywords that could be followed */
X /* by a left parenthesis (which, unfortunately, is most of them). */
X { static char *words[] =
X { "asm", "auto", "case", "char", "const", "double",
X "extern", "float", "for", "if", "int", "long",
X "register", "return", "short", "signed", "sizeof",
X "static", "switch", "typedef", "unsigned",
X "void", "volatile", "while", 0
X };
X char **key = words;
X char *kp;
X int len = endfn - buf;
X while ( (kp = *key) != 0 )
X { if ( strlen(kp) == len && !strncmp(kp, buf, len) )
X return 0; /* name is a keyword */
X key++;
X }
X }
X return contin;
X}
X
X/* Convert a recognized function definition or header to K&R syntax. */
Xint
Xconvert1(buf, out, header)
X char *buf;
X FILE *out;
X int header; /* Boolean */
X{ char *endfn;
X register char *p;
X char **breaks;
X unsigned num_breaks = 2; /* for testing */
X char **btop;
X char **bp;
X char **ap;
X /* Pre-ANSI implementations don't agree on whether strchr */
X /* is called strchr or index, so we open-code it here. */
X for ( endfn = buf; *(endfn++) != '('; ) ;
Xtop: p = endfn;
X breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
X if ( breaks == 0 )
X { /* Couldn't allocate break table, give up */
X fprintf(stderr, "Unable to allocate break table!\n");
X fputs(buf, out);
X return -1;
X }
X btop = breaks + num_breaks * 2 - 2;
X bp = breaks;
X /* Parse the argument list */
X do
X { int level = 0;
X char *lp = NULL;
X char *rp;
X char *end = NULL;
X if ( bp >= btop )
X { /* Filled up break table. */
X /* Allocate a bigger one and start over. */
X free((char *)breaks);
X num_breaks <<= 1;
X goto top;
X }
X *bp++ = p;
X /* Find the end of the argument */
X for ( ; end == NULL; p++ )
X { switch(*p)
X {
X case ',':
X if ( !level ) end = p;
X break;
X case '(':
X if ( !level ) lp = p;
X level++;
X break;
X case ')':
X if ( --level < 0 ) end = p;
X else rp = p;
X break;
X case '/':
X p = skipspace(p, 1) - 1;
X break;
X default:
X ;
X }
X }
X /* Erase any embedded prototype parameters. */
X if ( lp )
X writeblanks(lp + 1, rp);
X p--; /* back up over terminator */
X /* Find the name being declared. */
X /* This is complicated because of procedure and */
X /* array modifiers. */
X for ( ; ; )
X { p = skipspace(p - 1, -1);
X switch ( *p )
X {
X case ']': /* skip array dimension(s) */
X case ')': /* skip procedure args OR name */
X { int level = 1;
X while ( level )
X switch ( *--p )
X {
X case ']': case ')': level++; break;
X case '[': case '(': level--; break;
X case '/': p = skipspace(p, -1) + 1; break;
X default: ;
X }
X }
X if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
X { /* We found the name being declared */
X while ( !isidfirstchar(*p) )
X p = skipspace(p, 1) + 1;
X goto found;
X }
X break;
X default: goto found;
X }
X }
Xfound: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
X { p++;
X if ( bp == breaks + 1 ) /* sole argument */
X writeblanks(breaks[0], p);
X else
X writeblanks(bp[-1] - 1, p);
X bp--;
X }
X else
X { while ( isidchar(*p) ) p--;
X *bp++ = p+1;
X }
X p = end;
X }
X while ( *p++ == ',' );
X *bp = p;
X /* Make a special check for 'void' arglist */
X if ( bp == breaks+2 )
X { p = skipspace(breaks[0], 1);
X if ( !strncmp(p, "void", 4) )
X { p = skipspace(p+4, 1);
X if ( p == breaks[2] - 1 )
X { bp = breaks; /* yup, pretend arglist is empty */
X writeblanks(breaks[0], p + 1);
X }
X }
X }
X /* Put out the function name */
X p = buf;
X while ( p != endfn ) putc(*p, out), p++;
X /* Put out the declaration */
X if ( header )
X { fputs(");", out);
X for ( p = breaks[0]; *p; p++ )
X if ( *p == '\n' )
X putc('\n', out);
X }
X else
X { for ( ap = breaks+1; ap < bp; ap += 2 )
X { p = *ap;
X while ( isidchar(*p) )
X putc(*p, out), p++;
X if ( ap < bp - 1 )
X fputs(", ", out);
X }
X fputs(") ", out);
X /* Put out the argument declarations */
X for ( ap = breaks+2; ap <= bp; ap += 2 )
X (*ap)[-1] = ';';
X fputs(breaks[0], out);
X }
X free((char *)breaks);
X return 0;
X}
SHAR_EOF
chmod 0644 ansi2knr.c ||
echo 'restore of ansi2knr.c failed'
Wc_c="`wc -c < 'ansi2knr.c'`"
test 10770 -eq "$Wc_c" ||
echo 'ansi2knr.c: original size 10770, current size' "$Wc_c"
fi
# ============= ansi2knr.1 ==============
if test -f 'ansi2knr.1' -a X"$1" != X"-c"; then
echo 'x - skipping ansi2knr.1 (File already exists)'
else
echo 'x - extracting ansi2knr.1 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ansi2knr.1' &&
X.TH ANSI2KNR 1 "31 December 1990"
X.SH NAME
Xansi2knr \- convert ANSI C to Kernighan & Ritchie C
X.SH SYNOPSIS
X.I ansi2knr
Xinput_file output_file
X.SH DESCRIPTION
XIf no output_file is supplied, output goes to stdout.
X.br
XThere are no error messages.
X.sp
X.I ansi2knr
Xrecognizes functions by seeing a non-keyword identifier at the left margin, followed by a left parenthesis, with a right parenthesis as the last character on the line. It will recognize a multi-line header if the last character on each line but the last is a left parenthesis or comma. These algorithms ignore whitespace and comments, except that the function name must be the first thing on the line.
X.sp
XThe following constructs will confuse it:
X.br
X - Any other construct that starts at the left margin and follows the above syntax (such as a macro or function call).
X.br
X - Macros that tinker with the syntax of the function header.
SHAR_EOF
chmod 0644 ansi2knr.1 ||
echo 'restore of ansi2knr.1 failed'
Wc_c="`wc -c < 'ansi2knr.1'`"
test 910 -eq "$Wc_c" ||
echo 'ansi2knr.1: original size 910, current size' "$Wc_c"
fi
# ============= COPYING ==============
if test -f 'COPYING' -a X"$1" != X"-c"; then
echo 'x - skipping COPYING (File already exists)'
else
echo 'x - extracting COPYING (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'COPYING' &&
X GNU GENERAL PUBLIC LICENSE
X Version 2, June 1991
X
X Copyright (C) 1989, 1991 Free Software Foundation, Inc.
X 675 Mass Ave, Cambridge, MA 02139, USA
X Everyone is permitted to copy and distribute verbatim copies
X of this license document, but changing it is not allowed.
X
X Preamble
X
X The licenses for most software are designed to take away your
Xfreedom to share and change it. By contrast, the GNU General Public
XLicense is intended to guarantee your freedom to share and change free
Xsoftware--to make sure the software is free for all its users. This
XGeneral Public License applies to most of the Free Software
XFoundation's software and to any other program whose authors commit to
Xusing it. (Some other Free Software Foundation software is covered by
Xthe GNU Library General Public License instead.) You can apply it to
Xyour programs, too.
X
X When we speak of free software, we are referring to freedom, not
Xprice. Our General Public Licenses are designed to make sure that you
Xhave the freedom to distribute copies of free software (and charge for
Xthis service if you wish), that you receive source code or can get it
Xif you want it, that you can change the software or use pieces of it
Xin new free programs; and that you know you can do these things.
X
X To protect your rights, we need to make restrictions that forbid
Xanyone to deny you these rights or to ask you to surrender the rights.
XThese restrictions translate to certain responsibilities for you if you
Xdistribute copies of the software, or if you modify it.
X
X For example, if you distribute copies of such a program, whether
Xgratis or for a fee, you must give the recipients all the rights that
Xyou have. You must make sure that they, too, receive or can get the
Xsource code. And you must show them these terms so they know their
Xrights.
X
X We protect your rights with two steps: (1) copyright the software, and
X(2) offer you this license which gives you legal permission to copy,
Xdistribute and/or modify the software.
X
X Also, for each author's protection and ours, we want to make certain
Xthat everyone understands that there is no warranty for this free
Xsoftware. If the software is modified by someone else and passed on, we
Xwant its recipients to know that what they have is not the original, so
Xthat any problems introduced by others will not reflect on the original
Xauthors' reputations.
X
X Finally, any free program is threatened constantly by software
Xpatents. We wish to avoid the danger that redistributors of a free
Xprogram will individually obtain patent licenses, in effect making the
Xprogram proprietary. To prevent this, we have made it clear that any
Xpatent must be licensed for everyone's free use or not licensed at all.
X
X The precise terms and conditions for copying, distribution and
Xmodification follow.
X
X GNU GENERAL PUBLIC LICENSE
X TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
X
X 0. This License applies to any program or other work which contains
Xa notice placed by the copyright holder saying it may be distributed
Xunder the terms of this General Public License. The "Program", below,
Xrefers to any such program or work, and a "work based on the Program"
Xmeans either the Program or any derivative work under copyright law:
Xthat is to say, a work containing the Program or a portion of it,
Xeither verbatim or with modifications and/or translated into another
Xlanguage. (Hereinafter, translation is included without limitation in
Xthe term "modification".) Each licensee is addressed as "you".
X
XActivities other than copying, distribution and modification are not
Xcovered by this License; they are outside its scope. The act of
Xrunning the Program is not restricted, and the output from the Program
Xis covered only if its contents constitute a work based on the
XProgram (independent of having been made by running the Program).
XWhether that is true depends on what the Program does.
X
X 1. You may copy and distribute verbatim copies of the Program's
Xsource code as you receive it, in any medium, provided that you
Xconspicuously and appropriately publish on each copy an appropriate
Xcopyright notice and disclaimer of warranty; keep intact all the
Xnotices that refer to this License and to the absence of any warranty;
Xand give any other recipients of the Program a copy of this License
Xalong with the Program.
X
XYou may charge a fee for the physical act of transferring a copy, and
Xyou may at your option offer warranty protection in exchange for a fee.
X
X 2. You may modify your copy or copies of the Program or any portion
Xof it, thus forming a work based on the Program, and copy and
Xdistribute such modifications or work under the terms of Section 1
Xabove, provided that you also meet all of these conditions:
X
X a) You must cause the modified files to carry prominent notices
X stating that you changed the files and the date of any change.
X
X b) You must cause any work that you distribute or publish, that in
X whole or in part contains or is derived from the Program or any
X part thereof, to be licensed as a whole at no charge to all third
X parties under the terms of this License.
X
X c) If the modified program normally reads commands interactively
X when run, you must cause it, when started running for such
X interactive use in the most ordinary way, to print or display an
X announcement including an appropriate copyright notice and a
X notice that there is no warranty (or else, saying that you provide
X a warranty) and that users may redistribute the program under
X these conditions, and telling the user how to view a copy of this
X License. (Exception: if the Program itself is interactive but
X does not normally print such an announcement, your work based on
X the Program is not required to print an announcement.)
X
XThese requirements apply to the modified work as a whole. If
Xidentifiable sections of that work are not derived from the Program,
Xand can be reasonably considered independent and separate works in
Xthemselves, then this License, and its terms, do not apply to those
Xsections when you distribute them as separate works. But when you
Xdistribute the same sections as part of a whole which is a work based
Xon the Program, the distribution of the whole must be on the terms of
Xthis License, whose permissions for other licensees extend to the
Xentire whole, and thus to each and every part regardless of who wrote it.
X
XThus, it is not the intent of this section to claim rights or contest
Xyour rights to work written entirely by you; rather, the intent is to
Xexercise the right to control the distribution of derivative or
Xcollective works based on the Program.
X
XIn addition, mere aggregation of another work not based on the Program
Xwith the Program (or with a work based on the Program) on a volume of
Xa storage or distribution medium does not bring the other work under
Xthe scope of this License.
X
X 3. You may copy and distribute the Program (or a work based on it,
Xunder Section 2) in object code or executable form under the terms of
XSections 1 and 2 above provided that you also do one of the following:
X
X a) Accompany it with the complete corresponding machine-readable
X source code, which must be distributed under the terms of Sections
X 1 and 2 above on a medium customarily used for software interchange; or,
X
X b) Accompany it with a written offer, valid for at least three
X years, to give any third party, for a charge no more than your
X cost of physically performing source distribution, a complete
X machine-readable copy of the corresponding source code, to be
X distributed under the terms of Sections 1 and 2 above on a medium
X customarily used for software interchange; or,
X
X c) Accompany it with the information you received as to the offer
X to distribute corresponding source code. (This alternative is
X allowed only for noncommercial distribution and only if you
X received the program in object code or executable form with such
X an offer, in accord with Subsection b above.)
X
XThe source code for a work means the preferred form of the work for
Xmaking modifications to it. For an executable work, complete source
Xcode means all the source code for all modules it contains, plus any
Xassociated interface definition files, plus the scripts used to
Xcontrol compilation and installation of the executable. However, as a
Xspecial exception, the source code distributed need not include
Xanything that is normally distributed (in either source or binary
Xform) with the major components (compiler, kernel, and so on) of the
Xoperating system on which the executable runs, unless that component
Xitself accompanies the executable.
X
XIf distribution of executable or object code is made by offering
Xaccess to copy from a designated place, then offering equivalent
Xaccess to copy the source code from the same place counts as
Xdistribution of the source code, even though third parties are not
Xcompelled to copy the source along with the object code.
X
X 4. You may not copy, modify, sublicense, or distribute the Program
Xexcept as expressly provided under this License. Any attempt
Xotherwise to copy, modify, sublicense or distribute the Program is
Xvoid, and will automatically terminate your rights under this License.
XHowever, parties who have received copies, or rights, from you under
Xthis License will not have their licenses terminated so long as such
Xparties remain in full compliance.
X
X 5. You are not required to accept this License, since you have not
Xsigned it. However, nothing else grants you permission to modify or
Xdistribute the Program or its derivative works. These actions are
Xprohibited by law if you do not accept this License. Therefore, by
Xmodifying or distributing the Program (or any work based on the
XProgram), you indicate your acceptance of this License to do so, and
Xall its terms and conditions for copying, distributing or modifying
Xthe Program or works based on it.
X
X 6. Each time you redistribute the Program (or any work based on the
XProgram), the recipient automatically receives a license from the
Xoriginal licensor to copy, distribute or modify the Program subject to
Xthese terms and conditions. You may not impose any further
Xrestrictions on the recipients' exercise of the rights granted herein.
XYou are not responsible for enforcing compliance by third parties to
Xthis License.
X
X 7. If, as a consequence of a court judgment or allegation of patent
Xinfringement or for any other reason (not limited to patent issues),
Xconditions are imposed on you (whether by court order, agreement or
Xotherwise) that contradict the conditions of this License, they do not
Xexcuse you from the conditions of this License. If you cannot
Xdistribute so as to satisfy simultaneously your obligations under this
XLicense and any other pertinent obligations, then as a consequence you
Xmay not distribute the Program at all. For example, if a patent
Xlicense would not permit royalty-free redistribution of the Program by
Xall those who receive copies directly or indirectly through you, then
Xthe only way you could satisfy both it and this License would be to
Xrefrain entirely from distribution of the Program.
X
XIf any portion of this section is held invalid or unenforceable under
Xany particular circumstance, the balance of the section is intended to
Xapply and the section as a whole is intended to apply in other
Xcircumstances.
X
XIt is not the purpose of this section to induce you to infringe any
Xpatents or other property right claims or to contest validity of any
Xsuch claims; this section has the sole purpose of protecting the
Xintegrity of the free software distribution system, which is
Ximplemented by public license practices. Many people have made
Xgenerous contributions to the wide range of software distributed
Xthrough that system in reliance on consistent application of that
Xsystem; it is up to the author/donor to decide if he or she is willing
Xto distribute software through any other system and a licensee cannot
Ximpose that choice.
X
XThis section is intended to make thoroughly clear what is believed to
Xbe a consequence of the rest of this License.
X
X 8. If the distribution and/or use of the Program is restricted in
Xcertain countries either by patents or by copyrighted interfaces, the
Xoriginal copyright holder who places the Program under this License
Xmay add an explicit geographical distribution limitation excluding
Xthose countries, so that distribution is permitted only in or among
Xcountries not thus excluded. In such case, this License incorporates
Xthe limitation as if written in the body of this License.
X
X 9. The Free Software Foundation may publish revised and/or new versions
Xof the General Public License from time to time. Such new versions will
Xbe similar in spirit to the present version, but may differ in detail to
Xaddress new problems or concerns.
X
XEach version is given a distinguishing version number. If the Program
Xspecifies a version number of this License which applies to it and "any
Xlater version", you have the option of following the terms and conditions
Xeither of that version or of any later version published by the Free
XSoftware Foundation. If the Program does not specify a version number of
Xthis License, you may choose any version ever published by the Free Software
XFoundation.
X
X 10. If you wish to incorporate parts of the Program into other free
Xprograms whose distribution conditions are different, write to the author
Xto ask for permission. For software which is copyrighted by the Free
XSoftware Foundation, write to the Free Software Foundation; we sometimes
Xmake exceptions for this. Our decision will be guided by the two goals
Xof preserving the free status of all derivatives of our free software and
Xof promoting the sharing and reuse of software generally.
X
X NO WARRANTY
X
X 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
XOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
XPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
XOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
XMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
XTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
XREPAIR OR CORRECTION.
X
X 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
XINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
XOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
XTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
XYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
XPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
XPOSSIBILITY OF SUCH DAMAGES.
X
X END OF TERMS AND CONDITIONS
X
X Appendix: How to Apply These Terms to Your New Programs
X
X If you develop a new program, and you want it to be of the greatest
Xpossible use to the public, the best way to achieve this is to make it
Xfree software which everyone can redistribute and change under these terms.
X
X To do so, attach the following notices to the program. It is safest
Xto attach them to the start of each source file to most effectively
Xconvey the exclusion of warranty; and each file should have at least
Xthe "copyright" line and a pointer to where the full notice is found.
X
X <one line to give the program's name and a brief idea of what it does.>
X Copyright (C) 19yy <name of author>
X
X This program is free software; you can redistribute it and/or modify
X it under the terms of the GNU General Public License as published by
X the Free Software Foundation; either version 2 of the License, or
X (at your option) any later version.
X
X This program is distributed in the hope that it will be useful,
X but WITHOUT ANY WARRANTY; without even the implied warranty of
X MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
X GNU General Public License for more details.
X
X You should have received a copy of the GNU General Public License
X along with this program; if not, write to the Free Software
X Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
X
XAlso add information on how to contact you by electronic and paper mail.
X
XIf the program is interactive, make it output a short notice like this
Xwhen it starts in an interactive mode:
X
X Gnomovision version 69, Copyright (C) 19yy name of author
X Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
X This is free software, and you are welcome to redistribute it
X under certain conditions; type `show c' for details.
X
XThe hypothetical commands `show w' and `show c' should show the appropriate
Xparts of the General Public License. Of course, the commands you use may
Xbe called something other than `show w' and `show c'; they could even be
Xmouse-clicks or menu items--whatever suits your program.
X
XYou should also get your employer (if you work as a programmer) or your
Xschool, if any, to sign a "copyright disclaimer" for the program, if
Xnecessary. Here is a sample; alter the names:
X
X Yoyodyne, Inc., hereby disclaims all copyright interest in the program
X `Gnomovision' (which makes passes at compilers) written by James Hacker.
X
X <signature of Ty Coon>, 1 April 1989
X Ty Coon, President of Vice
X
XThis General Public License does not permit incorporating your program into
Xproprietary programs. If your program is a subroutine library, you may
Xconsider it more useful to permit linking proprietary applications with the
Xlibrary. If this is what you want to do, use the GNU Library General
XPublic License instead of this License.
X
SHAR_EOF
chmod 0644 COPYING ||
echo 'restore of COPYING failed'
Wc_c="`wc -c < 'COPYING'`"
test 17983 -eq "$Wc_c" ||
echo 'COPYING: original size 17983, current size' "$Wc_c"
fi
# ============= ChangeLog ==============
if test -f 'ChangeLog' -a X"$1" != X"-c"; then
echo 'x - skipping ChangeLog (File already exists)'
else
echo 'x - extracting ChangeLog (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ChangeLog' &&
XTue Oct 11 16:25:41 1994 Christopher Lott <lo...@bogner.informatik.uni-kl.de>
X
X * Version 1.12
X * Makefile.in: removed the test directory's dependency on the
X tarred/compressed/uuencoded file due to a loop. The test
X directory may be unpacked unnecessarily, but this is not as
X serious as failing to generate a new tarred/compressed/uuencoded
X file after the test data changes.
X
XFri Sep 2 08:37:36 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * csize.man: added mention that trigraphs are not supported, and
X neither dollar signs nor at signs are accepted in identifiers.
X Changed discussion of handling comments on preprocessor lines.
X
XThu Sep 1 14:54:43 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.11
X * Responded to bug report from Sven-Ove Westberg <s...@cad.luth.se>
X who correctly pointed out that csize was not properly handling
X comments that occur on the same line as a preprocessor
X directive. Extended function pp_dir() to handle comments.
X
XSun Aug 21 13:16:15 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X * Version 1.10
X * Shortened file names to stay within the 14-character constraint
X imposed by some sytems.
X * Added a missing closing quotation mark in the test directory
X Makefile
X * Adapted to version 2.4.7 of flex.
X * Updated the README to admit that I do not fully utilize the
X capabilities of the scanner.
X * Reworked the changelog into Gnu's accepted format
X * Moved function names in C files to column 1 to help ansi2knr
X * Moved Makefile to Makefile.in, reworked it for autoconf
X * Created configure.in so that I can use autoconf
X * Copied aclocal.m4 from GNUm4-1.2 directory
X * Created configure using autoconf
X * Updated the INSTALL file to state clearly the dependence on UNIX
X systems, and to reflect the addition of configure.
X * Copied the install.sh file from GNUm4-1.2 for SYSV people.
X
XSun Jul 24 10:00:45 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.9.
X * Failure: the string literal "\\" was not recognized properly.
X Removed fault by reworking code to process backslashes in
X string literals more intelligently.
X * Did the same for pp dirs, where the same fault was lurking.
X
XWed Jul 29 07:12.49 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.8
X * Split the README into a README and an INSTALL file.
X * Renamed version.h to patchlevel.h
X * Added a target to the Makefile for unpacking the tests.
X
XMon Jun 13 05:19:40 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.7
X * Added code to handle the cases where a totally blank line
X appears in a comment or a preprocessor directive. Lines with
X white-space characters were already being treated correctly,
X but lines with nothing but a newline were not. In the cases
X of comments or preprocessor directives, the line is not counted
X in the blank-line category but instead in the comment or nonblank
X noncomment line category, respectively.
X * Updated the man page to explain these counting rules.
X * Added test cases (v-*) for these conditions. Because counting
X the blank lines depends on their surrounding context, I can't use
X a grep/wc combination to verify the counts automatically.
X
XSun Jun 12 09:37:20 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.6
X * Removed fault that caused string literal continuation lines
X not to be counted correctly as nonblank noncomment lines.
X This was difficult and resulted in much reorganization of
X the code that counts nonblank noncomment lines, newlines,
X comments, and pp dirs to be more modular.
X * Added test cases for continuation lines in string literals
X and in preprocessor directives.
X * Added -v flag == print version information.
X Updated the man page accordingly.
X Added file version.h, updated the Makefile.
X * Updated the README to warn about different implementations
X of getopt() that cause mismatches in the test ouput. This
X is not a serious problem.
X * Added many comments to explain the inner workings of the
X counting functions.
X
XFri Jun 10 08:44:26 1994 Christopher Lott (lo...@bogner.informatik.uni-kl.de)
X
X * Version 1.5
X * Put files under revision control
X * Added preprocessor directives:
X include_next, import, warning, sccs, ident, assert, unassert.
X I can't find documentation of #indent in K&R 1/e, K&R 2/e,
X or even in Stroustrup _C++_ 2/e. However, GCC's info file
X mentions it, and it's supported both by gcc and Sun's cc.
X The rest came from reading version 2.5.8 of GCC's cccp.c.
X Changed the man page to reflect the additions.
X * removed fault that caused string literals with embedded
X backslashes and newlines to be handled improperly.
X Added function string_lit() to process all string literals.
X * Removed fault that caused backslashes outside of string
X literals to generate a "bad character" message. Added a lex
X rule. Now they are recognized, but the backslash processing
X is still not sophisticated.
X
XChanges between versions 1.3 and 1.4:
X
X * Removed faults that caused multi-line comments to threw off
X the newline count and to echo comments improperly.
X Both were removed by switching back to the original
X comment-eating code; dropped use of the code from flexdoc(1).
X * Removed fault that caused nonempty whitespace lines not to be
X echoed verbatim
X * Removed fault that caused blank line immediately after pp
X directive to be ignored. Changed pp-eating code to give
X back the newline that terminates the pp directive; this
X allows the scanner to recognize the beginning of a line (^)
X in the pattern for whitespace lines.
X * Removed ^ before pattern for preprocessor directives; i.e.,
X they will be recognized even if non-whitespace preceeds
X them. This deviates from the spec in K&R 2/e but matches
X gcc's behavior. Changed the man page to reflect this.
X * Aadded more cases to the regression test suite to detect faults.
X
XChanges between versions 1.2 and 1.3:
X
X * Upgraded to flex version 2.4.6; forced me to work around a
X bug in flex - use yyrestart(FILE *) to set up the scanner.
X * Removed fault that caused the the closing */ of a comment
X to be omitted in the echoed output.
X
XChanges between versions 1.1 and 1.2:
X
X * Replaced comment-eating code with example from flexdoc(1) man page
X * lex could not count pp dirs properly, so I gave up on lex
X and switched to using flex.
X * Cleaned up man page and Makefile
X * Added scan.c.flex to the distribution for those w/o flex
X
XRelease 1.1 of csize:
X
X * First release to interested parties.
SHAR_EOF
chmod 0644 ChangeLog ||
echo 'restore of ChangeLog failed'
Wc_c="`wc -c < 'ChangeLog'`"
test 6667 -eq "$Wc_c" ||
echo 'ChangeLog: original size 6667, current size' "$Wc_c"
fi
true || echo 'restore of scan.c.flex failed'
echo End of part 2, continue with part 3

Christopher Lott

unread,
Oct 17, 1994, 5:31:58 PM10/17/94
to
Submitted-by: lo...@informatik.uni-kl.de (Christopher Lott)
Posting-number: Volume 4, Issue 4
Archive-name: csize/part03
Environment: ANSI C,FLEX

#!/bin/sh
# This is part 03 of csize
# ============= scan.c.flex ==============
if test -f 'scan.c.flex' -a X"$1" != X"-c"; then
echo 'x - skipping scan.c.flex (File already exists)'
else
echo 'x - extracting scan.c.flex (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'scan.c.flex' &&
X/* A lexical scanner generated by flex */
X
X/* Scanner skeleton version:
X * $Header: /home/daffy/u0/vern/flex/flex-2.4.7/RCS/flex.skl,v 1.2 94/08/03 11:13:24 vern Exp $
X */
X
X#define FLEX_SCANNER
X
X#include <stdio.h>
X
X
X/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
X#ifdef c_plusplus
X#ifndef __cplusplus
X#define __cplusplus
X#endif
X#endif
X
X
X#ifdef __cplusplus
X
X#include <stdlib.h>
X#include <unistd.h>
X
X/* Use prototypes in function declarations. */
X#define YY_USE_PROTOS
X
X/* The "const" storage-class-modifier is valid. */
X#define YY_USE_CONST
X
X#else /* ! __cplusplus */
X
X#ifdef __STDC__
X
X#define YY_USE_PROTOS
X#define YY_USE_CONST
X
X#endif /* __STDC__ */
X#endif /* ! __cplusplus */
X
X
X#ifdef __TURBOC__
X#define YY_USE_CONST
X#endif
X
X
X#ifndef YY_USE_CONST
X#ifndef const
X#define const
X#endif
X#endif
X
X
X#ifdef YY_USE_PROTOS
X#define YY_PROTO(proto) proto
X#else
X#define YY_PROTO(proto) ()
X#endif
X
X/* Returned upon end-of-file. */
X#define YY_NULL 0
X
X/* Promotes a possibly negative, possibly signed char to an unsigned
X * integer for use as an array index. If the signed char is negative,
X * we want to instead treat it as an 8-bit unsigned char, hence the
X * double cast.
X */
X#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
X
X/* Enter a start condition. This macro really ought to take a parameter,
X * but we do it the disgusting crufty way forced on us by the ()-less
X * definition of BEGIN.
X */
X#define BEGIN yy_start = 1 + 2 *
X
X/* Translate the current start state into a value that can be later handed
X * to BEGIN to return to the state.
X */
X#define YY_START ((yy_start - 1) / 2)
X
X/* Action number for EOF rule of a given start state. */
X#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
X
X/* Special action meaning "start processing a new file". Now included
X * only for backward compatibility with previous versions of flex.
X */
X#define YY_NEW_FILE yyrestart( yyin )
X
X#define YY_END_OF_BUFFER_CHAR 0
X
X/* Size of default input buffer. */
X#define YY_BUF_SIZE 16384
X
Xtypedef struct yy_buffer_state *YY_BUFFER_STATE;
X
Xextern int yyleng;
Xextern FILE *yyin, *yyout;
X
X#ifdef __cplusplus
Xextern "C" {
X#endif
X extern int yywrap YY_PROTO(( void ));
X#ifdef __cplusplus
X }
X#endif
X
X#define EOB_ACT_CONTINUE_SCAN 0
X#define EOB_ACT_END_OF_FILE 1
X#define EOB_ACT_LAST_MATCH 2
X
X/* The funky do-while in the following #define is used to turn the definition
X * int a single C statement (which needs a semi-colon terminator). This
X * avoids problems with code like:
X *
X * if ( condition_holds )
X * yyless( 5 );
X * else
X * do_something_else();
X *
X * Prior to using the do-while the compiler would get upset at the
X * "else" because it interpreted the "if" statement as being all
X * done when it reached the ';' after the yyless() call.
X */
X
X/* Return all but the first 'n' matched characters back to the input stream. */
X
X#define yyless(n) \
X do \
X { \
X /* Undo effects of setting up yytext. */ \
X *yy_cp = yy_hold_char; \
X yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
X YY_DO_BEFORE_ACTION; /* set up yytext again */ \
X } \
X while ( 0 )
X
X#define unput(c) yyunput( c, yytext_ptr )
X
X
Xstruct yy_buffer_state
X {
X FILE *yy_input_file;
X
X char *yy_ch_buf; /* input buffer */
X char *yy_buf_pos; /* current position in input buffer */
X
X /* Size of input buffer in bytes, not including room for EOB
X * characters.
X */
X int yy_buf_size;
X
X /* Number of characters read into yy_ch_buf, not including EOB
X * characters.
X */
X int yy_n_chars;
X
X /* Whether this is an "interactive" input source; if so, and
X * if we're using stdio for input, then we want to use getc()
X * instead of fread(), to make sure we stop fetching input after
X * each newline.
X */
X int yy_is_interactive;
X
X /* Whether to try to fill the input buffer when we reach the
X * end of it.
X */
X int yy_fill_buffer;
X
X int yy_buffer_status;
X#define YY_BUFFER_NEW 0
X#define YY_BUFFER_NORMAL 1
X /* When an EOF's been seen but there's still some text to process
X * then we mark the buffer as YY_EOF_PENDING, to indicate that we
X * shouldn't try reading from the input source any more. We might
X * still have a bunch of tokens to match, though, because of
X * possible backing-up.
X *
X * When we actually see the EOF, we change the status to "new"
X * (via yyrestart()), so that the user can continue scanning by
X * just pointing yyin at a new input file.
X */
X#define YY_BUFFER_EOF_PENDING 2
X };
X
Xstatic YY_BUFFER_STATE yy_current_buffer = 0;
X
X/* We provide macros for accessing buffer states in case in the
X * future we want to put the buffer states in a more general
X * "scanner state".
X */
X#define YY_CURRENT_BUFFER yy_current_buffer
X
X
X/* yy_hold_char holds the character lost when yytext is formed. */
Xstatic char yy_hold_char;
X
Xstatic int yy_n_chars; /* number of characters read into yy_ch_buf */
X
X
Xint yyleng;
X
X/* Points to current character in buffer. */
Xstatic char *yy_c_buf_p = (char *) 0;
Xstatic int yy_init = 1; /* whether we need to initialize */
Xstatic int yy_start = 0; /* start state number */
X
X/* Flag which is used to allow yywrap()'s to do buffer switches
X * instead of setting up a fresh yyin. A bit of a hack ...
X */
Xstatic int yy_did_buffer_switch_on_eof;
X
Xstatic void yyunput YY_PROTO(( int c, char *buf_ptr ));
Xvoid yyrestart YY_PROTO(( FILE *input_file ));
Xvoid yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
Xvoid yy_load_buffer_state YY_PROTO(( void ));
XYY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
Xvoid yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
Xvoid yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
X
Xstatic int yy_start_stack_ptr = 0;
Xstatic int yy_start_stack_depth = 0;
Xstatic int *yy_start_stack = 0;
Xstatic void yy_push_state YY_PROTO(( int new_state ));
Xstatic void yy_pop_state YY_PROTO(( void ));
Xstatic int yy_top_state YY_PROTO(( void ));
X
Xstatic void *yy_flex_alloc YY_PROTO(( unsigned int ));
Xstatic void *yy_flex_realloc YY_PROTO(( void *, unsigned int ));
Xstatic void yy_flex_free YY_PROTO(( void * ));
X
X#define yy_new_buffer yy_create_buffer
X
X#define INITIAL 0
Xtypedef unsigned char YY_CHAR;
Xtypedef int yy_state_type;
XFILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
Xextern char *yytext;
X#define yytext_ptr yytext
X
X#ifndef yytext_ptr
Xstatic void yy_flex_strncpy YY_PROTO(( char *, const char *, int ));
X#endif
X
X#ifdef __cplusplus
Xstatic int yyinput YY_PROTO(( void ));
X#else
Xstatic int input YY_PROTO(( void ));
X#endif
X
Xstatic yy_state_type yy_get_previous_state YY_PROTO(( void ));
Xstatic yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
Xstatic int yy_get_next_buffer YY_PROTO(( void ));
Xstatic void yy_fatal_error YY_PROTO(( const char msg[] ));
X
X/* Done after the current pattern has been matched and before the
X * corresponding action - sets up yytext.
X */
X#define YY_DO_BEFORE_ACTION \
X yytext_ptr = yy_bp; \
X yyleng = yy_cp - yy_bp; \
X yy_hold_char = *yy_cp; \
X *yy_cp = '\0'; \
X yy_c_buf_p = yy_cp;
X
X#define YY_END_OF_BUFFER 113
Xstatic const short int yy_accept[324] =
X { 0,
X 0, 0, 113, 111, 108, 110, 74, 86, 111, 80,
X 73, 111, 68, 69, 78, 77, 65, 76, 72, 79,
X 36, 36, 66, 62, 81, 67, 82, 85, 33, 70,
X 106, 71, 83, 33, 33, 33, 33, 33, 33, 33,
X 33, 33, 33, 33, 33, 33, 33, 33, 63, 84,
X 64, 75, 108, 108, 61, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 47, 56, 48, 0, 0,
X 45, 53, 43, 54, 44, 55, 39, 107, 46, 40,
X 35, 0, 36, 0, 36, 52, 58, 60, 59, 51,
X 33, 49, 33, 33, 33, 33, 33, 33, 8, 33,
X
X 33, 33, 33, 33, 33, 16, 33, 33, 33, 33,
X 33, 33, 33, 33, 33, 33, 33, 50, 57, 108,
X 109, 0, 0, 0, 0, 0, 0, 94, 0, 0,
X 0, 0, 0, 0, 0, 37, 0, 39, 39, 0,
X 40, 35, 0, 38, 34, 42, 41, 33, 33, 33,
X 33, 33, 33, 33, 33, 33, 33, 33, 14, 33,
X 17, 33, 33, 33, 33, 33, 33, 33, 33, 33,
X 33, 33, 33, 33, 33, 33, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 39, 0, 39, 0, 40, 38,
X
X 34, 1, 33, 3, 4, 33, 33, 33, 33, 10,
X 11, 33, 33, 15, 18, 33, 33, 33, 33, 33,
X 33, 33, 33, 33, 33, 33, 30, 33, 33, 0,
X 0, 97, 98, 0, 0, 0, 0, 0, 0, 0,
X 90, 0, 102, 0, 0, 0, 0, 39, 2, 5,
X 33, 33, 33, 33, 13, 33, 33, 21, 33, 33,
X 33, 33, 33, 33, 28, 33, 33, 32, 0, 0,
X 93, 91, 103, 95, 0, 0, 0, 0, 0, 88,
X 0, 33, 33, 9, 12, 33, 20, 22, 23, 24,
X 25, 26, 33, 33, 33, 104, 87, 96, 100, 0,
X
X 92, 0, 0, 33, 7, 33, 27, 33, 33, 89,
X 0, 101, 6, 19, 29, 31, 0, 105, 0, 0,
X 0, 99, 0
X } ;
X
Xstatic const int yy_ec[256] =
X { 0,
X 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
X 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 2, 4, 5, 6, 1, 7, 8, 9, 10,
X 11, 12, 13, 14, 15, 16, 17, 18, 19, 19,
X 19, 19, 19, 19, 19, 19, 19, 20, 21, 22,
X 23, 24, 25, 1, 26, 26, 26, 26, 27, 28,
X 29, 29, 29, 29, 29, 30, 29, 29, 29, 29,
X 29, 29, 29, 29, 31, 29, 29, 32, 29, 29,
X 33, 34, 35, 36, 37, 1, 38, 39, 40, 41,
X
X 42, 43, 44, 45, 46, 29, 47, 48, 49, 50,
X 51, 52, 29, 53, 54, 55, 56, 57, 58, 59,
X 60, 61, 62, 63, 64, 65, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1
X } ;
X
Xstatic const int yy_meta[66] =
X { 0,
X 1, 1, 2, 1, 1, 1, 1, 1, 2, 1,
X 1, 1, 1, 1, 1, 1, 1, 3, 3, 1,
X 1, 1, 1, 1, 1, 3, 3, 3, 4, 4,
X 4, 4, 1, 1, 1, 1, 4, 3, 3, 3,
X 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
X 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
X 4, 1, 1, 1, 1
X } ;
X
Xstatic const short int yy_base[327] =
X { 0,
X 0, 445, 446, 448, 443, 448, 421, 448, 64, 420,
X 59, 408, 448, 448, 418, 55, 448, 56, 51, 60,
X 107, 73, 448, 448, 51, 417, 52, 448, 0, 448,
X 448, 448, 416, 382, 384, 39, 43, 38, 45, 385,
X 58, 384, 392, 85, 373, 382, 380, 385, 448, 64,
X 448, 448, 96, 427, 448, 0, 374, 385, 61, 92,
X 380, 372, 384, 373, 384, 448, 448, 448, 98, 412,
X 448, 448, 448, 448, 448, 448, 126, 448, 448, 143,
X 162, 133, 127, 0, 178, 397, 448, 448, 448, 396,
X 0, 448, 363, 375, 362, 377, 364, 370, 356, 357,
X
X 354, 354, 357, 354, 351, 0, 350, 354, 69, 352,
X 75, 112, 356, 349, 113, 131, 354, 448, 448, 185,
X 448, 345, 355, 118, 356, 343, 353, 149, 342, 353,
X 342, 353, 350, 157, 336, 448, 188, 448, 194, 210,
X 448, 184, 198, 220, 213, 448, 448, 337, 349, 344,
X 332, 176, 346, 344, 340, 332, 338, 341, 0, 327,
X 0, 333, 330, 319, 321, 323, 330, 316, 314, 314,
X 326, 316, 320, 324, 326, 315, 320, 315, 317, 317,
X 312, 306, 306, 313, 313, 302, 304, 309, 306, 295,
X 294, 305, 296, 227, 234, 236, 448, 238, 248, 448,
X
X 241, 0, 298, 0, 0, 289, 297, 286, 293, 0,
X 0, 287, 284, 0, 0, 284, 284, 281, 293, 283,
X 287, 292, 291, 289, 279, 284, 0, 272, 284, 272,
X 274, 448, 448, 280, 269, 266, 277, 277, 265, 261,
X 448, 267, 448, 261, 271, 267, 240, 255, 0, 0,
X 262, 263, 268, 255, 0, 247, 251, 0, 259, 256,
X 255, 239, 248, 250, 0, 240, 242, 0, 232, 244,
X 448, 448, 448, 448, 241, 226, 239, 241, 233, 448,
X 220, 209, 205, 0, 0, 205, 0, 0, 0, 0,
X 0, 0, 198, 193, 185, 448, 448, 448, 448, 185,
X
X 448, 166, 167, 160, 0, 147, 0, 143, 140, 139,
X 105, 448, 0, 0, 0, 0, 97, 448, 86, 58,
X 40, 448, 448, 303, 305, 78
X } ;
X
Xstatic const short int yy_def[327] =
X { 0,
X 323, 1, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 324, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 325, 323,
X 323, 323, 323, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 323, 323,
X 323, 323, 323, 323, 323, 9, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 324, 324,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 326, 323, 323, 323, 323, 323, 323,
X 325, 323, 325, 325, 325, 325, 325, 325, 325, 325,
X
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 326, 323, 323, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X
X 323, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 325, 325, 325, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 325, 325, 325, 325, 325, 325, 325, 325, 325,
X 325, 325, 325, 325, 325, 323, 323, 323, 323, 323,
X
X 323, 323, 323, 325, 325, 325, 325, 325, 325, 323,
X 323, 323, 325, 325, 325, 325, 323, 323, 323, 323,
X 323, 323, 0, 323, 323, 323
X } ;
X
Xstatic const short int yy_nxt[514] =
X { 0,
X 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
X 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
X 24, 25, 26, 27, 28, 29, 29, 29, 29, 29,
X 29, 29, 30, 31, 32, 33, 29, 34, 35, 36,
X 37, 38, 39, 40, 29, 41, 29, 42, 29, 29,
X 29, 29, 43, 44, 45, 46, 47, 48, 29, 29,
X 29, 49, 50, 51, 52, 56, 67, 72, 77, 77,
X 74, 78, 86, 87, 89, 90, 95, 73, 75, 76,
X 145, 68, 79, 96, 98, 100, 118, 101, 80, 97,
X 85, 85, 103, 99, 322, 104, 102, 120, 121, 82,
X
X 106, 57, 83, 83, 58, 59, 136, 107, 124, 60,
X 125, 61, 163, 126, 82, 62, 321, 63, 166, 64,
X 83, 65, 80, 164, 81, 81, 119, 320, 83, 110,
X 111, 70, 127, 82, 128, 167, 83, 83, 84, 112,
X 129, 130, 113, 77, 77, 143, 319, 143, 82, 168,
X 144, 144, 137, 138, 83, 138, 83, 83, 172, 318,
X 139, 139, 83, 179, 169, 84, 173, 137, 138, 140,
X 141, 180, 141, 138, 83, 317, 174, 80, 175, 81,
X 81, 316, 83, 315, 140, 141, 120, 121, 82, 184,
X 141, 142, 142, 80, 191, 85, 85, 192, 185, 314,
X
X 194, 313, 194, 82, 82, 195, 195, 83, 83, 142,
X 312, 139, 139, 142, 142, 144, 144, 142, 311, 82,
X 196, 197, 198, 197, 198, 83, 310, 199, 199, 206,
X 207, 142, 309, 83, 308, 196, 197, 144, 144, 142,
X 307, 197, 201, 201, 195, 195, 306, 200, 247, 200,
X 247, 195, 195, 248, 248, 199, 199, 248, 248, 305,
X 201, 138, 200, 138, 304, 199, 199, 200, 201, 303,
X 201, 201, 248, 248, 302, 141, 138, 141, 301, 300,
X 299, 138, 197, 298, 197, 297, 296, 295, 201, 294,
X 141, 293, 292, 291, 290, 141, 201, 197, 289, 288,
X
X 287, 286, 197, 69, 285, 69, 69, 91, 91, 284,
X 283, 282, 281, 280, 279, 278, 277, 276, 275, 274,
X 273, 272, 271, 270, 269, 268, 267, 266, 265, 264,
X 263, 262, 261, 260, 259, 258, 257, 256, 255, 254,
X 253, 252, 251, 250, 249, 246, 245, 244, 243, 242,
X 241, 240, 239, 238, 237, 236, 235, 234, 233, 232,
X 231, 230, 229, 228, 227, 226, 225, 224, 223, 222,
X 221, 220, 219, 218, 217, 216, 215, 214, 213, 212,
X 211, 210, 209, 208, 205, 204, 203, 202, 193, 190,
X 189, 188, 187, 186, 183, 182, 181, 178, 177, 176,
X
X 171, 170, 165, 162, 161, 160, 159, 158, 157, 156,
X 155, 154, 153, 152, 151, 150, 149, 148, 147, 146,
X 69, 135, 134, 133, 132, 131, 123, 122, 54, 117,
X 116, 115, 114, 109, 108, 105, 94, 93, 92, 88,
X 71, 70, 66, 55, 54, 323, 53, 3, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323
X } ;
X
Xstatic const short int yy_chk[514] =
X { 0,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 9, 11, 16, 19, 19,
X 18, 20, 25, 25, 27, 27, 36, 16, 18, 18,
X 326, 11, 20, 36, 37, 38, 50, 38, 22, 36,
X 22, 22, 39, 37, 321, 39, 38, 53, 53, 22,
X
X 41, 9, 22, 22, 9, 9, 69, 41, 59, 9,
X 59, 9, 109, 59, 22, 9, 320, 9, 111, 9,
X 22, 9, 21, 109, 21, 21, 50, 319, 22, 44,
X 44, 69, 60, 21, 60, 111, 21, 21, 21, 44,
X 60, 60, 44, 77, 77, 82, 317, 82, 21, 112,
X 82, 82, 77, 77, 21, 77, 83, 83, 115, 311,
X 80, 80, 21, 124, 112, 21, 115, 77, 77, 80,
X 80, 124, 80, 77, 83, 310, 116, 81, 116, 81,
X 81, 309, 83, 308, 80, 80, 120, 120, 81, 128,
X 80, 81, 81, 85, 134, 85, 85, 134, 128, 306,
X
X 137, 304, 137, 81, 85, 137, 137, 85, 85, 81,
X 303, 139, 139, 142, 142, 143, 143, 81, 302, 85,
X 139, 139, 140, 139, 140, 85, 300, 140, 140, 152,
X 152, 142, 295, 85, 294, 139, 139, 144, 144, 142,
X 293, 139, 145, 145, 194, 194, 286, 144, 196, 144,
X 196, 195, 195, 196, 196, 198, 198, 247, 247, 283,
X 145, 195, 144, 195, 282, 199, 199, 144, 145, 281,
X 201, 201, 248, 248, 279, 199, 195, 199, 278, 277,
X 276, 195, 248, 275, 248, 270, 269, 267, 201, 266,
X 199, 264, 263, 262, 261, 199, 201, 248, 260, 259,
X
X 257, 256, 248, 324, 254, 324, 324, 325, 325, 253,
X 252, 251, 246, 245, 244, 242, 240, 239, 238, 237,
X 236, 235, 234, 231, 230, 229, 228, 226, 225, 224,
X 223, 222, 221, 220, 219, 218, 217, 216, 213, 212,
X 209, 208, 207, 206, 203, 193, 192, 191, 190, 189,
X 188, 187, 186, 185, 184, 183, 182, 181, 180, 179,
X 178, 177, 176, 175, 174, 173, 172, 171, 170, 169,
X 168, 167, 166, 165, 164, 163, 162, 160, 158, 157,
X 156, 155, 154, 153, 151, 150, 149, 148, 135, 133,
X 132, 131, 130, 129, 127, 126, 125, 123, 122, 117,
X
X 114, 113, 110, 108, 107, 105, 104, 103, 102, 101,
X 100, 99, 98, 97, 96, 95, 94, 93, 90, 86,
X 70, 65, 64, 63, 62, 61, 58, 57, 54, 48,
X 47, 46, 45, 43, 42, 40, 35, 34, 33, 26,
X 15, 12, 10, 7, 5, 3, 2, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X
X 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
X 323, 323, 323
X } ;
X
Xstatic yy_state_type yy_last_accepting_state;
Xstatic char *yy_last_accepting_cpos;
X
X/* The intent behind this definition is that it'll catch
X * any uses of REJECT which flex missed.
X */
X#define REJECT reject_used_but_not_detected
X#define yymore() yymore_used_but_not_detected
X#define YY_MORE_ADJ 0
Xchar *yytext;
X# line 1 "scan.l"
X# line 12 "scan.l"
X
X/* $Id: scan.l,v 1.12 1994/10/11 15:45:22 lott Exp lott $


X *
X * csize, a program to measure the size of C source files.
X * Copyright (C) 1994 Christopher Lott <lo...@informatik.uni-kl.de>
X * FB Informatik - Bau 57 / Universitaet KL / D--67653 Kaiserslautern / Germany
X *
X * This program is free software; you can redistribute it and/or modify
X * it under the terms of the GNU General Public License as published by
X * the Free Software Foundation. See the file COPYING for more details.
X *

X * This file holds the source used by flex to generate the scanner for C.
X * SEE THE FILE "INSTALL" FOR THE REQUIRED FLEX VERSION. Sorry to
X * shout, but different versions of flex exhibit different behavior.
X *
X * Why flex? Because lex complains about this file as follows:
X * "scan.l", line xxx: (Error) Too many right contexts
X * If you simply remove the first token ("auto"), then lex dumps core
X * on my machine. Neither behavior is acceptable and I refuse to code
X * around bugs in lex when flex is available, reliable, and free.
X *
X */
X
X#include <stdio.h>
X#include <scan.h>
X#include <csize.h>
X
X/* variables supplied by flex

X *
X */
X

Xextern int yyleng;
Xextern char *yytext;
Xextern FILE *yyin;
X
X/* global variables
X * variables beginning with C_ are referenced in main and
X * Echo is set in main; all appear in csize.h

X *
X */
X

Xint Echo,
X Lex_errors;
X
Xlong C_newlines, /* incremented at the *end* of a line */

X C_blank_lines,
X C_lines_w_comments,

X/* Macros after this point can all be overridden by user definitions in
X * section 1.
X */
X
X#ifdef YY_MALLOC_DECL
XYY_MALLOC_DECL
X#else
X#if __STDC__
X#ifndef __cplusplus
X#include <stdlib.h>
X#endif
X#else
X/* Just try to get by without declaring the routines. This will fail
X * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
X * or sizeof(void*) != sizeof(int).
X */
X#endif
X#endif
X
X/* Amount of stuff to slurp up with each read. */
X#ifndef YY_READ_BUF_SIZE
X#define YY_READ_BUF_SIZE 8192
X#endif
X
X/* Copy whatever the last rule matched to the standard output. */
X
X#ifndef ECHO
X/* This used to be an fputs(), but since the string might contain NUL's,
X * we now use fwrite().
X */
X#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
X#endif
X
X/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
X * is returned in "result".
X */
X#ifndef YY_INPUT
X#define YY_INPUT(buf,result,max_size) \
X if ( yy_current_buffer->yy_is_interactive ) \
X { \
X int c = getc( yyin ); \
X result = c == EOF ? 0 : 1; \
X buf[0] = (char) c; \
X } \
X else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
X && ferror( yyin ) ) \
X YY_FATAL_ERROR( "input in flex scanner failed" );
X#endif
X
X/* No semi-colon after return; correct usage is to write "yyterminate();" -
X * we don't want an extra ';' after the "return" because that will cause
X * some compilers to complain about unreachable statements.
X */
X#ifndef yyterminate
X#define yyterminate() return YY_NULL
X#endif
X
X/* Number of entries by which start-condition stack grows. */
X#ifndef YY_START_STACK_INCR
X#define YY_START_STACK_INCR 25
X#endif
X
X/* Report a fatal error. */
X#ifndef YY_FATAL_ERROR
X#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
X#endif
X
X/* Default declaration of generated scanner - a define so the user can
X * easily add parameters.
X */
X#ifndef YY_DECL
X#define YY_DECL int yylex YY_PROTO(( void ))
X#endif
X
X/* Code executed at the beginning of each rule, after yytext and yyleng
X * have been set up.
X */
X#ifndef YY_USER_ACTION
X#define YY_USER_ACTION
X#endif
X
X/* Code executed at the end of each rule. */
X#ifndef YY_BREAK
X#define YY_BREAK break;
X#endif
X
XYY_DECL
X {
X register yy_state_type yy_current_state;
X register char *yy_cp, *yy_bp;
X register int yy_act;
X
X# line 92 "scan.l"
X
X
X
X if ( yy_init )
X {
X#ifdef YY_USER_INIT
X YY_USER_INIT;
X#endif
X
X if ( ! yy_start )
X yy_start = 1; /* first start state */
X
X if ( ! yyin )
X yyin = stdin;
X
X if ( ! yyout )
X yyout = stdout;
X
X if ( yy_current_buffer )
X yy_init_buffer( yy_current_buffer, yyin );
X else
X yy_current_buffer =
X yy_create_buffer( yyin, YY_BUF_SIZE );
X
X yy_load_buffer_state();
X
X yy_init = 0;
X }
X
X while ( 1 ) /* loops until end-of-file is reached */
X {
X yy_cp = yy_c_buf_p;
X
X /* Support of yytext. */
X *yy_cp = yy_hold_char;
X
X /* yy_bp points to the position in yy_ch_buf of the start of
X * the current run.
X */
X yy_bp = yy_cp;
X
X yy_current_state = yy_start;
X if ( yy_bp[-1] == '\n' )
X ++yy_current_state;
Xyy_match:
X do
X {
X register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
X if ( yy_accept[yy_current_state] )
X {
X yy_last_accepting_state = yy_current_state;
X yy_last_accepting_cpos = yy_cp;
X }
X while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
X {
X yy_current_state = (int) yy_def[yy_current_state];
X if ( yy_current_state >= 324 )
X yy_c = yy_meta[(unsigned int) yy_c];
X }
X yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
X ++yy_cp;
X }
X while ( yy_base[yy_current_state] != 448 );
X
Xyy_find_action:
X yy_act = yy_accept[yy_current_state];
X
X YY_DO_BEFORE_ACTION;
X
X
Xdo_action: /* This label is used only to access EOF actions. */
X
X
X switch ( yy_act )
X { /* beginning of action switch */
X case 0: /* must back up */
X /* undo the effects of YY_DO_BEFORE_ACTION */
X *yy_cp = yy_hold_char;
X yy_cp = yy_last_accepting_cpos;
X yy_current_state = yy_last_accepting_state;
X goto yy_find_action;
X
Xcase 1:
XYY_USER_ACTION
X# line 94 "scan.l"
X{ count(); return(AUTO); }
X YY_BREAK
Xcase 2:
XYY_USER_ACTION
X# line 95 "scan.l"
X{ count(); return(BREAK); }
X YY_BREAK
Xcase 3:
XYY_USER_ACTION
X# line 96 "scan.l"
X{ count(); return(CASE); }
X YY_BREAK
Xcase 4:
XYY_USER_ACTION
X# line 97 "scan.l"
X{ count(); return(CHAR); }
X YY_BREAK
Xcase 5:
XYY_USER_ACTION
X# line 98 "scan.l"
X{ count(); return(CONST); }
X YY_BREAK
Xcase 6:
XYY_USER_ACTION
X# line 99 "scan.l"
X{ count(); return(CONTINUE); }
X YY_BREAK
Xcase 7:
XYY_USER_ACTION
X# line 100 "scan.l"
X{ count(); return(DEFAULT); }
X YY_BREAK
Xcase 8:
XYY_USER_ACTION
X# line 101 "scan.l"
X{ count(); return(DO); }
X YY_BREAK
Xcase 9:
XYY_USER_ACTION
X# line 102 "scan.l"
X{ count(); return(DOUBLE); }
X YY_BREAK
Xcase 10:
XYY_USER_ACTION
X# line 103 "scan.l"
X{ count(); return(ELSE); }
X YY_BREAK
Xcase 11:
XYY_USER_ACTION
X# line 104 "scan.l"
X{ count(); return(ENUM); }
X YY_BREAK
Xcase 12:
XYY_USER_ACTION
X# line 105 "scan.l"
X{ count(); return(EXTERN); }
X YY_BREAK
Xcase 13:
XYY_USER_ACTION
X# line 106 "scan.l"
X{ count(); return(FLOAT); }
X YY_BREAK
Xcase 14:
XYY_USER_ACTION
X# line 107 "scan.l"
X{ count(); return(FOR); }
X YY_BREAK
Xcase 15:
XYY_USER_ACTION
X# line 108 "scan.l"
X{ count(); return(GOTO); }
X YY_BREAK
Xcase 16:
XYY_USER_ACTION
X# line 109 "scan.l"
X{ count(); return(IF); }
X YY_BREAK
Xcase 17:
XYY_USER_ACTION
X# line 110 "scan.l"
X{ count(); return(INT); }
X YY_BREAK
Xcase 18:
XYY_USER_ACTION
X# line 111 "scan.l"
X{ count(); return(LONG); }
X YY_BREAK
Xcase 19:
XYY_USER_ACTION
X# line 112 "scan.l"
X{ count(); return(REGISTER); }
X YY_BREAK
Xcase 20:
XYY_USER_ACTION
X# line 113 "scan.l"
X{ count(); return(RETURN); }
X YY_BREAK
Xcase 21:
XYY_USER_ACTION
X# line 114 "scan.l"
X{ count(); return(SHORT); }
X YY_BREAK
Xcase 22:
XYY_USER_ACTION
X# line 115 "scan.l"
X{ count(); return(SIGNED); }
X YY_BREAK
Xcase 23:
XYY_USER_ACTION
X# line 116 "scan.l"
X{ count(); return(SIZEOF); }
X YY_BREAK
Xcase 24:
XYY_USER_ACTION
X# line 117 "scan.l"
X{ count(); return(STATIC); }
X YY_BREAK
Xcase 25:
XYY_USER_ACTION
X# line 118 "scan.l"
X{ count(); return(STRUCT); }
X YY_BREAK
Xcase 26:
XYY_USER_ACTION
X# line 119 "scan.l"
X{ count(); return(SWITCH); }
X YY_BREAK
Xcase 27:
XYY_USER_ACTION
X# line 120 "scan.l"
X{ count(); return(TYPEDEF); }
X YY_BREAK
Xcase 28:
XYY_USER_ACTION
X# line 121 "scan.l"
X{ count(); return(UNION); }
X YY_BREAK
Xcase 29:
XYY_USER_ACTION
X# line 122 "scan.l"
X{ count(); return(UNSIGNED); }
X YY_BREAK
Xcase 30:
XYY_USER_ACTION
X# line 123 "scan.l"
X{ count(); return(VOID); }
X YY_BREAK
Xcase 31:
XYY_USER_ACTION
X# line 124 "scan.l"
X{ count(); return(VOLATILE); }
X YY_BREAK
Xcase 32:
XYY_USER_ACTION
X# line 125 "scan.l"
X{ count(); return(WHILE); }
X YY_BREAK
Xcase 33:
XYY_USER_ACTION
X# line 127 "scan.l"
X{ count(); return(check_type()); }
X YY_BREAK
Xcase 34:
XYY_USER_ACTION
X# line 129 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 35:
XYY_USER_ACTION
X# line 130 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 36:
XYY_USER_ACTION
X# line 131 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 37:
XYY_USER_ACTION
X# line 132 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 38:
XYY_USER_ACTION
X# line 134 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 39:
XYY_USER_ACTION
X# line 135 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 40:
XYY_USER_ACTION
X# line 136 "scan.l"
X{ count(); return(CONSTANT); }
X YY_BREAK
Xcase 41:
XYY_USER_ACTION
X# line 138 "scan.l"
X{ count(); return(RIGHT_ASSIGN); }
X YY_BREAK
Xcase 42:
XYY_USER_ACTION
X# line 139 "scan.l"
X{ count(); return(LEFT_ASSIGN); }
X YY_BREAK
Xcase 43:
XYY_USER_ACTION
X# line 140 "scan.l"
X{ count(); return(ADD_ASSIGN); }
X YY_BREAK
Xcase 44:
XYY_USER_ACTION
X# line 141 "scan.l"
X{ count(); return(SUB_ASSIGN); }
X YY_BREAK
Xcase 45:
XYY_USER_ACTION
X# line 142 "scan.l"
X{ count(); return(MUL_ASSIGN); }
X YY_BREAK
Xcase 46:
XYY_USER_ACTION
X# line 143 "scan.l"
X{ count(); return(DIV_ASSIGN); }
X YY_BREAK
Xcase 47:
XYY_USER_ACTION
X# line 144 "scan.l"
X{ count(); return(MOD_ASSIGN); }
X YY_BREAK
Xcase 48:
XYY_USER_ACTION
X# line 145 "scan.l"
X{ count(); return(AND_ASSIGN); }
X YY_BREAK
Xcase 49:
XYY_USER_ACTION
X# line 146 "scan.l"
X{ count(); return(XOR_ASSIGN); }
X YY_BREAK
Xcase 50:
XYY_USER_ACTION
X# line 147 "scan.l"
X{ count(); return(OR_ASSIGN); }
X YY_BREAK
Xcase 51:
XYY_USER_ACTION
X# line 148 "scan.l"
X{ count(); return(RIGHT_OP); }
X YY_BREAK
Xcase 52:
XYY_USER_ACTION
X# line 149 "scan.l"
X{ count(); return(LEFT_OP); }
X YY_BREAK
Xcase 53:
XYY_USER_ACTION
X# line 150 "scan.l"
X{ count(); return(INC_OP); }
X YY_BREAK
Xcase 54:
XYY_USER_ACTION
X# line 151 "scan.l"
X{ count(); return(DEC_OP); }
X YY_BREAK
Xcase 55:
XYY_USER_ACTION
X# line 152 "scan.l"
X{ count(); return(PTR_OP); }
X YY_BREAK
Xcase 56:
XYY_USER_ACTION
X# line 153 "scan.l"
X{ count(); return(AND_OP); }
X YY_BREAK
Xcase 57:
XYY_USER_ACTION
X# line 154 "scan.l"
X{ count(); return(OR_OP); }
X YY_BREAK
Xcase 58:
XYY_USER_ACTION
X# line 155 "scan.l"
X{ count(); return(LE_OP); }
X YY_BREAK
Xcase 59:
XYY_USER_ACTION
X# line 156 "scan.l"
X{ count(); return(GE_OP); }
X YY_BREAK
Xcase 60:
XYY_USER_ACTION
X# line 157 "scan.l"
X{ count(); return(EQ_OP); }
X YY_BREAK
Xcase 61:
XYY_USER_ACTION
X# line 158 "scan.l"
X{ count(); return(NE_OP); }
X YY_BREAK
Xcase 62:
XYY_USER_ACTION
X# line 159 "scan.l"


X{ count(); semicolon(); return(';'); }

X YY_BREAK
Xcase 63:
XYY_USER_ACTION
X# line 160 "scan.l"
X{ count(); return('{'); }
X YY_BREAK
Xcase 64:
XYY_USER_ACTION
X# line 161 "scan.l"
X{ count(); return('}'); }
X YY_BREAK
Xcase 65:
XYY_USER_ACTION
X# line 162 "scan.l"
X{ count(); return(','); }
X YY_BREAK
Xcase 66:
XYY_USER_ACTION
X# line 163 "scan.l"
X{ count(); return(':'); }
X YY_BREAK
Xcase 67:
XYY_USER_ACTION
X# line 164 "scan.l"
X{ count(); return('='); }
X YY_BREAK
Xcase 68:
XYY_USER_ACTION
X# line 165 "scan.l"
X{ count(); return('('); }
X YY_BREAK
Xcase 69:
XYY_USER_ACTION
X# line 166 "scan.l"
X{ count(); return(')'); }
X YY_BREAK
Xcase 70:
XYY_USER_ACTION
X# line 167 "scan.l"
X{ count(); return('['); }
X YY_BREAK
Xcase 71:
XYY_USER_ACTION
X# line 168 "scan.l"
X{ count(); return(']'); }
X YY_BREAK
Xcase 72:
XYY_USER_ACTION
X# line 169 "scan.l"
X{ count(); return('.'); }
X YY_BREAK
Xcase 73:
XYY_USER_ACTION
X# line 170 "scan.l"
X{ count(); return('&'); }
X YY_BREAK
Xcase 74:
XYY_USER_ACTION
X# line 171 "scan.l"
X{ count(); return('!'); }
X YY_BREAK
Xcase 75:
XYY_USER_ACTION
X# line 172 "scan.l"
X{ count(); return('~'); }
X YY_BREAK
Xcase 76:
XYY_USER_ACTION
X# line 173 "scan.l"
X{ count(); return('-'); }
X YY_BREAK
Xcase 77:
XYY_USER_ACTION
X# line 174 "scan.l"
X{ count(); return('+'); }
X YY_BREAK
Xcase 78:
XYY_USER_ACTION
X# line 175 "scan.l"
X{ count(); return('*'); }
X YY_BREAK
Xcase 79:
XYY_USER_ACTION
X# line 176 "scan.l"
X{ count(); return('/'); }
X YY_BREAK
Xcase 80:
XYY_USER_ACTION
X# line 177 "scan.l"
X{ count(); return('%'); }
X YY_BREAK
Xcase 81:
XYY_USER_ACTION
X# line 178 "scan.l"
X{ count(); return('<'); }
X YY_BREAK
Xcase 82:
XYY_USER_ACTION
X# line 179 "scan.l"
X{ count(); return('>'); }
X YY_BREAK
Xcase 83:
XYY_USER_ACTION
X# line 180 "scan.l"
X{ count(); return('^'); }
X YY_BREAK
Xcase 84:
XYY_USER_ACTION
X# line 181 "scan.l"
X{ count(); return('|'); }
X YY_BREAK
Xcase 85:
XYY_USER_ACTION
X# line 182 "scan.l"
X{ count(); return('?'); }
X YY_BREAK
Xcase 86:
XYY_USER_ACTION
X# line 184 "scan.l"
X{ count(); string_lit(); return(STRING_LITERAL); }
X YY_BREAK
Xcase 87:
XYY_USER_ACTION
X# line 186 "scan.l"
X{ count(); pp_dir(); /* from K&R 2/e p. 239 */ }
X YY_BREAK
Xcase 88:
XYY_USER_ACTION
X# line 187 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 89:
XYY_USER_ACTION
X# line 188 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 90:
XYY_USER_ACTION
X# line 189 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 91:
XYY_USER_ACTION
X# line 190 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 92:
XYY_USER_ACTION
X# line 191 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 93:
XYY_USER_ACTION
X# line 193 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 94:
XYY_USER_ACTION
X# line 194 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 95:
XYY_USER_ACTION
X# line 195 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 96:
XYY_USER_ACTION
X# line 196 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 97:
XYY_USER_ACTION
X# line 197 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 98:
XYY_USER_ACTION
X# line 198 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 99:
XYY_USER_ACTION
X# line 200 "scan.l"
X{ count(); pp_dir(); /* from GCC's cccp.c */ }
X YY_BREAK
Xcase 100:
XYY_USER_ACTION
X# line 201 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 101:
XYY_USER_ACTION
X# line 202 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 102:
XYY_USER_ACTION
X# line 203 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 103:
XYY_USER_ACTION
X# line 204 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 104:
XYY_USER_ACTION
X# line 205 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 105:
XYY_USER_ACTION
X# line 206 "scan.l"
X{ count(); pp_dir(); }
X YY_BREAK
Xcase 106:
XYY_USER_ACTION
X# line 208 "scan.l"


X{ count(); /* backslash processing is weak */ }

X YY_BREAK
Xcase 107:
XYY_USER_ACTION
X# line 210 "scan.l"
X{ comment(1); }
X YY_BREAK
Xcase 108:
XYY_USER_ACTION
X# line 211 "scan.l"
X{ count_ws(); }
X YY_BREAK
Xcase 109:
X*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
Xyy_c_buf_p = yy_cp -= 1;
XYY_DO_BEFORE_ACTION; /* set up yytext again */
XYY_USER_ACTION
X# line 212 "scan.l"
X{ whitespace_line(); }
X YY_BREAK
Xcase 110:
XYY_USER_ACTION
X# line 213 "scan.l"
X{ newline(); }
X YY_BREAK
Xcase 111:
XYY_USER_ACTION
X# line 214 "scan.l"
X{ bad_char(); }
X YY_BREAK
Xcase 112:
XYY_USER_ACTION
X# line 216 "scan.l"
XECHO;
X YY_BREAK
Xcase YY_STATE_EOF(INITIAL):
X yyterminate();
X
X case YY_END_OF_BUFFER:
X {
X /* Amount of text matched not including the EOB char. */
X int yy_amount_of_matched_text = yy_cp - yytext_ptr - 1;
X
X /* Undo the effects of YY_DO_BEFORE_ACTION. */
X *yy_cp = yy_hold_char;
X
X if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
X {
X /* We're scanning a new file or input source. It's
X * possible that this happened because the user
X * just pointed yyin at a new source and called
X * yylex(). If so, then we have to assure
X * consistency between yy_current_buffer and our
X * globals. Here is the right place to do so, because
X * this is the first action (other than possibly a
X * back-up) that will match for the new input source.
X */
X yy_n_chars = yy_current_buffer->yy_n_chars;
X yy_current_buffer->yy_input_file = yyin;
X yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
X }
X
X /* Note that here we test for yy_c_buf_p "<=" to the position
X * of the first EOB in the buffer, since yy_c_buf_p will
X * already have been incremented past the NUL character
X * (since all states make transitions on EOB to the
X * end-of-buffer state). Contrast this with the test
X * in input().
X */
X if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
X { /* This was really a NUL. */
X yy_state_type yy_next_state;
X
X yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
X
X yy_current_state = yy_get_previous_state();
X
X /* Okay, we're now positioned to make the NUL
X * transition. We couldn't have
X * yy_get_previous_state() go ahead and do it
X * for us because it doesn't know how to deal
X * with the possibility of jamming (and we don't
X * want to build jamming into it because then it
X * will run more slowly).
X */
X
X yy_next_state = yy_try_NUL_trans( yy_current_state );
X
X yy_bp = yytext_ptr + YY_MORE_ADJ;
X
X if ( yy_next_state )
X {
X /* Consume the NUL. */
X yy_cp = ++yy_c_buf_p;
X yy_current_state = yy_next_state;
X goto yy_match;


X }
X
X else
X {

X yy_cp = yy_c_buf_p;
X goto yy_find_action;
X }
X }
X
X else switch ( yy_get_next_buffer() )
X {
X case EOB_ACT_END_OF_FILE:
X {
X yy_did_buffer_switch_on_eof = 0;
X
X if ( yywrap() )
X {
X /* Note: because we've taken care in
X * yy_get_next_buffer() to have set up
X * yytext, we can now set up
X * yy_c_buf_p so that if some total
X * hoser (like flex itself) wants to
X * call the scanner after we return the
X * YY_NULL, it'll still work - another
X * YY_NULL will get returned.
X */
X yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
X
X yy_act = YY_STATE_EOF(YY_START);
X goto do_action;


X }
X
X else
X {

X if ( ! yy_did_buffer_switch_on_eof )
X YY_NEW_FILE;
X }
X break;
X }
X
X case EOB_ACT_CONTINUE_SCAN:
X yy_c_buf_p =
X yytext_ptr + yy_amount_of_matched_text;
X
X yy_current_state = yy_get_previous_state();
X
X yy_cp = yy_c_buf_p;
X yy_bp = yytext_ptr + YY_MORE_ADJ;
X goto yy_match;
X
X case EOB_ACT_LAST_MATCH:
X yy_c_buf_p =
X &yy_current_buffer->yy_ch_buf[yy_n_chars];
X
X yy_current_state = yy_get_previous_state();
X
X yy_cp = yy_c_buf_p;
X yy_bp = yytext_ptr + YY_MORE_ADJ;
X goto yy_find_action;
X }
X break;
X }
X
X default:
X YY_FATAL_ERROR(
X "fatal flex scanner internal error--no action found" );
X } /* end of action switch */
X } /* end of scanning one token */
X } /* end of yylex */
X
X
X/* yy_get_next_buffer - try to read in a new buffer
X *
X * Returns a code representing an action:
X * EOB_ACT_LAST_MATCH -
X * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
X * EOB_ACT_END_OF_FILE - end of file
X */
X
Xstatic int yy_get_next_buffer()
X {
X register char *dest = yy_current_buffer->yy_ch_buf;
X register char *source = yytext_ptr - 1; /* copy prev. char, too */
X register int number_to_move, i;
X int ret_val;
X
X if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
X YY_FATAL_ERROR(
X "fatal flex scanner internal error--end of buffer missed" );
X
X if ( yy_current_buffer->yy_fill_buffer == 0 )
X { /* Don't try to fill the buffer, so this is an EOF. */
X if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
X {
X /* We matched a singled characater, the EOB, so
X * treat this as a final EOF.
X */
X return EOB_ACT_END_OF_FILE;


X }
X
X else
X {

X /* We matched some text prior to the EOB, first
X * process it.
X */
X return EOB_ACT_LAST_MATCH;
X }
X }
X
X /* Try to read more data. */
X
X /* First move last chars to start of buffer. */
X number_to_move = yy_c_buf_p - yytext_ptr;
X
X for ( i = 0; i < number_to_move; ++i )
X *(dest++) = *(source++);
X
X if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
X /* don't do the read, it's not guaranteed to return an EOF,
X * just force an EOF
X */
X yy_n_chars = 0;
X
X else
X {
X int num_to_read =
X yy_current_buffer->yy_buf_size - number_to_move - 1;
X
X while ( num_to_read <= 0 )
X { /* Not enough room in the buffer - grow it. */
X#ifdef YY_USES_REJECT
X YY_FATAL_ERROR(
X"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
X#else
X
X /* just a shorter name for the current buffer */
X YY_BUFFER_STATE b = yy_current_buffer;
X
X int yy_c_buf_p_offset = yy_c_buf_p - b->yy_ch_buf;
X
X b->yy_buf_size *= 2;
X b->yy_ch_buf = (char *)
X yy_flex_realloc( (void *) b->yy_ch_buf,
X b->yy_buf_size );
X
X if ( ! b->yy_ch_buf )
X YY_FATAL_ERROR(
X "fatal error - scanner input buffer overflow" );
X
X yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
X
X num_to_read = yy_current_buffer->yy_buf_size -
X number_to_move - 1;
X#endif
X }
X
X if ( num_to_read > YY_READ_BUF_SIZE )
X num_to_read = YY_READ_BUF_SIZE;
X
X /* Read in more data. */
X YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
X yy_n_chars, num_to_read );
X }
X
X if ( yy_n_chars == 0 )
X {
X if ( number_to_move - YY_MORE_ADJ == 1 )
X {
X ret_val = EOB_ACT_END_OF_FILE;
X yyrestart( yyin );


X }
X
X else
X {

X ret_val = EOB_ACT_LAST_MATCH;
X yy_current_buffer->yy_buffer_status =
X YY_BUFFER_EOF_PENDING;
X }
X }
X
X else
X ret_val = EOB_ACT_CONTINUE_SCAN;
X
X yy_n_chars += number_to_move;
X yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
X yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
X
X /* yytext begins at the second character in yy_ch_buf; the first
X * character is the one which preceded it before reading in the latest
X * buffer; it needs to be kept around in case it's a newline, so
X * yy_get_previous_state() will have with '^' rules active.
X */
X
X yytext_ptr = &yy_current_buffer->yy_ch_buf[1];
X
X return ret_val;
X }
X
X
X/* yy_get_previous_state - get the state just before the EOB char was reached */
X
Xstatic yy_state_type yy_get_previous_state()
X {
X register yy_state_type yy_current_state;
X register char *yy_cp;
X
X register char *yy_bp = yytext_ptr;
X
X yy_current_state = yy_start;
X if ( yy_bp[-1] == '\n' )
X ++yy_current_state;
X
X for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
X {
X register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
X if ( yy_accept[yy_current_state] )
X {
X yy_last_accepting_state = yy_current_state;
X yy_last_accepting_cpos = yy_cp;
X }
X while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
X {
X yy_current_state = (int) yy_def[yy_current_state];
X if ( yy_current_state >= 324 )
X yy_c = yy_meta[(unsigned int) yy_c];
X }
X yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
X }
X
X return yy_current_state;
X }
X
X
X/* yy_try_NUL_trans - try to make a transition on the NUL character
X *
X * synopsis
X * next_state = yy_try_NUL_trans( current_state );
X */
X
X#ifdef YY_USE_PROTOS
Xstatic yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
X#else
Xstatic yy_state_type yy_try_NUL_trans( yy_current_state )
Xyy_state_type yy_current_state;
X#endif
X {
X register int yy_is_jam;
X register char *yy_cp = yy_c_buf_p;
X
X register YY_CHAR yy_c = 1;
X if ( yy_accept[yy_current_state] )
X {
X yy_last_accepting_state = yy_current_state;
X yy_last_accepting_cpos = yy_cp;
X }
X while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
X {
X yy_current_state = (int) yy_def[yy_current_state];
X if ( yy_current_state >= 324 )
X yy_c = yy_meta[(unsigned int) yy_c];
X }
X yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
X yy_is_jam = (yy_current_state == 323);
X
X return yy_is_jam ? 0 : yy_current_state;
X }
X
X
X#ifdef YY_USE_PROTOS
Xstatic void yyunput( int c, register char *yy_bp )
X#else
Xstatic void yyunput( c, yy_bp )
Xint c;
Xregister char *yy_bp;
X#endif
X {
X register char *yy_cp = yy_c_buf_p;
X
X /* undo effects of setting up yytext */
X *yy_cp = yy_hold_char;
X
X if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
X { /* need to shift things up to make room */
X /* +2 for EOB chars. */
X register int number_to_move = yy_n_chars + 2;
X register char *dest = &yy_current_buffer->yy_ch_buf[
X yy_current_buffer->yy_buf_size + 2];
X register char *source =
X &yy_current_buffer->yy_ch_buf[number_to_move];
X
X while ( source > yy_current_buffer->yy_ch_buf )
X *--dest = *--source;
X
X yy_cp += dest - source;
X yy_bp += dest - source;
X yy_n_chars = yy_current_buffer->yy_buf_size;
X
X if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
X YY_FATAL_ERROR( "flex scanner push-back overflow" );
X }
X
X if ( yy_cp > yy_bp && yy_cp[-1] == '\n' )
X yy_cp[-2] = '\n';
X
X *--yy_cp = (char) c;
X
X
X /* Note: the formal parameter *must* be called "yy_bp" for this
X * macro to now work correctly.
X */
X YY_DO_BEFORE_ACTION; /* set up yytext again */
X }
X
X
X#ifdef __cplusplus
Xstatic int yyinput()
X#else
Xstatic int input()
X#endif
X {
X int c;
X
X *yy_c_buf_p = yy_hold_char;
X
X if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
X {
X /* yy_c_buf_p now points to the character we want to return.
X * If this occurs *before* the EOB characters, then it's a
X * valid NUL; if not, then we've hit the end of the buffer.
X */
X if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
X /* This was really a NUL. */
X *yy_c_buf_p = '\0';
X
X else
X { /* need more input */
X yytext_ptr = yy_c_buf_p;
X ++yy_c_buf_p;
X
X switch ( yy_get_next_buffer() )
X {
X case EOB_ACT_END_OF_FILE:
X {
X if ( yywrap() )
X {
X yy_c_buf_p =
X yytext_ptr + YY_MORE_ADJ;
X return EOF;
X }
X
X YY_NEW_FILE;
X#ifdef __cplusplus
X return yyinput();
X#else
X return input();
X#endif
X }
X
X case EOB_ACT_CONTINUE_SCAN:
X yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
X break;
X
X case EOB_ACT_LAST_MATCH:
X#ifdef __cplusplus
X YY_FATAL_ERROR(
X "unexpected last match in yyinput()" );
X#else
X YY_FATAL_ERROR(
X "unexpected last match in input()" );
X#endif
X }
X }
X }
X
X c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
X *yy_c_buf_p = '\0'; /* preserve yytext */
X yy_hold_char = *++yy_c_buf_p;
X
X return c;
X }
X
X
X#ifdef YY_USE_PROTOS
Xvoid yyrestart( FILE *input_file )
X#else
Xvoid yyrestart( input_file )
XFILE *input_file;
X#endif
X {
X if ( ! yy_current_buffer )
X yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
X
X yy_init_buffer( yy_current_buffer, input_file );
X yy_load_buffer_state();
X }
X
X
X#ifdef YY_USE_PROTOS
Xvoid yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
X#else
Xvoid yy_switch_to_buffer( new_buffer )
XYY_BUFFER_STATE new_buffer;
X#endif
X {
X if ( yy_current_buffer == new_buffer )
X return;
X
X if ( yy_current_buffer )
X {
X /* Flush out information for old buffer. */
X *yy_c_buf_p = yy_hold_char;
X yy_current_buffer->yy_buf_pos = yy_c_buf_p;
X yy_current_buffer->yy_n_chars = yy_n_chars;
X }
X
X yy_current_buffer = new_buffer;
X yy_load_buffer_state();
X
X /* We don't actually know whether we did this switch during
X * EOF (yywrap()) processing, but the only time this flag
X * is looked at is after yywrap() is called, so it's safe
X * to go ahead and always set it.
X */
X yy_did_buffer_switch_on_eof = 1;
X }
X
X
X#ifdef YY_USE_PROTOS
Xvoid yy_load_buffer_state( void )
X#else
Xvoid yy_load_buffer_state()
X#endif
X {
X yy_n_chars = yy_current_buffer->yy_n_chars;
X yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
X yyin = yy_current_buffer->yy_input_file;
X yy_hold_char = *yy_c_buf_p;
X }
X
X
X#ifdef YY_USE_PROTOS
XYY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
X#else
XYY_BUFFER_STATE yy_create_buffer( file, size )
XFILE *file;
Xint size;
X#endif
X {
X YY_BUFFER_STATE b;
X
X b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
X
X if ( ! b )
X YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
X
X b->yy_buf_size = size;
X
X /* yy_ch_buf has to be 2 characters longer than the size given because
X * we need to put in 2 end-of-buffer characters.
X */
X b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
X
X if ( ! b->yy_ch_buf )
X YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
X
X yy_init_buffer( b, file );
X
X return b;
X }
X
X
X#ifdef YY_USE_PROTOS
Xvoid yy_delete_buffer( YY_BUFFER_STATE b )
X#else
Xvoid yy_delete_buffer( b )
XYY_BUFFER_STATE b;
X#endif
X {
X if ( b == yy_current_buffer )
X yy_current_buffer = (YY_BUFFER_STATE) 0;
X
X yy_flex_free( (void *) b->yy_ch_buf );
X yy_flex_free( (void *) b );
X }
X
X
X#ifdef YY_USE_PROTOS
Xvoid yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
X#else
Xvoid yy_init_buffer( b, file )
XYY_BUFFER_STATE b;
XFILE *file;
X#endif
X {
X b->yy_input_file = file;
X
X /* We put in the '\n' and start reading from [1] so that an
X * initial match-at-newline will be true.
X */
X
X b->yy_ch_buf[0] = '\n';
X b->yy_n_chars = 1;
X
X /* We always need two end-of-buffer characters. The first causes
X * a transition to the end-of-buffer state. The second causes
X * a jam in that state.
X */
X b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
X b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR;
X
X b->yy_buf_pos = &b->yy_ch_buf[1];
X
X b->yy_is_interactive = file ? isatty( fileno(file) ) : 0;
X
X b->yy_fill_buffer = 1;
X
X b->yy_buffer_status = YY_BUFFER_NEW;
X }
X
X
X#ifdef YY_USE_PROTOS
Xstatic void yy_push_state( int new_state )
X#else
Xstatic void yy_push_state( new_state )
Xint new_state;
X#endif
X {
X if ( yy_start_stack_ptr >= yy_start_stack_depth )
X {
X int new_size;
X
X yy_start_stack_depth += YY_START_STACK_INCR;
X new_size = yy_start_stack_depth * sizeof( int );
X
X if ( ! yy_start_stack )
X yy_start_stack = (int *) yy_flex_alloc( new_size );
X
X else
X yy_start_stack = (int *) yy_flex_realloc(
X (void *) yy_start_stack, new_size );
X
X if ( ! yy_start_stack )
X YY_FATAL_ERROR(
X "out of memory expanding start-condition stack" );
X }
X
X yy_start_stack[yy_start_stack_ptr++] = YY_START;
X
X BEGIN(new_state);
X }
X
X
Xstatic void yy_pop_state()
X {
X if ( --yy_start_stack_ptr < 0 )
X YY_FATAL_ERROR( "start-condition stack underflow" );
X
X BEGIN(yy_start_stack[yy_start_stack_ptr]);
X }
X
X
Xstatic int yy_top_state()
X {
X return yy_start_stack[yy_start_stack_ptr - 1];
X }
X
X
X#ifdef YY_USE_PROTOS
Xstatic void yy_fatal_error( const char msg[] )
X#else
Xstatic void yy_fatal_error( msg )
Xchar msg[];
X#endif
X {
X (void) fprintf( stderr, "%s\n", msg );
X exit( 1 );
X }
X
X
X
X/* Redefine yyless() so it works in section 3 code. */
X
X#undef yyless
X#define yyless(n) \
X do \
X { \
X /* Undo effects of setting up yytext. */ \
X yytext[yyleng] = yy_hold_char; \
X yy_c_buf_p = yytext + n - YY_MORE_ADJ; \
X yy_hold_char = *yy_c_buf_p; \
X *yy_c_buf_p = '\0'; \
X yyleng = n; \
X } \
X while ( 0 )
X
X
X/* Internal utility routines. */
X
X#ifndef yytext_ptr
X#ifdef YY_USE_PROTOS
Xstatic void yy_flex_strncpy( char *s1, const char *s2, int n )
X#else
Xstatic void yy_flex_strncpy( s1, s2, n )
Xchar *s1;
Xconst char *s2;
Xint n;
X#endif
X {
X register int i;
X for ( i = 0; i < n; ++i )
X s1[i] = s2[i];
X }
X#endif
X
X
X#ifdef YY_USE_PROTOS
Xstatic void *yy_flex_alloc( unsigned int size )
X#else
Xstatic void *yy_flex_alloc( size )
Xunsigned int size;
X#endif
X {
X return (void *) malloc( size );
X }
X
X#ifdef YY_USE_PROTOS
Xstatic void *yy_flex_realloc( void *ptr, unsigned int size )
X#else
Xstatic void *yy_flex_realloc( ptr, size )
Xvoid *ptr;
Xunsigned int size;
X#endif
X {
X return (void *) realloc( ptr, size );
X }
X
X#ifdef YY_USE_PROTOS
Xstatic void yy_flex_free( void *ptr )
X#else
Xstatic void yy_flex_free( ptr )
Xvoid *ptr;
X#endif
X {
X free( ptr );
X }
X# line 216 "scan.l"
X


X
X
X/* init_scanner
X * initialize necessary variables and set up the input file pointer
X * before processing a file.
X *
X * Called from csize.c

X *
X */
X
Xvoid

X *
X */
X

Xstatic void
Xcount_nb_nc_lines(void)
X{
X if (C_newlines != prev_line_with_text) {
X ++C_nb_nc_lines;
X prev_line_with_text = C_newlines;
X }
X}
X
X
X/* count
X * count columns for lines with *nonblank noncomment* text.
X * Optionally echo the buffer yytext, and call count_nb_nc_lines
X * to count the line.
X *
X * called by lexer with the *nonblank noncomment* token in yytext

X *
X */
X

Xstatic void
Xcount(void)
X{
X Column += yyleng;
X if (Echo)
X ECHO;
X count_nb_nc_lines();
X}
X
X
X/* semicolon
X * saw a semicolon in the input, just bump the appropriate counter
X *
X * count() is called before this function
X *
X * called by lexer but has no dependence on yytext

X *
X */
X

X *
X */
X

Xstatic void
Xpp_dir(void)
X{
X char c;
X int in_pp_dir = 1;
X int saw_forwslash = 0;
X int apply_backslash = 0;
X
X ++C_pp_directives;
X
X while (in_pp_dir && (c = input()) != EOF) {
X
X if (c == '\n') { /* first take care of newline chars */
X if (apply_backslash) {
X apply_backslash = 0;
X newline(); /* register the newline globally */
X count_nb_nc_lines(); /* count the new nb nc line */

X }
X else {


X if (Column == 0) /* if Column has value 0, newline() will */
X ++Column; /* count the line as blank; don't let it */
X unput(c); /* give back the nl */
X in_pp_dir = 0; /* done with this pp dir */
X }
X }
X else {
X
X if (Echo) /* only do echo processing for non-newlines */
X putchar(c);
X ++Column;
X

X switch (c) {


X case '\\':
X if (apply_backslash) {
X apply_backslash = 0;
X }
X else {
X apply_backslash = 1;
X }
X saw_forwslash = 0;
X break;
X case '/':
X saw_forwslash = 1;
X apply_backslash = 0;
X break;
X case '*':
X if (saw_forwslash) {
X comment(0); /* 0 means don't echo the start token again */
X }
X saw_forwslash = 0;
X apply_backslash = 0;

X break;
X default:

X *
X */
X

Xstatic void
Xstring_lit(void)
X{
X char c;
X int in_string_lit = 1;
X int apply_backslash = 0; /* apply backslash to the next char seen */
X
X while (in_string_lit && (c = input()) != EOF) {
X
X if (c == '\n') { /* first take care of newline chars */
X if (apply_backslash) {
X apply_backslash = 0;
X newline(); /* register the newline globally */
X count_nb_nc_lines(); /* count the new nb nc line */
X }
X else {
X scan_error("newline in string literal");
X unput(c); /* give back the newline */
X in_string_lit = 0; /* give up on this string literal */
X }
X }
X else { /* prev char was not a newline */

X switch (c) {


X case '\\':
X if (apply_backslash)
X apply_backslash = 0;
X else
X apply_backslash = 1;
X break;
X case '"':
X if (apply_backslash)
X apply_backslash = 0;
X else
X in_string_lit = 0; /* finished with this string literal */

X break;
X default:

X if (apply_backslash) /* any char after bslash turns off the flag */
X apply_backslash = 0;
X break;
X }
X
X if (Echo) /* only do echo processing for non-newlines */
X putchar(c);
X ++Column;
X }
X
X } /* while */
X
X if (c == EOF)
X scan_error("EOF in string literal");
X}
X
X
X/* count_ws
X * count the columns in the buffer yytext (only white space, never nl)
X * adjusting for tabs
X *
X * called by the lexer with the whitespace in yytext

X *
X */
X

Xstatic void
Xcount_ws(void)
X{
X int i;
X
X if (Echo)
X ECHO;
X
X for (i = 0; yytext[i] != '\0'; i++)
X if (yytext[i] == '\t')
X Column += 8 - (Column % 8);
X else
X Column++;
X}
X
X
X/* whitespace_line
X * Process a line that is not empty but only has whitespace.
X * The newline is *not* part of yytext at this point.
X * Do not do *anything* except echo the line, if desired.
X * Because the Column variable is not changed, it will be
X * 0 when newline is called, which will count the blank line.
X *
X * called by the lexer with the whitespace in yytext

X *
X */
X

Xstatic void
Xwhitespace_line(void)
X{
X if (Echo)
X ECHO;
X}
X
X
X/* newline
X * Count all newline characters. Also check the value of the Column
X * variable to catch lines with nothing but whitespace (blank lines).
X *
X * Note that blank lines are somewhat difficult to catch with a lex
X * pattern, because the pattern ``^"\n"'', meaning match a newline that
X * occurs first on a line, doesn't seem to work.
X *
X * Note also that if the lex pattern to match a line with only whitespace
X * fires, then the Column variable will not be incremented, and this
X * function will be called with Column = 0. I call this a virtual
X * column 0, because newline really didn't occur as the first character
X * on the line, we just pretend that it did.
X *
X * Called by the lexer *and* other functions; no dependence on yytext

X *
X */
X

Xstatic void
Xnewline(void)
X{
X if (Echo)
X putchar('\n');
X ++C_newlines;
X if (Column == 0) {
X ++C_blank_lines;
X }
X Column = 0;
X}
X
X
X/* count_line_w_comment
X * Cuarantee that we don't count a line as having a comment twice
X *
X * Called by functions; no dependence on yytext

X *
X */
X

Xstatic void
Xcount_line_w_comment(void)
X{
X if (C_newlines != prev_line_with_comment) {
X ++C_lines_w_comments;
X prev_line_with_comment = C_newlines;
X }
X}
X
X
X/* comment
X * Read characters until the closing two-character sequence '*' and '/'
X * is found. Count the lines with comments. Count columns because a
X * comment may be followed by other text on a line.
X *
X * Complications:
X * Newline characters. These force the function to update the counts
X * of newlines and the number of lines with comments. A line
X * within a comment that has zero or more whitespace characters
X * and a newline, although blank, will be counted as a comment line.
X * Input errors:
X * EOF condition before the terminating token

X *

X * This fn implements a simple FSA to recognize the end of a comment.
X * The original code was reused from Jeff Lee's distribution and
X * amended to count lines. While I don't much like gotos, his
X * implementation is highly concise and keeps code redundancy to a
X * minimum. This code is far more concise than, for example, the
X * code from the flexdoc(1) man page, when you consider all the
X * intermediate cases in which characters must be counted.
X *
X * Called by the lexer with the comment start token in yytext,
X * and also called by pp_dir with garbage in yytext, so don't
X * depend on yytext (and don't use ECHO). Argument tells whether
X * it should echo the comment start token.

X *
X */
X

Xstatic void
Xcomment(int echo_start)
X{
X register int c, lookahead;
X
X if (Echo && echo_start) {
X putchar('/');
X putchar('*');
X }
X Column += yyleng;
X
X /* starting a comment, count the line if necessary */
X count_line_w_comment();
X
X /* deal with all characters in this while loop */
X loop:
X while ((c = input()) != EOF) { /* find a star */
X
X if (c == '\n') {
X if (Column == 0) /* if Column has value 0, newline() will count */
X ++Column; /* the line as blank, which we don't want */
X newline();
X count_line_w_comment();

X }
X else {
X if (Echo)

X putchar(c);
X ++Column;
X }
X
X if (c == '*') /* found one, leave the while loop */
X break;
X }
X
X if (c != EOF && (lookahead = input()) != '/') { /* check for a slash */
X unput(lookahead);
X goto loop;
X }
X
X if (c == EOF) {
X scan_error("EOF in comment");

X }
X else {
X if (Echo)

X putchar('/');
X }
X}
X
X
X/* check_type
X * pseudo code --- this is what it should check
X *
X * if (yytext == type_name)
X * return(TYPE_NAME);
X * else
X * return(IDENTIFIER);
X *
X * If it did, it would be easy to build a C language
X * recognizer, and then trivial to count declarations
X * and executable statements.
X *
X * However, the function only returns IDENTIFIER

X *
X */
X

Xstatic int
Xcheck_type(void)
X{
X return(IDENTIFIER);
X}
X
X
X/* scan_error
X * print an informative error message with file, line info.
X * if echoing is on, indicate the column where the error
X * was found by using the Column variable

X *
X */
X

Xstatic void
Xscan_error(char *s)
X{
X fflush(stdout);
X ++Lex_errors;
X if (Echo)
X printf("\n%*s\n%*s\n", Column, "^", Column, s);
X else
X printf("\"%s\", line %d: %s\n", Filename, C_newlines + 1, s);
X}
X
X
X/* bad_char
X * bump up the column count and call the error function
X *
X * Called by the lexer with the unrecognized character in yytext

X *
X */
X

Xstatic void
Xbad_char(void)
X{
X int i;
X
X if (Echo)
X ECHO;
X ++Column;
X scan_error("bad character");
X if (Echo) /* restore output to column where we left off */
X for (i = 0; i < Column; ++i)
X putchar(' ');
X}
X
X
X/* yywrap
X * supply a trivial version of yywrap
X * to eliminate the need to link against libfl
X * the value 1 means stop at the end of the file
X * (the file pointer has not been aimed at a new file)
X *
X * Called by the lexer at the end of the input

X *
X */
X

Xint
Xyywrap(void)
X{
X return 1;
X}
SHAR_EOF

chmod 0644 scan.c.flex ||


echo 'restore of scan.c.flex failed'

Wc_c="`wc -c < 'scan.c.flex'`"
test 67608 -eq "$Wc_c" ||
echo 'scan.c.flex: original size 67608, current size' "$Wc_c"
fi
true || echo 'restore of t-dir.tar.Z.uu failed'
echo End of part 3, continue with part 4

Christopher Lott

unread,
Oct 17, 1994, 5:32:41 PM10/17/94
to
Submitted-by: lo...@informatik.uni-kl.de (Christopher Lott)
Posting-number: Volume 4, Issue 5
Archive-name: csize/part04
Environment: ANSI C,FLEX

#!/bin/sh
# This is part 04 of csize
# ============= t-dir.tar.Z.uu ==============
if test -f 't-dir.tar.Z.uu' -a X"$1" != X"-c"; then
echo 'x - skipping t-dir.tar.Z.uu (File already exists)'
else
echo 'x - extracting t-dir.tar.Z.uu (Text)'
sed 's/^X//' << 'SHAR_EOF' > 't-dir.tar.Z.uu' &&
Xbegin 644 t-dir.tar.Z
XM'YV0=%J022/GA90B08@T*0*@H<.'$"-*G$BQHL6+%4%HM$&#!@@ &F?8&/E1
XMHPP8-&Z4U,@2Q(P9-3R"J,'11HT9,6K F,'21@P9,D!B'$JTJ-&C2),J7<JT
XMJ=.G4*-&M5)&SIPT;]R &).5CIPW;$"D<6/FC9PV8>A@=:-# 8DD9'2 .)AP
XM(0L[(&*X^)DW1PX:+V+ "!PC;PT=- [7R &"S1LZ=$ 4P0.G\>/()!0HH((F
XMS1P0 ^64&4/';)ZM7<.,_1P&Q)PRD=^8 2'ZC.@Y5[."H%-F#IW/9>5LO:JG
XMC L%2=R,85.'3!DR(-!4+0,BC&@09M*PZ;T;35H0=Z:[+N,F<FD0;:B+.5WG
XMM540LH>G*<Y"06\XH].$8</F-!TT;[S6W7=CA-'><]@9R,9ON[V!7AANI&%&
XM;^9)E]YK;-C1FP)A *<:<[<=IX 395C77W7\P3?;?]1EM]UG8W7G&6@$C5::
XM'*=91UT88XQ1!AR\0;=>=V4H, 1J;<"A754N:,19@-3]]YV.(+CQ6'77_0<E
XM>&G\!T(=Y575QEAI/:< 5VVD5]X<+'P9YEED!@D"'*+1^8:/N)E%HVBDI:$A
XMFR# -H8+.XBEU1P RD%'?2S.F1: CIV11H%A%?C:9TE\^1ITY_'FFWS%B3A$
XM$U"T,,0353A!Q10N(-K69IU]-L<8<J0!)))PZ/A9HW;L5P=W:,)1AYQ#-FJG
XM;6&TT2 (O3*W8;##(MC>6&>X1@>$9%@''9AIX($D6FZ0(6L=8Z!1W6>V_=AF
XM&'>LL6ZXX T* G*SY?%&'2=<-ZT;U;8&Q9%Z/B:=<%:ZT0*WWLZ1AV]EM-&F
XMO75L!>$)D<D!IHQS*#!KK4 V"0)G,R):1HH;VQK9?G,X*%H<==3XV1VUJL4O
XMD:"EU9J+W 5W9E9SU)&D6KH-F2X<'ANA9QEX) O'=FTVZENM,Y_:Q$*J5@<'
XM?M;!Z(9]&N+X+7F1L3$6=3&6T?5I.!N*\9XVFN::@U*>#,+0"@0'@M144\%E
XMBI)J2+-S5XD&W6UU+#B'QU.4$:5T7Z^I-HL:2T<RK29C%S"+PGDG!QDMW%$C
XM=,[A%RYY8Z3!G6Z-<A6FX[(IT*BGD65[+79+'JX9%45,086IJ*K*JJN:#;$?
XM&[LR/FJIIZ:Z:JOFEGRK;FT$&-N*C..L-<8*A-8VCAXG03UUQ\J1+*[1LJ;5
XM6%S)P6=D7(&YZ-JP:]PR;R"H@.B];)"A NWP=MGD[8R[%QV$%1DS?$59%G-#
XMA&;F-,F%Q7F1P9WN>*>\WS4/0(4C@P+00H=RT4R !+2661 4HT:E38*[2Y[O
XM7/"&-=PN=[M#%16@4 4J,.]5G(D2A3Z30! 4*U:NH=RMD%:5T@G(6%]!EK*P
XMA2L=N2Z PPKA>4 XK+F1IRIE@@[T3H.6<HW-8R#[3+E&LX;BI44!X?&AP,:S
XM..K,(5GJ*8-W[( 5.73O>W-*HOB4Y1W6)*AP%3IC@0[D1S-\J [70<&89G6O
XM\J0 /EH1PQKC<R_A=+$S;NA-TX 8OYYUB3J>2Y&5"C@6Z/@/@-2A8@$/2!LP
XM+;!:#1S9 X4801BV0(8TM"&B7(/!_&TP+1Z,FP@%][CJ+>ECML1E#5GH0@!@
XM (< $>Y. &QXQA#<X$P (:8@!( " P_!%-J,9!C/ P0Y@F4,V%<!-4GQS
XM&-]8IPNB]\9)*8D,T.0F.+Y)C!F,TP5A( ,9;J/.9R* F_S@9QJ$$@$78*$%
XM<[A#&.#0 M+(@0TML"8V'W)0?K9!GIF\PQSD,"AJ F W&1"0]+0A7'V3 Q/
XM<\$8&J(&+G#3I@!(@Q< 0 $ &( K<,B#3 % #6ZR8:5?X*E/@[.&H:+4IX!8
XM*1A<ZKXWX&&H % #([A)B96&89RT E.YA@J!DW(3%2L50S838(:KD&$,27)!
XM0$+S@N-1<(6(DHI>E\*2&]2@!BL1"4E H*3I&0E+0'!#7+"DYG4Y"8YV4E?
XM93"#H'QDKYC-K&8WR]G.>O:SH!U!"%X@AK&\ %$*&$$KM3(&XJ12*ZVY"K^V
XM0SO:HL ZU8K!(YD8+"H1;D'40HW[,J;:M\3E;J2ZZ_(0=9>\[$4&??E+8 83
XM@\+D!#&*88QC(",9REB&NYD906K7EC8RW$L,VZFH=*Y9/.JTCW5BN-;8A'2:
XMULZG2*K=5[6&MJYVO0LZ=QA4:L<KT?)4![;M^A83O],H\FAQ-B7R8'P@IUJQ
XM08:V9A KT-RP*P>=H0[6@1!OJ&,EU^0*3XTY\.#&.V'&N<%G8F"2DQ@'.Q"@
XM8 N/#%^RWF6E/%"K/^,ES[W.@(8V.6<YNJ*9;\JD)CJ,5R-A$,,80-""3((
XM!N,]3XP31+PRM"E3YG4#Q=SD'*M<"UYW0(-09SR=X% G"5D6S7?,5I4\_">X
XM':J.M:!6K1B9I<S+\DZX:)ME G(4MR)49HG92X(!4I]>KK0&\] -A["!I&9
XM),-QQ*O:X54I*^B%T!H^K9PWI ELUCF-V#+)FNN@10YK(*%6*%Q;[GC.2TX0
XM@A.&,& %P.$,;>B!"USP OL61S,2 L$60$ "U;:@#'&X,@BZ ()"L6AK+1D-
XM@$ @@O:$@=)R(0$,:EUE.,I4V>1V@[FGW 41*"#;>.A27NJ6!F3/9MDAH/)L
XM2/!K95';VM+!-DNT[2 1\!O8<BEQSSR8-CUICS2F<3>\Y2T#>FM&M0'^0DA7
XMO2'5OC<R(6W,V#ZCWWC9^&FJ(3(=@B/1S:5@P!G?^,A1\,@]O)LE :9R6$A0
XM&#Y$IT30:4'/JY/@$^R!3F/!3 SZ< (%].'B\?I"J-VP!HX35U,[<A1DJC)K
XM!SF'-Z3Q(1M$+7)6$XFUC8Q,R0,,\S%(?>Q4MSK-06#S; \-!"?PPK(3T 45
XMD. $S!YZSC,* I^S:]1&1[J!><YTIT,]XVAJ\M5#Y^#/H(YQ=_CSW9XPM2)4
XMC0YYP(\IRP,W8VZGT#.:46N\<\TVB:&*73K!9P9BANR, 9#+LA.>/C/>R(.-
XMY+*MUE621%O>X"$RNN]-\//X!B42=[QW%^#F.U\UWJ:][-Q9^QC:_@7?KVGN
XM=1_XW?'F>;WQO/ F)[SABWYTJ"F]\4\GL-O=( ;EC)?RX;+\K#&O^5SO>C>A
XM)VN=8GKXM3:J%QT\XBX^!'MT('LT4GN3@GOG\74V,B^J53!3-VH%XWUA,W*:
XM$ES#MS0Z='SCE7RX$5PZU@;/IUK15T7^=R36YS[8!WS!Q7;B%7/U-P;@=W,:
XM409W]X*!AWZ#%Q;KAWCMEW2!!W^/YW:O,29<X1@<!GUU A]59'7@,3!NU#"3
XM A8\8S58(QPQ:&#:-U[?IAK[EWI^Q'JCQD3FU1MB9AX4HF1:^(19T0)\TGP1
XMLF$LAD<IR"QUUAUF,61H &0WR(1SR(4<MH,M42!*AWYW=P([ '@^-X3H=WAX
XM=X2+MW1-]W2))7]?<#5?$!I2^"-4V(%F=VN-AH"(T@*OMH;P\G$?.#,VB$9N
XM!XJAH8@LP8A!Z'./. *2F'Y$2'1&J'COMXF:,6 7^ 9WP'R[AR)A84*U,V!V
XMDS8Q0@(JD#UOP(.!4BX%)W$#QXW<EAPAA#/AAC/NIHW]QG$] 8'IRPDD#8^
XM)QT!164Q ::T1+]IG%E< =6MXX$QQ+MR'&5R'[$F(0G8(_X"&QO)VK]" ;_
XM&)!C,Y##Z'[,)@-,AY LD8\<. ?^"(X: 9%65H276) D, ,7B8X*27_*T9';
XMEEC,EHX1*9*)1Y$D0 ,GF9!M\ 5-N(50R)$."8X@21TRB8F840,WF9$*:8L$
XMP9(.TA)!*9$C29,V<)+:R)$&EX\RQVK>J!%CL(XQMX]6^(Y+@I$:D6S+9G!C
XM( (@$ (]P&TD, =JV04 1QX*D #_* (JD)<@T 2>P4$>%".P&!\A9W5RP6R?
XMP9;,EI;:.#*O49=WV03 )!W0,9@C5YAO"0)M20**V1+9H8U5V0-7J9 9:'5;
XMN15>Z7:CZ8',AC-D*1;WYI9IN99M:7!P.6USN35V"8YXJ9=\.0=^:2Z >7WQ
XMD8$S:)F'F9F;.7!=YIBZ"9D=))EB1W:$^9&?@9REV9DM\9FAF9,;69I="0:0
XM9VJ2MYICJ8UF"9MJB9BT&9>WR9S;MIO[TYN_J3:!.1L;:9RRF9BER9A%DIOO
XMZ9QC!!WW29V8J9_:B)TLH9WMJ'$YZ)VGR:#*09[;T9KGB9;I.9MOR9YGYYX%
XMEY?QV9>129_".1L8"'<:F!4<6)P$BIB:N9_+Z9\%!Z#06:)DMX'B"38J:I@%
XMVJ('6F_9V1)6N: [28<<YJ#@:8A.B(B?(983:IZO::'YN9ZVN:$PRFT>NI<@
XM^IPB*H/Q,:1*BI\LFIP]^**/&9D(XJ4]B9_6V:.>":2@N:!**0=&FG%Q^I&L
XMZ:3H!J7JF:%3>FT<:J6\F:5_B79<.AMT\B-?L7L.5R-]\B=@NJ;91J;-::;0
XM<35LTZB]H:8&RID^FJ!A5B0;!$AI$#U= P"/T! , 0-,0D-P0$ T #X815V
XMV!LM$!P?)0=3!0 ,0 4KY0+9M !VD"3?9AR(8AT.X0 .D0:J\*M')@,'!"%#
XM16G,8ZP-@:PKM:S/M #-^JQN@%6@]:W@&J[B.JY1,5<$\0*0&6LX0ZZ@U1,=
XM$5@C80,K85@J05B))0,V, ,R01,T8!,XH1.%L1$W ,P(!3L>K (F[ *N[ ,
XM"Q&J-5YHH:[')$QK,"EEI"*S41L$M1:[$8=V8VP%R$1FXRMETEZTT1N =#@:
XM(8Y59#U80AVB,2&BH1QFHEH/1P<G8D"F1C-TD'D=ZQL@2$MS,)<Y<AVC5((=
XMLBGGXBA[!!M583N<QFQP(1?I6@8XTUQZP1<QX!> (1B$81C8I0.+\5V1,1F5
XML5V8T6O*1 4HE !M26PH=$LUE$O,HP!K6P18 5%, 2X0P1N"P)PFTQSNTPM
XM9+>#2P4R]+>!.T%KRT+#$CR]P[8PI+@O$+<JM%QH8"21B[=ZR[=%X+=O6[FV
XM=+FL4KB7F[BA:[F16[J/JP!$D 1&8 0%2GMF,%ZO&[M/ 6K4J 5E0")Y7%=
XM@32Q(R%M];)^Z#69MSEYX+JP:P2YN[MMJ1E!P 1,8 1)P 2YTP-5FS9TH1!%
XM@%S(L[K, P)<4)<D@ )KBT*/=+YWF[=[V[>/5+X)<+Z7J[X?B0*7R[GO^[DO
XMQR'\H0,),&S%YEK'FQM:H4K"M2::T34&W!8) 1WZ6X/?)=2X(,;JQN>1#\?
XMZUIM(@4D4,%TU,#.Q1<DP&UU"<&Z>8ZJ%&[H>[CVR[Z'J[^>2P0O-\$I?,(4
XM[$K!I;'*Q[$U9C<(C )7L1WET1\IX (2C,+O&4:\A#]"0ATL8[%(;+XM/$,U
XM9+\^P&Q5G$LR]$@RX ,F$ ,X?,,V_)Y$0+S30;/ P4I(@Q^D\1QR@0(E%E(P
XM@BYO\ :3N8]SD (2?+ZW:P3KBP)__+Q3$,AKV\5:W+Z="[^:\7%SP,+U"T.!
XMG+_N.\,UK,3=.,;O*04Z/#,\?(*HX[%ZXL@GMR1%G ='G,1W"07;T2%QI'6F
XM4QZ;-"/MDS^[$0:QIF<3LHQC\F*>,L7SB[^1B\5:?+HUY,5@+,9EG,G+S&UG
XM7'MIC&(ZJRQM;"-P;&-SK,=B8<=X7"5ZS,=4_,>!/,BZ6\C%'+F(3+^;6\F,
XM?";K5;%L49>EHV\ZI\736[W7FSN/I (RU<BM',\)<!;T#,-6C+C'?,[*T\5N
XM,73R&'1#9XDSB82,9XR>F)JL-EX'HF>YLG74M"P4&';$:877EL#F(1#GJKH5
XMQ$P-^Q3NZA&$)5CR2ECTBE@LD1,I 5B.A1,P(1@QT%B*10,P8%DK/=1$7=1&
XM?=060044@H)Z-#X"#++V01D5F#+I\6A?\1YV,Q;C6#L#$ADQ)BE:@8IXIP=-
XMAP)W]AD1RQT]DR7>42$Z]"FS4DYE8<L?S2!5<=5[K!DL2TK;(1=T0+ MX$!O
XMT,\RBB"4R6J%R1=M^1,*4-A"8J(YRA-M.0.-3:F-\QN%R1AMF0.5_9R&#6J0
XM;:.G9F#3J5@%>@.=':#CD:1I&A(%2MF./2>5<;-^DJD:41B+K==NL-5]O1LP
XM$ //]C-"M7VQ?=BV+6UMB66Q'=*5J1'CEMRI#9T#BMQ7%MV?37^AC:(W2MK-
XM3=W*;=EHRC.%^=S5'=N62MN.ZMP%BF7(L=LMNR1^'=0MD!5ET *ET53$;=G&
XM_<BW7:!BO-R07=KD_=V>+:#;C=GJ#=W%#=HUJMVC;8K'C=OS%MOAS6'CO=[6
XM7:FSS:AJD=[>K=N\70;Q/0/SG4D9U:WY7>#>O(RE+>'_;=G,C=@)7MZ6/=TN
XMGN&D1IRBW60Y>N,4?HBMG1?^C>/GS>&US=\?WMXA'M\T8-^9=^*$K=_[F*/0
XMU985!^#2V=T#CN/37>6%A>,T2G6DEJ*E[>57#MY +MXF4:!GKN)%OCY'?N'0
XMK>3OW=M_70/VC0:B4=]L@.)@/N6E+=DN@>,Q?MQ;'MO3+>BPK=\,+N8[CJ.!
XM_MHX7N%(;N9$ON%P[N$W3N=\+>*^;0-YON=0GN*JO=^%J>B$'N#=C>J(?N!(
XM?NB,CMT-7FH/GJ.PKN*4+N<T[N:8;B-Q/N/LO=>U%M\W4%&N'N4J;NJWK=E]
XMD>I9+N,@(*]M:0-<[NJ)+>@]#>:-?J*TSN-ESN:3GN86ON96?NF7VN&&CN&<
XM/NR^C0.LZ!F#0NHS"NC=35ELON@J7NA(KA)MB=JM_N!('@/2GA?4ON"R[N@.
XM[NW=K=AYT>:JG>L;4: %;]EO[NL>;NGK3HZ^G0/V'8#(7NKT#NT,S]A8+N:E
XM#5AM60/5#O"%R>^*I>T'S^UDWMT>T98T$.ZLK>8N(>GFW>N8&O!#GO'PO1N"
XMX>1O4*M^7MPA?]PR4/.%=?,E/VJE[?107^/6;A+D?1(PK^,)#^D+C_*&@?,\
XMJ?/,SMD]?^Z_+N2Y+?1V7ETM<#4F;4?R;MA+C^0V0-YW[^PFO_!>3O)6S_(:
XM00,2+OA;G]W=[O703@->KOAB3Z1(#O8J?_;H?=R5]=H5Q_:>3@<_T0)1S"1S
XMG\<LONJ*CN^JK>^%2?4K+WF%*0/,SOJ%/^LS#^TGP>8$_O#BCN2H+_E&KNDN
XM+L:8[]<]#5%>02V'\_DK'MD2CA-Z+_4+3]Z"D?J_=_H%6O7)ONUC?N ]SNQ;
XMV_A?JA$X4* X8.Z3_^KJ+NP:K_E-#E-CAR@?/^^A+_*]O_PY"OG0OR:%.? 3
XM7_TQ?_VU'NF3S?U!SM+IODR7[N:<^1MZF@_/A0??$&/DP!EH?W3O_1TWE^?O
XM8)RJ@W:L[N^IOL W_5X?PCM\W$WV@;L?E_/&W8<;@!:/Z8&[WP<"],!O:P%B
XM(*"H%^O0SZZ4? I1P:E0';_2)@)<('"+@9RC7-# M-0F$!.ULX&""C@1*@,S
XMG"[@<1-(B$F,(4'?A .7X/2X;(]/+B FE3<%YU,.9((DROH]NA!XW(!@?I*"
XM@8H*:JDO> 4AWE;0'#R"-P@'Q(1ENF 5)&DJ(H\@JCNA?!85 41R^2G8N;=.
XM)Q=<H R @3)0",H]!6 'UZ 5S(/*CML80D08!#6'3!$!1; MA;]&.*CP8!-\
XM=D\P(B$FRL8)E: GM$]7SR5HP?]7"K<4&,QQAB_VE<%Y% 4981KT@H^P2]V^
XMPJ0(XV!5"(2V\$.IP4Y8G_2@"4H9PF'\%:8S".+JG*=S...@23.2E09-@ !05^.
XMHH#RK\4-N5;(!O/@=%,)1C 88JEA: J+89B3>=A/&])! *CS?!S%\WGHCOP9
XMP$'([EQ@^I.!<$\1UL!;> ?-8=TK3#T0)5#"MT=1]"$19(;<,!?.!M.G$: @
XM=$N(IQ +)K956-T@HCD4@UV/#"(Y,[@.+>*(6FUCSP3VPC<V!Q\B/W2$$?%0
XM'4,_F (!82UD@2X0S\&],B ;]J$PQ(41,1(&1)E(46BB&;B$F1 $W#R/J ,9
XM(O;)3Q6'*+["Z788$.)))(8?\1SR/X4'[8K $Y!=M5 IML%=6):T0D=\BN7P
XM(ZK$1-4'D^'N.VYCD0_FB9(X;V B# !U:.+9U,3MHQ4AX3_4" $1+IH:N?@3
XM#V(XK(N?<.]!.X=8$<&B*[R"WY B'D'#V T%$T8$@1 .R5E%K)C; .-L<(,Q
XMXBO>Q'XH%NL$65R+:,_#I:AUZ!:+W=.8AC9Q'.)$?R@!D5Q -(U> 37ZQ6DG
XM#F\@2BR&1I$P#D7&J! E8N"CB'60-^;$QR@+D5Q6H@Z:435R1AV(&;VB2=R,
XMM[$S[D%%91;_8&%Z&L&%-![ WN8"W=UIK":IT39"11VH$[NC\),#LA$3YB<N
XM*!QQHQ-$<H0Q*;;'CSC=: !PK(U)\#!"0N*8#KO;<02&EA$D.K["E!DKXWS4
XM@6F1.H;&XX8=9X9VI(<:SP5RO-/H$\-C?FR,).HN2D(8,"%C8X6<C8,N0.9&
XM45CN F1]O(\!4BJ.P<A8F"8C@#R0K[ YODCH.!Y?88(LBPL2R37(:O$@EUP+
XM+'KYL T$A ^)'\FA?A1,&K(' LF"*"3Y(E#,3[N11H;%HO@>"U-\+)*KD3ZF
XMPJ:8',7CE'R%*C(CLDB-X"*[Y(7LC3+23!I)#&D,/R,RS)&\$/N]1*7V*8IA
XMSW(0UN//\:/FUO38W,W;#''(3NHYQ5%K,H;2VY,R3B2\-FJGX>!D?UM[VS'S
XMO<"& 22&FYZT=1@NZF%*!:<!HQ^P\X#HL/]IN4R)YDJ@/-P-<4]T31#2Q3R0
XM&E+H*W\%7@T6K'=8[%5+. E]TK'T*\BB$W":8A$)-,!@N<IA22R+I;'4+**%
XMM)@6U*):/ID!^UD,8H/=E_%B7.0"2L,K108O9"WHLK6DB]>J+F K,8@M[7(9
XMNLO9*I?A13/T&V%#;* :[*@*PJ:N)!=6B5H4P'G*-[7J)0&;:5-M-E2V 4K]
XM)N$XB(5C+AI.==P>RVOB1 8QUIDTPUVBDS*C6O2A=N1N[E(U"SM4C3K<-;,
XM'/2$5G.&9L2K^2!%TR7,Q0D@:Q53-YDU()+6Q@5;8S T)@[%M=H#%D"'TR(-
XMGV%C...@5P-HV.20GA9U-&#P!-;*2-2,"[% Y,JDA\*H=YPQYFH/R(=[)0NAN?
XMU(XTPE^# 8%-E@RV*7,ULR9_V)KH1[Z$!:$#E2):)CI)WXD2=4W!=F[6IM8\
XM-SY';-*CLDF4#)(]JE M*DKQ*;GD+[_1>TJ18&GD%(K+%*8JYG+ZE_])RB%*
XMVW:9UE3#C&#V03=!S(CX'_:<U-08ZZAJ^C:LR3:Y)F#KG)O3:SH&N'G+M,/<
XM'$HD21/9H[0Y90B/V_R:;?-SODW/R3EG9]C\$*=3&$4EB:8Z[>63RIM[JC;Q
XM33^%.#L4C+R"QW%HZ:C":1\.I]^,48IS.C5. _4XXTUDP#(;L+",P%C']2 C
XME=N>N(XK:L]RAP)_GJX3A#[RSH4ZQ3'J+J7_&W2:4L"12A67Z'@>]XR%_1$#
XMVL_P:2I7'_A4;17/?#[*MA@IXQNHJYSLL\]5PQVXZO9GZ:N2KNW__;OL>>M*
XM'7\4E="N@D(G-_C<S%5!B%N-JX4<2XS0TF1E3*.5]<HE51:_@M/XE;^*+#+A
XMIRD^83E":Z@-O:$XU"'80G-9@1@8QQH+MBHMK(4S0<!\J&X HF:!@ZR%< /"
XM/,,2'6'0)3- 3*;6?/8(X&J7KD4!E!@[@5X:1JO1F%+MC4&'GODB?,C(5" U
XMJ&3BG08$'X3#"; #38<%OL[1N7U80FFX%F&!)>@[\/ "6 +]:1,1BB7LI!;0
XM)N]$D\ 9/,@*L00KM)%:@B)%#3U)(]RLX] "*JDEK:0KX))>TDRJ23%I)_6D
XMGY23=E)1V@*TT6V#+BYIYZ52QI!*54(J]6F)I3#,T:T9/$Q-KK@.'S,RI Q$
XMXB.6%L%!$#'PFOB0^D+ Q%J7P!"UZYD5+Q1P,2N$Y:1=T<RV+1E%D5'&1IMP
XM,-4TD_P7DI;78$ 8$&-9K)).TRN(,RJI O@)WY0&L("<H #"Z;.!%_&AG);2
XM+.:2^,(K3:4@@)6Z)%>J0O&I+)6=L'/[R-%)*=SZF1U]#/NA)>S1.]!'-<(?
XMK1)31I!J(4*:( _IDDBDJJDA>J!&N...@SJN.3I!R.DH;23]H"2.DF):DFU9*F
XM5%!J3E/IN'&I^/2ENB29FEAH:DL8-W\-N%%*T-//C(0MI1*Y]&WPTAV1,[D1
XM,$U PQ14@!(U>DQ'1C(E7I^!F8919THHH>G,PA-R89QF4R\3*,+%5MVFCNSE
XM>-,8P (HFSL=IWE0GK93*O-.'PRYF:<Q-:["U+DZ4^-J3@UNE;*G%E#?=@CI
XMFWUK(0;5:B+4/*H1%FI#K1)B )!&5(TP2 NIO$"D'=7L1%9@X>H<J4=54B!U
XM?8C448I2.^M(_:R<U9*:TOY&5VNJ/Y6K=?6O]543=]]ZZA#XJ;B4'NY2DD)4
XMMQ& .*K"=$B +"[A)9HJ&WBJM2>J-M/N\$S1V%65IM>"FG*<:^I5EZN*X:9B
XM]9NN57&:7,GIDC"G,2 ,S 6<//<J8-)J]<5KJ;2@%572VM+(*^F%::JUA)7
XMWUJK0-VK?XW$^54%6D<%*QY5J.^1C_K1Q I1@=1$=:P6]?1,UL\P8+&@996L
XMD+0+G;O-JDE7:DGUK*$UPC;82SI:A9QYK6FG=;S:U9W 7MNG3Q56L36$S-9>
XMFF=^J9! JKJUF#+5W^!471=4M3'#%8%2!ZM*.I"K=0@(SA6;.M<P]!NB*SAE
XMJV@UGH;7<ZI=N>MT;:O@-;V(UWJ*6F-IAF6RZI7#SE<_-U";W)ULGP?UONK1
XM_,I0]ZMB]:]C@J)Z1D-::S J@IU!!K; <B7,NF 5 (2=L* 5SDK8DRI:4RDJ
XM+:\NZ<[>*WRJ9V^J;[.R3XZ^UE(02S9D:R4AL47UMI[8W$I,[PMO!4XL]K>Z
XMV. *8Z<J<:VJQK7&\C>MFF.;JS5]KF%5 8S5(QMD9X-:E0%A0)VJ/.\*3TWM
XMD*6G>;;)WDH^2VNC+* ]>H)VH.(Y&8ME[6M"W;*@\&4<UH<:2!GK?ZVH95;-
XM:E2SPU&7+7=8LY&TS;Y9.CMG5>JTM;9UMI]>6-=V3^WL:56?O#;7OE9":RA$
XM[*&MK2;6AZ#81EL<'JU8B+3 =9G&V$$Y8S.M&LNJU?6K=E7.L6-?4=KIIM+U
XMK%;7)%O?2ND," ,U@ 50.U;K5M4JK$TLL-3/=EMM&VLU++BEMQX6OK[%]<GG
XM_%R6_;6%E<L.6_Y:;$&BF)V. ;9(*%LTVVS1++15L)/4S<99:BMG:R[-I;D5
XM-N*R!)VKWK:MM(FR!Q3CBEO86FC-[5#UI49UT8Z:%.MHC2F\G;3RUM+*V <D
XMLS0MOKVQ^E;'?EH>"W!_+'6]L037G![<A+MPV>IW%;)*=JU.7(@K:UF"376[
XM&S;HBKI<JW&+W48*K U"RX;<8*M?'2K)7:PF%\ F6V=+8 EOFC6\+Y?#9%8;
XMP6!O+K:MMBS5YC[>4EI/]6EBD5?UE.=J3V\;9>WNL1.HX_:6%MTJ,F+1;=)5
XMMXQ6J;I;WQIOA:O4I;=4-YINVGS;:?GMUO6WP\7'DMJ!BW8+[CG- 6% !I!5
XMH'!DSZZK3;L/MZ99WI: >6.IYNVS+ 'ZJK>_YGD!GEZ%D @0!KB[11+O>- =
XM!;G123#:FI'[925JF!6\D!7Q&MZ6^T@_JK2=N9/7\49>^?M@L^VMU+S\]+PV
XMW_,J?:,=K?UKVQ?>N5:B6VY)[[E%NHH6]2Y==KM4>^O35::NUXU1U7H+S8[K
XM[,6ZM5??<EW=*W#!;N\UIY0E^"9<?%5\6^U;5;OW"O^.U_U;T_HO"XZ^[>[=
XMS8KKFSXY9,?##WCW^Q+6\,O\3A'Y[:_F-PV<7-V3<LWLLUV_E579NM^8>VWG
XM;_Q]PDXX\HY6>^J2?&5BR;\M(8:R78MK@T$/#@:]!#BHEEX$_ 9PZP)6O4X7
XMF4+="%R!IBZ-O;?6 @-_6JVK34'MO^7 0);W'E_?BTYC@#IEIPPW["Y9_HM/
XMK7!+P,(L00NW!,W[3SF>%S8.[Q7[MCVL>67-@,?UM3O8L'I9(&QLSR^R3;\N
XM%PD#O -[A)=P2)6YD+?^IF('RXHI;)Y5Q(G8SKY=PX!/ER^&U7R4^,E9X@%,
XM;L7P 2ZQIS>8GN'=FH9;+ 2NM!+XTE+@J@N'.>T<]K1U> .+VH";ASWP'@;!
XM-"#XV@ 6( -06R#^P(,X^L)B#IAG9W%.J,7?MNA58BH+7]T>W L-.7BPXE>^
XMVV7];OGMQ$(8_5[4E<M(D[#Z-<6:%15+WBBLB@=R0<:Y+NGNC5?I*_A2J>(K
XMQ*\4NF@^X/:."0(O%KT%6)?^XD1;AI5N4B7&*U8-'V.IFHS=L+W%JG%8N3YC
XMVQN-<>^:P,-?5U$(8@5P]\* #9 !"M>LFET3['!3J4*NIPP9O2;B_FN(0X)$
XM=L<4!1Y'XO2Y^3K?(ORXF5CD;N*2VU@_\3Y6ORS7'X=B@,QX!3+];<7PER"3
XMTM'Z$O#I.&9]LM@LCU=9VI1;AN<;M!C9%Q]=8)R A?%'5K$.6"2_6)+<AF'O
XM&T;)SK@.TV&N*HU';0>6R>!8 ;P$[9IP14();KBO]I5JWK-LBPO++!:*:YGH
XM'4*G3(.=(? C<3NR^'E?>0QLQ:^PG<J MRJ/V<=ZE4-Q5A[%2IC-,N&P?)"A
XM<&T6RZX8X@KEVW:9Q_'6PJ??3[T&O]!\D8&JH9W+'-D,W^6F&Y*-\5Z>M\6U
XM EO=E(QC5[(&=LD]=AI[7>%GC4\P3M"NVU5?/>:9G'Q#PF[."[UYO%9F$!"<
XM4^MP'G[\0C3+43\, ^? ^D,#\5CO\F T6X\1ZST.O%99P&+E?@R;_[%L/L5-
XM^#8K:+ L8:?P>9X)^/0%<]N*ZY[3GWWN$/@9#/?BXTQ;R;!R9KKMMAA+VI$,
XMG3&M=&[&M-<Z]UL#EWNU\^[MSFJUNGS3[>J'QW-B+L]YX4$7Y8BW=F>M<+;0
XM][DS$T*BIP I1 -\@/4U[X)?36R/.3& 7LU%F!]O5*W<?@]T0$[0#-H@9^D*
XMBX@G=&(9QYL7S^[9!-@YC'150-)PV3@;W0Y-ESNR E[.(;HYC^CG_'JC,S,&
XMS"E:,$-CPHR=N^Z+1LS7N)3>@#"0 ]8IEOG&@1H%7V%\.IEKK9B>M61Z =*!
XM(RVDV9T=,'8/+C\O::G<I*GRL872@]<U$^CQ%)NC[6Q>Q5@Z5=O?FB:AP_1Y
XM!=.7.58S"TS=9(ISB#7 R-FVNFF[#*(;,*35RY26+X<=DWRB\;0<UM,LF4^S
XMZ)?LH@^S=4V[ N^;XH!URMD0]0G&T0+/4;_JMMMSZ^JEYD"56N-]:]>BJ:,R
XM/?[!GMH3@VI0_$A?,ZDVT*8:0=/F+/V5WZPI_0D[F@J?U\J< W;T0[ZGX_J^
XMV.K1JY%S=;KEU0QX]3Y@.EV2_?))MK$J&5E?YV6=G0US-0;4)QA??]-NO$YE
XM0/BSUCTYELJ ?"U]?[-+ZM<.N?_RA( =*I:R9Y[5%?DI8^)Y;)K[KG]VTJH9
XMY8;J=CVJ?P\I+KQ<F30T7MM,KXFVO:Z\VOH0CU=9[9!A=E*VR!HZ+G-H1*NK
XM/W3"%M&M%QGW93LM>Z]NQ.:J@QFLWN%F?;&?-1\&OL*7&U<<D!V9D3;GW:=+
XMFUMCYDL=LWLJH 1:,Z,//;4L.EPS)O/IHBK(<@@'E_75QL(K<;<G,X[N51\X
XM$ VB @B(/S 16L*#*)":HAD<B7*P&0[I20@$9^ B#(B'L',;1/4HD&: 7+C<
XM<) D:NYZR&&E(7A,TCJ89O?@\8N:P6P^#M J=T!/Z0*]E:UT5U;5J'I>Y^9%
XMK6%;Z9-ULC 5&E:9H_>Z5W>$%(B=.Q].[L=M#P>B]!Z"I#LBQ8#3/8\P=U5P
XMWD,O)A)$)[E]=N+X_I#9V\HT11<9(VXD:)Q\X)L[;MRX2"3S(J8FW^F;.MP
XMN<"^T<Z#B]_/$ ; 1O38O%_C>4R/;4(@V<<5)Y!BQ(X4.7)P/P#P0JA]#W@!
XM-X_?D1I2[HBTP/^C X?/U<+"8!$V0+TK> 9_DI4[X01.*_/!^0P$'^$3O 7:
XM8 HY%TMXAT2/Z#N!<W#^?175Q@,7X>*#A,/$)5E1FF3]U@-$'*X,R;F8OV<"
XM#Y==P>E_*TFL&227>%]LXNN[A[?OU8PCX??M>)HZ,&KF2:#,J-&Q\>[1MQB@
XMTM$IK++-.-Q&X_UMEN)=<1RAQVM[WM8^^?\.UB]>)Z$F[!WC(KN,KU)\VJ55
XM*9.5XTFZ!0ORDTW(%[F31>1LW)&WA/5<R!EQZ.R<9+E55^9N;&<?]'KF"3I8
XM,^@ELU6!$)A8:VA/:S3K9R9]L]/U[5[7K9EG[^YWW;OC]946WK@\>+?40 ['
XM\VDC[^7_M'8&5%&^/TAYV$FWJD3FEMH3K !>P/X0;&TB>=FRZ9,WWLW^(#]5
XM0P6\@(N#/IB#<P !/, W#(3!A@9\0 (XY^C<F;\@SI,WM+F]-#!H82S<%@<X
XM!M:% [0#CP0$./,K-"4D214A#W8 #OP C8#-]88V/^?J7-<4='>.A'#+&-@!
XMZ#RB)_1=P\[+CSM7A/5#!> 6.P#1(SI"5P'KG/I0 7>^!SQZ.@?I"KVBJPIW
XMGI'<CQE 2( FH,'LY _7 7< ,B( 5T]),>TMOY-N\#)OVC]W2+OLUEKO$]
XMP62\EU-R29[&A?D:WZ'&/#(@\RA214XYT$GE,=ELF]-F_LRU9C2GZ="!FI<?
XM:R[6LWE1'P'=O#E0AW!.!\:Y"RCG)GVB+_1MCH3BN1N8YV>@GF.),X#/-<(^
XM3S/]7/H =(%.T%6Z07\!0CVEBW2&;F <^DZ7Z"B=HB_V;8[1\])&?^P\7;'[
XM= 50TH.Z7#?L+%TC$*.7'M.]^DR_*)KFIN=TS/[9)[O3">H)H+5O=J/.DX<L
XM5);=_!E=I^9/K;/9=49UUSZ[5,-<>:W+M33PIKR\G.(FEJ4.S"_Y["3F/#3L
XM>!M*@QZ4S[!2 -/=T^UM1[MLG@T:P O4!F><FV4CWJ?,L&D27:#"/AO,U);^
XM4:,(JH \L00V]IY'&OK/"2B_,,:XF;]A,]0[7N@!;:E.F(7(8$3/!UE(HD(T
XM*T#WJ*XIAE5UQPW7/;O+A>W>;KN[' 'OM6:\9WCS/FRFC7JG#@!>5],,^!Z-
XM4NE\#_$%:?5<=>&@WT<(?[\6_IV^"WB97. -11#50U#=TNI,N9!NTX980]W6
XM09GKX1.\SP>)@' T.K.8P"P+UL-"F6]( 6=K,<8(T\=2MB,&"5ZIEFD 0&5
XMNN7@.8_R]2,/LHS'P!T\>I0OZ/5CF^/3-;_F,P.;?_.)Q0M4V%0*Y,6'ZH;S
XM>+XK+@>U#L[%.59XZ^9<MA-US5!)C[I:S?')>,?7&M!0AC\#ED<:GL')Z &!
XMT.B7]Y",-[Y!IL@%)S PR47!/"8L$>+@B 6OXR&-') +VF$[G(&$^@: Q! %
XM6:B>/_@@5N_J=4,E_1+8?=)H=RS*W:G,A>>7Y1W=!/OS[N%-/(AO[^#HO4OB
XM#6'BS06*IT@J'K^S>*OEXAN%[ @#,3[$SW@"_[1^Z($_"PE^:V2/B0U=/:BJ
XMC"&'JU7FT(@ *P'+2XM7\PHEI% 5BJ]>J@OEE2BAKP@^?W)9UKV___< ?V$E
XMR]+B!DY+YFJ63!Z4S9H=(KB5*K6<6LB$<:5[YJ(MGTMTZ5K4Q;H<!G$YMM"6
XMN21;S 89D9=C,D;8RP>AZHB1@)6AU>#66 S*MR*91'S(B2WR(+Q()MDTZA+8
XML,L!-BU])[K!E_NFW_#+]E0\]64;$)BNP=,O^E!_(Q+FP+&>\^9Q-DW=-,HM
XM;8U'HN!^P[B;JMD"[ #37&)++6\W-7?4;U+F>]JB7P%P?]% ,541!!GE#H4;
XMC<HB-4HQ (^>>*,GP.QGLK?_.( FLQB:YF4QZ::]FC1+$]<W%TE3\+^G<U3T
XM14#H5=.XFDTG9X_<JQ4V,C7\0G^])TT0D,5(P![ &7W !1 <Q5]P2'2=-M%W
XM&F)79XF]HJ%K::)=$JK*?_XE$?I'?TL0:)X?](M^;D3ZN8V[69I?/Y,Y3;PM
XM,<>^T=?[W*9OFQKPD?:W0^!^^Y\A[A]NL9:XD;\(<#=\/T8(S7X6^!L_X3='
XM13/S(WY0+.*O/S;*)!=GO*2-\Z DA.D1U0H91E$,#&CY?#[,V)@H:> ,] !(
XM'CD7?_\O.).3G>2S6 ];G]#';-A_F03^5RV0 A@B: DG '!G^_W_W$; : ?
XM9SD1@&Z! <@ M@P)X -X '* #F#^]P'>?P]@!&C^W2557S)FRJE1J)Q54 #N
XM2_/=!D@"YG\FH/67 E8@4]T ,2R\@,J"YM< *H UX 2XFT1W4MWIM0)Z"2T@
XM7)(!PH!RQ C8 =* 0J -6,Q96MG=@Z?K\8!!( HX!29C5:"D,:SP@%1&YA(%
XMS@M:(!%HU9@%/-[IY>.I474>&+C>,6ZBV_06!0J!-^ Q9^K)!>5%H_=I2'68
XM'AT !DYZ;<@<8.D]&WU@3P4YE8$,GJ*7ZLUZ84&KI_4M@3U@Q! (#H*07J8G
XM4!V"4!^68;L-88E*E*:[,5M4VF5ER_UNN9QQ5PJ29>>98*"6N6TNR1WG9VD^
XMH!D()Y\]?K=:P2;Y56V4W]4FIV5MPMH$%GM98%[;Z@>V[6EB6XMFL9E[B%S
XM!Q&44._>K&29U4IFV6*A$= $.DU',+#(5 /+349#*8/<8#?H#>H57-W/\35]
XM=:A=82?2D75HGCN76J1UWQQ;Y];!=1Z=H+?2T77PG!F"U^EU&UT^]]>U-=6!
XM/R?5N0$!W4!7UAUVB9UDM]DU=/0<9E<0SG7NC'60T5UVGEUDQQ!V=G&=1 C:
XMJ7FBG4L'T\ETTEQJA]/I=/&@1>C: 741X5 W#SI,5H&W=^.M!6Z@UR<$3E%B
XM7Q4U/E!,0B#:]P:H?<9+,^7VZ0F$VQDU_=%];-3=!T=9?]@?3^@SS1I^GQT
XM^&4CWM^R5XXL"9@?#&@N((,$55XU4WB#S&!( ._)-/(>35->_15^A6!@ [!0
XM?04,4 /< -O@-Z@6KH5L(49 %:Y6[15@=14J@UFA2[ 5HE!>86+10IV%-8!8
XM2!9J!#? #+ 3I(5M86%H&+*%+TCSY!B0@],<F'?-&79I'C>G''AS:YV?1\Z9
XM<R&A23C2T8.1@5UW#]IS?)T^N#\ =B>#/]A5!83F8-Z0YBV$%^$[=S(DA"6A
XM9C?H578:W3VG$,9V(N%F1Q%FAK+A2=C2)1VD'4<(UMET'R%KEQL.>B1A1:@9
XMJH/=WONW$F8%+:$)"!,6?S(AV0=L6'\V(4Y()>B$8Y116$9)?VF4EU#WM5%X
XMQU X!V9_2.&YH11R?TSA\Q2..(6Q7U38 TZ%J5)\U6'15UCA1O"N-(,GU#,X
XM[_ED]AY?Z!?&2H"A'Q8#$(:'88*H(/Y[2$@:4"CL<P/A9;,:9G8&X:!7&;9U
XM?QX\"-DMAYSA@R#/.72@85^GSXV&_&"4(=@!A(1=A'C0X88<HFNXUSUTL6&%
XM>!+2AA"A<M@;;H:<'6PG#^*(OV%Y$!R:=ATA<;C:\88R(HZ8'!*)#*%]D!(Z
XMAPC>(\CUN83#7\3$?"@1QU]-Z"!P4<[?VL<=-GP](5CS$XJ'0:$;91Y"3NCA
XM;I 4+H6]GPCP_4&%X9]4B"K1%7_-K37JY(?1SGZH%3J#,XVM=%XI2C.!@/@6
XM_86*A?!E R"("V*A:"@:2YXAB+C7]74THFU((4Z$]9V/N!$"B6"=:J?3@0#)
XMX8[(TN6#?AV)&-C]<RBB0)@.(G8LXHW(V+V&>=UMJ"E2=IK#0^@HVHA%(DFG
XM(QZ'OF%&"!Q.BN/@:5?368K&88MX)&Z(IF)1UQP:>,\A3@<)4AE0HN04]E&'
XM5")->)=DAUEB3MCV=8>#&U<#'LY]8*+=)R;F?>>A=UAHF8GJ(9K8%/I(A5^;
XM.!^^B>?*Q35WH3C<8%T(T\1[T*"=Q2=2@SU-8A#4D%<W0$HP*/9[AV*_Z"^Z
XM2FC=9,CGN8,98A8#*S*$B2(]%R(^$HTB7_<@/H8BW818*L:*VUP"L =@!Z.=
XM$-/6"1!M0FF7*W:$O"*F^"BVAJHBK8@C-HP<78PX$<Z*+6*/N'+@BHNAKN@1
XM#HG (L7XVJF,K:&2^"QA?4H4='@L=GW2X;(X)5I1SJ)N BUZ4=*B!+835HO?
XMH4\8'II,86)YR"V2B=YBWQ<NLH=IXIJX'<B'82"Z6!#\-7)7 L4NTH7ZH4MS
XM)_:'>>*:YX=-@W[B6$@@_C2+!:'X+\Z-=".[8DK5)>A<]E P@@ '8VN8,.9U
XM"^,;Y!!:=K;AB*@BDHH3(T-H,6*,&J$XQS%R&\(A:A<R9HHFHSM7,K:(*./E
XM&"SFB#BC:^<R_H@?XW#(*R*)K>&O.#*Z=CJC2M@DLH0_8[((]A%_0^-,6/99
XMB7];M+@=3HM<HK7H-&*+4*.V*#42A75#U?@S78W;1_?G'JJ)\&&YZ)2(?U[C
XM"T!]T6J_A[<"\+F+=Z%_F!=.@Y5/GW@#W&0Z 66!+_H$P1*_6#>.C^1CN.(B
XM.HB&8XI2&&ASG:*$* .PC^DC]L,3P(^KHN'(@Z0H'L'3("A(!Y9'UZ ]*5*C
XMHF:PS[4&*0J8EPXF .]&.C@OJ(B:2\3HH3R0#Z0U-RI^=$GB #E*S'^.X4#8
XM0*J&'DI1%P[Z+H>C +D_I"CL(Q*B!A0*\6.MLR*RAIZC"# =QH[681N '5Z)
XMS1_2>#LJC=1BH61&>8E/XQKE.^)]P&.92 ><B5CCN/BR*8\ "?-(%09@,]A<
XMV U2CWAB5Z@GGE*J8$Y3+^H$/UFT$Q@*->5C%^E%=A8!XY[7#EJ&@%[?B#KN
XM<UZ!?U!ZC 6C1I>R_&D=D$+S,2DD5(@&@95!$DQ=#<U C<@*:D&*L!W$&Y3"
XMB? $+ &IX5@70J86SD%V8&74CVU 'O %=!%?P6V1 B0 \DO]:$XTCFW=7=,Q
XM1AEI2?^"1D89$^(G*08<DG6=/:@HYH-FY&:7 ""$J6(J.>@E )FC*WD2<HZR
XM)(ZX2AH8:4";H :T"6N 0K@JAH,%)&180A8H:@ (L +TDJ2C:[?/L8\9AG*
XM N22AN,NF>:! &O I5CD83\39.*8,^YSZP^$<SAJ!(N&;:%;1(HOH\<8,X*,
XMQ:$VB3J:CBSD9M<+*F._X'06F V#R5HQ^)*]?L1+[,=LS'[;0>W'^]U^[@@_
XM60;XDP!"FOC[T3?'R"&H+,*.$]/L:#%96GX;EH@T0G\[I.'60U9_W2+3^"UN
XM?\5C>]B##'[)(_BW/+J)B5_C=U"B?R+?^G<E6BR0A-H0_V$.]-^ \0,^@/N?
XM&D=+486.F,?C1+:+9:,)!2_^AQ#7#8!*T8OZ"A;9?+F-:*'X^$4NE4QE4Q!&
XM4H9]'H9X&;:3@YX"8+U@+_T@C)A,SG9/ [E0&DX9%R,2DDCVBIMC'Z YVHPB
XMY,A'6S@'T0.'X164+%?(:0 Q>#,(PB-VLG %9T >PK& >5T1S?!'SI%A 82P
XM'^0!Q8%P$-$9D,)D40=*!I NXM^(#]YSD^16^4JRDEIES:@XQI*2Y2RY&UJ6
XMK>$M&1E D](D,IE9XHC79*TS*HH%Q*0Q*5J>CIO=,ME'-9,Z"#2YSTF3[&,U
XM^3!N!<B@.J:+C8T\99UH-MJ%462\Z'QE:U9D44D#X 2314\C-S:5S&5S61$\
XME0,C&:DALI:#W@")'H@J+0"49]B1=0*)=GD.AGD<B'=9S8607678P4G2'6*E
XMU>)+5HX58P)@5M:2H5TGXLR) 1;#?34J"B]<AZ$0&6AT4L9C]TLJ .C$EH<=
XMB!4T1^>H&[*,FV-7]%GJDKSD6<D0<B6MHD;7)J@ _)4*\-"UC\&D XDX_I=E
XM26K9EJR6G*7G:#BV!JW,0# S9)@<9$/5&K0EHV1;4EG^DNRD.CG;E9+R'&79
XM)J",-4>(N=GIEV+!;2AC#GKD).AX3E:*Q6'[&%N,!EF!@6-:)I8_YDG(378(
XM[ ,VF5C>C/"EFK?YY7ZTW^Y74 *4^Z3N9_L=CR<EJ#('1HE45+/H4.HFRE]5
XM(U$^?]YB]+<[5@O4'\J442YZVI^X>#QJC64 UQ@#DG^0$_ 7M:B4<P)+^?X-
XMF/+?+P0[U'\@H )84SIU-V5]J%L>/;O8H$!P3(\])7_X4UZ/<)>N9!/@*QR!
XM3" 8F(5<I',I:HZ:%$%N29$];7(/G=AI^I1<H7"YB+T$KA11F1CTA?R44"G
XM+9>D9J[)5#X9DI35$I$4E@X"#%!EIA8) )B02 ::PR9T.49*E67D:,G2J1;L
XMX%K'+8ASS::..>A5&-K;N"$"<)(B@(%Y;9Z!PD%A0 ?QC<-F:D$G?!MHP<K"
XMZ+TAU*25L(R0AB! $G "* OF!;5@;9Z$(\"Y"6RT!E>(@U @5#5U0&4@UC0*
XMR4NE(C[LFP=&'@ @W %4Y2S)$J!UL\&XX6WBF_P)N9EL2@C'IB$!2-0J>\ZP
XMF0", "-#LC%QXH@0Y^@P&W"2T,'(^6PZ&")GLEEQA@$()EJ9,8H .\ .(-CL
XM %R 6H).KG869\.)(X:#[N;;H&;"0T=.'CE1?"'+PI81(V0TT@?F0!T$D,IF
XM&:"/'!]99;)I*(B14F<F075RDL,F" !M"HS.P=3Y57:=(\ MB76*G57GO4ER
XMB@5)PH"G<FYS(T#+<;BE =6!LM#JD0?!A;'0S<1 IX%YP3$9&6& AD!=XINS
XM0FO!;=1X>L$,X (HGC7 7J!UE O;@880%OP$,T .T&WZG.X<6N<<&!@BP%GC
XMA>@(IPP"DG\<&&+!YJD69 >&9NE!5#4A792<PA+\DIT&;E 5(!]TYV2S%]
XM9">8D+3,GG_$@L!Q*@[EIFJ1Y&4T)H19X",D<'5 K.%L%G4TYEUG8PJ.P@'A
XM&!K2'6HG2]<@^IB_)/19/PPM;^>[47OB'9&(@]D:N@8%"LU)<W:?,>9_"7%>
XM&3$G0[C/@0G! 1V@>_(&_<$L\QGT$4FG>X''[ C$0U."6&J8J07+:0:TG]OD
XM_E!C% :J@\P 8FP8V,=A.66. (ED1/*"R"^)83A88T 7">A8L(!R+%:' PJ
XM0J"^II4Q@=8E(V@"4(&BD7'(,11<Q ?F11W012E@%YK(, =\>0]H!"J"*G3D
XM2_F"2(:@U $0$@9P 5R & "$3AETX!:( QJ!*)\;6.7-E%"@0ODW&:'''!*J
XM T8&5IVTIP1R?4V@#/@$0H!C)M4'A:H=NIX5^ 5"@EF@%VH&=H'6':7A!HJ!
XM$0P9:(8F@G<@+KCH_7C=F^:@A,IP/U!NN9FY9:FFJFDG I=HHQ0I+VZ/TV"^
XM<D7. #= K1E9X)JZ9B-:/NYS1L !(1=, 5P!=Q$%\*%]7B5*!P !]43/X ;T
XM-"[ V$%2N #JQAOA IP!;X =@!D&D/M<#F$Y?$V>P\PP/"@C'9-P\-X1'PT#
XMJL& QE,:!L<B7I8?D>$^9R?<40'(RU R21]BPY@@):8.MM3$XB"H >U!9! $
XM. %30*;PBYIUP*0M)3:(&+C"DF 5= ]")VPPJG '<T0;05=R"OYF,[H=7*.'
XM73@X<#(.4\#%$&M0$W2D.OH+H0 ]0F1)@P*@ZZ 9<&Q" 5+ $X"X=)\C@+%I
XMM8 *E ^@00I (H 7I&[@],S(Q@@P)3.8(;<!I,H]4HKK"-&AC!@C=*;D*=
XM&.=!^@5\ ;H#$3 $C*0$Z42*D :DB L*@ <\$GB R]EE.*2;'0BJ2%('"6E+
XM^I+:&/KHX$ER-J3=9SAX!%P1,I\Y"ELRH,/H8Q" +"TQQJ>01A0(;L ^FF*&
XM@WT#>>!7CBI=0KAG>> 1'>EV( >@<P%D\]E]KJ0**0KP3#9V"J/V61OR=5M
XM%Y "@(0^J3K8BOHL;Q@5&@8L#!X-#ZI']J+OGQQD2/124BDPFGF&I+/!2%J2
XMGJ1?0/?9?)ZEJ*)>5]EM=&UI3PI[\B<TZ:"WF)Z2D.6P25F*GZ[=8WK/M:6<
XM:4T*E Z;FV5<BA$&F3 =$F#:70%$)LUHFE*9R^?/N(0FFB5@%_J$FH$Y8 A1
XMA9895VCFEX4RH5RH$VH\G:%AJ!>HAI*AMNEPRN"AH1#><7KXU8!NZ&T*AUXU
XM:6 "M@9Z"6V@;(J'PD"Y92S(9Q0_3V2E>39>FE/D1C"R%:)^V'%)L.2+^AY-
XMP(@ZHO#IW&B!IJ!NT@IZ&8%P+UP0]QD$IMCH/G<?Y >#)6I0'FB@X=X, I9.
XMF8U,A%F=<!LO",V9H Z.D<%L4H*R! WJ#O"@1I\1@X2JT,DO%.J&6I=TJ+N&
XM@]H01I__'8/JH8*0(,"$JA&HJ"FJ0B>B5G;+B(:Z:W"H*^J)"J(. 1+,3O=?
XM5G;>@HPZ!-"H+>J,"H1^J#5JB&JACJCUPVG@HY(O(@!IZ( $G$;&G9!SOJ@1
XMIAY0?@*A-.?KR5[BC:]I.!B1SAX\*'V1<(( &&FF$"QLI%%FDN"1\J?M*,1Y
XM;!JF5(!)BI+&=;DED(:A28\!'Q09B+J:B]B_!A;>/<+7P.(K"94SE%(9GQZJ
XMXV,X*(S%H/RC\8+E"1IDP'8 '9P-<X.=9[44#O7G D('L*G>EW10M.P(/<*/
XM$"2X "8=8\G5<8B>958IOXR50>D^=S]D$(%"L[" 1@D.@IF'H*:J**=ZV756
XMJ!=J_1"CFJ@S*I$:I/ZHPFJ#6I?HJ%LJDJH"]*C *K&*HDZ@0^JSZJ(>J96=
XMDMJL,JE.*LD!!T2I8\"42JU6J5=JSHE"CH@M8FSJI0(1$FF8FE1!"!<I-6JF
XM:J/Z 4=JCQJ6[&ADZ*:*I"1IG(J8>G:Y99'& )UI>*J_IZ>2IXQ:669%[GLI
XMP9VU/=Z:ABJBZK#ZB_O<:U4>U JO![%P&DP!&H+!\ 3X#5> F>8 ]7G*"!!0
XM(&@:S,%_T"J4 09CO:H.>ITJZ1(P/)0!N*$!XD=H>4IFDX'.:89XH^KUJN8/
XM[*8A83IYH%/I#GJ3[B6IAN'H'4 ')&:7@+-0!^PC$Y LB '59U&W8_*JRNJO
XM*@*PJ%BKBWJL=JD\:OF9M0JI0"K56JUZK3AHSIFM?@G;*J/7K5Y_W^K@:*7.
XM)ECJN/I+FJNM*+H*IMZD8BJ[2J:ZJQIIO)JF*@E>Z4?Z@!*F( "<*J<FIG1J
XMJO2M'3@!*Z7I6[*:>&%Y.A,(<&SC]K@]Z@2"X62Q/;ZG#VOGVA;.IY^"5U B
XMT $\3F TNQFC=X;_)GF0=2S":;"S/C$D#8*09U@A8LU&4A^$>5A>GJ'OD'4D
XM M4ID."?%R2U\"J$>;VK-XE_%@9SP(DAXKP;O*OP<A0=K[>,&.# -*^^:T2"
XM?_IMPXG T!9H!" DZ]K6."">AL@ 'GP%O %95\'T#(9#$P.K;GMYI.>9-N"?
XMT,7N&ADJ --JKZH"6*M7:]G:I'ZOVBJWZJW:KV\KMQ&W:JGE:M2:5GZIH(&Z
XM.B3HK65JW\J-=J6_$)MJKQ*NANN^FKC2%2P;)+86#JRM)E#9$U06+=1C\:\0
XMEUID8,BY>JXHK#<8=4:5[Z /L Z"G=)FA$!MEG.2(=;);8 L;]TYPM61==72
XMK(;#UG,5G];"M4P77\MUP?&12]R%V0+RN7G7"'C)P6@TQM]YD!YT"(B$.4K
XMQ ='PAAF/1P'8=YK%534"BJ'C3$$/!+=DD<P!.@YD5ZK-_\Q >42#X"V $\
XMHQ#55' ++4#5X0(X!RYLF&<$" 'QYK>G1(T:A)008"#,!"I!'U4%1 @^U+4
XM&X 2P 3H,^! $1 )346^BN,K&K@'EQHT4)'TT<-I>">16K-D75,3!\R(Q@0
XMA%+*8 ;T+#I"H3!70J4GRT" '56L9,/)$"Z\ )$&'B,A)$S[@[QAD-JB,=-9
XML)72#$> $U %@ !#:<R74$$!+JC8,&4P 9,">7#D?0;" GKA&4 GZX'W2AU$
XMHH32%" ;H++7@=%@;(9[B .A!(W0%J<"%) %) %.P!'0\$4/U\'7\2'8#O4#
XM* M$O*\U$W# ERI>4X3H4"BM"P*%DE8I_%NWZ_[ 1!0D/4.:8!V8#BH+F9HB
XM- IR1EB0O(P:$BE]H^0%$1!"S,?%[@]! -_@&,1 84&O4"M$&644E2 VQ!J>
XM@X!P9(BBLH:2 97&?!9JF->Z&B\H@]<Q&J"TT %^28_R!Z=!"4%C, XM8(;W
XMR<ZO :;!F71\ ;_%;X "0"'50C71)N2L#5%64"V@%TOM.;=(.;6-08 1U:*H
XM2"UB-1E>M5/MS+"3<+5-;=Z6MC*U:BG.H&ZD!R]'^($"!+4YAD8H I0 .( M
XM ]?*M7$M=##7VK5U+0APU^JU<X!J5Q_X+DJMV)' 6;5:[7+0)GRULDV;8-;"
XM$3J=XX%L&!C'T!> ,^"C$>9BB]9R=C?'5?F]J #F1$O+8Y(41ZI&8$X4*&6!
XMZ( "6+9<E0@@IS2V9<EL<-I6!B&>,$N]U!SHB,YTVIHRC*UGJQ&0%+Q+#.#9
XM<B*!0I=!=^ I*$ 1P(T\$FOM&[#EM;6WH@B0U0EBO*(V(HRZ22,>/11?&@I=
XM@DZRTE8%KZUBB]NBM;KM%7),H !Y0![P1\X==-#+X9*$M\E&<7O<VAAL+6KJ
XMW")9X%ATVQ(DM\LM=K <0 FO+6O+$O"V;0D3@#1\ 3K3T')SQ!^[[:71T8"V
XMCFUC:0\^G[3AHIC6WAPVK8$7&[AZX4)HRV/J=:,527&[)A9WC1G !E0+R<U2
XMZY*@ 2(NB7ME?+@M 5G U20WGFU6JX/I(XO3@@H#F+@NR8R;@7P!5DB)NT#F
XMN(,5CSMR? %W0/=1696X%=:,2W]H'&Y'C[OB)KE!+J6SWK"X+<&,&Z>T1.N-
XMAAM.4@=FZ931EE :I0&0\!DNBAVC')'3/1*(B="AW@I2MX8'@8_2MHN(*X-W
XME $GP/::6*P *X!Q"R"$MX65G-%+:B.(!MZ!!M2YHQ6>B^*.N'RN#^'GAK>)
XMI() !]BY+0&>&^(BNMH(<-O>.G3T7<_A<SB"I01]A^GR 3['I'L&P+DL 7Y+
XM!J0 E^2M*,YIDMR&A,?7HAO>';"W)&AXPUZ'UP7XM?5#/AC>FKJH;L:XZJH/
XM':.Q1]^Y=XP#B?<BV+>E+EN;ZDJ*OZX<$.RZ)"=>6Y+BW7> 1HO'ULQ8-@.R
XMN]MZN?3(;TOA"K?AAVBK)Z A0*G"R_P "]BN8OAD@%X+JE[^W&[D>UD"YF:
XMNV2 6YKHMK< ;G)#VZZ2KNVA.^H.MR DKSMSWG:EV>EJLQ%;NYVZUMLM"=%M
XMP,O6#KR?(&7%NU5IHZ#0UO!J! *O6WO<U6NEX,4;':2X66[[F!6<" 5)H]#3
XMHBA,:\7X="0 Q A1B[(8#O@+C6MUM DGZ8X[\]X-0BZK0>0:N0 /6-L2G*1+
XMKG*0\VH2."^E0_-^(G! *'(6 0ID+4LP[ZZ[]FY=HN2N<$>82[("M"5 +]5K
XMX"8 .JZ),O067BS!U8OSVKR"D]0;Y%H=.V\C)?:>I&AOD;N16*A<;Y ;]#:Y
XMOYU&L/8R*$SNUPOWSKA2KM6+]>HDM\_>&^1>N3]/I/OW$K[Q$-R+Y[JX+T*B
XM"]QJ!(^O:X+-N"Q9S#@9[KJ,+B_Z:M1.O35NTQ#DDKVLAL_KSWZ]::^KX_GB
XM47BOT#OS-KU\[^US^NX'2*_2^P=UC#K8:E?I'K@WAV@@?RZX#YWC 0I.O*+@
XM<'?+%7<<;W$WA;5J)1NL)K>-&XMKIA:U07ZV(-5VL*U;:-@NN(9I;<.:PU:L
XMJ7Y9%S%HAQF#U!AUI;B.;TJ96LC!1JZ$G%E8N=H$QZ4U6!;"!"=L"BO_ GR@
XMJU<#V62@+T:!:H5L<=-1%[?T!J.Y; ,"([2=)\@+>AYH#F2 Y\#6T#)RKMUP
XM=TQY!L(1P3BX<]?D@)K_,J "24-[(N"?6H9Z -G(I?M#1M,:Z& G G&"_VZ@
XMNH% DGFJI*T!&:"#OI]'GGCK*2BO JH"JO]&)"NP7MH"ER_9"0R<=2P:,S"/
XMH']:P"BP5J "PYTL,&@@OX2#(K ,?!\(P34P@8H!1R1Y1J/036(?.?#0N@/7
XM)03$' #3<9N7HOS2!7_!4@;/J8,JLR ,^LC<!BU530K-H@,](4U"P)@L]2!
XM-GO*MAS7;",A.ZP%YAX<*+D-0;WEJFEI=K"8IF X5'*/-UF@VGSEBSA!_#O_
XM/L(X5)$7 >\(6D&2I],N>>F"P@<ML:-2WF@P"3,;V\P>F.7M!P*F]_:5<L)A
XM7GPPYGD*/2<G'$#F>7 >"1!MLK %8Y/Y<YK 78$4S('BP$BP#JP$IY5-,!#\
XM!/=2)_ -;&5DP53P+]P#A\ QL#"<O$+!Q? 4? SWPEKP+XQ ^L!ZAC-, T?#
XMN["5404S#E<PQX$,>\/6\!B\;9;!83 7/"QXP>=P)UDHG,&30AK<S++!2XL;
XM/,U2I'(P'0P"V,'<;![\S6X8?;!\$P<"PF3CXSH(H[^R&.8%%L8$/<W=$T,Q
XMPOP>)"P1;[ :P0I+,$Z5YBH0D%92>:2G);Q_8,(7S,+W*620*7!$,FZ@ .-D
XM?!!4.89%'2S,YLG","PM/%7^E[@P$6P,I[Q":S+L @/#S7!G$ 03P[GP!=P-
XMX\0VJ4[, R<HV'!KH U#PT%Q$7P4C<-9QTY\#3/#/[!// P/P3:P-%Q;6<%0
XM)A9,#1O%ZK!1VPZ;P6$Q.PP&O\.: 1JL!CNS;7 R>P_'P2XMXZ /\\-X\!RL
XM!X=[ 7$TQ+QI<-_@^6L]2JY@8>7:%_Z);^/ O\VK!-Q8IQ#4:532"#(;KX&
XM64<U41VX-?M6'M0HL'E\I3=3O=9A*<,58I7*&Q/"<Q R'47GP9J7&><<YP$L
XM8O2^6PF"=I#0.IUN1IOP\VZ7=I2+X;S^KGG&D5D"+0MI#<T BQ22JL+]>'V@
XM":E$%0'&H@&1P4Z76*!Y/$A,:P5F'Y6!2C)E=*!2[6P,@%9V"ZH(0'EFJ9TB
XMAP@4V\1:\=+"%7\*XO!73 Y+Q>;P64R^E,5DL#N\'BL :O$\_,S."6XQ'#Q,
XMY<.6$UU,)7BSX0)>G"I5;]%;032Y.:Z"\'A*"$NN:X[V.!B[C3C-I_D3.,**
XM<81LU(@7^\/=X1B/&9"QGB$9PTP:DPEV&9O&M+%#=1M_6IUQFO$9%Q"*@[B0
XM1PHDI3$^=1IS3>FH#+(:@\;OK,< &X\0LC%+D!DW"EJG\9H;"TB("&^,RYBC
XMO[$&F8L,QV^D]'$<)\?HW'(,&3;'_>=SK*T6M@9J=:PC3YG8<?FY'<NM[.5W
XMG!4/Q>(Q.-P5E\<Y\7DL!J_#[3%9S/*BR6-Q.@P?Q\-K,3V<9]C#]G$U&Q=?
XML_GQ-EL7\\=[<%?P'YN%Y]M<Y(?^EN_B@>Q/G6,*\H XJ,8 PN$+"$_R@U+
XM.-@:!%#H3AXY(\A!O4P6D53Y1!'B_%H4WZ#_QWE9OC@()O+Y@"*+QBMR1-(B
XMIU(O\K*@&KN^K+'/2CS8R%A(;.PD?Y=6DVV\&5,'^*=N'!()R;D,,RJ# ,=4
XM@' L@Q#'I0AMD/\AQ]5&DVP=JX90<F<L:4#'5#)UC*(2RY%AECR;;,D$;+#H
XM)>O");$W;+*$PV,#5*QGH,=LLGI\)HO%ZG):#"?+QVVQ-%LGX[(TPURL)^_'
XM=S% _"?K16T ^1:>&L0&,D+LDJBG@K&BW%>\! 4+8@PI+\Q'S94LT@5UB6'$
XM"AD:'A*B,'$IBPEQ D4:*+0.#K-JZ'/L5J2,1%L:. C@@JKA@4# Q*=TP(.@
XM>3Z'0"+6!*\S@[5KCG+*M$S:829TS,"HX>%'R$(>PQ-@+H0'_ $7BRW['+<M
XM;8$ *\!G2NG!(4-+IUT9\7)$C-$RR:Q\4,O2<95\+8>0VC*WP2UWQ]XR5@PN
XM&\%4\+@\)I?+YG%4O"Z;Q>@P6KPFL\MI\WL<'Z_!\S&=3,W2RXV"O7P'X\O_
XM,!_\)P]PLM&@#+G^Q6O>3;;^!C5O4;Y7(,:-"C/#K#BO-)+RGM%#M@;_D3J8
XM-;?#8N;%#">H&Q;KQER[X,Q5P\=,P(3,5L;(_"!8I&@6RBP!YVX18LL<D;S,
XM D-P(3/3##2S&&$S:Q"<L]Z@,^L9/+-&X#.#![*$T)PZVQCOJ[: -$,'G;$P
XM\3K$(0]M7@,U.[U1\K0\)5?-UO*M/)5.SELSN=HU1\%"<;B\%8O)Y#'97":;
XMS>QQFZPVI\=M,SR\S,++]7!]/#?CQ]GLO=S-YLMZ,UV!P<5&KYO??! #SN.5
XMP4H3I*>"H>*S" M?!V+BO#@/T E+X_S B360,]5;*,1!( 9."TFH!PD(H]H@
XMD,QZJ^2LH):?G&09$*WVFF: N_%O/= 3].AL,IL=IG,;L3)/S$<1ZYRZ/K74
XMWK6K.8?"'\?-/#0O+01D_F0<Z,X_<^]\0D>,1'/PO#D,SV]#^QHS.:5F@=/<
XMV$#+S+.T/#4_SSF(U2P]"Z:LXN"8'5?/J^*WG#V#S>*R7SDV9Q+F\A:\-J/-
XM[O'9G":[R6\S6YP^R\OK\YT\!^?)=_/[G#?[R?+S#.<A"<J!\!]:* O,"=E>
XMN+">!(;HP2P2.,H$="#=61C0^"D0EU Y&!JSBV1!2]$8M)3A=XK0\^ODG$%O
XMT EL!ZT ?- B\QT#25LA)321L$-[S"FT&@4SL]#[78.A$LO.[H,,_3O_R+DS
XM"+ [ \W4T">=,P//Q\31_#D$T<;S$$V%%M'*,Q(-933/2S3:6BV/',YR[9PM
XM7]#;,F7!'5O/%*,5[10+)-\P=4 N<]%E\[DL1HO/Z_$7/4:CQ6_R^0PWQ\MO
XM<!IM@,K%;'0_;!>_T>7!?YS$&7%T]+_G%Z>-2UMC(6LFHGY%7Y$OAH^"=#[-
XML#3.*4HY(0=I-)C.OI5(]W#JX*>L'M0!U0(*^BEP"-%G=CQ)TZB)I <]7(#0
XMHG/)7#I[PBDSZLPRA])>PBAM1I72C$/L'+O2SC,T*VU#]\PY=- L2W?.M+31
XM+#S?TL4S/W@\$]&P1B\-C$;-4K(P#3T3TU8RMGS1(=-:LS+-)7O'7O,5?11%
XMTXW!%ET&=-'E<+I</H?/[7(W+0]_TV=T.(T/J]%VLSG-)X=[^G17[55_U6!U
XC6)T@!L3W$.=PO?6A JMX"H@2K&O>4-DV_H4.<J@I5L_5F@5[
X
Xend
SHAR_EOF
chmod 0644 t-dir.tar.Z.uu ||


echo 'restore of t-dir.tar.Z.uu failed'

Wc_c="`wc -c < 't-dir.tar.Z.uu'`"
test 29900 -eq "$Wc_c" ||
echo 't-dir.tar.Z.uu: original size 29900, current size' "$Wc_c"
fi

0 new messages