mirror of
https://git.savannah.gnu.org/git/gperf.git
synced 2025-12-02 13:09:22 +00:00
Initial revision
This commit is contained in:
249
COPYING
Normal file
249
COPYING
Normal file
@@ -0,0 +1,249 @@
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 1, February 1989
|
||||
|
||||
Copyright (C) 1989 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The license agreements of most software companies try to keep users
|
||||
at the mercy of those companies. By contrast, our General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. The
|
||||
General Public License applies to the Free Software Foundation's
|
||||
software and to any other program whose authors commit to using it.
|
||||
You can use it for your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Specifically, the General Public License is designed to make
|
||||
sure that you have the freedom to give away or sell copies of free
|
||||
software, that you receive source code or can get it if you want it,
|
||||
that you can change the software or use pieces of it in new free
|
||||
programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of a such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must tell them their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any program or other work which
|
||||
contains a notice placed by the copyright holder saying it may be
|
||||
distributed under the terms of this General Public License. The
|
||||
"Program", below, refers to any such program or work, and a "work based
|
||||
on the Program" means either the Program or any work containing the
|
||||
Program or a portion of it, either verbatim or with modifications. Each
|
||||
licensee is addressed as "you".
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and
|
||||
disclaimer of warranty; keep intact all the notices that refer to this
|
||||
General Public License and to the absence of any warranty; and give any
|
||||
other recipients of the Program a copy of this General Public License
|
||||
along with the Program. You may charge a fee for the physical act of
|
||||
transferring a copy.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of
|
||||
it, and copy and distribute such modifications under the terms of Paragraph
|
||||
1 above, provided that you also do the following:
|
||||
|
||||
a) cause the modified files to carry prominent notices stating that
|
||||
you changed the files and the date of any change; and
|
||||
|
||||
b) cause the whole of any work that you distribute or publish, that
|
||||
in whole or in part contains the Program or any part thereof, either
|
||||
with or without modifications, to be licensed at no charge to all
|
||||
third parties under the terms of this General Public License (except
|
||||
that you may choose to grant warranty protection to some or all
|
||||
third parties, at your option).
|
||||
|
||||
c) If the modified program normally reads commands interactively when
|
||||
run, you must cause it, when started running for such interactive use
|
||||
in the simplest and most usual way, to print or display an
|
||||
announcement including an appropriate copyright notice and a notice
|
||||
that there is no warranty (or else, saying that you provide a
|
||||
warranty) and that users may redistribute the program under these
|
||||
conditions, and telling the user how to view a copy of this General
|
||||
Public License.
|
||||
|
||||
d) You may charge a fee for the physical act of transferring a
|
||||
copy, and you may at your option offer warranty protection in
|
||||
exchange for a fee.
|
||||
|
||||
Mere aggregation of another independent work with the Program (or its
|
||||
derivative) on a volume of a storage or distribution medium does not bring
|
||||
the other work under the scope of these terms.
|
||||
|
||||
3. You may copy and distribute the Program (or a portion or derivative of
|
||||
it, under Paragraph 2) in object code or executable form under the terms of
|
||||
Paragraphs 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
b) accompany it with a written offer, valid for at least three
|
||||
years, to give any third party free (except for a nominal charge
|
||||
for the cost of distribution) a complete machine-readable copy of the
|
||||
corresponding source code, to be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
c) accompany it with the information you received as to where the
|
||||
corresponding source code may be obtained. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form alone.)
|
||||
|
||||
Source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable file, complete source code means
|
||||
all the source code for all modules it contains; but, as a special
|
||||
exception, it need not include source code for modules which are standard
|
||||
libraries that accompany the operating system on which the executable
|
||||
file runs, or for standard header files or definitions files that
|
||||
accompany that operating system.
|
||||
|
||||
4. You may not copy, modify, sublicense, distribute or transfer the
|
||||
Program except as expressly provided under this General Public License.
|
||||
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
|
||||
the Program is void, and will automatically terminate your rights to use
|
||||
the Program under this License. However, parties who have received
|
||||
copies, or rights to use copies, from you under this General Public
|
||||
License will not have their licenses terminated so long as such parties
|
||||
remain in full compliance.
|
||||
|
||||
5. By copying, distributing or modifying the Program (or any work based
|
||||
on the Program) you indicate your acceptance of this license to do so,
|
||||
and all its terms and conditions.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the original
|
||||
licensor to copy, distribute or modify the Program subject to these
|
||||
terms and conditions. You may not impose any further restrictions on the
|
||||
recipients' exercise of the rights granted herein.
|
||||
|
||||
7. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of the license which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
the license, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
8. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to humanity, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19xx name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the
|
||||
appropriate parts of the General Public License. Of course, the
|
||||
commands you use may be called something other than `show w' and `show
|
||||
c'; they could even be mouse-clicks or menu items--whatever suits your
|
||||
program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
program `Gnomovision' (a program to direct compilers to make passes
|
||||
at assemblers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
181
INSTALL
Normal file
181
INSTALL
Normal file
@@ -0,0 +1,181 @@
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
These are generic installation instructions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, a file
|
||||
`config.cache' that saves the results of its tests to speed up
|
||||
reconfiguring, and a file `config.log' containing compiler output
|
||||
(useful mainly for debugging `configure').
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If at some point `config.cache'
|
||||
contains results you don't want to keep, you may remove or edit it.
|
||||
|
||||
The file `configure.in' is used to create `configure' by a program
|
||||
called `autoconf'. You only need `configure.in' if you want to change
|
||||
it or regenerate `configure' using a newer version of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system. If you're
|
||||
using `csh' on an old version of System V, you might need to type
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
|
||||
Running `configure' takes awhile. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. You can give `configure'
|
||||
initial values for variables by setting them in the environment. Using
|
||||
a Bourne-compatible shell, you can do that on the command line like
|
||||
this:
|
||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
||||
|
||||
Or on systems that have the `env' program, you can do it like this:
|
||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
If you have to use a `make' that does not supports the `VPATH'
|
||||
variable, you have to compile the package for one architecture at a time
|
||||
in the source code directory. After you have installed the package for
|
||||
one architecture, use `make distclean' before reconfiguring for another
|
||||
architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=PATH' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' can not figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it can not guess the host type, give it the
|
||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name with three fields:
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the host type.
|
||||
|
||||
If you are building compiler tools for cross-compiling, you can also
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for and the `--build=TYPE' option to select the type of
|
||||
system on which you are compiling the package.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Operation Controls
|
||||
==================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Use and save the results of the tests in FILE instead of
|
||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
||||
debugging `configure'.
|
||||
|
||||
`--help'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made.
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--version'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options.
|
||||
|
||||
35
Makefile.devel
Normal file
35
Makefile.devel
Normal file
@@ -0,0 +1,35 @@
|
||||
# This is the developer's makefile, not the user's makefile.
|
||||
# Don't use it unless you know exactly what you do!
|
||||
|
||||
SHELL = /bin/sh
|
||||
MAKE = make
|
||||
|
||||
all : configures src/config.h.in
|
||||
|
||||
CONFIGURES = configure lib/configure src/configure tests/configure doc/configure
|
||||
|
||||
configures : $(CONFIGURES)
|
||||
|
||||
configure : configure.in aclocal.m4
|
||||
autoconf -l .
|
||||
|
||||
lib/configure : lib/configure.in aclocal.m4
|
||||
cd lib && autoconf -l ..
|
||||
|
||||
src/configure : src/configure.in aclocal.m4
|
||||
cd src && autoconf -l ..
|
||||
|
||||
tests/configure : tests/configure.in aclocal.m4
|
||||
cd tests && autoconf -l ..
|
||||
|
||||
doc/configure : doc/configure.in aclocal.m4
|
||||
cd doc && autoconf -l ..
|
||||
|
||||
check-configures : $(CONFIGURES)
|
||||
set -e; for f in $(CONFIGURES); do bash -x -n $$f; done
|
||||
|
||||
src/config.h.in : src/configure.in aclocal.m4
|
||||
cd src && autoheader -l ..
|
||||
|
||||
force :
|
||||
|
||||
62
Makefile.in
Normal file
62
Makefile.in
Normal file
@@ -0,0 +1,62 @@
|
||||
# Makefile for gperf
|
||||
|
||||
# Copyright (C) 1989, 1992, 1993, 1998 Free Software Foundation, Inc.
|
||||
# written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
#
|
||||
# This file is part of GNU GPERF.
|
||||
#
|
||||
# GNU GPERF is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 1, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GPERF is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU GPERF; see the file COPYING. If not, write to
|
||||
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
|
||||
# Programs used by "make":
|
||||
RM = rm -f
|
||||
@SET_MAKE@
|
||||
|
||||
#### End of system configuration section. ####
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
all : force
|
||||
cd @subdir@; $(MAKE) all
|
||||
|
||||
install : force
|
||||
cd @subdir@; $(MAKE) install
|
||||
|
||||
installdirs : force
|
||||
cd @subdir@; $(MAKE) installdirs
|
||||
|
||||
uninstall : force
|
||||
cd @subdir@; $(MAKE) uninstall
|
||||
|
||||
check : force
|
||||
cd @subdir@; $(MAKE) check
|
||||
|
||||
mostlyclean : force
|
||||
cd @subdir@; $(MAKE) mostlyclean
|
||||
|
||||
clean : force
|
||||
cd @subdir@; $(MAKE) clean
|
||||
|
||||
distclean : force
|
||||
cd @subdir@; if test -f Makefile; then $(MAKE) distclean; fi
|
||||
$(RM) config.status config.log config.cache Makefile
|
||||
|
||||
maintainer-clean : force
|
||||
cd @subdir@; if test -f Makefile; then $(MAKE) maintainer-clean; fi
|
||||
$(RM) config.status config.log config.cache Makefile
|
||||
|
||||
force :
|
||||
|
||||
11
NEWS
Normal file
11
NEWS
Normal file
@@ -0,0 +1,11 @@
|
||||
New in 2.7:
|
||||
|
||||
* gperf is now a stand-alone package, untied from libg++.
|
||||
* Autoconfiguring.
|
||||
* Removed the "-a" and "-g" options, extended the "-L" option instead.
|
||||
* Removed the "-p" option, it is the default.
|
||||
* Added long options ("--help", "--version" etc.).
|
||||
* 8-bit cleanliness is now the default; use "-7" to get the old behaviour.
|
||||
* Compiles with any C++ compiler.
|
||||
* Numerous small improvements.
|
||||
|
||||
24
README
Normal file
24
README
Normal file
@@ -0,0 +1,24 @@
|
||||
While teaching a data structures course at University of California,
|
||||
Irvine, I developed a program called GPERF that generates perfect hash
|
||||
functions for sets of key words. A perfect hash function is simply:
|
||||
|
||||
A hash function and a data structure that allows
|
||||
recognition of a key word in a set of words using
|
||||
exactly 1 probe into the data structure.
|
||||
|
||||
The gperf.texinfo file explains how the program works, the form of the
|
||||
input, what options are available, and hints on choosing the best
|
||||
options for particular key word sets. The texinfo file is readable
|
||||
both via the GNU emacs `info' command, and is also suitable for
|
||||
typesetting with TeX.
|
||||
|
||||
The enclosed Makefile creates the executable program ``gperf'' and
|
||||
also runs some tests.
|
||||
|
||||
Output from the GPERF program is used to recognize reserved words in
|
||||
the GNU C, GNU C++, and GNU Pascal compilers, as well as with the GNU
|
||||
indent program.
|
||||
|
||||
Happy hacking!
|
||||
|
||||
Douglas C. Schmidt
|
||||
4
acconfig.h
Normal file
4
acconfig.h
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
/* Define if the C++ compiler supports "throw ()" declarations. */
|
||||
#undef HAVE_THROW_DECL
|
||||
|
||||
71
aclocal.m4
vendored
Normal file
71
aclocal.m4
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
AC_PREREQ(2.12)
|
||||
|
||||
AC_DEFUN(CL_PROG_RANLIB, [AC_CHECK_PROG(RANLIB, ranlib, ranlib, true)])
|
||||
|
||||
AC_DEFUN(CL_PROG_INSTALL,
|
||||
[dnl This is mostly copied from AC_PROG_INSTALL.
|
||||
# Find a good install program. We prefer a C program (faster),
|
||||
# so one script is as good as another. But avoid the broken or
|
||||
# incompatible versions:
|
||||
# SysV /etc/install, /usr/sbin/install
|
||||
# SunOS /usr/etc/install
|
||||
# IRIX /sbin/install
|
||||
# AIX /bin/install
|
||||
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
|
||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||
# ./install, which can be erroneously created by make from ./install.sh.
|
||||
AC_MSG_CHECKING(for a BSD compatible install)
|
||||
if test -z "$INSTALL"; then
|
||||
AC_CACHE_VAL(cl_cv_path_install,
|
||||
[ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH; do
|
||||
# Account for people who put trailing slashes in PATH elements.
|
||||
case "$ac_dir/" in
|
||||
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
|
||||
*)
|
||||
# OSF1 and SCO ODT 3.0 have their own names for install.
|
||||
for ac_prog in ginstall installbsd scoinst install; do
|
||||
if test -f $ac_dir/$ac_prog; then
|
||||
if test $ac_prog = install &&
|
||||
grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
|
||||
# AIX install. It has an incompatible calling convention.
|
||||
# OSF/1 installbsd also uses dspmsg, but is usable.
|
||||
:
|
||||
else
|
||||
if test $ac_prog = installbsd &&
|
||||
grep src/bos $ac_dir/$ac_prog >/dev/null 2>&1; then
|
||||
# AIX installbsd doesn't work without option "-g".
|
||||
:
|
||||
else
|
||||
ac_cv_path_install="$ac_dir/$ac_prog -c"
|
||||
break 2
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
;;
|
||||
esac
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
# As a last resort, use cp.
|
||||
test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
|
||||
])dnl
|
||||
INSTALL="$cl_cv_path_install"
|
||||
fi
|
||||
dnl We do special magic for INSTALL instead of AC_SUBST, to get
|
||||
dnl relative paths right.
|
||||
AC_MSG_RESULT($INSTALL)
|
||||
AC_SUBST(INSTALL)dnl
|
||||
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
|
||||
# It thinks the first close brace ends the variable substitution.
|
||||
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
|
||||
AC_SUBST(INSTALL_PROGRAM)dnl
|
||||
if test -z "$INSTALL_DATA"; then
|
||||
case "$INSTALL" in
|
||||
cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
|
||||
* ) INSTALL_DATA='$(INSTALL) -m 644' ;;
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(INSTALL_DATA)dnl
|
||||
])
|
||||
|
||||
909
configure
vendored
Executable file
909
configure
vendored
Executable file
@@ -0,0 +1,909 @@
|
||||
#! /bin/sh
|
||||
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated automatically using autoconf version 2.12
|
||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
#
|
||||
# This configure script is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
|
||||
# Defaults:
|
||||
ac_help=
|
||||
ac_default_prefix=/usr/local
|
||||
# Any additions from configure.in:
|
||||
|
||||
# Initialize some variables set by options.
|
||||
# The variables have the same names as the options, with
|
||||
# dashes changed to underlines.
|
||||
build=NONE
|
||||
cache_file=./config.cache
|
||||
exec_prefix=NONE
|
||||
host=NONE
|
||||
no_create=
|
||||
nonopt=NONE
|
||||
no_recursion=
|
||||
prefix=NONE
|
||||
program_prefix=NONE
|
||||
program_suffix=NONE
|
||||
program_transform_name=s,x,x,
|
||||
silent=
|
||||
site=
|
||||
srcdir=
|
||||
target=NONE
|
||||
verbose=
|
||||
x_includes=NONE
|
||||
x_libraries=NONE
|
||||
bindir='${exec_prefix}/bin'
|
||||
sbindir='${exec_prefix}/sbin'
|
||||
libexecdir='${exec_prefix}/libexec'
|
||||
datadir='${prefix}/share'
|
||||
sysconfdir='${prefix}/etc'
|
||||
sharedstatedir='${prefix}/com'
|
||||
localstatedir='${prefix}/var'
|
||||
libdir='${exec_prefix}/lib'
|
||||
includedir='${prefix}/include'
|
||||
oldincludedir='/usr/include'
|
||||
infodir='${prefix}/info'
|
||||
mandir='${prefix}/man'
|
||||
|
||||
# Initialize some other variables.
|
||||
subdirs=
|
||||
MFLAGS= MAKEFLAGS=
|
||||
# Maximum number of lines to put in a shell here document.
|
||||
ac_max_here_lines=12
|
||||
|
||||
ac_prev=
|
||||
for ac_option
|
||||
do
|
||||
|
||||
# If the previous option needs an argument, assign it.
|
||||
if test -n "$ac_prev"; then
|
||||
eval "$ac_prev=\$ac_option"
|
||||
ac_prev=
|
||||
continue
|
||||
fi
|
||||
|
||||
case "$ac_option" in
|
||||
-*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) ac_optarg= ;;
|
||||
esac
|
||||
|
||||
# Accept the important Cygnus configure options, so we can diagnose typos.
|
||||
|
||||
case "$ac_option" in
|
||||
|
||||
-bindir | --bindir | --bindi | --bind | --bin | --bi)
|
||||
ac_prev=bindir ;;
|
||||
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
|
||||
bindir="$ac_optarg" ;;
|
||||
|
||||
-build | --build | --buil | --bui | --bu)
|
||||
ac_prev=build ;;
|
||||
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
|
||||
build="$ac_optarg" ;;
|
||||
|
||||
-cache-file | --cache-file | --cache-fil | --cache-fi \
|
||||
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
|
||||
ac_prev=cache_file ;;
|
||||
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
|
||||
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
|
||||
cache_file="$ac_optarg" ;;
|
||||
|
||||
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
|
||||
ac_prev=datadir ;;
|
||||
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
|
||||
| --da=*)
|
||||
datadir="$ac_optarg" ;;
|
||||
|
||||
-disable-* | --disable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
eval "enable_${ac_feature}=no" ;;
|
||||
|
||||
-enable-* | --enable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) ac_optarg=yes ;;
|
||||
esac
|
||||
eval "enable_${ac_feature}='$ac_optarg'" ;;
|
||||
|
||||
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
|
||||
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
|
||||
| --exec | --exe | --ex)
|
||||
ac_prev=exec_prefix ;;
|
||||
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
|
||||
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
|
||||
| --exec=* | --exe=* | --ex=*)
|
||||
exec_prefix="$ac_optarg" ;;
|
||||
|
||||
-gas | --gas | --ga | --g)
|
||||
# Obsolete; use --with-gas.
|
||||
with_gas=yes ;;
|
||||
|
||||
-help | --help | --hel | --he)
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat << EOF
|
||||
Usage: configure [options] [host]
|
||||
Options: [defaults in brackets after descriptions]
|
||||
Configuration:
|
||||
--cache-file=FILE cache test results in FILE
|
||||
--help print this message
|
||||
--no-create do not create output files
|
||||
--quiet, --silent do not print \`checking...' messages
|
||||
--version print the version of autoconf that created configure
|
||||
Directory and file names:
|
||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||
[$ac_default_prefix]
|
||||
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
|
||||
[same as prefix]
|
||||
--bindir=DIR user executables in DIR [EPREFIX/bin]
|
||||
--sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
|
||||
--libexecdir=DIR program executables in DIR [EPREFIX/libexec]
|
||||
--datadir=DIR read-only architecture-independent data in DIR
|
||||
[PREFIX/share]
|
||||
--sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
|
||||
--sharedstatedir=DIR modifiable architecture-independent data in DIR
|
||||
[PREFIX/com]
|
||||
--localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
|
||||
--libdir=DIR object code libraries in DIR [EPREFIX/lib]
|
||||
--includedir=DIR C header files in DIR [PREFIX/include]
|
||||
--oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
|
||||
--infodir=DIR info documentation in DIR [PREFIX/info]
|
||||
--mandir=DIR man documentation in DIR [PREFIX/man]
|
||||
--srcdir=DIR find the sources in DIR [configure dir or ..]
|
||||
--program-prefix=PREFIX prepend PREFIX to installed program names
|
||||
--program-suffix=SUFFIX append SUFFIX to installed program names
|
||||
--program-transform-name=PROGRAM
|
||||
run sed PROGRAM on installed program names
|
||||
EOF
|
||||
cat << EOF
|
||||
Host type:
|
||||
--build=BUILD configure for building on BUILD [BUILD=HOST]
|
||||
--host=HOST configure for HOST [guessed]
|
||||
--target=TARGET configure for TARGET [TARGET=HOST]
|
||||
Features and packages:
|
||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||
--x-includes=DIR X include files are in DIR
|
||||
--x-libraries=DIR X library files are in DIR
|
||||
EOF
|
||||
if test -n "$ac_help"; then
|
||||
echo "--enable and --with options recognized:$ac_help"
|
||||
fi
|
||||
exit 0 ;;
|
||||
|
||||
-host | --host | --hos | --ho)
|
||||
ac_prev=host ;;
|
||||
-host=* | --host=* | --hos=* | --ho=*)
|
||||
host="$ac_optarg" ;;
|
||||
|
||||
-includedir | --includedir | --includedi | --included | --include \
|
||||
| --includ | --inclu | --incl | --inc)
|
||||
ac_prev=includedir ;;
|
||||
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
|
||||
| --includ=* | --inclu=* | --incl=* | --inc=*)
|
||||
includedir="$ac_optarg" ;;
|
||||
|
||||
-infodir | --infodir | --infodi | --infod | --info | --inf)
|
||||
ac_prev=infodir ;;
|
||||
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
|
||||
infodir="$ac_optarg" ;;
|
||||
|
||||
-libdir | --libdir | --libdi | --libd)
|
||||
ac_prev=libdir ;;
|
||||
-libdir=* | --libdir=* | --libdi=* | --libd=*)
|
||||
libdir="$ac_optarg" ;;
|
||||
|
||||
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
|
||||
| --libexe | --libex | --libe)
|
||||
ac_prev=libexecdir ;;
|
||||
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
|
||||
| --libexe=* | --libex=* | --libe=*)
|
||||
libexecdir="$ac_optarg" ;;
|
||||
|
||||
-localstatedir | --localstatedir | --localstatedi | --localstated \
|
||||
| --localstate | --localstat | --localsta | --localst \
|
||||
| --locals | --local | --loca | --loc | --lo)
|
||||
ac_prev=localstatedir ;;
|
||||
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
|
||||
| --localstate=* | --localstat=* | --localsta=* | --localst=* \
|
||||
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
|
||||
localstatedir="$ac_optarg" ;;
|
||||
|
||||
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
|
||||
ac_prev=mandir ;;
|
||||
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
|
||||
mandir="$ac_optarg" ;;
|
||||
|
||||
-nfp | --nfp | --nf)
|
||||
# Obsolete; use --without-fp.
|
||||
with_fp=no ;;
|
||||
|
||||
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
|
||||
| --no-cr | --no-c)
|
||||
no_create=yes ;;
|
||||
|
||||
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
|
||||
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
|
||||
no_recursion=yes ;;
|
||||
|
||||
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
|
||||
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
|
||||
| --oldin | --oldi | --old | --ol | --o)
|
||||
ac_prev=oldincludedir ;;
|
||||
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
|
||||
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
|
||||
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
|
||||
oldincludedir="$ac_optarg" ;;
|
||||
|
||||
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
|
||||
ac_prev=prefix ;;
|
||||
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
|
||||
prefix="$ac_optarg" ;;
|
||||
|
||||
-program-prefix | --program-prefix | --program-prefi | --program-pref \
|
||||
| --program-pre | --program-pr | --program-p)
|
||||
ac_prev=program_prefix ;;
|
||||
-program-prefix=* | --program-prefix=* | --program-prefi=* \
|
||||
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
|
||||
program_prefix="$ac_optarg" ;;
|
||||
|
||||
-program-suffix | --program-suffix | --program-suffi | --program-suff \
|
||||
| --program-suf | --program-su | --program-s)
|
||||
ac_prev=program_suffix ;;
|
||||
-program-suffix=* | --program-suffix=* | --program-suffi=* \
|
||||
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
|
||||
program_suffix="$ac_optarg" ;;
|
||||
|
||||
-program-transform-name | --program-transform-name \
|
||||
| --program-transform-nam | --program-transform-na \
|
||||
| --program-transform-n | --program-transform- \
|
||||
| --program-transform | --program-transfor \
|
||||
| --program-transfo | --program-transf \
|
||||
| --program-trans | --program-tran \
|
||||
| --progr-tra | --program-tr | --program-t)
|
||||
ac_prev=program_transform_name ;;
|
||||
-program-transform-name=* | --program-transform-name=* \
|
||||
| --program-transform-nam=* | --program-transform-na=* \
|
||||
| --program-transform-n=* | --program-transform-=* \
|
||||
| --program-transform=* | --program-transfor=* \
|
||||
| --program-transfo=* | --program-transf=* \
|
||||
| --program-trans=* | --program-tran=* \
|
||||
| --progr-tra=* | --program-tr=* | --program-t=*)
|
||||
program_transform_name="$ac_optarg" ;;
|
||||
|
||||
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
||||
| -silent | --silent | --silen | --sile | --sil)
|
||||
silent=yes ;;
|
||||
|
||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||
ac_prev=sbindir ;;
|
||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||
| --sbi=* | --sb=*)
|
||||
sbindir="$ac_optarg" ;;
|
||||
|
||||
-sharedstatedir | --sharedstatedir | --sharedstatedi \
|
||||
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
|
||||
| --sharedst | --shareds | --shared | --share | --shar \
|
||||
| --sha | --sh)
|
||||
ac_prev=sharedstatedir ;;
|
||||
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
|
||||
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
|
||||
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
|
||||
| --sha=* | --sh=*)
|
||||
sharedstatedir="$ac_optarg" ;;
|
||||
|
||||
-site | --site | --sit)
|
||||
ac_prev=site ;;
|
||||
-site=* | --site=* | --sit=*)
|
||||
site="$ac_optarg" ;;
|
||||
|
||||
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
||||
ac_prev=srcdir ;;
|
||||
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
||||
srcdir="$ac_optarg" ;;
|
||||
|
||||
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
|
||||
| --syscon | --sysco | --sysc | --sys | --sy)
|
||||
ac_prev=sysconfdir ;;
|
||||
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
|
||||
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
|
||||
sysconfdir="$ac_optarg" ;;
|
||||
|
||||
-target | --target | --targe | --targ | --tar | --ta | --t)
|
||||
ac_prev=target ;;
|
||||
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
|
||||
target="$ac_optarg" ;;
|
||||
|
||||
-v | -verbose | --verbose | --verbos | --verbo | --verb)
|
||||
verbose=yes ;;
|
||||
|
||||
-version | --version | --versio | --versi | --vers)
|
||||
echo "configure generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
|
||||
-with-* | --with-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_package=`echo $ac_package| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) ac_optarg=yes ;;
|
||||
esac
|
||||
eval "with_${ac_package}='$ac_optarg'" ;;
|
||||
|
||||
-without-* | --without-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*without-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_package=`echo $ac_package| sed 's/-/_/g'`
|
||||
eval "with_${ac_package}=no" ;;
|
||||
|
||||
--x)
|
||||
# Obsolete; use --with-x.
|
||||
with_x=yes ;;
|
||||
|
||||
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
|
||||
| --x-incl | --x-inc | --x-in | --x-i)
|
||||
ac_prev=x_includes ;;
|
||||
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
|
||||
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
|
||||
x_includes="$ac_optarg" ;;
|
||||
|
||||
-x-libraries | --x-libraries | --x-librarie | --x-librari \
|
||||
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
|
||||
ac_prev=x_libraries ;;
|
||||
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
|
||||
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
|
||||
x_libraries="$ac_optarg" ;;
|
||||
|
||||
-*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
|
||||
echo "configure: warning: $ac_option: invalid host type" 1>&2
|
||||
fi
|
||||
if test "x$nonopt" != xNONE; then
|
||||
{ echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
|
||||
fi
|
||||
nonopt="$ac_option"
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
if test -n "$ac_prev"; then
|
||||
{ echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
|
||||
fi
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
# File descriptor usage:
|
||||
# 0 standard input
|
||||
# 1 file creation
|
||||
# 2 errors and warnings
|
||||
# 3 some systems may open it to /dev/tty
|
||||
# 4 used on the Kubota Titan
|
||||
# 6 checking for... messages and results
|
||||
# 5 compiler messages saved in config.log
|
||||
if test "$silent" = yes; then
|
||||
exec 6>/dev/null
|
||||
else
|
||||
exec 6>&1
|
||||
fi
|
||||
exec 5>./config.log
|
||||
|
||||
echo "\
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
" 1>&5
|
||||
|
||||
# Strip out --no-create and --no-recursion so they do not pile up.
|
||||
# Also quote any args containing shell metacharacters.
|
||||
ac_configure_args=
|
||||
for ac_arg
|
||||
do
|
||||
case "$ac_arg" in
|
||||
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
|
||||
| --no-cr | --no-c) ;;
|
||||
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
|
||||
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
|
||||
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
|
||||
ac_configure_args="$ac_configure_args '$ac_arg'" ;;
|
||||
*) ac_configure_args="$ac_configure_args $ac_arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# NLS nuisances.
|
||||
# Only set these to C if already set. These must not be set unconditionally
|
||||
# because not all systems understand e.g. LANG=C (notably SCO).
|
||||
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
|
||||
# Non-C LC_CTYPE values break the ctype check.
|
||||
if test "${LANG+set}" = set; then LANG=C; export LANG; fi
|
||||
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
|
||||
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
|
||||
if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
|
||||
|
||||
# confdefs.h avoids OS command line length limits that DEFS can exceed.
|
||||
rm -rf conftest* confdefs.h
|
||||
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
|
||||
echo > confdefs.h
|
||||
|
||||
# A filename unique to this package, relative to the directory that
|
||||
# configure is in, which we can look for to find out if srcdir is correct.
|
||||
ac_unique_file=doc/gperf.1
|
||||
|
||||
# Find the source files, if location was not specified.
|
||||
if test -z "$srcdir"; then
|
||||
ac_srcdir_defaulted=yes
|
||||
# Try the directory containing this script, then its parent.
|
||||
ac_prog=$0
|
||||
ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
|
||||
test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
|
||||
srcdir=$ac_confdir
|
||||
if test ! -r $srcdir/$ac_unique_file; then
|
||||
srcdir=..
|
||||
fi
|
||||
else
|
||||
ac_srcdir_defaulted=no
|
||||
fi
|
||||
if test ! -r $srcdir/$ac_unique_file; then
|
||||
if test "$ac_srcdir_defaulted" = yes; then
|
||||
{ echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
|
||||
else
|
||||
{ echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
|
||||
fi
|
||||
fi
|
||||
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
|
||||
|
||||
# Prefer explicitly selected file to automatically selected ones.
|
||||
if test -z "$CONFIG_SITE"; then
|
||||
if test "x$prefix" != xNONE; then
|
||||
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
|
||||
else
|
||||
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
|
||||
fi
|
||||
fi
|
||||
for ac_site_file in $CONFIG_SITE; do
|
||||
if test -r "$ac_site_file"; then
|
||||
echo "loading site script $ac_site_file"
|
||||
. "$ac_site_file"
|
||||
fi
|
||||
done
|
||||
|
||||
if test -r "$cache_file"; then
|
||||
echo "loading cache $cache_file"
|
||||
. $cache_file
|
||||
else
|
||||
echo "creating cache $cache_file"
|
||||
> $cache_file
|
||||
fi
|
||||
|
||||
ac_ext=c
|
||||
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
||||
ac_cpp='$CPP $CPPFLAGS'
|
||||
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
|
||||
ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
|
||||
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
|
||||
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
|
||||
ac_n= ac_c='
|
||||
' ac_t=' '
|
||||
else
|
||||
ac_n=-n ac_c= ac_t=
|
||||
fi
|
||||
else
|
||||
ac_n= ac_c='\c' ac_t=
|
||||
fi
|
||||
|
||||
|
||||
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
||||
echo "configure:523: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
||||
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftestmake <<\EOF
|
||||
all:
|
||||
@echo 'ac_maketemp="${MAKE}"'
|
||||
EOF
|
||||
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
|
||||
eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
|
||||
if test -n "$ac_maketemp"; then
|
||||
eval ac_cv_prog_make_${ac_make}_set=yes
|
||||
else
|
||||
eval ac_cv_prog_make_${ac_make}_set=no
|
||||
fi
|
||||
rm -f conftestmake
|
||||
fi
|
||||
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
|
||||
echo "$ac_t""yes" 1>&6
|
||||
SET_MAKE=
|
||||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
SET_MAKE="MAKE=${MAKE-make}"
|
||||
fi
|
||||
|
||||
extrasub="$extrasub"'
|
||||
/@subdir@/{
|
||||
h
|
||||
g
|
||||
s/@subdir@/lib/
|
||||
p
|
||||
g
|
||||
s/@subdir@/src/
|
||||
p
|
||||
g
|
||||
s/@subdir@/tests/
|
||||
p
|
||||
g
|
||||
s/@subdir@/doc/
|
||||
p
|
||||
d
|
||||
}
|
||||
'
|
||||
trap '' 1 2 15
|
||||
cat > confcache <<\EOF
|
||||
# This file is a shell script that caches the results of configure
|
||||
# tests run on this system so they can be shared between configure
|
||||
# scripts and configure runs. It is not useful on other systems.
|
||||
# If it contains results you don't want to keep, you may remove or edit it.
|
||||
#
|
||||
# By default, configure uses ./config.cache as the cache file,
|
||||
# creating it if it does not exist already. You can give configure
|
||||
# the --cache-file=FILE option to use a different cache file; that is
|
||||
# what configure does when it calls configure scripts in
|
||||
# subdirectories, so they share the cache.
|
||||
# Giving --cache-file=/dev/null disables caching, for debugging configure.
|
||||
# config.status only pays attention to the cache file if you give it the
|
||||
# --recheck option to rerun configure.
|
||||
#
|
||||
EOF
|
||||
# The following way of writing the cache mishandles newlines in values,
|
||||
# but we know of no workaround that is simple, portable, and efficient.
|
||||
# So, don't put newlines in cache variables' values.
|
||||
# Ultrix sh set writes to stderr and can't be redirected directly,
|
||||
# and sets the high bit in the cache file unless we assign to the vars.
|
||||
(set) 2>&1 |
|
||||
case `(ac_space=' '; set) 2>&1` in
|
||||
*ac_space=\ *)
|
||||
# `set' does not quote correctly, so add quotes (double-quote substitution
|
||||
# turns \\\\ into \\, and sed turns \\ into \).
|
||||
sed -n \
|
||||
-e "s/'/'\\\\''/g" \
|
||||
-e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
|
||||
;;
|
||||
*)
|
||||
# `set' quotes correctly as required by POSIX, so do not add quotes.
|
||||
sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
|
||||
;;
|
||||
esac >> confcache
|
||||
if cmp -s $cache_file confcache; then
|
||||
:
|
||||
else
|
||||
if test -w $cache_file; then
|
||||
echo "updating cache $cache_file"
|
||||
cat confcache > $cache_file
|
||||
else
|
||||
echo "not updating unwritable cache $cache_file"
|
||||
fi
|
||||
fi
|
||||
rm -f confcache
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
test "x$prefix" = xNONE && prefix=$ac_default_prefix
|
||||
# Let make expand exec_prefix.
|
||||
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
||||
|
||||
# Any assignment to VPATH causes Sun make to only execute
|
||||
# the first set of double-colon rules, so remove it if not needed.
|
||||
# If there is a colon in the path, we need to keep it.
|
||||
if test "x$srcdir" = x.; then
|
||||
ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
|
||||
fi
|
||||
|
||||
trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
|
||||
|
||||
# Transform confdefs.h into DEFS.
|
||||
# Protect against shell expansion while executing Makefile rules.
|
||||
# Protect against Makefile macro expansion.
|
||||
cat > conftest.defs <<\EOF
|
||||
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
|
||||
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
|
||||
s%\[%\\&%g
|
||||
s%\]%\\&%g
|
||||
s%\$%$$%g
|
||||
EOF
|
||||
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
|
||||
rm -f conftest.defs
|
||||
|
||||
|
||||
# Without the "./", some shells look in PATH for config.status.
|
||||
: ${CONFIG_STATUS=./config.status}
|
||||
|
||||
echo creating $CONFIG_STATUS
|
||||
rm -f $CONFIG_STATUS
|
||||
cat > $CONFIG_STATUS <<EOF
|
||||
#! /bin/sh
|
||||
# Generated automatically by configure.
|
||||
# Run this file to recreate the current configuration.
|
||||
# This directory was configured as follows,
|
||||
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
|
||||
#
|
||||
# $0 $ac_configure_args
|
||||
#
|
||||
# Compiler output produced by configure, useful for debugging
|
||||
# configure, is in ./config.log if it exists.
|
||||
|
||||
ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
|
||||
for ac_option
|
||||
do
|
||||
case "\$ac_option" in
|
||||
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
|
||||
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
|
||||
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
|
||||
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
-help | --help | --hel | --he | --h)
|
||||
echo "\$ac_cs_usage"; exit 0 ;;
|
||||
*) echo "\$ac_cs_usage"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
ac_given_srcdir=$srcdir
|
||||
|
||||
trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
# Protect against being on the right side of a sed subst in config.status.
|
||||
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
|
||||
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
|
||||
$ac_vpsub
|
||||
$extrasub
|
||||
s%@CFLAGS@%$CFLAGS%g
|
||||
s%@CPPFLAGS@%$CPPFLAGS%g
|
||||
s%@CXXFLAGS@%$CXXFLAGS%g
|
||||
s%@DEFS@%$DEFS%g
|
||||
s%@LDFLAGS@%$LDFLAGS%g
|
||||
s%@LIBS@%$LIBS%g
|
||||
s%@exec_prefix@%$exec_prefix%g
|
||||
s%@prefix@%$prefix%g
|
||||
s%@program_transform_name@%$program_transform_name%g
|
||||
s%@bindir@%$bindir%g
|
||||
s%@sbindir@%$sbindir%g
|
||||
s%@libexecdir@%$libexecdir%g
|
||||
s%@datadir@%$datadir%g
|
||||
s%@sysconfdir@%$sysconfdir%g
|
||||
s%@sharedstatedir@%$sharedstatedir%g
|
||||
s%@localstatedir@%$localstatedir%g
|
||||
s%@libdir@%$libdir%g
|
||||
s%@includedir@%$includedir%g
|
||||
s%@oldincludedir@%$oldincludedir%g
|
||||
s%@infodir@%$infodir%g
|
||||
s%@mandir@%$mandir%g
|
||||
s%@SET_MAKE@%$SET_MAKE%g
|
||||
|
||||
CEOF
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
# Split the substitutions into bite-sized pieces for seds with
|
||||
# small command number limits, like on Digital OSF/1 and HP-UX.
|
||||
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
|
||||
ac_file=1 # Number of current file.
|
||||
ac_beg=1 # First line for current file.
|
||||
ac_end=$ac_max_sed_cmds # Line after last line for current file.
|
||||
ac_more_lines=:
|
||||
ac_sed_cmds=""
|
||||
while $ac_more_lines; do
|
||||
if test $ac_beg -gt 1; then
|
||||
sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
|
||||
else
|
||||
sed "${ac_end}q" conftest.subs > conftest.s$ac_file
|
||||
fi
|
||||
if test ! -s conftest.s$ac_file; then
|
||||
ac_more_lines=false
|
||||
rm -f conftest.s$ac_file
|
||||
else
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds="sed -f conftest.s$ac_file"
|
||||
else
|
||||
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
|
||||
fi
|
||||
ac_file=`expr $ac_file + 1`
|
||||
ac_beg=$ac_end
|
||||
ac_end=`expr $ac_end + $ac_max_sed_cmds`
|
||||
fi
|
||||
done
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds=cat
|
||||
fi
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
|
||||
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
|
||||
case "$ac_file" in
|
||||
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
|
||||
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
||||
*) ac_file_in="${ac_file}.in" ;;
|
||||
esac
|
||||
|
||||
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
|
||||
|
||||
# Remove last slash and all that follows it. Not all systems have dirname.
|
||||
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
|
||||
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
|
||||
# The file is in a subdirectory.
|
||||
test ! -d "$ac_dir" && mkdir "$ac_dir"
|
||||
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
|
||||
# A "../" for each directory in $ac_dir_suffix.
|
||||
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
|
||||
else
|
||||
ac_dir_suffix= ac_dots=
|
||||
fi
|
||||
|
||||
case "$ac_given_srcdir" in
|
||||
.) srcdir=.
|
||||
if test -z "$ac_dots"; then top_srcdir=.
|
||||
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
|
||||
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
|
||||
*) # Relative path.
|
||||
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
|
||||
top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||
esac
|
||||
|
||||
|
||||
echo creating "$ac_file"
|
||||
rm -f "$ac_file"
|
||||
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
|
||||
case "$ac_file" in
|
||||
*Makefile*) ac_comsub="1i\\
|
||||
# $configure_input" ;;
|
||||
*) ac_comsub= ;;
|
||||
esac
|
||||
|
||||
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
|
||||
sed -e "$ac_comsub
|
||||
s%@configure_input@%$configure_input%g
|
||||
s%@srcdir@%$srcdir%g
|
||||
s%@top_srcdir@%$top_srcdir%g
|
||||
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
|
||||
fi; done
|
||||
rm -f conftest.s*
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x $CONFIG_STATUS
|
||||
rm -fr confdefs* $ac_clean_files
|
||||
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
|
||||
|
||||
|
||||
if test "$no_recursion" != yes; then
|
||||
|
||||
# Remove --cache-file and --srcdir arguments so they do not pile up.
|
||||
ac_sub_configure_args=
|
||||
ac_prev=
|
||||
for ac_arg in $ac_configure_args; do
|
||||
if test -n "$ac_prev"; then
|
||||
ac_prev=
|
||||
continue
|
||||
fi
|
||||
case "$ac_arg" in
|
||||
-cache-file | --cache-file | --cache-fil | --cache-fi \
|
||||
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
|
||||
ac_prev=cache_file ;;
|
||||
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
|
||||
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
|
||||
;;
|
||||
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
||||
ac_prev=srcdir ;;
|
||||
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
||||
;;
|
||||
*) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
for ac_config_dir in lib src tests doc; do
|
||||
|
||||
# Do not complain, so a configure script can configure whichever
|
||||
# parts of a large source tree are present.
|
||||
if test ! -d $srcdir/$ac_config_dir; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo configuring in $ac_config_dir
|
||||
|
||||
case "$srcdir" in
|
||||
.) ;;
|
||||
*)
|
||||
if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
|
||||
else
|
||||
{ echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
ac_popdir=`pwd`
|
||||
cd $ac_config_dir
|
||||
|
||||
# A "../" for each directory in /$ac_config_dir.
|
||||
ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
|
||||
|
||||
case "$srcdir" in
|
||||
.) # No --srcdir option. We are building in place.
|
||||
ac_sub_srcdir=$srcdir ;;
|
||||
/*) # Absolute path.
|
||||
ac_sub_srcdir=$srcdir/$ac_config_dir ;;
|
||||
*) # Relative path.
|
||||
ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
|
||||
esac
|
||||
|
||||
# Check for guested configure; otherwise get Cygnus style configure.
|
||||
if test -f $ac_sub_srcdir/configure; then
|
||||
ac_sub_configure=$ac_sub_srcdir/configure
|
||||
elif test -f $ac_sub_srcdir/configure.in; then
|
||||
ac_sub_configure=$ac_configure
|
||||
else
|
||||
echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
|
||||
ac_sub_configure=
|
||||
fi
|
||||
|
||||
# The recursion is here.
|
||||
if test -n "$ac_sub_configure"; then
|
||||
|
||||
# Make the cache file name correct relative to the subdirectory.
|
||||
case "$cache_file" in
|
||||
/*) ac_sub_cache_file=$cache_file ;;
|
||||
*) # Relative path.
|
||||
ac_sub_cache_file="$ac_dots$cache_file" ;;
|
||||
esac
|
||||
|
||||
echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
|
||||
# The eval makes quoting arguments work.
|
||||
if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
|
||||
then :
|
||||
else
|
||||
{ echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
|
||||
fi
|
||||
fi
|
||||
|
||||
cd $ac_popdir
|
||||
done
|
||||
fi
|
||||
|
||||
46
configure.in
Normal file
46
configure.in
Normal file
@@ -0,0 +1,46 @@
|
||||
dnl autoconf configuration for gperf
|
||||
|
||||
dnl Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
dnl written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
dnl
|
||||
dnl This file is part of GNU GPERF.
|
||||
dnl
|
||||
dnl GNU GPERF is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 1, or (at your option)
|
||||
dnl any later version.
|
||||
dnl
|
||||
dnl GNU GPERF is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with GNU GPERF; see the file COPYING. If not, write to the
|
||||
dnl Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
dnl MA 02111-1307, USA.
|
||||
|
||||
AC_INIT(doc/gperf.1)
|
||||
AC_PROG_MAKE_SET
|
||||
dnl This piece of sed script replaces every line containing '@subdir@'
|
||||
dnl by several consecutive lines, each referencing one subdir.
|
||||
extrasub="$extrasub"'
|
||||
/@subdir@/{
|
||||
h
|
||||
g
|
||||
s/@subdir@/lib/
|
||||
p
|
||||
g
|
||||
s/@subdir@/src/
|
||||
p
|
||||
g
|
||||
s/@subdir@/tests/
|
||||
p
|
||||
g
|
||||
s/@subdir@/doc/
|
||||
p
|
||||
d
|
||||
}
|
||||
'
|
||||
AC_OUTPUT(Makefile)
|
||||
AC_OUTPUT_SUBDIRS(lib src tests doc)
|
||||
129
doc/Makefile.in
Normal file
129
doc/Makefile.in
Normal file
@@ -0,0 +1,129 @@
|
||||
# Makefile for gperf/doc
|
||||
|
||||
# Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GNU GPERF.
|
||||
#
|
||||
# GNU GPERF is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 1, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GPERF is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
|
||||
# Directories used by "make":
|
||||
srcdir = @srcdir@
|
||||
|
||||
# Directories used by "make install":
|
||||
prefix = @prefix@
|
||||
local_prefix = /usr/local
|
||||
exec_prefix = @exec_prefix@
|
||||
infodir = @infodir@
|
||||
mandir = @mandir@
|
||||
man1dir = $(mandir)/man1
|
||||
dvidir = $(mandir)/dvi
|
||||
htmldir = $(mandir)/html
|
||||
|
||||
# Programs used by "make":
|
||||
RM = rm -f
|
||||
@SET_MAKE@
|
||||
|
||||
# Programs used by "make" if you have changed the documentation files:
|
||||
TEX = tex
|
||||
TEXI2DVI = texi2dvi
|
||||
DVIPS = dvips -Pljfour
|
||||
MAKEINFO = LANGUAGE= makeinfo
|
||||
TEXI2HTML = texi2html
|
||||
|
||||
# Programs used by "make install":
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
#### End of system configuration section. ####
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
VPATH = $(srcdir)
|
||||
|
||||
all : info dvi ps html
|
||||
|
||||
|
||||
info : $(srcdir)/gperf.info
|
||||
|
||||
$(srcdir)/gperf.info : $(srcdir)/gperf.texi
|
||||
cd $(srcdir) && $(MAKEINFO) --no-split gperf.texi
|
||||
|
||||
|
||||
dvi : $(srcdir)/gperf.dvi
|
||||
|
||||
$(srcdir)/gperf.dvi : $(srcdir)/gperf.texi
|
||||
cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log
|
||||
cd $(srcdir) && $(TEXI2DVI) gperf.texi
|
||||
cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log
|
||||
|
||||
|
||||
ps : $(srcdir)/gperf.ps
|
||||
|
||||
$(srcdir)/gperf.ps : $(srcdir)/gperf.dvi
|
||||
$(DVIPS) -o $@ $<
|
||||
|
||||
|
||||
html : gperf.html gperf_toc.html
|
||||
|
||||
gperf.html : $(srcdir)/gperf.texi
|
||||
cd $(srcdir) && $(TEXI2HTML) -expandinfo -number -monolithic gperf.texi
|
||||
|
||||
gperf_toc.html : $(srcdir)/gperf.texi
|
||||
cd $(srcdir) && $(RM) gperf_*.html
|
||||
cd $(srcdir) && $(TEXI2HTML) -expandinfo -number -split_chapter gperf.texi
|
||||
|
||||
|
||||
install : all force
|
||||
if [ ! -d $(infodir) ] ; then mkdir $(infodir) ; fi
|
||||
$(INSTALL_DATA) $(srcdir)/gperf.info $(infodir)/gperf.info
|
||||
if [ ! -d $(mandir) ] ; then mkdir $(mandir) ; fi
|
||||
if [ ! -d $(man1dir) ] ; then mkdir $(man1dir) ; fi
|
||||
$(INSTALL_DATA) $(srcdir)/gperf.1 $(man1dir)/gperf.1
|
||||
if [ ! -d $(dvidir) ] ; then mkdir $(dvidir) ; fi
|
||||
$(INSTALL_DATA) $(srcdir)/gperf.dvi $(dvidir)/gperf.dvi
|
||||
if [ ! -d $(htmldir) ] ; then mkdir $(htmldir) ; fi
|
||||
$(INSTALL_DATA) $(srcdir)/gperf.html $(htmldir)/gperf.html
|
||||
|
||||
installdirs : force
|
||||
if [ ! -d $(infodir) ] ; then mkdir $(infodir) ; fi
|
||||
if [ ! -d $(mandir) ] ; then mkdir $(mandir) ; fi
|
||||
if [ ! -d $(man1dir) ] ; then mkdir $(man1dir) ; fi
|
||||
if [ ! -d $(dvidir) ] ; then mkdir $(dvidir) ; fi
|
||||
if [ ! -d $(htmldir) ] ; then mkdir $(htmldir) ; fi
|
||||
|
||||
uninstall : force
|
||||
$(RM) $(infodir)/gperf.info
|
||||
$(RM) $(man1dir)/gperf.1
|
||||
$(RM) $(dvidir)/gperf.dvi
|
||||
$(RM) $(htmldir)/gperf.html
|
||||
|
||||
check : all
|
||||
|
||||
mostlyclean : clean
|
||||
|
||||
clean : force
|
||||
$(RM) *~ *.aux *.toc *.cp *.fn *.ky *.pg *.tp *.vr *.my *.log core
|
||||
|
||||
distclean : clean
|
||||
$(RM) config.status config.log config.cache Makefile
|
||||
|
||||
maintainer-clean : distclean
|
||||
$(RM) *.info *.dvi *.ps *.html
|
||||
|
||||
force :
|
||||
|
||||
863
doc/configure
vendored
Executable file
863
doc/configure
vendored
Executable file
@@ -0,0 +1,863 @@
|
||||
#! /bin/sh
|
||||
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated automatically using autoconf version 2.12
|
||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
#
|
||||
# This configure script is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
|
||||
# Defaults:
|
||||
ac_help=
|
||||
ac_default_prefix=/usr/local
|
||||
# Any additions from configure.in:
|
||||
|
||||
# Initialize some variables set by options.
|
||||
# The variables have the same names as the options, with
|
||||
# dashes changed to underlines.
|
||||
build=NONE
|
||||
cache_file=./config.cache
|
||||
exec_prefix=NONE
|
||||
host=NONE
|
||||
no_create=
|
||||
nonopt=NONE
|
||||
no_recursion=
|
||||
prefix=NONE
|
||||
program_prefix=NONE
|
||||
program_suffix=NONE
|
||||
program_transform_name=s,x,x,
|
||||
silent=
|
||||
site=
|
||||
srcdir=
|
||||
target=NONE
|
||||
verbose=
|
||||
x_includes=NONE
|
||||
x_libraries=NONE
|
||||
bindir='${exec_prefix}/bin'
|
||||
sbindir='${exec_prefix}/sbin'
|
||||
libexecdir='${exec_prefix}/libexec'
|
||||
datadir='${prefix}/share'
|
||||
sysconfdir='${prefix}/etc'
|
||||
sharedstatedir='${prefix}/com'
|
||||
localstatedir='${prefix}/var'
|
||||
libdir='${exec_prefix}/lib'
|
||||
includedir='${prefix}/include'
|
||||
oldincludedir='/usr/include'
|
||||
infodir='${prefix}/info'
|
||||
mandir='${prefix}/man'
|
||||
|
||||
# Initialize some other variables.
|
||||
subdirs=
|
||||
MFLAGS= MAKEFLAGS=
|
||||
# Maximum number of lines to put in a shell here document.
|
||||
ac_max_here_lines=12
|
||||
|
||||
ac_prev=
|
||||
for ac_option
|
||||
do
|
||||
|
||||
# If the previous option needs an argument, assign it.
|
||||
if test -n "$ac_prev"; then
|
||||
eval "$ac_prev=\$ac_option"
|
||||
ac_prev=
|
||||
continue
|
||||
fi
|
||||
|
||||
case "$ac_option" in
|
||||
-*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) ac_optarg= ;;
|
||||
esac
|
||||
|
||||
# Accept the important Cygnus configure options, so we can diagnose typos.
|
||||
|
||||
case "$ac_option" in
|
||||
|
||||
-bindir | --bindir | --bindi | --bind | --bin | --bi)
|
||||
ac_prev=bindir ;;
|
||||
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
|
||||
bindir="$ac_optarg" ;;
|
||||
|
||||
-build | --build | --buil | --bui | --bu)
|
||||
ac_prev=build ;;
|
||||
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
|
||||
build="$ac_optarg" ;;
|
||||
|
||||
-cache-file | --cache-file | --cache-fil | --cache-fi \
|
||||
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
|
||||
ac_prev=cache_file ;;
|
||||
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
|
||||
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
|
||||
cache_file="$ac_optarg" ;;
|
||||
|
||||
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
|
||||
ac_prev=datadir ;;
|
||||
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
|
||||
| --da=*)
|
||||
datadir="$ac_optarg" ;;
|
||||
|
||||
-disable-* | --disable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
eval "enable_${ac_feature}=no" ;;
|
||||
|
||||
-enable-* | --enable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) ac_optarg=yes ;;
|
||||
esac
|
||||
eval "enable_${ac_feature}='$ac_optarg'" ;;
|
||||
|
||||
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
|
||||
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
|
||||
| --exec | --exe | --ex)
|
||||
ac_prev=exec_prefix ;;
|
||||
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
|
||||
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
|
||||
| --exec=* | --exe=* | --ex=*)
|
||||
exec_prefix="$ac_optarg" ;;
|
||||
|
||||
-gas | --gas | --ga | --g)
|
||||
# Obsolete; use --with-gas.
|
||||
with_gas=yes ;;
|
||||
|
||||
-help | --help | --hel | --he)
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat << EOF
|
||||
Usage: configure [options] [host]
|
||||
Options: [defaults in brackets after descriptions]
|
||||
Configuration:
|
||||
--cache-file=FILE cache test results in FILE
|
||||
--help print this message
|
||||
--no-create do not create output files
|
||||
--quiet, --silent do not print \`checking...' messages
|
||||
--version print the version of autoconf that created configure
|
||||
Directory and file names:
|
||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||
[$ac_default_prefix]
|
||||
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
|
||||
[same as prefix]
|
||||
--bindir=DIR user executables in DIR [EPREFIX/bin]
|
||||
--sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
|
||||
--libexecdir=DIR program executables in DIR [EPREFIX/libexec]
|
||||
--datadir=DIR read-only architecture-independent data in DIR
|
||||
[PREFIX/share]
|
||||
--sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
|
||||
--sharedstatedir=DIR modifiable architecture-independent data in DIR
|
||||
[PREFIX/com]
|
||||
--localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
|
||||
--libdir=DIR object code libraries in DIR [EPREFIX/lib]
|
||||
--includedir=DIR C header files in DIR [PREFIX/include]
|
||||
--oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
|
||||
--infodir=DIR info documentation in DIR [PREFIX/info]
|
||||
--mandir=DIR man documentation in DIR [PREFIX/man]
|
||||
--srcdir=DIR find the sources in DIR [configure dir or ..]
|
||||
--program-prefix=PREFIX prepend PREFIX to installed program names
|
||||
--program-suffix=SUFFIX append SUFFIX to installed program names
|
||||
--program-transform-name=PROGRAM
|
||||
run sed PROGRAM on installed program names
|
||||
EOF
|
||||
cat << EOF
|
||||
Host type:
|
||||
--build=BUILD configure for building on BUILD [BUILD=HOST]
|
||||
--host=HOST configure for HOST [guessed]
|
||||
--target=TARGET configure for TARGET [TARGET=HOST]
|
||||
Features and packages:
|
||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||
--x-includes=DIR X include files are in DIR
|
||||
--x-libraries=DIR X library files are in DIR
|
||||
EOF
|
||||
if test -n "$ac_help"; then
|
||||
echo "--enable and --with options recognized:$ac_help"
|
||||
fi
|
||||
exit 0 ;;
|
||||
|
||||
-host | --host | --hos | --ho)
|
||||
ac_prev=host ;;
|
||||
-host=* | --host=* | --hos=* | --ho=*)
|
||||
host="$ac_optarg" ;;
|
||||
|
||||
-includedir | --includedir | --includedi | --included | --include \
|
||||
| --includ | --inclu | --incl | --inc)
|
||||
ac_prev=includedir ;;
|
||||
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
|
||||
| --includ=* | --inclu=* | --incl=* | --inc=*)
|
||||
includedir="$ac_optarg" ;;
|
||||
|
||||
-infodir | --infodir | --infodi | --infod | --info | --inf)
|
||||
ac_prev=infodir ;;
|
||||
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
|
||||
infodir="$ac_optarg" ;;
|
||||
|
||||
-libdir | --libdir | --libdi | --libd)
|
||||
ac_prev=libdir ;;
|
||||
-libdir=* | --libdir=* | --libdi=* | --libd=*)
|
||||
libdir="$ac_optarg" ;;
|
||||
|
||||
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
|
||||
| --libexe | --libex | --libe)
|
||||
ac_prev=libexecdir ;;
|
||||
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
|
||||
| --libexe=* | --libex=* | --libe=*)
|
||||
libexecdir="$ac_optarg" ;;
|
||||
|
||||
-localstatedir | --localstatedir | --localstatedi | --localstated \
|
||||
| --localstate | --localstat | --localsta | --localst \
|
||||
| --locals | --local | --loca | --loc | --lo)
|
||||
ac_prev=localstatedir ;;
|
||||
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
|
||||
| --localstate=* | --localstat=* | --localsta=* | --localst=* \
|
||||
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
|
||||
localstatedir="$ac_optarg" ;;
|
||||
|
||||
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
|
||||
ac_prev=mandir ;;
|
||||
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
|
||||
mandir="$ac_optarg" ;;
|
||||
|
||||
-nfp | --nfp | --nf)
|
||||
# Obsolete; use --without-fp.
|
||||
with_fp=no ;;
|
||||
|
||||
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
|
||||
| --no-cr | --no-c)
|
||||
no_create=yes ;;
|
||||
|
||||
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
|
||||
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
|
||||
no_recursion=yes ;;
|
||||
|
||||
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
|
||||
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
|
||||
| --oldin | --oldi | --old | --ol | --o)
|
||||
ac_prev=oldincludedir ;;
|
||||
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
|
||||
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
|
||||
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
|
||||
oldincludedir="$ac_optarg" ;;
|
||||
|
||||
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
|
||||
ac_prev=prefix ;;
|
||||
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
|
||||
prefix="$ac_optarg" ;;
|
||||
|
||||
-program-prefix | --program-prefix | --program-prefi | --program-pref \
|
||||
| --program-pre | --program-pr | --program-p)
|
||||
ac_prev=program_prefix ;;
|
||||
-program-prefix=* | --program-prefix=* | --program-prefi=* \
|
||||
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
|
||||
program_prefix="$ac_optarg" ;;
|
||||
|
||||
-program-suffix | --program-suffix | --program-suffi | --program-suff \
|
||||
| --program-suf | --program-su | --program-s)
|
||||
ac_prev=program_suffix ;;
|
||||
-program-suffix=* | --program-suffix=* | --program-suffi=* \
|
||||
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
|
||||
program_suffix="$ac_optarg" ;;
|
||||
|
||||
-program-transform-name | --program-transform-name \
|
||||
| --program-transform-nam | --program-transform-na \
|
||||
| --program-transform-n | --program-transform- \
|
||||
| --program-transform | --program-transfor \
|
||||
| --program-transfo | --program-transf \
|
||||
| --program-trans | --program-tran \
|
||||
| --progr-tra | --program-tr | --program-t)
|
||||
ac_prev=program_transform_name ;;
|
||||
-program-transform-name=* | --program-transform-name=* \
|
||||
| --program-transform-nam=* | --program-transform-na=* \
|
||||
| --program-transform-n=* | --program-transform-=* \
|
||||
| --program-transform=* | --program-transfor=* \
|
||||
| --program-transfo=* | --program-transf=* \
|
||||
| --program-trans=* | --program-tran=* \
|
||||
| --progr-tra=* | --program-tr=* | --program-t=*)
|
||||
program_transform_name="$ac_optarg" ;;
|
||||
|
||||
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
||||
| -silent | --silent | --silen | --sile | --sil)
|
||||
silent=yes ;;
|
||||
|
||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||
ac_prev=sbindir ;;
|
||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||
| --sbi=* | --sb=*)
|
||||
sbindir="$ac_optarg" ;;
|
||||
|
||||
-sharedstatedir | --sharedstatedir | --sharedstatedi \
|
||||
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
|
||||
| --sharedst | --shareds | --shared | --share | --shar \
|
||||
| --sha | --sh)
|
||||
ac_prev=sharedstatedir ;;
|
||||
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
|
||||
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
|
||||
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
|
||||
| --sha=* | --sh=*)
|
||||
sharedstatedir="$ac_optarg" ;;
|
||||
|
||||
-site | --site | --sit)
|
||||
ac_prev=site ;;
|
||||
-site=* | --site=* | --sit=*)
|
||||
site="$ac_optarg" ;;
|
||||
|
||||
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
||||
ac_prev=srcdir ;;
|
||||
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
||||
srcdir="$ac_optarg" ;;
|
||||
|
||||
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
|
||||
| --syscon | --sysco | --sysc | --sys | --sy)
|
||||
ac_prev=sysconfdir ;;
|
||||
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
|
||||
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
|
||||
sysconfdir="$ac_optarg" ;;
|
||||
|
||||
-target | --target | --targe | --targ | --tar | --ta | --t)
|
||||
ac_prev=target ;;
|
||||
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
|
||||
target="$ac_optarg" ;;
|
||||
|
||||
-v | -verbose | --verbose | --verbos | --verbo | --verb)
|
||||
verbose=yes ;;
|
||||
|
||||
-version | --version | --versio | --versi | --vers)
|
||||
echo "configure generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
|
||||
-with-* | --with-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_package=`echo $ac_package| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) ac_optarg=yes ;;
|
||||
esac
|
||||
eval "with_${ac_package}='$ac_optarg'" ;;
|
||||
|
||||
-without-* | --without-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*without-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_package=`echo $ac_package| sed 's/-/_/g'`
|
||||
eval "with_${ac_package}=no" ;;
|
||||
|
||||
--x)
|
||||
# Obsolete; use --with-x.
|
||||
with_x=yes ;;
|
||||
|
||||
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
|
||||
| --x-incl | --x-inc | --x-in | --x-i)
|
||||
ac_prev=x_includes ;;
|
||||
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
|
||||
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
|
||||
x_includes="$ac_optarg" ;;
|
||||
|
||||
-x-libraries | --x-libraries | --x-librarie | --x-librari \
|
||||
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
|
||||
ac_prev=x_libraries ;;
|
||||
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
|
||||
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
|
||||
x_libraries="$ac_optarg" ;;
|
||||
|
||||
-*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
|
||||
echo "configure: warning: $ac_option: invalid host type" 1>&2
|
||||
fi
|
||||
if test "x$nonopt" != xNONE; then
|
||||
{ echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
|
||||
fi
|
||||
nonopt="$ac_option"
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
if test -n "$ac_prev"; then
|
||||
{ echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
|
||||
fi
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
# File descriptor usage:
|
||||
# 0 standard input
|
||||
# 1 file creation
|
||||
# 2 errors and warnings
|
||||
# 3 some systems may open it to /dev/tty
|
||||
# 4 used on the Kubota Titan
|
||||
# 6 checking for... messages and results
|
||||
# 5 compiler messages saved in config.log
|
||||
if test "$silent" = yes; then
|
||||
exec 6>/dev/null
|
||||
else
|
||||
exec 6>&1
|
||||
fi
|
||||
exec 5>./config.log
|
||||
|
||||
echo "\
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
" 1>&5
|
||||
|
||||
# Strip out --no-create and --no-recursion so they do not pile up.
|
||||
# Also quote any args containing shell metacharacters.
|
||||
ac_configure_args=
|
||||
for ac_arg
|
||||
do
|
||||
case "$ac_arg" in
|
||||
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
|
||||
| --no-cr | --no-c) ;;
|
||||
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
|
||||
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
|
||||
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
|
||||
ac_configure_args="$ac_configure_args '$ac_arg'" ;;
|
||||
*) ac_configure_args="$ac_configure_args $ac_arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# NLS nuisances.
|
||||
# Only set these to C if already set. These must not be set unconditionally
|
||||
# because not all systems understand e.g. LANG=C (notably SCO).
|
||||
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
|
||||
# Non-C LC_CTYPE values break the ctype check.
|
||||
if test "${LANG+set}" = set; then LANG=C; export LANG; fi
|
||||
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
|
||||
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
|
||||
if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
|
||||
|
||||
# confdefs.h avoids OS command line length limits that DEFS can exceed.
|
||||
rm -rf conftest* confdefs.h
|
||||
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
|
||||
echo > confdefs.h
|
||||
|
||||
# A filename unique to this package, relative to the directory that
|
||||
# configure is in, which we can look for to find out if srcdir is correct.
|
||||
ac_unique_file=gperf.1
|
||||
|
||||
# Find the source files, if location was not specified.
|
||||
if test -z "$srcdir"; then
|
||||
ac_srcdir_defaulted=yes
|
||||
# Try the directory containing this script, then its parent.
|
||||
ac_prog=$0
|
||||
ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
|
||||
test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
|
||||
srcdir=$ac_confdir
|
||||
if test ! -r $srcdir/$ac_unique_file; then
|
||||
srcdir=..
|
||||
fi
|
||||
else
|
||||
ac_srcdir_defaulted=no
|
||||
fi
|
||||
if test ! -r $srcdir/$ac_unique_file; then
|
||||
if test "$ac_srcdir_defaulted" = yes; then
|
||||
{ echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
|
||||
else
|
||||
{ echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
|
||||
fi
|
||||
fi
|
||||
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
|
||||
|
||||
# Prefer explicitly selected file to automatically selected ones.
|
||||
if test -z "$CONFIG_SITE"; then
|
||||
if test "x$prefix" != xNONE; then
|
||||
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
|
||||
else
|
||||
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
|
||||
fi
|
||||
fi
|
||||
for ac_site_file in $CONFIG_SITE; do
|
||||
if test -r "$ac_site_file"; then
|
||||
echo "loading site script $ac_site_file"
|
||||
. "$ac_site_file"
|
||||
fi
|
||||
done
|
||||
|
||||
if test -r "$cache_file"; then
|
||||
echo "loading cache $cache_file"
|
||||
. $cache_file
|
||||
else
|
||||
echo "creating cache $cache_file"
|
||||
> $cache_file
|
||||
fi
|
||||
|
||||
ac_ext=c
|
||||
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
||||
ac_cpp='$CPP $CPPFLAGS'
|
||||
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
|
||||
ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
|
||||
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
|
||||
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
|
||||
ac_n= ac_c='
|
||||
' ac_t=' '
|
||||
else
|
||||
ac_n=-n ac_c= ac_t=
|
||||
fi
|
||||
else
|
||||
ac_n= ac_c='\c' ac_t=
|
||||
fi
|
||||
|
||||
|
||||
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
||||
echo "configure:523: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
||||
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftestmake <<\EOF
|
||||
all:
|
||||
@echo 'ac_maketemp="${MAKE}"'
|
||||
EOF
|
||||
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
|
||||
eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
|
||||
if test -n "$ac_maketemp"; then
|
||||
eval ac_cv_prog_make_${ac_make}_set=yes
|
||||
else
|
||||
eval ac_cv_prog_make_${ac_make}_set=no
|
||||
fi
|
||||
rm -f conftestmake
|
||||
fi
|
||||
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
|
||||
echo "$ac_t""yes" 1>&6
|
||||
SET_MAKE=
|
||||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
SET_MAKE="MAKE=${MAKE-make}"
|
||||
fi
|
||||
|
||||
# Find a good install program. We prefer a C program (faster),
|
||||
# so one script is as good as another. But avoid the broken or
|
||||
# incompatible versions:
|
||||
# SysV /etc/install, /usr/sbin/install
|
||||
# SunOS /usr/etc/install
|
||||
# IRIX /sbin/install
|
||||
# AIX /bin/install
|
||||
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
|
||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||
# ./install, which can be erroneously created by make from ./install.sh.
|
||||
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
||||
echo "configure:560: checking for a BSD compatible install" >&5
|
||||
if test -z "$INSTALL"; then
|
||||
if eval "test \"`echo '$''{'cl_cv_path_install'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_dir in $PATH; do
|
||||
# Account for people who put trailing slashes in PATH elements.
|
||||
case "$ac_dir/" in
|
||||
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
|
||||
*)
|
||||
# OSF1 and SCO ODT 3.0 have their own names for install.
|
||||
for ac_prog in ginstall installbsd scoinst install; do
|
||||
if test -f $ac_dir/$ac_prog; then
|
||||
if test $ac_prog = install &&
|
||||
grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
|
||||
# AIX install. It has an incompatible calling convention.
|
||||
# OSF/1 installbsd also uses dspmsg, but is usable.
|
||||
:
|
||||
else
|
||||
if test $ac_prog = installbsd &&
|
||||
grep src/bos $ac_dir/$ac_prog >/dev/null 2>&1; then
|
||||
# AIX installbsd doesn't work without option "-g".
|
||||
:
|
||||
else
|
||||
ac_cv_path_install="$ac_dir/$ac_prog -c"
|
||||
break 2
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
;;
|
||||
esac
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
# As a last resort, use cp.
|
||||
test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
|
||||
|
||||
fi
|
||||
INSTALL="$cl_cv_path_install"
|
||||
fi
|
||||
echo "$ac_t""$INSTALL" 1>&6
|
||||
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
|
||||
# It thinks the first close brace ends the variable substitution.
|
||||
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
|
||||
if test -z "$INSTALL_DATA"; then
|
||||
case "$INSTALL" in
|
||||
cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
|
||||
* ) INSTALL_DATA='$(INSTALL) -m 644' ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
trap '' 1 2 15
|
||||
cat > confcache <<\EOF
|
||||
# This file is a shell script that caches the results of configure
|
||||
# tests run on this system so they can be shared between configure
|
||||
# scripts and configure runs. It is not useful on other systems.
|
||||
# If it contains results you don't want to keep, you may remove or edit it.
|
||||
#
|
||||
# By default, configure uses ./config.cache as the cache file,
|
||||
# creating it if it does not exist already. You can give configure
|
||||
# the --cache-file=FILE option to use a different cache file; that is
|
||||
# what configure does when it calls configure scripts in
|
||||
# subdirectories, so they share the cache.
|
||||
# Giving --cache-file=/dev/null disables caching, for debugging configure.
|
||||
# config.status only pays attention to the cache file if you give it the
|
||||
# --recheck option to rerun configure.
|
||||
#
|
||||
EOF
|
||||
# The following way of writing the cache mishandles newlines in values,
|
||||
# but we know of no workaround that is simple, portable, and efficient.
|
||||
# So, don't put newlines in cache variables' values.
|
||||
# Ultrix sh set writes to stderr and can't be redirected directly,
|
||||
# and sets the high bit in the cache file unless we assign to the vars.
|
||||
(set) 2>&1 |
|
||||
case `(ac_space=' '; set) 2>&1` in
|
||||
*ac_space=\ *)
|
||||
# `set' does not quote correctly, so add quotes (double-quote substitution
|
||||
# turns \\\\ into \\, and sed turns \\ into \).
|
||||
sed -n \
|
||||
-e "s/'/'\\\\''/g" \
|
||||
-e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
|
||||
;;
|
||||
*)
|
||||
# `set' quotes correctly as required by POSIX, so do not add quotes.
|
||||
sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
|
||||
;;
|
||||
esac >> confcache
|
||||
if cmp -s $cache_file confcache; then
|
||||
:
|
||||
else
|
||||
if test -w $cache_file; then
|
||||
echo "updating cache $cache_file"
|
||||
cat confcache > $cache_file
|
||||
else
|
||||
echo "not updating unwritable cache $cache_file"
|
||||
fi
|
||||
fi
|
||||
rm -f confcache
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
test "x$prefix" = xNONE && prefix=$ac_default_prefix
|
||||
# Let make expand exec_prefix.
|
||||
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
||||
|
||||
# Any assignment to VPATH causes Sun make to only execute
|
||||
# the first set of double-colon rules, so remove it if not needed.
|
||||
# If there is a colon in the path, we need to keep it.
|
||||
if test "x$srcdir" = x.; then
|
||||
ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
|
||||
fi
|
||||
|
||||
trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
|
||||
|
||||
# Transform confdefs.h into DEFS.
|
||||
# Protect against shell expansion while executing Makefile rules.
|
||||
# Protect against Makefile macro expansion.
|
||||
cat > conftest.defs <<\EOF
|
||||
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
|
||||
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
|
||||
s%\[%\\&%g
|
||||
s%\]%\\&%g
|
||||
s%\$%$$%g
|
||||
EOF
|
||||
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
|
||||
rm -f conftest.defs
|
||||
|
||||
|
||||
# Without the "./", some shells look in PATH for config.status.
|
||||
: ${CONFIG_STATUS=./config.status}
|
||||
|
||||
echo creating $CONFIG_STATUS
|
||||
rm -f $CONFIG_STATUS
|
||||
cat > $CONFIG_STATUS <<EOF
|
||||
#! /bin/sh
|
||||
# Generated automatically by configure.
|
||||
# Run this file to recreate the current configuration.
|
||||
# This directory was configured as follows,
|
||||
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
|
||||
#
|
||||
# $0 $ac_configure_args
|
||||
#
|
||||
# Compiler output produced by configure, useful for debugging
|
||||
# configure, is in ./config.log if it exists.
|
||||
|
||||
ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
|
||||
for ac_option
|
||||
do
|
||||
case "\$ac_option" in
|
||||
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
|
||||
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
|
||||
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
|
||||
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
-help | --help | --hel | --he | --h)
|
||||
echo "\$ac_cs_usage"; exit 0 ;;
|
||||
*) echo "\$ac_cs_usage"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
ac_given_srcdir=$srcdir
|
||||
|
||||
trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
# Protect against being on the right side of a sed subst in config.status.
|
||||
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
|
||||
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
|
||||
$ac_vpsub
|
||||
$extrasub
|
||||
s%@CFLAGS@%$CFLAGS%g
|
||||
s%@CPPFLAGS@%$CPPFLAGS%g
|
||||
s%@CXXFLAGS@%$CXXFLAGS%g
|
||||
s%@DEFS@%$DEFS%g
|
||||
s%@LDFLAGS@%$LDFLAGS%g
|
||||
s%@LIBS@%$LIBS%g
|
||||
s%@exec_prefix@%$exec_prefix%g
|
||||
s%@prefix@%$prefix%g
|
||||
s%@program_transform_name@%$program_transform_name%g
|
||||
s%@bindir@%$bindir%g
|
||||
s%@sbindir@%$sbindir%g
|
||||
s%@libexecdir@%$libexecdir%g
|
||||
s%@datadir@%$datadir%g
|
||||
s%@sysconfdir@%$sysconfdir%g
|
||||
s%@sharedstatedir@%$sharedstatedir%g
|
||||
s%@localstatedir@%$localstatedir%g
|
||||
s%@libdir@%$libdir%g
|
||||
s%@includedir@%$includedir%g
|
||||
s%@oldincludedir@%$oldincludedir%g
|
||||
s%@infodir@%$infodir%g
|
||||
s%@mandir@%$mandir%g
|
||||
s%@SET_MAKE@%$SET_MAKE%g
|
||||
s%@INSTALL@%$INSTALL%g
|
||||
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
|
||||
s%@INSTALL_DATA@%$INSTALL_DATA%g
|
||||
|
||||
CEOF
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
# Split the substitutions into bite-sized pieces for seds with
|
||||
# small command number limits, like on Digital OSF/1 and HP-UX.
|
||||
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
|
||||
ac_file=1 # Number of current file.
|
||||
ac_beg=1 # First line for current file.
|
||||
ac_end=$ac_max_sed_cmds # Line after last line for current file.
|
||||
ac_more_lines=:
|
||||
ac_sed_cmds=""
|
||||
while $ac_more_lines; do
|
||||
if test $ac_beg -gt 1; then
|
||||
sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
|
||||
else
|
||||
sed "${ac_end}q" conftest.subs > conftest.s$ac_file
|
||||
fi
|
||||
if test ! -s conftest.s$ac_file; then
|
||||
ac_more_lines=false
|
||||
rm -f conftest.s$ac_file
|
||||
else
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds="sed -f conftest.s$ac_file"
|
||||
else
|
||||
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
|
||||
fi
|
||||
ac_file=`expr $ac_file + 1`
|
||||
ac_beg=$ac_end
|
||||
ac_end=`expr $ac_end + $ac_max_sed_cmds`
|
||||
fi
|
||||
done
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds=cat
|
||||
fi
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
|
||||
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
|
||||
case "$ac_file" in
|
||||
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
|
||||
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
||||
*) ac_file_in="${ac_file}.in" ;;
|
||||
esac
|
||||
|
||||
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
|
||||
|
||||
# Remove last slash and all that follows it. Not all systems have dirname.
|
||||
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
|
||||
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
|
||||
# The file is in a subdirectory.
|
||||
test ! -d "$ac_dir" && mkdir "$ac_dir"
|
||||
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
|
||||
# A "../" for each directory in $ac_dir_suffix.
|
||||
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
|
||||
else
|
||||
ac_dir_suffix= ac_dots=
|
||||
fi
|
||||
|
||||
case "$ac_given_srcdir" in
|
||||
.) srcdir=.
|
||||
if test -z "$ac_dots"; then top_srcdir=.
|
||||
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
|
||||
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
|
||||
*) # Relative path.
|
||||
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
|
||||
top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||
esac
|
||||
|
||||
|
||||
echo creating "$ac_file"
|
||||
rm -f "$ac_file"
|
||||
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
|
||||
case "$ac_file" in
|
||||
*Makefile*) ac_comsub="1i\\
|
||||
# $configure_input" ;;
|
||||
*) ac_comsub= ;;
|
||||
esac
|
||||
|
||||
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
|
||||
sed -e "$ac_comsub
|
||||
s%@configure_input@%$configure_input%g
|
||||
s%@srcdir@%$srcdir%g
|
||||
s%@top_srcdir@%$top_srcdir%g
|
||||
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
|
||||
fi; done
|
||||
rm -f conftest.s*
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x $CONFIG_STATUS
|
||||
rm -fr confdefs* $ac_clean_files
|
||||
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
|
||||
|
||||
33
doc/configure.in
Normal file
33
doc/configure.in
Normal file
@@ -0,0 +1,33 @@
|
||||
dnl autoconf configuration for gperf/doc
|
||||
|
||||
dnl Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
dnl written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
dnl
|
||||
dnl This file is part of GNU GPERF.
|
||||
dnl
|
||||
dnl GNU GPERF is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 1, or (at your option)
|
||||
dnl any later version.
|
||||
dnl
|
||||
dnl GNU GPERF is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with GNU GPERF; see the file COPYING. If not, write to the
|
||||
dnl Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
dnl MA 02111-1307, USA.
|
||||
|
||||
AC_INIT(gperf.1)
|
||||
AC_PROG_MAKE_SET
|
||||
dnl
|
||||
dnl checks for programs
|
||||
dnl
|
||||
CL_PROG_INSTALL
|
||||
dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
|
||||
dnl
|
||||
dnl That's it.
|
||||
dnl
|
||||
AC_OUTPUT(Makefile)
|
||||
23
doc/gperf.1
Normal file
23
doc/gperf.1
Normal file
@@ -0,0 +1,23 @@
|
||||
.TH GPERF 1 "March 7, 1998
|
||||
.UC 4
|
||||
.SH NAME
|
||||
gperf \- generate a perfect hash function from a key set
|
||||
.SH SYNOPSIS
|
||||
.B gperf
|
||||
[
|
||||
.B \-adghijklnoprsStv
|
||||
] [
|
||||
.I keyfile
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
|
||||
\fIgperf\fP reads a set of ``keys'' from \fIkeyfile\fP (or, by
|
||||
default, from the standard input) and attempts to find a non-minimal
|
||||
perfect hashing function that recognizes a member of the key set in
|
||||
constant, i.e., O(1), time. If such a function is found the program
|
||||
generates a pair of \fIC\fP source code routines that perform the
|
||||
hashing and table lookup. All generated code is directed to the
|
||||
standard output.
|
||||
|
||||
Please refer to the \fIgperf.texi\fP file for more information.
|
||||
This file is distributed with \fIgperf\fP release.
|
||||
BIN
doc/gperf.dvi
Normal file
BIN
doc/gperf.dvi
Normal file
Binary file not shown.
1381
doc/gperf.html
Normal file
1381
doc/gperf.html
Normal file
File diff suppressed because it is too large
Load Diff
1202
doc/gperf.info
Normal file
1202
doc/gperf.info
Normal file
File diff suppressed because it is too large
Load Diff
2883
doc/gperf.ps
Normal file
2883
doc/gperf.ps
Normal file
File diff suppressed because it is too large
Load Diff
1251
doc/gperf.texi
Normal file
1251
doc/gperf.texi
Normal file
File diff suppressed because it is too large
Load Diff
25
doc/gperf_1.html
Normal file
25
doc/gperf_1.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - Introduction</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the first, previous, <A HREF="gperf_2.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC1" HREF="gperf_toc.html#TOC1">Introduction</A></H1>
|
||||
|
||||
<P>
|
||||
This manual documents the GNU <CODE>gperf</CODE> perfect hash function generator
|
||||
utility, focusing on its features and how to use them, and how to report
|
||||
bugs.
|
||||
|
||||
</P>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the first, previous, <A HREF="gperf_2.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
30
doc/gperf_10.html
Normal file
30
doc/gperf_10.html
Normal file
@@ -0,0 +1,30 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 7 Implementation Details of GNU gperf</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_9.html">previous</A>, <A HREF="gperf_11.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC22" HREF="gperf_toc.html#TOC22">7 Implementation Details of GNU <CODE>gperf</CODE></A></H1>
|
||||
|
||||
<P>
|
||||
A paper describing the high-level description of the data structures and
|
||||
algorithms used to implement <CODE>gperf</CODE> will soon be available. This
|
||||
paper is useful not only from a maintenance and enhancement perspective,
|
||||
but also because they demonstrate several clever and useful programming
|
||||
techniques, e.g., `Iteration Number' boolean arrays, double
|
||||
hashing, a "safe" and efficient method for reading arbitrarily long
|
||||
input from a file, and a provably optimal algorithm for simultaneously
|
||||
determining both the minimum and maximum elements in a list.
|
||||
|
||||
</P>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_9.html">previous</A>, <A HREF="gperf_11.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
82
doc/gperf_11.html
Normal file
82
doc/gperf_11.html
Normal file
@@ -0,0 +1,82 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 8 Bibliography</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_10.html">previous</A>, next, last section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC23" HREF="gperf_toc.html#TOC23">8 Bibliography</A></H1>
|
||||
|
||||
<P>
|
||||
[1] Chang, C.C.: <I>A Scheme for Constructing Ordered Minimal Perfect
|
||||
Hashing Functions</I> Information Sciences 39(1986), 187-195.
|
||||
|
||||
[2] Cichelli, Richard J. <I>Author's Response to "On Cichelli's Minimal Perfect Hash
|
||||
Functions Method"</I> Communications of the ACM, 23, 12(December 1980), 729.
|
||||
|
||||
[3] Cichelli, Richard J. <I>Minimal Perfect Hash Functions Made Simple</I>
|
||||
Communications of the ACM, 23, 1(January 1980), 17-19.
|
||||
|
||||
[4] Cook, C. R. and Oldehoeft, R.R. <I>A Letter Oriented Minimal
|
||||
Perfect Hashing Function</I> SIGPLAN Notices, 17, 9(September 1982), 18-27.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
|
||||
<I>Practical Perfect Hashing</I> Computer Journal, 28, 1(January 1985), 54-58.
|
||||
|
||||
[6] Jaeschke, G. <I>Reciprocal Hashing: A Method for Generating Minimal
|
||||
Perfect Hashing Functions</I> Communications of the ACM, 24, 12(December
|
||||
1981), 829-833.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[7] Jaeschke, G. and Osterburg, G. <I>On Cichelli's Minimal Perfect
|
||||
Hash Functions Method</I> Communications of the ACM, 23, 12(December 1980),
|
||||
728-729.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[8] Sager, Thomas J. <I>A Polynomial Time Generator for Minimal Perfect
|
||||
Hash Functions</I> Communications of the ACM, 28, 5(December 1985), 523-532
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[9] Schmidt, Douglas C. <I>GPERF: A Perfect Hash Function Generator</I>
|
||||
Second USENIX C++ Conference Proceedings, April 1990.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[10] Sebesta, R.W. and Taylor, M.A. <I>Minimal Perfect Hash Functions
|
||||
for Reserved Word Lists</I> SIGPLAN Notices, 20, 12(September 1985), 47-53.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[11] Sprugnoli, R. <I>Perfect Hashing Functions: A Single Probe
|
||||
Retrieving Method for Static Sets</I> Communications of the ACM, 20
|
||||
11(November 1977), 841-850.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[12] Stallman, Richard M. <I>Using and Porting GNU CC</I> Free Software Foundation,
|
||||
1988.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[13] Stroustrup, Bjarne <I>The C++ Programming Language.</I> Addison-Wesley, 1986.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
[14] Tiemann, Michael D. <I>User's Guide to GNU C++</I> Free Software
|
||||
Foundation, 1989.
|
||||
|
||||
</P>
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_10.html">previous</A>, next, last section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
360
doc/gperf_2.html
Normal file
360
doc/gperf_2.html
Normal file
@@ -0,0 +1,360 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - GNU GENERAL PUBLIC LICENSE</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_1.html">previous</A>, <A HREF="gperf_3.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC2" HREF="gperf_toc.html#TOC2">GNU GENERAL PUBLIC LICENSE</A></H1>
|
||||
<P>
|
||||
Version 1, February 1989
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
Copyright (C) 1989 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
</PRE>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC3" HREF="gperf_toc.html#TOC3">Preamble</A></H2>
|
||||
|
||||
<P>
|
||||
The license agreements of most software companies try to keep users
|
||||
at the mercy of those companies. By contrast, our General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. The
|
||||
General Public License applies to the Free Software Foundation's
|
||||
software and to any other program whose authors commit to using it.
|
||||
You can use it for your programs, too.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Specifically, the General Public License is designed to make
|
||||
sure that you have the freedom to give away or sell copies of free
|
||||
software, that you receive source code or can get it if you want it,
|
||||
that you can change the software or use pieces of it in new free
|
||||
programs; and that you know you can do these things.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
For example, if you distribute copies of a such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must tell them their rights.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
</P>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
|
||||
This License Agreement applies to any program or other work which
|
||||
contains a notice placed by the copyright holder saying it may be
|
||||
distributed under the terms of this General Public License. The
|
||||
"Program", below, refers to any such program or work, and a "work based
|
||||
on the Program" means either the Program or any work containing the
|
||||
Program or a portion of it, either verbatim or with modifications. Each
|
||||
licensee is addressed as "you".
|
||||
|
||||
<LI>
|
||||
|
||||
You may copy and distribute verbatim copies of the Program's source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and
|
||||
disclaimer of warranty; keep intact all the notices that refer to this
|
||||
General Public License and to the absence of any warranty; and give any
|
||||
other recipients of the Program a copy of this General Public License
|
||||
along with the Program. You may charge a fee for the physical act of
|
||||
transferring a copy.
|
||||
|
||||
<LI>
|
||||
|
||||
You may modify your copy or copies of the Program or any portion of
|
||||
it, and copy and distribute such modifications under the terms of Paragraph
|
||||
1 above, provided that you also do the following:
|
||||
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
cause the modified files to carry prominent notices stating that
|
||||
you changed the files and the date of any change; and
|
||||
|
||||
<LI>
|
||||
|
||||
cause the whole of any work that you distribute or publish, that
|
||||
in whole or in part contains the Program or any part thereof, either
|
||||
with or without modifications, to be licensed at no charge to all
|
||||
third parties under the terms of this General Public License (except
|
||||
that you may choose to grant warranty protection to some or all
|
||||
third parties, at your option).
|
||||
|
||||
<LI>
|
||||
|
||||
If the modified program normally reads commands interactively when
|
||||
run, you must cause it, when started running for such interactive use
|
||||
in the simplest and most usual way, to print or display an
|
||||
announcement including an appropriate copyright notice and a notice
|
||||
that there is no warranty (or else, saying that you provide a
|
||||
warranty) and that users may redistribute the program under these
|
||||
conditions, and telling the user how to view a copy of this General
|
||||
Public License.
|
||||
|
||||
<LI>
|
||||
|
||||
You may charge a fee for the physical act of transferring a
|
||||
copy, and you may at your option offer warranty protection in
|
||||
exchange for a fee.
|
||||
</UL>
|
||||
|
||||
Mere aggregation of another independent work with the Program (or its
|
||||
derivative) on a volume of a storage or distribution medium does not bring
|
||||
the other work under the scope of these terms.
|
||||
|
||||
<LI>
|
||||
|
||||
You may copy and distribute the Program (or a portion or derivative of
|
||||
it, under Paragraph 2) in object code or executable form under the terms of
|
||||
Paragraphs 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
<LI>
|
||||
|
||||
accompany it with a written offer, valid for at least three
|
||||
years, to give any third party free (except for a nominal charge
|
||||
for the cost of distribution) a complete machine-readable copy of the
|
||||
corresponding source code, to be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
<LI>
|
||||
|
||||
accompany it with the information you received as to where the
|
||||
corresponding source code may be obtained. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form alone.)
|
||||
</UL>
|
||||
|
||||
Source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable file, complete source code means
|
||||
all the source code for all modules it contains; but, as a special
|
||||
exception, it need not include source code for modules which are standard
|
||||
libraries that accompany the operating system on which the executable
|
||||
file runs, or for standard header files or definitions files that
|
||||
accompany that operating system.
|
||||
|
||||
<LI>
|
||||
|
||||
You may not copy, modify, sublicense, distribute or transfer the
|
||||
Program except as expressly provided under this General Public License.
|
||||
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
|
||||
the Program is void, and will automatically terminate your rights to use
|
||||
the Program under this License. However, parties who have received
|
||||
copies, or rights to use copies, from you under this General Public
|
||||
License will not have their licenses terminated so long as such parties
|
||||
remain in full compliance.
|
||||
|
||||
<LI>
|
||||
|
||||
By copying, distributing or modifying the Program (or any work based
|
||||
on the Program) you indicate your acceptance of this license to do so,
|
||||
and all its terms and conditions.
|
||||
|
||||
<LI>
|
||||
|
||||
Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the original
|
||||
licensor to copy, distribute or modify the Program subject to these
|
||||
terms and conditions. You may not impose any further restrictions on the
|
||||
recipients' exercise of the rights granted herein.
|
||||
|
||||
<LI>
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of the license which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
the license, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
<LI>
|
||||
|
||||
If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
<LI>
|
||||
|
||||
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
<LI>
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
|
||||
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
|
||||
LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
|
||||
SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
|
||||
WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
</OL>
|
||||
|
||||
<P>
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
<H2><A NAME="SEC4" HREF="gperf_toc.html#TOC4">Appendix: How to Apply These Terms to Your New Programs</A></H2>
|
||||
|
||||
<P>
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to humanity, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
<VAR>one line to give the program's name and a brief idea of what it does.</VAR>
|
||||
Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
Gnomovision version 69, Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The hypothetical commands `show w' and `show c' should show the
|
||||
appropriate parts of the General Public License. Of course, the
|
||||
commands you use may be called something other than `show w' and `show
|
||||
c'; they could even be mouse-clicks or menu items--whatever suits your
|
||||
program.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here a sample; alter the names:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
program `Gnomovision' (a program to direct compilers to make passes
|
||||
at assemblers) written by James Hacker.
|
||||
|
||||
<VAR>signature of Ty Coon</VAR>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
That's all there is to it!
|
||||
|
||||
</P>
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_1.html">previous</A>, <A HREF="gperf_3.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
42
doc/gperf_3.html
Normal file
42
doc/gperf_3.html
Normal file
@@ -0,0 +1,42 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - Contributors to GNU gperf Utility</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_2.html">previous</A>, <A HREF="gperf_4.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC5" HREF="gperf_toc.html#TOC5">Contributors to GNU <CODE>gperf</CODE> Utility</A></H1>
|
||||
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
The GNU <CODE>gperf</CODE> perfect hash function generator utility was
|
||||
originally written in GNU C++ by Douglas C. Schmidt. It is now also
|
||||
available in a highly-portable "old-style" C version. The general
|
||||
idea for the perfect hash function generator was inspired by Keith
|
||||
Bostic's algorithm written in C, and distributed to net.sources around
|
||||
1984. The current program is a heavily modified, enhanced, and extended
|
||||
implementation of Keith's basic idea, created at the University of
|
||||
California, Irvine. Bugs, patches, and suggestions should be reported
|
||||
to <CODE><bug-gnu-utils@gnu.org></CODE> and <CODE><schmidt@ics.uci.edu></CODE>.
|
||||
|
||||
<LI>
|
||||
|
||||
Special thanks is extended to Michael Tiemann and Doug Lea, for
|
||||
providing a useful compiler, and for giving me a forum to exhibit my
|
||||
creation.
|
||||
|
||||
In addition, Adam de Boor and Nels Olson provided many tips and insights
|
||||
that greatly helped improve the quality and functionality of <CODE>gperf</CODE>.
|
||||
</UL>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_2.html">previous</A>, <A HREF="gperf_4.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
44
doc/gperf_4.html
Normal file
44
doc/gperf_4.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 1 Introduction</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_3.html">previous</A>, <A HREF="gperf_5.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC6" HREF="gperf_toc.html#TOC6">1 Introduction</A></H1>
|
||||
|
||||
<P>
|
||||
<CODE>gperf</CODE> is a perfect hash function generator written in C++. It
|
||||
transforms an <VAR>n</VAR> element user-specified keyword set <VAR>W</VAR> into
|
||||
a perfect hash function <VAR>F</VAR>. <VAR>F</VAR> uniquely maps keywords in
|
||||
<VAR>W</VAR> onto the range 0..<VAR>k</VAR>, where <VAR>k >= n</VAR>. If
|
||||
<VAR>k = n</VAR> then <VAR>F</VAR> is a <EM>minimal</EM> perfect hash function.
|
||||
<CODE>gperf</CODE> generates a 0..<VAR>k</VAR> element static lookup table and a
|
||||
pair of C functions. These functions determine whether a given
|
||||
character string <VAR>s</VAR> occurs in <VAR>W</VAR>, using at most one probe
|
||||
into the lookup table.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
<CODE>gperf</CODE> currently generates the reserved keyword recognizer for
|
||||
lexical analyzers in several production and research compilers and
|
||||
language processing tools, including GNU C, GNU C++, GNU Pascal, GNU
|
||||
Modula 3, and GNU indent. Complete C++ source code for <CODE>gperf</CODE> is
|
||||
available via anonymous ftp from <CODE>ics.uci.edu</CODE> and
|
||||
<CODE>ftp.santafe.edu</CODE>. <CODE>gperf</CODE> was also distributed along with
|
||||
the GNU libg++ library for several years. A highly portable,
|
||||
functionally equivalent K&R C version of <CODE>gperf</CODE> is archived in
|
||||
comp.sources.unix, volume 20. Finally, a paper describing
|
||||
<CODE>gperf</CODE>'s design and implementation in greater detail is available
|
||||
in the Second USENIX C++ Conference proceedings.
|
||||
|
||||
</P>
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_3.html">previous</A>, <A HREF="gperf_5.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
95
doc/gperf_5.html
Normal file
95
doc/gperf_5.html
Normal file
@@ -0,0 +1,95 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 2 Static search structures and GNU gperf</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_4.html">previous</A>, <A HREF="gperf_6.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC7" HREF="gperf_toc.html#TOC7">2 Static search structures and GNU <CODE>gperf</CODE></A></H1>
|
||||
|
||||
<P>
|
||||
A <STRONG>static search structure</STRONG> is an Abstract Data Type with certain
|
||||
fundamental operations, e.g., <EM>initialize</EM>, <EM>insert</EM>,
|
||||
and <EM>retrieve</EM>. Conceptually, all insertions occur before any
|
||||
retrievals. In practice, <CODE>gperf</CODE> generates a <CODE>static</CODE> array
|
||||
containing search set keywords and any associated attributes specified
|
||||
by the user. Thus, there is essentially no execution-time cost for the
|
||||
insertions. It is a useful data structure for representing <EM>static
|
||||
search sets</EM>. Static search sets occur frequently in software system
|
||||
applications. Typical static search sets include compiler reserved
|
||||
words, assembler instruction opcodes, and built-in shell interpreter
|
||||
commands. Search set members, called <STRONG>keywords</STRONG>, are inserted into
|
||||
the structure only once, usually during program initialization, and are
|
||||
not generally modified at run-time.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Numerous static search structure implementations exist, e.g.,
|
||||
arrays, linked lists, binary search trees, digital search tries, and
|
||||
hash tables. Different approaches offer trade-offs between space
|
||||
utilization and search time efficiency. For example, an <VAR>n</VAR> element
|
||||
sorted array is space efficient, though the average-case time
|
||||
complexity for retrieval operations using binary search is
|
||||
proportional to log <VAR>n</VAR>. Conversely, hash table implementations
|
||||
often locate a table entry in constant time, but typically impose
|
||||
additional memory overhead and exhibit poor worst case performance.
|
||||
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<EM>Minimal perfect hash functions</EM> provide an optimal solution for a
|
||||
particular class of static search sets. A minimal perfect hash
|
||||
function is defined by two properties:
|
||||
|
||||
</P>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
It allows keyword recognition in a static search set using at most
|
||||
<EM>one</EM> probe into the hash table. This represents the "perfect"
|
||||
property.
|
||||
<LI>
|
||||
|
||||
The actual memory allocated to store the keywords is precisely large
|
||||
enough for the keyword set, and <EM>no larger</EM>. This is the
|
||||
"minimal" property.
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
For most applications it is far easier to generate <EM>perfect</EM> hash
|
||||
functions than <EM>minimal perfect</EM> hash functions. Moreover,
|
||||
non-minimal perfect hash functions frequently execute faster than
|
||||
minimal ones in practice. This phenomena occurs since searching a
|
||||
sparse keyword table increases the probability of locating a "null"
|
||||
entry, thereby reducing string comparisons. <CODE>gperf</CODE>'s default
|
||||
behavior generates <EM>near-minimal</EM> perfect hash functions for
|
||||
keyword sets. However, <CODE>gperf</CODE> provides many options that permit
|
||||
user control over the degree of minimality and perfection.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Static search sets often exhibit relative stability over time. For
|
||||
example, Ada's 63 reserved words have remained constant for nearly a
|
||||
decade. It is therefore frequently worthwhile to expend concerted
|
||||
effort building an optimal search structure <EM>once</EM>, if it
|
||||
subsequently receives heavy use multiple times. <CODE>gperf</CODE> removes
|
||||
the drudgery associated with constructing time- and space-efficient
|
||||
search structures by hand. It has proven a useful and practical tool
|
||||
for serious programming projects. Output from <CODE>gperf</CODE> is currently
|
||||
used in several production and research compilers, including GNU C, GNU
|
||||
C++, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet
|
||||
part of the official GNU distribution. Each compiler utilizes
|
||||
<CODE>gperf</CODE> to automatically generate static search structures that
|
||||
efficiently identify their respective reserved keywords.
|
||||
|
||||
</P>
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_4.html">previous</A>, <A HREF="gperf_6.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
292
doc/gperf_6.html
Normal file
292
doc/gperf_6.html
Normal file
@@ -0,0 +1,292 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 3 High-Level Description of GNU gperf</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_5.html">previous</A>, <A HREF="gperf_7.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC8" HREF="gperf_toc.html#TOC8">3 High-Level Description of GNU <CODE>gperf</CODE></A></H1>
|
||||
|
||||
<P>
|
||||
The perfect hash function generator <CODE>gperf</CODE> reads a set of
|
||||
"keywords" from a <STRONG>keyfile</STRONG> (or from the standard input by
|
||||
default). It attempts to derive a perfect hashing function that
|
||||
recognizes a member of the <STRONG>static keyword set</STRONG> with at most a
|
||||
single probe into the lookup table. If <CODE>gperf</CODE> succeeds in
|
||||
generating such a function it produces a pair of C source code routines
|
||||
that perform hashing and table lookup recognition. All generated C code
|
||||
is directed to the standard output. Command-line options described
|
||||
below allow you to modify the input and output format to <CODE>gperf</CODE>.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
By default, <CODE>gperf</CODE> attempts to produce time-efficient code, with
|
||||
less emphasis on efficient space utilization. However, several options
|
||||
exist that permit trading-off execution time for storage space and vice
|
||||
versa. In particular, expanding the generated table size produces a
|
||||
sparse search structure, generally yielding faster searches.
|
||||
Conversely, you can direct <CODE>gperf</CODE> to utilize a C <CODE>switch</CODE>
|
||||
statement scheme that minimizes data space storage size. Furthermore,
|
||||
using a C <CODE>switch</CODE> may actually speed up the keyword retrieval time
|
||||
somewhat. Actual results depend on your C compiler, of course.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
In general, <CODE>gperf</CODE> assigns values to the characters it is using
|
||||
for hashing until some set of values gives each keyword a unique value.
|
||||
A helpful heuristic is that the larger the hash value range, the easier
|
||||
it is for <CODE>gperf</CODE> to find and generate a perfect hash function.
|
||||
Experimentation is the key to getting the most from <CODE>gperf</CODE>.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
<H2><A NAME="SEC9" HREF="gperf_toc.html#TOC9">3.1 Input Format to <CODE>gperf</CODE></A></H2>
|
||||
|
||||
<P>
|
||||
You can control the input keyfile format by varying certain command-line
|
||||
arguments, in particular the <SAMP>`-t'</SAMP> option. The input's appearance
|
||||
is similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE> (or UNIX
|
||||
utilities <CODE>lex</CODE> and <CODE>yacc</CODE>). Here's an outline of the general
|
||||
format:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
declarations
|
||||
%%
|
||||
keywords
|
||||
%%
|
||||
functions
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
<EM>Unlike</EM> <CODE>flex</CODE> or <CODE>bison</CODE>, all sections of <CODE>gperf</CODE>'s input
|
||||
are optional. The following sections describe the input format for each
|
||||
section.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
|
||||
<H3><A NAME="SEC10" HREF="gperf_toc.html#TOC10">3.1.1 <CODE>struct</CODE> Declarations and C Code Inclusion</A></H3>
|
||||
|
||||
<P>
|
||||
The keyword input file optionally contains a section for including
|
||||
arbitrary C declarations and definitions, as well as provisions for
|
||||
providing a user-supplied <CODE>struct</CODE>. If the <SAMP>`-t'</SAMP> option
|
||||
<EM>is</EM> enabled, you <EM>must</EM> provide a C <CODE>struct</CODE> as the last
|
||||
component in the declaration section from the keyfile file. The first
|
||||
field in this struct must be a <CODE>char *</CODE> identifier called <SAMP>`name'</SAMP>,
|
||||
although it is possible to modify this field's name with the <SAMP>`-K'</SAMP>
|
||||
option described below.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Here is simple example, using months of the year and their attributes as
|
||||
input:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
struct months { char *name; int number; int days; int leap_days; };
|
||||
%%
|
||||
january, 1, 31, 31
|
||||
february, 2, 28, 29
|
||||
march, 3, 31, 31
|
||||
april, 4, 30, 30
|
||||
may, 5, 31, 31
|
||||
june, 6, 30, 30
|
||||
july, 7, 31, 31
|
||||
august, 8, 31, 31
|
||||
september, 9, 30, 30
|
||||
october, 10, 31, 31
|
||||
november, 11, 30, 30
|
||||
december, 12, 31, 31
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
Separating the <CODE>struct</CODE> declaration from the list of key words and
|
||||
other fields are a pair of consecutive percent signs, <CODE>%%</CODE>,
|
||||
appearing left justified in the first column, as in the UNIX utility
|
||||
<CODE>lex</CODE>.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Using a syntax similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE>, it
|
||||
is possible to directly include C source text and comments verbatim into
|
||||
the generated output file. This is accomplished by enclosing the region
|
||||
inside left-justified surrounding <CODE>%{</CODE>, <CODE>%}</CODE> pairs. Here is
|
||||
an input fragment based on the previous example that illustrates this
|
||||
feature:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
%{
|
||||
#include <assert.h>
|
||||
/* This section of code is inserted directly into the output. */
|
||||
int return_month_days (struct months *months, int is_leap_year);
|
||||
%}
|
||||
struct months { char *name; int number; int days; int leap_days; };
|
||||
%%
|
||||
january, 1, 31, 31
|
||||
february, 2, 28, 29
|
||||
march, 3, 31, 31
|
||||
...
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
It is possible to omit the declaration section entirely. In this case
|
||||
the keyfile begins directly with the first keyword line, e.g.:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
january, 1, 31, 31
|
||||
february, 2, 28, 29
|
||||
march, 3, 31, 31
|
||||
april, 4, 30, 30
|
||||
...
|
||||
</PRE>
|
||||
|
||||
|
||||
|
||||
<H3><A NAME="SEC11" HREF="gperf_toc.html#TOC11">3.1.2 Format for Keyword Entries</A></H3>
|
||||
|
||||
<P>
|
||||
The second keyfile format section contains lines of keywords and any
|
||||
associated attributes you might supply. A line beginning with <SAMP>`#'</SAMP>
|
||||
in the first column is considered a comment. Everything following the
|
||||
<SAMP>`#'</SAMP> is ignored, up to and including the following newline.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
The first field of each non-comment line is always the key itself. It
|
||||
should be given as a simple name, i.e., without surrounding
|
||||
string quotation marks, and be left-justified flush against the first
|
||||
column. In this context, a "field" is considered to extend up to, but
|
||||
not include, the first blank, comma, or newline. Here is a simple
|
||||
example taken from a partial list of C reserved words:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
# These are a few C reserved words, see the c.<CODE>gperf</CODE> file
|
||||
# for a complete list of ANSI C reserved words.
|
||||
unsigned
|
||||
sizeof
|
||||
switch
|
||||
signed
|
||||
if
|
||||
default
|
||||
for
|
||||
while
|
||||
return
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
Note that unlike <CODE>flex</CODE> or <CODE>bison</CODE> the first <CODE>%%</CODE> marker
|
||||
may be elided if the declaration section is empty.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Additional fields may optionally follow the leading keyword. Fields
|
||||
should be separated by commas, and terminate at the end of line. What
|
||||
these fields mean is entirely up to you; they are used to initialize the
|
||||
elements of the user-defined <CODE>struct</CODE> provided by you in the
|
||||
declaration section. If the <SAMP>`-t'</SAMP> option is <EM>not</EM> enabled
|
||||
these fields are simply ignored. All previous examples except the last
|
||||
one contain keyword attributes.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
<H3><A NAME="SEC12" HREF="gperf_toc.html#TOC12">3.1.3 Including Additional C Functions</A></H3>
|
||||
|
||||
<P>
|
||||
The optional third section also corresponds closely with conventions
|
||||
found in <CODE>flex</CODE> and <CODE>bison</CODE>. All text in this section,
|
||||
starting at the final <CODE>%%</CODE> and extending to the end of the input
|
||||
file, is included verbatim into the generated output file. Naturally,
|
||||
it is your responsibility to ensure that the code contained in this
|
||||
section is valid C.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
<H2><A NAME="SEC13" HREF="gperf_toc.html#TOC13">3.2 Output Format for Generated C Code with <CODE>gperf</CODE></A></H2>
|
||||
|
||||
<P>
|
||||
Several options control how the generated C code appears on the standard
|
||||
output. Two C function are generated. They are called <CODE>hash</CODE> and
|
||||
<CODE>in_word_set</CODE>, although you may modify the name for
|
||||
<CODE>in_word_set</CODE> with a command-line option. Both functions require
|
||||
two arguments, a string, <CODE>char *</CODE> <VAR>str</VAR>, and a length
|
||||
parameter, <CODE>int</CODE> <VAR>len</VAR>. Their default function prototypes are
|
||||
as follows:
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
static int hash (char *str, int len);
|
||||
int in_word_set (char *str, int len);
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
By default, the generated <CODE>hash</CODE> function returns an integer value
|
||||
created by adding <VAR>len</VAR> to several user-specified <VAR>str</VAR> key
|
||||
positions indexed into an <STRONG>associated values</STRONG> table stored in a
|
||||
local static array. The associated values table is constructed
|
||||
internally by <CODE>gperf</CODE> and later output as a static local C array called
|
||||
<VAR>hash_table</VAR>; its meaning and properties are described below.
|
||||
See section <A HREF="gperf_10.html#SEC22">7 Implementation Details of GNU <CODE>gperf</CODE></A>. The relevant key positions are specified via the
|
||||
<SAMP>`-k'</SAMP> option when running <CODE>gperf</CODE>, as detailed in the <EM>Options</EM>
|
||||
section below. See section <A HREF="gperf_7.html#SEC14">4 Options to the <CODE>gperf</CODE> Utility</A>.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Two options, <SAMP>`-g'</SAMP> (assume you are compiling with GNU C and its
|
||||
<CODE>inline</CODE> feature) and <SAMP>`-a'</SAMP> (assume ANSI C-style function
|
||||
prototypes), alter the content of both the generated <CODE>hash</CODE> and
|
||||
<CODE>in_word_set</CODE> routines. However, function <CODE>in_word_set</CODE> may
|
||||
be modified more extensively, in response to your option settings. The
|
||||
options that affect the <CODE>in_word_set</CODE> structure are:
|
||||
|
||||
</P>
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-t'</SAMP>
|
||||
<DD>
|
||||
Make use of the user-defined <CODE>struct</CODE>.
|
||||
|
||||
<DT><SAMP>`-S <VAR>total switch statements</VAR>'</SAMP>
|
||||
<DD>
|
||||
Generate 1 or more C <CODE>switch</CODE> statement rather than use a large,
|
||||
(and potentially sparse) static array. Although the exact time and
|
||||
space savings of this approach vary according to your C compiler's
|
||||
degree of optimization, this method often results in smaller and faster
|
||||
code.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
If the <SAMP>`-t'</SAMP> and <SAMP>`-S'</SAMP> options are omitted, the
|
||||
default action is to generate a <CODE>char *</CODE> array containing the keys,
|
||||
together with additional null strings used for padding the array. By
|
||||
experimenting with the various input and output options, and timing the
|
||||
resulting C code, you can determine the best option choices for
|
||||
different keyword set characteristics.
|
||||
|
||||
</P>
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_5.html">previous</A>, <A HREF="gperf_7.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
393
doc/gperf_7.html
Normal file
393
doc/gperf_7.html
Normal file
@@ -0,0 +1,393 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 4 Options to the gperf Utility</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_6.html">previous</A>, <A HREF="gperf_8.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC14" HREF="gperf_toc.html#TOC14">4 Options to the <CODE>gperf</CODE> Utility</A></H1>
|
||||
|
||||
<P>
|
||||
There are <EM>many</EM> options to <CODE>gperf</CODE>. They were added to make
|
||||
the program more convenient for use with real applications. "On-line"
|
||||
help is readily available via the <SAMP>`-h'</SAMP> option. Here is the complete
|
||||
list of options.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC15" HREF="gperf_toc.html#TOC15">4.1 Options that affect Interpretation of the Input File</A></H2>
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-e <VAR>keyword delimiter list</VAR>'</SAMP>
|
||||
<DD>
|
||||
Allows the user to provide a string containing delimiters used to
|
||||
separate keywords from their attributes. The default is ",\n". This
|
||||
option is essential if you want to use keywords that have embedded
|
||||
commas or newlines. One useful trick is to use -e'TAB', where TAB is
|
||||
the literal tab character.
|
||||
|
||||
<DT><SAMP>`-t'</SAMP>
|
||||
<DD>
|
||||
Allows you to include a <CODE>struct</CODE> type declaration for generated
|
||||
code. Any text before a pair of consecutive %% is consider part of the
|
||||
type declaration. Key words and additional fields may follow this, one
|
||||
group of fields per line. A set of examples for generating perfect hash
|
||||
tables and functions for Ada, C, and G++, Pascal, and Modula 2 and 3
|
||||
reserved words are distributed with this release.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC16" HREF="gperf_toc.html#TOC16">4.2 Options to specify the Language for the Output Code</A></H2>
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-L <VAR>generated language name</VAR>'</SAMP>
|
||||
<DD>
|
||||
Instructs <CODE>gperf</CODE> to generate code in the language specified by the
|
||||
option's argument. Languages handled are currently:
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`KR-C'</SAMP>
|
||||
<DD>
|
||||
Old-style K&R C. This language is understood by old-style C compilers and
|
||||
ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
|
||||
because of lacking <SAMP>`const'</SAMP>.
|
||||
|
||||
<DT><SAMP>`C'</SAMP>
|
||||
<DD>
|
||||
Common C. This language is understood by ANSI C compilers, and also by
|
||||
old-style C compilers, provided that you <CODE>#define const</CODE> to empty
|
||||
for compilers which don't know about this keyword.
|
||||
|
||||
<DT><SAMP>`ANSI-C'</SAMP>
|
||||
<DD>
|
||||
ANSI C. This language is understood by ANSI C compilers and C++ compilers.
|
||||
|
||||
<DT><SAMP>`C++'</SAMP>
|
||||
<DD>
|
||||
C++. This language is understood by C++ compilers.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
The default is C.
|
||||
|
||||
<DT><SAMP>`-a'</SAMP>
|
||||
<DD>
|
||||
This option is supported for compatibility with previous releases of
|
||||
<CODE>gperf</CODE>. It does not do anything.
|
||||
|
||||
<DT><SAMP>`-g'</SAMP>
|
||||
<DD>
|
||||
This option is supported for compatibility with previous releases of
|
||||
<CODE>gperf</CODE>. It does not do anything.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC17" HREF="gperf_toc.html#TOC17">4.3 Options for fine tuning Details in the Output Code</A></H2>
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-K <VAR>key name</VAR>'</SAMP>
|
||||
<DD>
|
||||
This option is only useful when option <SAMP>`-t'</SAMP> has been given.
|
||||
By default, the program assumes the structure component identifier for
|
||||
the keyword is <SAMP>`name'</SAMP>. This option allows an arbitrary choice of
|
||||
identifier for this component, although it still must occur as the first
|
||||
field in your supplied <CODE>struct</CODE>.
|
||||
|
||||
<DT><SAMP>`-H <VAR>hash function name</VAR>'</SAMP>
|
||||
<DD>
|
||||
Allows you to specify the name for the generated hash function. Default
|
||||
name is <SAMP>`hash'</SAMP>. This option permits the use of two hash tables in the
|
||||
same file.
|
||||
|
||||
<DT><SAMP>`-N <VAR>lookup function name</VAR>'</SAMP>
|
||||
<DD>
|
||||
Allows you to specify the name for the generated lookup function.
|
||||
Default name is <SAMP>`in_word_set'</SAMP>. This option permits completely automatic
|
||||
generation of perfect hash functions, especially when multiple generated
|
||||
hash functions are used in the same application.
|
||||
|
||||
<DT><SAMP>`-Z <VAR>class name</VAR>'</SAMP>
|
||||
<DD>
|
||||
This option is only useful when option <SAMP>`-L C++'</SAMP> has been given.
|
||||
It allows you to specify the name of generated C++ class. Default name is
|
||||
<CODE>Perfect_Hash</CODE>.
|
||||
|
||||
<DT><SAMP>`-7'</SAMP>
|
||||
<DD>
|
||||
This option specifies that all strings that will be passed as arguments
|
||||
to the generated hash function and the generated lookup function will
|
||||
solely consist of 7-bit ASCII characters (characters in the range 0..127).
|
||||
(Note that the ANSI C functions <CODE>isalnum</CODE> and <CODE>isgraph</CODE> do
|
||||
<EM>not</EM> guarantee that a character is in this range. Only an explicit
|
||||
test like <SAMP>`c >= 'A' && c <= 'Z''</SAMP> guarantees this.) This was the
|
||||
default in earlier versions of <CODE>gperf</CODE>; now the default is to assume
|
||||
8-bit characters.
|
||||
|
||||
<DT><SAMP>`-c'</SAMP>
|
||||
<DD>
|
||||
Generates C code that uses the <CODE>strncmp</CODE> function to perform
|
||||
string comparisons. The default action is to use <CODE>strcmp</CODE>.
|
||||
|
||||
<DT><SAMP>`-C'</SAMP>
|
||||
<DD>
|
||||
Makes the contents of all generated lookup tables constant, i.e.,
|
||||
"readonly". Many compilers can generate more efficient code for this
|
||||
by putting the tables in readonly memory.
|
||||
|
||||
<DT><SAMP>`-E'</SAMP>
|
||||
<DD>
|
||||
Define constant values using an enum local to the lookup function rather
|
||||
than with #defines. This also means that different lookup functions can
|
||||
reside in the same file. Thanks to James Clark <CODE><jjc@ai.mit.edu></CODE>.
|
||||
|
||||
<DT><SAMP>`-I'</SAMP>
|
||||
<DD>
|
||||
Include the necessary system include file, <CODE><string.h></CODE>, at the
|
||||
beginning of the code. By default, this is not done; the user must
|
||||
include this header file himself to allow compilation of the code.
|
||||
|
||||
<DT><SAMP>`-G'</SAMP>
|
||||
<DD>
|
||||
Generate the static table of keywords as a static global variable,
|
||||
rather than hiding it inside of the lookup function (which is the
|
||||
default behavior).
|
||||
|
||||
<DT><SAMP>`-W <VAR>hash table array name</VAR>'</SAMP>
|
||||
<DD>
|
||||
Allows you to specify the name for the generated array containing the
|
||||
hash table. Default name is <SAMP>`wordlist'</SAMP>. This option permits the
|
||||
use of two hash tables in the same file, even when the option <SAMP>`-G'</SAMP>
|
||||
is given.
|
||||
|
||||
<DT><SAMP>`-S <VAR>total switch statements</VAR>'</SAMP>
|
||||
<DD>
|
||||
Causes the generated C code to use a <CODE>switch</CODE> statement scheme,
|
||||
rather than an array lookup table. This can lead to a reduction in both
|
||||
time and space requirements for some keyfiles. The argument to this
|
||||
option determines how many <CODE>switch</CODE> statements are generated. A
|
||||
value of 1 generates 1 <CODE>switch</CODE> containing all the elements, a
|
||||
value of 2 generates 2 tables with 1/2 the elements in each
|
||||
<CODE>switch</CODE>, etc. This is useful since many C compilers cannot
|
||||
correctly generate code for large <CODE>switch</CODE> statements. This option
|
||||
was inspired in part by Keith Bostic's original C program.
|
||||
|
||||
<DT><SAMP>`-T'</SAMP>
|
||||
<DD>
|
||||
Prevents the transfer of the type declaration to the output file. Use
|
||||
this option if the type is already defined elsewhere.
|
||||
|
||||
<DT><SAMP>`-p'</SAMP>
|
||||
<DD>
|
||||
This option is supported for compatibility with previous releases of
|
||||
<CODE>gperf</CODE>. It does not do anything.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC18" HREF="gperf_toc.html#TOC18">4.4 Options for changing the Algorithms employed by <CODE>gperf</CODE></A></H2>
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-k <VAR>keys</VAR>'</SAMP>
|
||||
<DD>
|
||||
Allows selection of the character key positions used in the keywords'
|
||||
hash function. The allowable choices range between 1-126, inclusive.
|
||||
The positions are separated by commas, e.g., <SAMP>`-k 9,4,13,14'</SAMP>;
|
||||
ranges may be used, e.g., <SAMP>`-k 2-7'</SAMP>; and positions may occur
|
||||
in any order. Furthermore, the meta-character '*' causes the generated
|
||||
hash function to consider <STRONG>all</STRONG> character positions in each key,
|
||||
whereas '$' instructs the hash function to use the "final character"
|
||||
of a key (this is the only way to use a character position greater than
|
||||
126, incidentally).
|
||||
|
||||
For instance, the option <SAMP>`-k 1,2,4,6-10,'$''</SAMP> generates a hash
|
||||
function that considers positions 1,2,4,6,7,8,9,10, plus the last
|
||||
character in each key (which may differ for each key, obviously). Keys
|
||||
with length less than the indicated key positions work properly, since
|
||||
selected key positions exceeding the key length are simply not
|
||||
referenced in the hash function.
|
||||
|
||||
<DT><SAMP>`-l'</SAMP>
|
||||
<DD>
|
||||
Compare key lengths before trying a string comparison. This might cut
|
||||
down on the number of string comparisons made during the lookup, since
|
||||
keys with different lengths are never compared via <CODE>strcmp</CODE>.
|
||||
However, using <SAMP>`-l'</SAMP> might greatly increase the size of the
|
||||
generated C code if the lookup table range is large (which implies that
|
||||
the switch option <SAMP>`-S'</SAMP> is not enabled), since the length table
|
||||
contains as many elements as there are entries in the lookup table.
|
||||
|
||||
<DT><SAMP>`-D'</SAMP>
|
||||
<DD>
|
||||
Handle keywords whose key position sets hash to duplicate values.
|
||||
Duplicate hash values occur for two reasons:
|
||||
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
Since <CODE>gperf</CODE> does not backtrack it is possible for it to process
|
||||
all your input keywords without finding a unique mapping for each word.
|
||||
However, frequently only a very small number of duplicates occur, and
|
||||
the majority of keys still require one probe into the table.
|
||||
<LI>
|
||||
|
||||
Sometimes a set of keys may have the same names, but possess different
|
||||
attributes. With the -D option <CODE>gperf</CODE> treats all these keys as part of
|
||||
an equivalence class and generates a perfect hash function with multiple
|
||||
comparisons for duplicate keys. It is up to you to completely
|
||||
disambiguate the keywords by modifying the generated C code. However,
|
||||
<CODE>gperf</CODE> helps you out by organizing the output.
|
||||
</UL>
|
||||
|
||||
Option <SAMP>`-D'</SAMP> is extremely useful for certain large or highly
|
||||
redundant keyword sets, e.g., assembler instruction opcodes.
|
||||
Using this option usually means that the generated hash function is no
|
||||
longer perfect. On the other hand, it permits <CODE>gperf</CODE> to work on
|
||||
keyword sets that it otherwise could not handle.
|
||||
|
||||
<DT><SAMP>`-f <VAR>iteration amount</VAR>'</SAMP>
|
||||
<DD>
|
||||
Generate the perfect hash function "fast". This decreases <CODE>gperf</CODE>'s
|
||||
running time at the cost of minimizing generated table-size. The
|
||||
iteration amount represents the number of times to iterate when
|
||||
resolving a collision. `0' means iterate by the number of keywords.
|
||||
This option is probably most useful when used in conjunction with options
|
||||
<SAMP>`-D'</SAMP> and/or <SAMP>`-S'</SAMP> for <EM>large</EM> keyword sets.
|
||||
|
||||
<DT><SAMP>`-i <VAR>initial value</VAR>'</SAMP>
|
||||
<DD>
|
||||
Provides an initial <VAR>value</VAR> for the associate values array. Default
|
||||
is 0. Increasing the initial value helps inflate the final table size,
|
||||
possibly leading to more time efficient keyword lookups. Note that this
|
||||
option is not particularly useful when <SAMP>`-S'</SAMP> is used. Also,
|
||||
<SAMP>`-i'</SAMP> is overriden when the <SAMP>`-r'</SAMP> option is used.
|
||||
|
||||
<DT><SAMP>`-j <VAR>jump value</VAR>'</SAMP>
|
||||
<DD>
|
||||
Affects the "jump value", i.e., how far to advance the
|
||||
associated character value upon collisions. <VAR>Jump value</VAR> is rounded
|
||||
up to an odd number, the default is 5. If the <VAR>jump value</VAR> is 0
|
||||
<CODE>gperf</CODE> jumps by random amounts.
|
||||
|
||||
<DT><SAMP>`-n'</SAMP>
|
||||
<DD>
|
||||
Instructs the generator not to include the length of a keyword when
|
||||
computing its hash value. This may save a few assembly instructions in
|
||||
the generated lookup table.
|
||||
|
||||
<DT><SAMP>`-o'</SAMP>
|
||||
<DD>
|
||||
Reorders the keywords by sorting the keywords so that frequently
|
||||
occuring key position set components appear first. A second reordering
|
||||
pass follows so that keys with "already determined values" are placed
|
||||
towards the front of the keylist. This may decrease the time required
|
||||
to generate a perfect hash function for many keyword sets, and also
|
||||
produce more minimal perfect hash functions. The reason for this is
|
||||
that the reordering helps prune the search time by handling inevitable
|
||||
collisions early in the search process. On the other hand, if the
|
||||
number of keywords is <EM>very</EM> large using <SAMP>`-o'</SAMP> may
|
||||
<EM>increase</EM> <CODE>gperf</CODE>'s execution time, since collisions will begin
|
||||
earlier and continue throughout the remainder of keyword processing.
|
||||
See Cichelli's paper from the January 1980 Communications of the ACM for
|
||||
details.
|
||||
|
||||
<DT><SAMP>`-r'</SAMP>
|
||||
<DD>
|
||||
Utilizes randomness to initialize the associated values table. This
|
||||
frequently generates solutions faster than using deterministic
|
||||
initialization (which starts all associated values at 0). Furthermore,
|
||||
using the randomization option generally increases the size of the
|
||||
table. If <CODE>gperf</CODE> has difficultly with a certain keyword set try using
|
||||
<SAMP>`-r'</SAMP> or <SAMP>`-D'</SAMP>.
|
||||
|
||||
<DT><SAMP>`-s <VAR>size-multiple</VAR>'</SAMP>
|
||||
<DD>
|
||||
Affects the size of the generated hash table. The numeric argument for
|
||||
this option indicates "how many times larger or smaller" the maximum
|
||||
associated value range should be, in relationship to the number of keys.
|
||||
If the <VAR>size-multiple</VAR> is negative the maximum associated value is
|
||||
calculated by <EM>dividing</EM> it into the total number of keys. For
|
||||
example, a value of 3 means "allow the maximum associated value to be
|
||||
about 3 times larger than the number of input keys".
|
||||
|
||||
Conversely, a value of -3 means "allow the maximum associated value to
|
||||
be about 3 times smaller than the number of input keys". Negative
|
||||
values are useful for limiting the overall size of the generated hash
|
||||
table, though this usually increases the number of duplicate hash
|
||||
values.
|
||||
|
||||
If `generate switch' option <SAMP>`-S'</SAMP> is <EM>not</EM> enabled, the maximum
|
||||
associated value influences the static array table size, and a larger
|
||||
table should decrease the time required for an unsuccessful search, at
|
||||
the expense of extra table space.
|
||||
|
||||
The default value is 1, thus the default maximum associated value about
|
||||
the same size as the number of keys (for efficiency, the maximum
|
||||
associated value is always rounded up to a power of 2). The actual
|
||||
table size may vary somewhat, since this technique is essentially a
|
||||
heuristic. In particular, setting this value too high slows down
|
||||
<CODE>gperf</CODE>'s runtime, since it must search through a much larger range
|
||||
of values. Judicious use of the <SAMP>`-f'</SAMP> option helps alleviate this
|
||||
overhead, however.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC19" HREF="gperf_toc.html#TOC19">4.5 Informative Output</A></H2>
|
||||
|
||||
|
||||
<UL>
|
||||
<DL COMPACT>
|
||||
|
||||
<DT><SAMP>`-h'</SAMP>
|
||||
<DD>
|
||||
Prints a short summary on the meaning of each program option. Aborts
|
||||
further program execution.
|
||||
|
||||
<DT><SAMP>`-v'</SAMP>
|
||||
<DD>
|
||||
Prints out the current version number.
|
||||
|
||||
<DT><SAMP>`-d'</SAMP>
|
||||
<DD>
|
||||
Enables the debugging option. This produces verbose diagnostics to
|
||||
"standard error" when <CODE>gperf</CODE> is executing. It is useful both for
|
||||
maintaining the program and for determining whether a given set of
|
||||
options is actually speeding up the search for a solution. Some useful
|
||||
information is dumped at the end of the program when the <SAMP>`-d'</SAMP>
|
||||
option is enabled.
|
||||
</DL>
|
||||
</UL>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_6.html">previous</A>, <A HREF="gperf_8.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
66
doc/gperf_8.html
Normal file
66
doc/gperf_8.html
Normal file
@@ -0,0 +1,66 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 5 Known Bugs and Limitations with gperf</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_7.html">previous</A>, <A HREF="gperf_9.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC20" HREF="gperf_toc.html#TOC20">5 Known Bugs and Limitations with <CODE>gperf</CODE></A></H1>
|
||||
|
||||
<P>
|
||||
The following are some limitations with the current release of
|
||||
<CODE>gperf</CODE>:
|
||||
|
||||
</P>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
The <CODE>gperf</CODE> utility is tuned to execute quickly, and works quickly
|
||||
for small to medium size data sets (around 1000 keywords). It is
|
||||
extremely useful for maintaining perfect hash functions for compiler
|
||||
keyword sets. Several recent enhancements now enable <CODE>gperf</CODE> to
|
||||
work efficiently on much larger keyword sets (over 15,000 keywords).
|
||||
When processing large keyword sets it helps greatly to have over 8 megs
|
||||
of RAM.
|
||||
|
||||
However, since <CODE>gperf</CODE> does not backtrack no guaranteed solution
|
||||
occurs on every run. On the other hand, it is usually easy to obtain a
|
||||
solution by varying the option parameters. In particular, try the
|
||||
<SAMP>`-r'</SAMP> option, and also try changing the default arguments to the
|
||||
<SAMP>`-s'</SAMP> and <SAMP>`-j'</SAMP> options. To <EM>guarantee</EM> a solution, use
|
||||
the <SAMP>`-D'</SAMP> and <SAMP>`-S'</SAMP> options, although the final results are not
|
||||
likely to be a <EM>perfect</EM> hash function anymore! Finally, use the
|
||||
<SAMP>`-f'</SAMP> option if you want <CODE>gperf</CODE> to generate the perfect hash
|
||||
function <EM>fast</EM>, with less emphasis on making it minimal.
|
||||
|
||||
<LI>
|
||||
|
||||
The size of the generate static keyword array can get <EM>extremely</EM>
|
||||
large if the input keyword file is large or if the keywords are quite
|
||||
similar. This tends to slow down the compilation of the generated C
|
||||
code, and <EM>greatly</EM> inflates the object code size. If this
|
||||
situation occurs, consider using the <SAMP>`-S'</SAMP> option to reduce data
|
||||
size, potentially increasing keyword recognition time a negligible
|
||||
amount. Since many C compilers cannot correctly generated code for
|
||||
large switch statements it is important to qualify the <VAR>-S</VAR> option
|
||||
with an appropriate numerical argument that controls the number of
|
||||
switch statements generated.
|
||||
|
||||
<LI>
|
||||
|
||||
The maximum number of key positions selected for a given key has an
|
||||
arbitrary limit of 126. This restriction should be removed, and if
|
||||
anyone considers this a problem write me and let me know so I can remove
|
||||
the constraint.
|
||||
</UL>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_7.html">previous</A>, <A HREF="gperf_9.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
54
doc/gperf_9.html
Normal file
54
doc/gperf_9.html
Normal file
@@ -0,0 +1,54 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - 6 Things Still Left to Do</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_8.html">previous</A>, <A HREF="gperf_10.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
<P><HR><P>
|
||||
|
||||
|
||||
<H1><A NAME="SEC21" HREF="gperf_toc.html#TOC21">6 Things Still Left to Do</A></H1>
|
||||
|
||||
<P>
|
||||
It should be "relatively" easy to replace the current perfect hash
|
||||
function algorithm with a more exhaustive approach; the perfect hash
|
||||
module is essential independent from other program modules. Additional
|
||||
worthwhile improvements include:
|
||||
|
||||
</P>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
|
||||
Make the algorithm more robust. At present, the program halts with an
|
||||
error diagnostic if it can't find a direct solution and the <SAMP>`-D'</SAMP>
|
||||
option is not enabled. A more comprehensive, albeit computationally
|
||||
expensive, approach would employ backtracking or enable alternative
|
||||
options and retry. It's not clear how helpful this would be, in
|
||||
general, since most search sets are rather small in practice.
|
||||
|
||||
<LI>
|
||||
|
||||
Another useful extension involves modifying the program to generate
|
||||
"minimal" perfect hash functions (under certain circumstances, the
|
||||
current version can be rather extravagant in the generated table size).
|
||||
Again, this is mostly of theoretical interest, since a sparse table
|
||||
often produces faster lookups, and use of the <SAMP>`-S'</SAMP> <CODE>switch</CODE>
|
||||
option can minimize the data size, at the expense of slightly longer
|
||||
lookups (note that the gcc compiler generally produces good code for
|
||||
<CODE>switch</CODE> statements, reducing the need for more complex schemes).
|
||||
|
||||
<LI>
|
||||
|
||||
In addition to improving the algorithm, it would also be useful to
|
||||
generate a C++ class or Ada package as the code output, in addition to
|
||||
the current C routines.
|
||||
</UL>
|
||||
|
||||
<P><HR><P>
|
||||
Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_8.html">previous</A>, <A HREF="gperf_10.html">next</A>, <A HREF="gperf_11.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
50
doc/gperf_toc.html
Normal file
50
doc/gperf_toc.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<!-- This HTML file has been created by texi2html 1.51
|
||||
from gperf.texi on 15 April 1998 -->
|
||||
|
||||
<TITLE>User's Guide to gperf - Table of Contents</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<H1>User's Guide to <CODE>gperf</CODE></H1>
|
||||
<P>
|
||||
<P><HR><P>
|
||||
<UL>
|
||||
<LI><A NAME="TOC1" HREF="gperf_1.html#SEC1">Introduction</A>
|
||||
<LI><A NAME="TOC2" HREF="gperf_2.html#SEC2">GNU GENERAL PUBLIC LICENSE</A>
|
||||
<UL>
|
||||
<LI><A NAME="TOC3" HREF="gperf_2.html#SEC3">Preamble</A>
|
||||
<LI><A NAME="TOC4" HREF="gperf_2.html#SEC4">Appendix: How to Apply These Terms to Your New Programs</A>
|
||||
</UL>
|
||||
<LI><A NAME="TOC5" HREF="gperf_3.html#SEC5">Contributors to GNU <CODE>gperf</CODE> Utility</A>
|
||||
<LI><A NAME="TOC6" HREF="gperf_4.html#SEC6">1 Introduction</A>
|
||||
<LI><A NAME="TOC7" HREF="gperf_5.html#SEC7">2 Static search structures and GNU <CODE>gperf</CODE></A>
|
||||
<LI><A NAME="TOC8" HREF="gperf_6.html#SEC8">3 High-Level Description of GNU <CODE>gperf</CODE></A>
|
||||
<UL>
|
||||
<LI><A NAME="TOC9" HREF="gperf_6.html#SEC9">3.1 Input Format to <CODE>gperf</CODE></A>
|
||||
<UL>
|
||||
<LI><A NAME="TOC10" HREF="gperf_6.html#SEC10">3.1.1 <CODE>struct</CODE> Declarations and C Code Inclusion</A>
|
||||
<LI><A NAME="TOC11" HREF="gperf_6.html#SEC11">3.1.2 Format for Keyword Entries</A>
|
||||
<LI><A NAME="TOC12" HREF="gperf_6.html#SEC12">3.1.3 Including Additional C Functions</A>
|
||||
</UL>
|
||||
<LI><A NAME="TOC13" HREF="gperf_6.html#SEC13">3.2 Output Format for Generated C Code with <CODE>gperf</CODE></A>
|
||||
</UL>
|
||||
<LI><A NAME="TOC14" HREF="gperf_7.html#SEC14">4 Options to the <CODE>gperf</CODE> Utility</A>
|
||||
<UL>
|
||||
<LI><A NAME="TOC15" HREF="gperf_7.html#SEC15">4.1 Options that affect Interpretation of the Input File</A>
|
||||
<LI><A NAME="TOC16" HREF="gperf_7.html#SEC16">4.2 Options to specify the Language for the Output Code</A>
|
||||
<LI><A NAME="TOC17" HREF="gperf_7.html#SEC17">4.3 Options for fine tuning Details in the Output Code</A>
|
||||
<LI><A NAME="TOC18" HREF="gperf_7.html#SEC18">4.4 Options for changing the Algorithms employed by <CODE>gperf</CODE></A>
|
||||
<LI><A NAME="TOC19" HREF="gperf_7.html#SEC19">4.5 Informative Output</A>
|
||||
</UL>
|
||||
<LI><A NAME="TOC20" HREF="gperf_8.html#SEC20">5 Known Bugs and Limitations with <CODE>gperf</CODE></A>
|
||||
<LI><A NAME="TOC21" HREF="gperf_9.html#SEC21">6 Things Still Left to Do</A>
|
||||
<LI><A NAME="TOC22" HREF="gperf_10.html#SEC22">7 Implementation Details of GNU <CODE>gperf</CODE></A>
|
||||
<LI><A NAME="TOC23" HREF="gperf_11.html#SEC23">8 Bibliography</A>
|
||||
</UL>
|
||||
<P><HR><P>
|
||||
This document was generated on 15 April 1998 using the
|
||||
<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
|
||||
translator version 1.51.</P>
|
||||
</BODY>
|
||||
</HTML>
|
||||
4585
doc/texinfo.tex
Normal file
4585
doc/texinfo.tex
Normal file
File diff suppressed because it is too large
Load Diff
109
lib/Makefile.in
Normal file
109
lib/Makefile.in
Normal file
@@ -0,0 +1,109 @@
|
||||
# Makefile for gperf/lib
|
||||
|
||||
# Copyright (C) 1989, 1992, 1993, 1998 Free Software Foundation, Inc.
|
||||
# written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
#
|
||||
# This file is part of GNU GPERF.
|
||||
#
|
||||
# GNU GPERF is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 1, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GPERF is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
|
||||
# Directories used by "make":
|
||||
srcdir = @srcdir@
|
||||
|
||||
# Directories used by "make install":
|
||||
prefix = @prefix@
|
||||
local_prefix = /usr/local
|
||||
exec_prefix = @exec_prefix@
|
||||
|
||||
# Programs used by "make":
|
||||
# C compiler
|
||||
CC = @CC@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
# C++ compiler
|
||||
CXX = @CXX@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CXXCPP = @CXXCPP@
|
||||
# Other
|
||||
AR = ar
|
||||
AR_FLAGS = rc
|
||||
RANLIB = @RANLIB@
|
||||
MV = mv
|
||||
LN = ln
|
||||
RM = rm -f
|
||||
@SET_MAKE@
|
||||
|
||||
# Programs used by "make install":
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
#### End of system configuration section. ####
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
VPATH = $(srcdir)
|
||||
|
||||
OBJECTS = getopt.o getopt1.o hash.o
|
||||
CPPFLAGS = -I$(srcdir)
|
||||
|
||||
TARGETLIB = libgp.a
|
||||
|
||||
all : $(TARGETLIB)
|
||||
|
||||
$(TARGETLIB): $(OBJECTS)
|
||||
$(RM) $@
|
||||
$(AR) $(AR_FLAGS) $@ $(OBJECTS)
|
||||
$(RANLIB) $@
|
||||
|
||||
# Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always
|
||||
# expand $< correctly in this context.
|
||||
#
|
||||
#%.o : %.c
|
||||
# $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
|
||||
#
|
||||
#%.o : %.cc
|
||||
# $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
|
||||
|
||||
getopt.o : getopt.c getopt.h
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt.c
|
||||
|
||||
getopt1.o : getopt1.c getopt.h
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt1.c
|
||||
|
||||
hash.o : hash.cc hash.h
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash.cc
|
||||
|
||||
install : all
|
||||
|
||||
installdirs :
|
||||
|
||||
uninstall :
|
||||
|
||||
check : all
|
||||
|
||||
mostlyclean : clean
|
||||
|
||||
clean : force
|
||||
$(RM) *~ *.s *.o *.a $(TARGETLIB) core
|
||||
|
||||
distclean : clean
|
||||
$(RM) config.status config.log config.cache Makefile
|
||||
|
||||
maintainer-clean : distclean
|
||||
|
||||
force :
|
||||
1303
lib/configure
vendored
Executable file
1303
lib/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
43
lib/configure.in
Normal file
43
lib/configure.in
Normal file
@@ -0,0 +1,43 @@
|
||||
dnl autoconf configuration for gperf/lib
|
||||
|
||||
dnl Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
dnl written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
dnl
|
||||
dnl This file is part of GNU GPERF.
|
||||
dnl
|
||||
dnl GNU GPERF is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 1, or (at your option)
|
||||
dnl any later version.
|
||||
dnl
|
||||
dnl GNU GPERF is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with GNU GPERF; see the file COPYING. If not, write to the
|
||||
dnl Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
dnl MA 02111-1307, USA.
|
||||
|
||||
AC_INIT(hash.cc)
|
||||
AC_PROG_MAKE_SET
|
||||
dnl
|
||||
dnl checks for programs
|
||||
dnl
|
||||
AC_PROG_CC
|
||||
dnl sets variable CC
|
||||
AC_PROG_CPP
|
||||
dnl sets variable CPP
|
||||
AC_PROG_CXX
|
||||
dnl sets variable CXX
|
||||
AC_PROG_CXXCPP
|
||||
dnl sets variable CXXCPP
|
||||
CL_PROG_RANLIB
|
||||
dnl sets variable RANLIB
|
||||
CL_PROG_INSTALL
|
||||
dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
|
||||
dnl
|
||||
dnl That's it.
|
||||
dnl
|
||||
AC_OUTPUT(Makefile)
|
||||
1042
lib/getopt.c
Normal file
1042
lib/getopt.c
Normal file
File diff suppressed because it is too large
Load Diff
25
lib/getopt.c.patch
Normal file
25
lib/getopt.c.patch
Normal file
@@ -0,0 +1,25 @@
|
||||
getopt.c is a modified version of the getopt.c found in the glibc snapshot
|
||||
on 1998-04-14. Below the patch that has been applied to this file. The glibc
|
||||
maintainer has been informed of these patches.
|
||||
|
||||
diff -c3 getopt.c.orig getopt.c
|
||||
*** getopt.c.orig Sun Mar 8 16:06:55 1998
|
||||
--- getopt.c Thu Apr 16 00:09:41 1998
|
||||
***************
|
||||
*** 201,207 ****
|
||||
/* Avoid depending on library functions or files
|
||||
whose names are inconsistent. */
|
||||
|
||||
! char *getenv ();
|
||||
|
||||
static char *
|
||||
my_index (str, chr)
|
||||
--- 201,208 ----
|
||||
/* Avoid depending on library functions or files
|
||||
whose names are inconsistent. */
|
||||
|
||||
! extern char *getenv ();
|
||||
! extern int strncmp ();
|
||||
|
||||
static char *
|
||||
my_index (str, chr)
|
||||
138
lib/getopt.h
Normal file
138
lib/getopt.h
Normal file
@@ -0,0 +1,138 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
#if defined (__STDC__) && __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
|
||||
#ifdef __cplusplus
|
||||
/* SunOS4 declares getopt with the following prototype:
|
||||
extern int getopt (int argc, const char *const *argv, const char *shortopts);
|
||||
We cannot redeclare it when compiling C++ code. */
|
||||
#define getopt(x,y,z) getopt_long(x, y, z, (const struct option *) 0, (int *) 0)
|
||||
#else /* not __cplusplus */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
extern int getopt (int argc, char *const *argv, const char *shortopts);
|
||||
#else /* not __GNU_LIBRARY__ */
|
||||
extern int getopt ();
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
#endif /* __cplusplus */
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind,
|
||||
int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt ();
|
||||
extern int getopt_long ();
|
||||
extern int getopt_long_only ();
|
||||
|
||||
extern int _getopt_internal ();
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* getopt.h */
|
||||
40
lib/getopt.h.patch
Normal file
40
lib/getopt.h.patch
Normal file
@@ -0,0 +1,40 @@
|
||||
getopt.h is a modified version of the getopt.h found in the glibc snapshot
|
||||
on 1998-04-14. Below the patch that has been applied to this file. The glibc
|
||||
maintainer has been informed of these patches.
|
||||
|
||||
diff -c3 getopt.h.orig getopt.h
|
||||
*** getopt.h.orig Sat Jun 21 03:01:53 1997
|
||||
--- getopt.h Thu Apr 16 00:17:42 1998
|
||||
***************
|
||||
*** 96,102 ****
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
! #if defined (__STDC__) && __STDC__
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
--- 96,108 ----
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
! #if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
|
||||
! #ifdef __cplusplus
|
||||
! /* SunOS4 declares getopt with the following prototype:
|
||||
! extern int getopt (int argc, const char *const *argv, const char *shortopts);
|
||||
! We cannot redeclare it when compiling C++ code. */
|
||||
! #define getopt(x,y,z) getopt_long(x, y, z, (const struct option *) 0, (int *) 0)
|
||||
! #else /* not __cplusplus */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
***************
|
||||
*** 105,110 ****
|
||||
--- 111,117 ----
|
||||
#else /* not __GNU_LIBRARY__ */
|
||||
extern int getopt ();
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
+ #endif /* __cplusplus */
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
188
lib/getopt1.c
Normal file
188
lib/getopt1.c
Normal file
@@ -0,0 +1,188 @@
|
||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
#if !defined __STDC__ || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#define GETOPT_INTERFACE_VERSION 2
|
||||
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
|
||||
#define ELIDE_CODE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ELIDE_CODE
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
int
|
||||
getopt_long (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
|
||||
}
|
||||
|
||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||
If an option that starts with '-' (not '--') doesn't match a long option,
|
||||
but does match a short option, it is parsed as a short option
|
||||
instead. */
|
||||
|
||||
int
|
||||
getopt_long_only (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* Not ELIDE_CODE. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"add", 1, 0, 0},
|
||||
{"append", 0, 0, 0},
|
||||
{"delete", 1, 0, 0},
|
||||
{"verbose", 0, 0, 0},
|
||||
{"create", 0, 0, 0},
|
||||
{"file", 1, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
printf ("option %s", long_options[option_index].name);
|
||||
if (optarg)
|
||||
printf (" with arg %s", optarg);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
printf ("option d with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
36
lib/hash.cc
Normal file
36
lib/hash.cc
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
Copyright (C) 1990 Free Software Foundation
|
||||
written by Doug Lea (dl@rocky.oswego.edu)
|
||||
|
||||
This file is part of the GNU C++ Library. This library is free
|
||||
software; you can redistribute it and/or modify it under the terms of
|
||||
the GNU Library General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version. This library is distributed in the hope
|
||||
that it will be useful, but WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. See the GNU Library General Public License for more details.
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <hash.h>
|
||||
|
||||
/*
|
||||
some useful hash functions
|
||||
*/
|
||||
|
||||
unsigned int hashpjw (const char* x) // From Dragon book, p436
|
||||
{
|
||||
unsigned int h = 0;
|
||||
unsigned int g;
|
||||
|
||||
while (*x != 0)
|
||||
{
|
||||
h = (h << 4) + (unsigned char) *x++;
|
||||
if ((g = h & 0xf0000000) != 0)
|
||||
h = (h ^ (g >> 24)) ^ g;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
27
lib/hash.h
Normal file
27
lib/hash.h
Normal file
@@ -0,0 +1,27 @@
|
||||
// This may look like C code, but it is really -*- C++ -*-
|
||||
|
||||
/*
|
||||
Copyright (C) 1988, 1992 Free Software Foundation
|
||||
written by Doug Lea (dl@rocky.oswego.edu)
|
||||
|
||||
This file is part of the GNU C++ Library. This library is free
|
||||
software; you can redistribute it and/or modify it under the terms of
|
||||
the GNU Library General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version. This library is distributed in the hope
|
||||
that it will be useful, but WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. See the GNU Library General Public License for more details.
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef _hash_h
|
||||
#define _hash_h 1
|
||||
|
||||
/* a hash function for null-terminated char* strings using the
|
||||
method described in Aho, Sethi, & Ullman, p 436. */
|
||||
extern unsigned int hashpjw (const char*);
|
||||
|
||||
#endif
|
||||
143
src/Makefile.in
Normal file
143
src/Makefile.in
Normal file
@@ -0,0 +1,143 @@
|
||||
# Makefile for gperf/src
|
||||
|
||||
# Copyright (C) 1989, 1992, 1993, 1998 Free Software Foundation, Inc.
|
||||
# written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
#
|
||||
# This file is part of GNU GPERF.
|
||||
#
|
||||
# GNU GPERF is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 1, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GPERF is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
|
||||
# Directories used by "make":
|
||||
srcdir = @srcdir@
|
||||
|
||||
# Directories used by "make install":
|
||||
prefix = @prefix@
|
||||
local_prefix = /usr/local
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
|
||||
# Programs used by "make":
|
||||
# C compiler
|
||||
CC = @CC@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
# C++ compiler
|
||||
CXX = @CXX@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CXXCPP = @CXXCPP@
|
||||
# Other
|
||||
MV = mv
|
||||
LN = ln
|
||||
RM = rm -f
|
||||
@SET_MAKE@
|
||||
|
||||
# Programs used by "make install":
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
#### End of system configuration section. ####
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
VPATH = $(srcdir)
|
||||
|
||||
OBJECTS = new.o options.o iterator.o main.o gen-perf.o key-list.o list-node.o \
|
||||
hash-table.o bool-array.o read-line.o trace.o vectors.o version.o
|
||||
LIBS = ../lib/libgp.a -lm
|
||||
CPPFLAGS = -I. -I$(srcdir)/../lib
|
||||
|
||||
TARGETPROG = gperf
|
||||
|
||||
all : $(TARGETPROG)
|
||||
|
||||
$(TARGETPROG): $(OBJECTS)
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
|
||||
|
||||
# Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always
|
||||
# expand $< correctly in this context.
|
||||
#
|
||||
#%.o : %.c
|
||||
# $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
|
||||
#
|
||||
#%.o : %.cc
|
||||
# $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
|
||||
|
||||
# Dependencies.
|
||||
CONFIG_H = config.h
|
||||
VERSION_H = version.h
|
||||
VECTORS_H = vectors.h
|
||||
TRACE_H = trace.h
|
||||
READ_LINE_H = read-line.h read-line.icc $(TRACE_H)
|
||||
OPTIONS_H = options.h options.icc $(TRACE_H)
|
||||
LIST_NODE_H = list-node.h $(VECTORS_H)
|
||||
KEY_LIST_H = key-list.h $(LIST_NODE_H) $(VECTORS_H) $(READ_LINE_H)
|
||||
ITERATOR_H = iterator.h
|
||||
HASH_TABLE_H = hash-table.h $(LIST_NODE_H)
|
||||
BOOL_ARRAY_H = bool-array.h bool-array.icc $(TRACE_H) $(OPTIONS_H)
|
||||
GEN_PERF_H = gen-perf.h $(KEY_LIST_H) $(BOOL_ARRAY_H)
|
||||
|
||||
bool-array.o : bool-array.cc $(BOOL_ARRAY_H) $(OPTIONS_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/bool-array.cc
|
||||
gen-perf.o : gen-perf.cc $(GEN_PERF_H) $(OPTIONS_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/gen-perf.cc
|
||||
hash-table.o : hash-table.cc $(HASH_TABLE_H) $(OPTIONS_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash-table.cc
|
||||
iterator.o : iterator.cc $(ITERATOR_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/iterator.cc
|
||||
key-list.o : key-list.cc $(KEY_LIST_H) $(OPTIONS_H) $(READ_LINE_H) $(HASH_TABLE_H) $(TRACE_H) $(VERSION_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/key-list.cc
|
||||
list-node.o : list-node.cc $(LIST_NODE_H) $(OPTIONS_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/list-node.cc
|
||||
main.o : main.cc $(OPTIONS_H) $(GEN_PERF_H) $(TRACE_H) $(CONFIG_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/main.cc
|
||||
new.o : new.cc $(TRACE_H) $(CONFIG_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/new.cc
|
||||
options.o : options.cc $(OPTIONS_H) $(ITERATOR_H) $(TRACE_H) $(VECTORS_H) $(VERSION_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/options.cc
|
||||
read-line.o : read-line.cc $(READ_LINE_H) $(OPTIONS_H) $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/read-line.cc
|
||||
trace.o : trace.cc $(TRACE_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/trace.cc
|
||||
vectors.o : vectors.cc $(VECTORS_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/vectors.cc
|
||||
version.o : version.cc $(VERSION_H)
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/version.cc
|
||||
|
||||
install : all force
|
||||
if [ ! -d $(bindir) ] ; then mkdir $(bindir) ; fi
|
||||
$(INSTALL_PROGRAM) $(TARGETPROG) $(bindir)/$(TARGETPROG)
|
||||
|
||||
installdirs : force
|
||||
if [ ! -d $(bindir) ] ; then mkdir $(bindir) ; fi
|
||||
|
||||
uninstall : force
|
||||
$(RM) $(bindir)/$(TARGETPROG)
|
||||
|
||||
check : all
|
||||
|
||||
mostlyclean : clean
|
||||
|
||||
clean : force
|
||||
$(RM) *~ *.s *.o *.a $(TARGETPROG) core
|
||||
|
||||
distclean : clean
|
||||
$(RM) config.status config.log config.cache Makefile config.h
|
||||
|
||||
maintainer-clean : distclean
|
||||
|
||||
force :
|
||||
49
src/bool-array.cc
Normal file
49
src/bool-array.cc
Normal file
@@ -0,0 +1,49 @@
|
||||
/* Fast lookup table abstraction implemented as an Iteration Number Array
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "bool-array.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "options.h"
|
||||
#include "trace.h"
|
||||
|
||||
STORAGE_TYPE * Bool_Array::storage_array;
|
||||
STORAGE_TYPE Bool_Array::iteration_number;
|
||||
unsigned int Bool_Array::size;
|
||||
|
||||
/* Prints out debugging diagnostics. */
|
||||
|
||||
Bool_Array::~Bool_Array (void)
|
||||
{
|
||||
T (Trace t ("Bool_Array::~Bool_Array");)
|
||||
if (option[DEBUG])
|
||||
fprintf (stderr, "\ndumping boolean array information\n"
|
||||
"size = %d\niteration number = %d\nend of array dump\n",
|
||||
size, iteration_number);
|
||||
}
|
||||
|
||||
#ifndef __OPTIMIZE__
|
||||
|
||||
#define INLINE /* not inline */
|
||||
#include "bool-array.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif /* not defined __OPTIMIZE__ */
|
||||
66
src/bool-array.h
Normal file
66
src/bool-array.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Simple lookup table abstraction implemented as an Iteration Number Array.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Define and implement a simple boolean array abstraction,
|
||||
uses an Iteration Numbering implementation to save on initialization time. */
|
||||
|
||||
#ifndef bool_array_h
|
||||
#define bool_array_h 1
|
||||
|
||||
#include "trace.h"
|
||||
|
||||
#ifdef LO_CAL
|
||||
/* If we are on a memory diet then we'll only make these use a limited
|
||||
amount of storage space. */
|
||||
typedef unsigned short STORAGE_TYPE;
|
||||
#else
|
||||
typedef unsigned int STORAGE_TYPE;
|
||||
#endif
|
||||
|
||||
class Bool_Array
|
||||
{
|
||||
private:
|
||||
static STORAGE_TYPE *storage_array; /* Initialization of the index space. */
|
||||
static STORAGE_TYPE iteration_number; /* Keep track of the current iteration. */
|
||||
static unsigned int size; /* Keep track of array size. */
|
||||
|
||||
public:
|
||||
Bool_Array (void);
|
||||
~Bool_Array (void);
|
||||
static void init (STORAGE_TYPE *buffer, unsigned int s);
|
||||
static int find (int hash_value);
|
||||
static void reset (void);
|
||||
};
|
||||
|
||||
#ifdef __OPTIMIZE__ /* efficiency hack! */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "options.h"
|
||||
#define INLINE inline
|
||||
#include "bool-array.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
85
src/bool-array.icc
Normal file
85
src/bool-array.icc
Normal file
@@ -0,0 +1,85 @@
|
||||
/* Inline Functions for bool-array.{h,cc}.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
// This needs:
|
||||
//#include <stdio.h>
|
||||
//#include <string.h>
|
||||
//#include "options.h"
|
||||
//#include "trace.h"
|
||||
|
||||
INLINE
|
||||
Bool_Array::Bool_Array (void)
|
||||
{
|
||||
T (Trace t ("Bool_Array::Bool_Array");)
|
||||
storage_array = 0;
|
||||
iteration_number = size = 0;
|
||||
}
|
||||
|
||||
INLINE void
|
||||
Bool_Array::init (STORAGE_TYPE *buffer, unsigned int s)
|
||||
{
|
||||
T (Trace t ("Bool_Array::init");)
|
||||
size = s;
|
||||
iteration_number = 1;
|
||||
storage_array = buffer;
|
||||
memset (storage_array, 0, s * sizeof (*storage_array));
|
||||
if (option[DEBUG])
|
||||
fprintf (stderr, "\nbool array size = %d, total bytes = %d\n",
|
||||
size, (unsigned int) (size * sizeof (*storage_array)));
|
||||
}
|
||||
|
||||
INLINE int
|
||||
Bool_Array::find (int index)
|
||||
{
|
||||
T (Trace t ("Bool_Array::find");)
|
||||
if (storage_array[index] == iteration_number)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
storage_array[index] = iteration_number;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
INLINE void
|
||||
Bool_Array::reset (void)
|
||||
{
|
||||
T (Trace t ("Bool_Array::reset");)
|
||||
/* If we wrap around it's time to zero things out again! However, this only
|
||||
occurs once about every 2^31 or 2^15 iterations, so it should probably
|
||||
never happen! */
|
||||
|
||||
if (++iteration_number == 0)
|
||||
{
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, "(re-initializing bool_array)...");
|
||||
fflush (stderr);
|
||||
}
|
||||
iteration_number = 1;
|
||||
memset (storage_array, 0, size * sizeof (*storage_array));
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, "done\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
}
|
||||
}
|
||||
19
src/config.h.in
Normal file
19
src/config.h.in
Normal file
@@ -0,0 +1,19 @@
|
||||
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||
|
||||
/* Define if the C++ compiler supports "throw ()" declarations. */
|
||||
#undef HAVE_THROW_DECL
|
||||
|
||||
/* Define if you have the getrlimit function. */
|
||||
#undef HAVE_GETRLIMIT
|
||||
|
||||
/* Define if you have the setrlimit function. */
|
||||
#undef HAVE_SETRLIMIT
|
||||
|
||||
/* Define if you have the <sys/resource.h> header file. */
|
||||
#undef HAVE_SYS_RESOURCE_H
|
||||
|
||||
/* Define if you have the <sys/time.h> header file. */
|
||||
#undef HAVE_SYS_TIME_H
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
1573
src/configure
vendored
Executable file
1573
src/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
71
src/configure.in
Normal file
71
src/configure.in
Normal file
@@ -0,0 +1,71 @@
|
||||
dnl autoconf configuration for gperf/src
|
||||
|
||||
dnl Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
dnl written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
dnl
|
||||
dnl This file is part of GNU GPERF.
|
||||
dnl
|
||||
dnl GNU GPERF is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 1, or (at your option)
|
||||
dnl any later version.
|
||||
dnl
|
||||
dnl GNU GPERF is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with GNU GPERF; see the file COPYING. If not, write to the
|
||||
dnl Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
dnl MA 02111-1307, USA.
|
||||
|
||||
AC_INIT(gen-perf.cc)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PROG_MAKE_SET
|
||||
dnl
|
||||
dnl checks for programs
|
||||
dnl
|
||||
AC_PROG_CC
|
||||
dnl sets variable CC
|
||||
AC_PROG_CPP
|
||||
dnl sets variable CPP
|
||||
AC_PROG_CXX
|
||||
dnl sets variable CXX
|
||||
AC_PROG_CXXCPP
|
||||
dnl sets variable CXXCPP
|
||||
CL_PROG_INSTALL
|
||||
dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
|
||||
dnl
|
||||
dnl checks for compiler characteristics
|
||||
dnl
|
||||
AC_MSG_CHECKING([for working throw()])
|
||||
AC_CACHE_VAL(gp_cxx_throw_decl,[
|
||||
AC_LANG_SAVE()
|
||||
AC_LANG_CPLUSPLUS()
|
||||
AC_TRY_COMPILE([#include <stdlib.h>
|
||||
void operator delete (void* ptr) throw() {}], [],
|
||||
gp_cxx_throw_decl=yes, gp_cxx_throw_decl=no)
|
||||
AC_LANG_RESTORE()
|
||||
])
|
||||
AC_MSG_RESULT([$]gp_cxx_throw_decl)
|
||||
if test [$]gp_cxx_throw_decl = yes; then
|
||||
AC_DEFINE(HAVE_THROW_DECL)
|
||||
fi
|
||||
dnl
|
||||
dnl checks for functions and declarations
|
||||
dnl
|
||||
AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h)
|
||||
dnl DEFs HAVE_UNISTD_H, HAVE_SYS_TIME_H, HAVE_SYS_RESOURCE_H
|
||||
if test $ac_cv_header_sys_resource_h = yes; then
|
||||
AC_CHECK_FUNCS(getrlimit)
|
||||
dnl DEFS HAVE_GETRLIMIT
|
||||
if test $ac_cv_func_getrlimit = yes; then
|
||||
AC_CHECK_FUNCS(setrlimit)
|
||||
dnl DEFS HAVE_SETRLIMIT
|
||||
fi
|
||||
fi
|
||||
dnl
|
||||
dnl That's it.
|
||||
dnl
|
||||
AC_OUTPUT(Makefile)
|
||||
342
src/gen-perf.cc
Normal file
342
src/gen-perf.cc
Normal file
@@ -0,0 +1,342 @@
|
||||
/* Provides high-level routines to manipulate the keywork list
|
||||
structures the code generation output.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* declares rand(), srand() */
|
||||
#include <time.h> /* declares time() */
|
||||
#include "options.h"
|
||||
#include "gen-perf.h"
|
||||
#include "trace.h"
|
||||
|
||||
/* Efficiently returns the least power of two greater than or equal to X! */
|
||||
#define POW(X) ((!X)?1:(X-=1,X|=X>>1,X|=X>>2,X|=X>>4,X|=X>>8,X|=X>>16,(++X)))
|
||||
|
||||
/* Reads input keys, possibly applies the reordering heuristic, sets the
|
||||
maximum associated value size (rounded up to the nearest power of 2),
|
||||
may initialize the associated values array, and determines the maximum
|
||||
hash table size. Note: using the random numbers is often helpful,
|
||||
though not as deterministic, of course! */
|
||||
|
||||
Gen_Perf::Gen_Perf (void)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::Gen_Perf");)
|
||||
int asso_value_max;
|
||||
int non_linked_length;
|
||||
|
||||
Key_List::read_keys ();
|
||||
if (option[ORDER])
|
||||
reorder ();
|
||||
asso_value_max = option.get_asso_max ();
|
||||
non_linked_length = Key_List::keyword_list_length ();
|
||||
num_done = 1;
|
||||
fewest_collisions = 0;
|
||||
if (asso_value_max == 0)
|
||||
asso_value_max = non_linked_length;
|
||||
else if (asso_value_max > 0)
|
||||
asso_value_max *= non_linked_length;
|
||||
else /* if (asso_value_max < 0) */
|
||||
asso_value_max = non_linked_length / -asso_value_max;
|
||||
option.set_asso_max (POW (asso_value_max));
|
||||
|
||||
if (option[RANDOM])
|
||||
{
|
||||
srand ((long) time (0));
|
||||
|
||||
for (int i = 0; i < ALPHA_SIZE; i++)
|
||||
asso_values[i] = (rand () & asso_value_max - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
int asso_value = option.initial_value ();
|
||||
|
||||
if (asso_value) /* Initialize array if user requests non-zero default. */
|
||||
for (int i = ALPHA_SIZE - 1; i >= 0; i--)
|
||||
asso_values[i] = asso_value & option.get_asso_max () - 1;
|
||||
}
|
||||
max_hash_value = Key_List::max_key_length () + option.get_asso_max () *
|
||||
option.get_max_keysig_size ();
|
||||
|
||||
if (option[DEBUG])
|
||||
fprintf (stderr, "total non-linked keys = %d\nmaximum associated value is %d"
|
||||
"\nmaximum size of generated hash table is %d\n",
|
||||
non_linked_length, asso_value_max, max_hash_value);
|
||||
}
|
||||
|
||||
/* Merge two disjoint hash key multisets to form the ordered disjoint union of the sets.
|
||||
(In a multiset, an element can occur multiple times).
|
||||
Precondition: both set_1 and set_2 must be ordered. Returns the length
|
||||
of the combined set. */
|
||||
|
||||
inline int
|
||||
Gen_Perf::compute_disjoint_union (const char *set_1, const char *set_2, char *set_3)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::compute_disjoint_union");)
|
||||
char *base = set_3;
|
||||
|
||||
while (*set_1 && *set_2)
|
||||
if (*set_1 == *set_2)
|
||||
set_1++, set_2++;
|
||||
else
|
||||
{
|
||||
*set_3 = *set_1 < *set_2 ? *set_1++ : *set_2++;
|
||||
if (set_3 == base || *set_3 != *(set_3-1)) set_3++;
|
||||
}
|
||||
|
||||
while (*set_1)
|
||||
{
|
||||
*set_3 = *set_1++;
|
||||
if (set_3 == base || *set_3 != *(set_3-1)) set_3++;
|
||||
}
|
||||
|
||||
while (*set_2)
|
||||
{
|
||||
*set_3 = *set_2++;
|
||||
if (set_3 == base || *set_3 != *(set_3-1)) set_3++;
|
||||
}
|
||||
*set_3 = '\0';
|
||||
return set_3 - base;
|
||||
}
|
||||
|
||||
/* Sort the UNION_SET in increasing frequency of occurrence.
|
||||
This speeds up later processing since we may assume the resulting
|
||||
set (Set_3, in this case), is ordered. Uses insertion sort, since
|
||||
the UNION_SET is typically short. */
|
||||
|
||||
inline void
|
||||
Gen_Perf::sort_set (char *union_set, int len)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::sort_set");)
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = len - 1; i < j; i++)
|
||||
{
|
||||
int curr;
|
||||
char tmp;
|
||||
|
||||
for (curr = i + 1, tmp = union_set[curr];
|
||||
curr > 0 && occurrences[(unsigned char)tmp] < occurrences[(unsigned char)(union_set[curr-1])];
|
||||
curr--)
|
||||
union_set[curr] = union_set[curr - 1];
|
||||
|
||||
union_set[curr] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate a key set's hash value. */
|
||||
|
||||
inline int
|
||||
Gen_Perf::hash (List_Node *key_node)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::hash");)
|
||||
int sum = option[NOLENGTH] ? 0 : key_node->length;
|
||||
|
||||
for (const char *ptr = key_node->char_set; *ptr; ptr++)
|
||||
sum += asso_values[(unsigned char)(*ptr)];
|
||||
|
||||
return key_node->hash_value = sum;
|
||||
}
|
||||
|
||||
/* Find out how character value change affects successfully hashed items.
|
||||
Returns FALSE if no other hash values are affected, else returns TRUE.
|
||||
Note that because Option.Get_Asso_Max is a power of two we can guarantee
|
||||
that all legal Asso_Values are visited without repetition since
|
||||
Option.Get_Jump was forced to be an odd value! */
|
||||
|
||||
inline int
|
||||
Gen_Perf::affects_prev (char c, List_Node *curr)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::affects_prev");)
|
||||
int original_char = asso_values[(unsigned char)c];
|
||||
int total_iterations = !option[FAST]
|
||||
? option.get_asso_max () : option.get_iterations () ? option.get_iterations () : keyword_list_length ();
|
||||
|
||||
/* Try all legal associated values. */
|
||||
|
||||
for (int i = total_iterations - 1; i >= 0; i--)
|
||||
{
|
||||
int collisions = 0;
|
||||
|
||||
asso_values[(unsigned char)c] =
|
||||
(asso_values[(unsigned char)c] + (option.get_jump () ? option.get_jump () : rand ()))
|
||||
& (option.get_asso_max () - 1);
|
||||
|
||||
/* Iteration Number array is a win, O(1) intialization time! */
|
||||
reset ();
|
||||
|
||||
/* See how this asso_value change affects previous keywords. If
|
||||
it does better than before we'll take it! */
|
||||
|
||||
for (List_Node *ptr = head;
|
||||
!Bool_Array::find (hash (ptr)) || ++collisions < fewest_collisions;
|
||||
ptr = ptr->next)
|
||||
if (ptr == curr)
|
||||
{
|
||||
fewest_collisions = collisions;
|
||||
if (option[DEBUG])
|
||||
fprintf (stderr, "- resolved after %d iterations", total_iterations - i);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore original values, no more tries. */
|
||||
asso_values[(unsigned char)c] = original_char;
|
||||
/* If we're this far it's time to try the next character.... */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Change a character value, try least-used characters first. */
|
||||
|
||||
void
|
||||
Gen_Perf::change (List_Node *prior, List_Node *curr)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::change");)
|
||||
static char *union_set;
|
||||
|
||||
if (!union_set)
|
||||
union_set = new char [2 * option.get_max_keysig_size () + 1];
|
||||
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, "collision on keyword #%d, prior = \"%s\", curr = \"%s\" hash = %d\n",
|
||||
num_done, prior->key, curr->key, curr->hash_value);
|
||||
fflush (stderr);
|
||||
}
|
||||
sort_set (union_set, compute_disjoint_union (prior->char_set, curr->char_set, union_set));
|
||||
|
||||
/* Try changing some values, if change doesn't alter other values continue normal action. */
|
||||
fewest_collisions++;
|
||||
|
||||
for (char *temp = union_set; *temp; temp++)
|
||||
if (!affects_prev (*temp, curr))
|
||||
{
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, " by changing asso_value['%c'] (char #%d) to %d\n",
|
||||
*temp, temp - union_set + 1, asso_values[(unsigned char)(*temp)]);
|
||||
fflush (stderr);
|
||||
}
|
||||
return; /* Good, doesn't affect previous hash values, we'll take it. */
|
||||
}
|
||||
|
||||
for (List_Node *ptr = head; ptr != curr; ptr = ptr->next)
|
||||
hash (ptr);
|
||||
|
||||
hash (curr);
|
||||
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, "** collision not resolved after %d iterations, %d duplicates remain, continuing...\n",
|
||||
!option[FAST] ? option.get_asso_max () : option.get_iterations () ? option.get_iterations () : keyword_list_length (),
|
||||
fewest_collisions + total_duplicates);
|
||||
fflush (stderr);
|
||||
}
|
||||
}
|
||||
|
||||
/* Does the hard stuff....
|
||||
Initializes the Iteration Number array, and attempts to find a perfect
|
||||
function that will hash all the key words without getting any
|
||||
duplications. This is made much easier since we aren't attempting
|
||||
to generate *minimum* functions, only perfect ones.
|
||||
If we can't generate a perfect function in one pass *and* the user
|
||||
hasn't enabled the DUP option, we'll inform the user to try the
|
||||
randomization option, use -D, or choose alternative key positions.
|
||||
The alternatives (e.g., back-tracking) are too time-consuming, i.e,
|
||||
exponential in the number of keys. */
|
||||
|
||||
int
|
||||
Gen_Perf::operator() (void)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::operator()");)
|
||||
#if LARGE_STACK_ARRAYS
|
||||
STORAGE_TYPE buffer[max_hash_value + 1];
|
||||
#else
|
||||
// Note: we don't use new, because that invokes a custom operator new.
|
||||
STORAGE_TYPE *buffer
|
||||
= (STORAGE_TYPE*) malloc (sizeof(STORAGE_TYPE) * (max_hash_value + 1));
|
||||
if (buffer == NULL)
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
Bool_Array::init (buffer, max_hash_value + 1);
|
||||
|
||||
List_Node *curr;
|
||||
for (curr = head; curr; curr = curr->next)
|
||||
{
|
||||
hash (curr);
|
||||
|
||||
for (List_Node *ptr = head; ptr != curr; ptr = ptr->next)
|
||||
if (ptr->hash_value == curr->hash_value)
|
||||
{
|
||||
change (ptr, curr);
|
||||
break;
|
||||
}
|
||||
num_done++;
|
||||
}
|
||||
|
||||
/* Make one final check, just to make sure nothing weird happened.... */
|
||||
|
||||
Bool_Array::reset ();
|
||||
|
||||
for (curr = head; curr; curr = curr->next)
|
||||
if (Bool_Array::find (hash (curr)))
|
||||
if (option[DUP]) /* Keep track of this number... */
|
||||
total_duplicates++;
|
||||
else /* Yow, big problems. we're outta here! */
|
||||
{
|
||||
fprintf (stderr, "\nInternal error, duplicate value %d:\n"
|
||||
"try options -D or -r, or use new key positions.\n\n", hash (curr));
|
||||
#if !LARGE_STACK_ARRAYS
|
||||
free ((char *) buffer);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Sorts the key word list by hash value, and then outputs the list.
|
||||
The generated hash table code is only output if the early stage of
|
||||
processing turned out O.K. */
|
||||
|
||||
sort ();
|
||||
output ();
|
||||
#if !LARGE_STACK_ARRAYS
|
||||
free ((char *) buffer);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Prints out some diagnostics upon completion. */
|
||||
|
||||
Gen_Perf::~Gen_Perf (void)
|
||||
{
|
||||
T (Trace t ("Gen_Perf::~Gen_Perf");)
|
||||
if (option[DEBUG])
|
||||
{
|
||||
fprintf (stderr, "\ndumping occurrence and associated values tables\n");
|
||||
|
||||
for (int i = 0; i < ALPHA_SIZE; i++)
|
||||
if (occurrences[i])
|
||||
fprintf (stderr, "asso_values[%c] = %6d, occurrences[%c] = %6d\n",
|
||||
i, asso_values[i], i, occurrences[i]);
|
||||
|
||||
fprintf (stderr, "end table dumping\n");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
50
src/gen-perf.h
Normal file
50
src/gen-perf.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Provides high-level routines to manipulate the keyword list
|
||||
structures the code generation output.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#ifndef gen_perf_h
|
||||
#define gen_perf_h 1
|
||||
|
||||
#include "key-list.h"
|
||||
#include "bool-array.h"
|
||||
|
||||
class Gen_Perf : private Key_List, private Bool_Array
|
||||
{
|
||||
private:
|
||||
int max_hash_value; /* Maximum possible hash value. */
|
||||
int fewest_collisions; /* Records fewest # of collisions for asso value. */
|
||||
int num_done; /* Number of keywords processed without a collision. */
|
||||
|
||||
void change (List_Node *prior, List_Node *curr);
|
||||
int affects_prev (char c, List_Node *curr);
|
||||
static int hash (List_Node *key_node);
|
||||
static int compute_disjoint_union (const char *set_1, const char *set_2, char *set_3);
|
||||
static void sort_set (char *union_set, int len);
|
||||
|
||||
public:
|
||||
Gen_Perf (void);
|
||||
~Gen_Perf (void);
|
||||
int operator () (void);
|
||||
};
|
||||
|
||||
#endif
|
||||
91
src/hash-table.cc
Normal file
91
src/hash-table.cc
Normal file
@@ -0,0 +1,91 @@
|
||||
/* Hash table for checking keyword links. Implemented using double hashing.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "hash-table.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h> /* declares memset(), strcmp() */
|
||||
#include <hash.h>
|
||||
#include "options.h"
|
||||
#include "trace.h"
|
||||
|
||||
#define NIL(TYPE) (TYPE *)0
|
||||
|
||||
/* The size of the hash table is always the smallest power of 2 >= the size
|
||||
indicated by the user. This allows several optimizations, including
|
||||
the use of double hashing and elimination of the mod instruction.
|
||||
Note that the size had better be larger than the number of items
|
||||
in the hash table, else there's trouble!!! Note that the memory
|
||||
for the hash table is allocated *outside* the intialization routine.
|
||||
This compromises information hiding somewhat, but greatly reduces
|
||||
memory fragmentation, since we can now use alloca! */
|
||||
|
||||
Hash_Table::Hash_Table (List_Node **table_ptr, int s):
|
||||
table (table_ptr), size (s), collisions (0)
|
||||
{
|
||||
T (Trace t ("Hash_Table::Hash_Table");)
|
||||
memset ((char *) table, 0, size * sizeof (*table));
|
||||
}
|
||||
|
||||
Hash_Table::~Hash_Table (void)
|
||||
{
|
||||
T (Trace t ("Hash_Table::~Hash_Table");)
|
||||
if (option[DEBUG])
|
||||
{
|
||||
int field_width = option.get_max_keysig_size ();
|
||||
|
||||
fprintf (stderr,
|
||||
"\ndumping the hash table\n"
|
||||
"total available table slots = %d, total bytes = %d, total collisions = %d\n"
|
||||
"location, %*s, keyword\n",
|
||||
size, size * (int) sizeof (*table), collisions,
|
||||
field_width, "keysig");
|
||||
|
||||
for (int i = size - 1; i >= 0; i--)
|
||||
if (table[i])
|
||||
fprintf (stderr, "%8d, %*s, %s\n",
|
||||
i, field_width, table[i]->char_set, table[i]->key);
|
||||
|
||||
fprintf (stderr, "\nend dumping hash table\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* If the ITEM is already in the hash table return the item found
|
||||
in the table. Otherwise inserts the ITEM, and returns FALSE.
|
||||
Uses double hashing. */
|
||||
|
||||
List_Node *
|
||||
Hash_Table::operator() (List_Node *item, int ignore_length)
|
||||
{
|
||||
T (Trace t ("Hash_Table::operator()");)
|
||||
unsigned hash_val = hashpjw (item->char_set);
|
||||
int probe = hash_val & size - 1;
|
||||
int increment = (hash_val ^ item->length | 1) & size - 1;
|
||||
|
||||
while (table[probe]
|
||||
&& (strcmp (table[probe]->char_set, item->char_set)
|
||||
|| (!ignore_length && table[probe]->length != item->length)))
|
||||
{
|
||||
collisions++;
|
||||
probe = probe + increment & size - 1;
|
||||
}
|
||||
|
||||
return table[probe] ? table[probe] : (table[probe] = item, NIL (List_Node));
|
||||
}
|
||||
42
src/hash-table.h
Normal file
42
src/hash-table.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Hash table used to check for duplicate keyword entries.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#ifndef hash_table_h
|
||||
#define hash_table_h 1
|
||||
|
||||
#include "list-node.h"
|
||||
|
||||
class Hash_Table
|
||||
{
|
||||
private:
|
||||
List_Node **table; /* Vector of pointers to linked lists of List_Node's. */
|
||||
int size; /* Size of the vector. */
|
||||
int collisions; /* Find out how well our double hashing is working! */
|
||||
|
||||
public:
|
||||
Hash_Table (List_Node **t, int s);
|
||||
~Hash_Table (void);
|
||||
List_Node *operator () (List_Node *item, int ignore_length);
|
||||
};
|
||||
|
||||
#endif
|
||||
88
src/iterator.cc
Normal file
88
src/iterator.cc
Normal file
@@ -0,0 +1,88 @@
|
||||
/* Provides an Iterator for keyword characters.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "iterator.h"
|
||||
|
||||
#include <stream.h>
|
||||
#include <ctype.h>
|
||||
#include "trace.h"
|
||||
|
||||
/* Constructor for Iterator. */
|
||||
|
||||
Iterator::Iterator (const char *s, int lo, int hi, int word_end, int bad_val, int key_end)
|
||||
{
|
||||
T (Trace t ("Iterator::Iterator");)
|
||||
end = key_end;
|
||||
error_value = bad_val;
|
||||
end_word = word_end;
|
||||
str = s;
|
||||
hi_bound = hi;
|
||||
lo_bound = lo;
|
||||
}
|
||||
|
||||
/* Provide an Iterator, returning the ``next'' value from
|
||||
the list of valid values given in the constructor. */
|
||||
|
||||
int
|
||||
Iterator::operator() (void)
|
||||
{
|
||||
T (Trace t ("Iterator::operator()");)
|
||||
/* Variables to record the Iterator's status when handling ranges, e.g., 3-12. */
|
||||
|
||||
static int size;
|
||||
static int curr_value;
|
||||
static int upper_bound;
|
||||
|
||||
if (size)
|
||||
{
|
||||
if (++curr_value >= upper_bound)
|
||||
size = 0;
|
||||
return curr_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (*str)
|
||||
switch (*str)
|
||||
{
|
||||
default: return error_value;
|
||||
case ',': str++; break;
|
||||
case '$': str++; return end_word;
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
for (curr_value = 0; isdigit ((unsigned char)(*str)); str++)
|
||||
curr_value = curr_value * 10 + (*str - '0');
|
||||
|
||||
if (*str == '-')
|
||||
{
|
||||
|
||||
for (size = 1, upper_bound = 0;
|
||||
isdigit ((unsigned char)(*++str));
|
||||
upper_bound = upper_bound * 10 + (*str - '0'));
|
||||
|
||||
if (upper_bound <= curr_value || upper_bound > hi_bound)
|
||||
return error_value;
|
||||
}
|
||||
return curr_value >= lo_bound && curr_value <= hi_bound
|
||||
? curr_value : error_value;
|
||||
}
|
||||
|
||||
return end;
|
||||
}
|
||||
}
|
||||
51
src/iterator.h
Normal file
51
src/iterator.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Provides an Iterator for keyword characters.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Provides an Iterator that expands and decodes a control string containing digits
|
||||
and ranges, returning an integer every time the generator function is called.
|
||||
This is used to decode the user's key position requests. For example:
|
||||
"-k 1,2,5-10,$" will return 1, 2, 5, 6, 7, 8, 9, 10, and 0 ( representing
|
||||
the abstract ``last character of the key'' on successive calls to the
|
||||
member function operator ().
|
||||
No errors are handled in these routines, they are passed back to the
|
||||
calling routines via a user-supplied Error_Value */
|
||||
|
||||
#ifndef iterator_h
|
||||
#define iterator_h 1
|
||||
|
||||
class Iterator
|
||||
{
|
||||
private:
|
||||
const char *str; /* A pointer to the string provided by the user. */
|
||||
int end; /* Value returned after last key is processed. */
|
||||
int end_word; /* A value marking the abstract ``end of word'' ( usually '$'). */
|
||||
int error_value; /* Error value returned when input is syntactically erroneous. */
|
||||
int hi_bound; /* Greatest possible value, inclusive. */
|
||||
int lo_bound; /* Smallest possible value, inclusive. */
|
||||
|
||||
public:
|
||||
Iterator (const char *s, int lo, int hi, int word_end, int bad_val, int key_end);
|
||||
int operator () (void);
|
||||
};
|
||||
|
||||
#endif
|
||||
1957
src/key-list.cc
Normal file
1957
src/key-list.cc
Normal file
File diff suppressed because it is too large
Load Diff
96
src/key-list.h
Normal file
96
src/key-list.h
Normal file
@@ -0,0 +1,96 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Data and function member declarations for the keyword list class.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
/* The key word list is a useful abstraction that keeps track of
|
||||
various pieces of information that enable that fast generation
|
||||
of the Gen_Perf.hash function. A Key_List is a singly-linked
|
||||
list of List_Nodes. */
|
||||
|
||||
#ifndef key_list_h
|
||||
#define key_list_h 1
|
||||
|
||||
#include "list-node.h"
|
||||
#include "vectors.h"
|
||||
#include "read-line.h"
|
||||
|
||||
/* OSF/1 cxx needs these forward declarations. */
|
||||
struct Output_Constants;
|
||||
struct Output_Compare;
|
||||
|
||||
class Key_List : private Read_Line, public Vectors
|
||||
{
|
||||
private:
|
||||
const char *array_type; /* Pointer to the type for word list. */
|
||||
const char *return_type; /* Pointer to return type for lookup function. */
|
||||
const char *struct_tag; /* Shorthand for user-defined struct tag type. */
|
||||
const char *include_src; /* C source code to be included verbatim. */
|
||||
int max_key_len; /* Maximum length of the longest keyword. */
|
||||
int min_key_len; /* Minimum length of the shortest keyword. */
|
||||
int min_hash_value; /* Minimum hash value for all keywords. */
|
||||
int max_hash_value; /* Maximum hash value for all keywords. */
|
||||
int occurrence_sort; /* True if sorting by occurrence. */
|
||||
int hash_sort; /* True if sorting by hash value. */
|
||||
int additional_code; /* True if any additional C code is included. */
|
||||
int list_len; /* Length of head's Key_List, not counting duplicates. */
|
||||
int total_keys; /* Total number of keys, counting duplicates. */
|
||||
static int determined[MAX_ALPHA_SIZE]; /* Used in function reorder, below. */
|
||||
static int get_occurrence (List_Node *ptr);
|
||||
#ifndef strcspn
|
||||
static int strcspn (const char *s, const char *reject);
|
||||
#endif
|
||||
static int already_determined (List_Node *ptr);
|
||||
static void set_determined (List_Node *ptr);
|
||||
void compute_min_max (void);
|
||||
int num_hash_values (void);
|
||||
void output_constants (struct Output_Constants&);
|
||||
void output_hash_function (void);
|
||||
void output_keylength_table (void);
|
||||
void output_keyword_table (void);
|
||||
void output_lookup_array (void);
|
||||
void output_lookup_tables (void);
|
||||
void output_lookup_function_body (const struct Output_Compare&);
|
||||
void output_lookup_function (void);
|
||||
void set_output_types (void);
|
||||
void dump (void);
|
||||
const char *get_array_type (void);
|
||||
const char *save_include_src (void);
|
||||
const char *get_special_input (char delimiter);
|
||||
List_Node *merge (List_Node *list1, List_Node *list2);
|
||||
List_Node *merge_sort (List_Node *head);
|
||||
|
||||
protected:
|
||||
List_Node *head; /* Points to the head of the linked list. */
|
||||
int total_duplicates; /* Total number of duplicate hash values. */
|
||||
|
||||
public:
|
||||
Key_List (void);
|
||||
~Key_List (void);
|
||||
int keyword_list_length (void);
|
||||
int max_key_length (void);
|
||||
void reorder (void);
|
||||
void sort (void);
|
||||
void read_keys (void);
|
||||
void output (void);
|
||||
};
|
||||
|
||||
#endif
|
||||
101
src/list-node.cc
Normal file
101
src/list-node.cc
Normal file
@@ -0,0 +1,101 @@
|
||||
/* Creates and initializes a new list node.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "list-node.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* declares exit() */
|
||||
#include "options.h"
|
||||
#include "trace.h"
|
||||
|
||||
/* Sorts the key set alphabetically to speed up subsequent operations.
|
||||
Uses insertion sort since the set is probably quite small. */
|
||||
|
||||
inline void
|
||||
List_Node::set_sort (char *base, int len)
|
||||
{
|
||||
T (Trace t ("List_Node::set_sort");)
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = len - 1; i < j; i++)
|
||||
{
|
||||
char curr, tmp;
|
||||
|
||||
for (curr = i + 1, tmp = base[curr]; curr > 0 && tmp < base[curr-1]; curr--)
|
||||
base[curr] = base[curr - 1];
|
||||
|
||||
base[curr] = tmp;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Initializes a List_Node. This requires obtaining memory for the CHAR_SET
|
||||
initializing them using the information stored in the KEY_POSITIONS array in Options,
|
||||
and checking for simple errors. It's important to note that KEY and REST are
|
||||
both pointers to the different offsets into the same block of dynamic memory pointed
|
||||
to by parameter K. The data member REST is used to store any additional fields
|
||||
of the input file (it is set to the "" string if Option[TYPE] is not enabled).
|
||||
This is useful if the user wishes to incorporate a lookup structure,
|
||||
rather than just an array of keys. Finally, KEY_NUMBER contains a count
|
||||
of the total number of keys seen so far. This is used to initialize
|
||||
the INDEX field to some useful value. */
|
||||
|
||||
List_Node::List_Node (char *k, int len): link (0), next (0),
|
||||
key (k), rest (option[TYPE] ? k + len + 1 : ""), length (len), index (0)
|
||||
{
|
||||
T (Trace t ("List_Node::List_Node");)
|
||||
char *ptr = new char[(option[ALLCHARS] ? len : option.get_max_keysig_size ()) + 1];
|
||||
char *key_set = ptr;
|
||||
k[len] = '\0'; /* Null terminate KEY to separate it from REST. */
|
||||
|
||||
if (option[ALLCHARS]) /* Use all the character position in the KEY. */
|
||||
for (; *k; k++, ptr++)
|
||||
++occurrences[(unsigned char)(*ptr = *k)];
|
||||
else /* Only use those character positions specified by the user. */
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Iterate thru the list of key_positions, initializing occurrences table
|
||||
and char_set (via char * pointer ptr). */
|
||||
|
||||
for (option.reset (); (i = option.get ()) != EOS; )
|
||||
{
|
||||
if (i == WORD_END) /* Special notation for last KEY position, i.e. '$'. */
|
||||
*ptr = key[len - 1];
|
||||
else if (i <= len) /* Within range of KEY length, so we'll keep it. */
|
||||
*ptr = key[i - 1];
|
||||
else /* Out of range of KEY length, so we'll just skip it. */
|
||||
continue;
|
||||
++occurrences[(unsigned char)(*ptr++)];
|
||||
}
|
||||
|
||||
/* Didn't get any hits and user doesn't want to consider the
|
||||
keylength, so there are essentially no usable hash positions! */
|
||||
if (ptr == char_set && option[NOLENGTH])
|
||||
{
|
||||
fprintf (stderr, "Can't hash keyword %s with chosen key positions.\n", key);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
*ptr = '\0'; /* Terminate this bastard.... */
|
||||
/* Sort the KEY_SET items alphabetically. */
|
||||
set_sort (key_set, ptr - key_set);
|
||||
char_set = key_set;
|
||||
}
|
||||
45
src/list-node.h
Normal file
45
src/list-node.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Data and function members for defining values and operations of a list node.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#ifndef list_node_h
|
||||
#define list_node_h 1
|
||||
|
||||
#include "vectors.h"
|
||||
|
||||
struct List_Node : private Vectors
|
||||
{
|
||||
List_Node *link; /* TRUE if key has an identical KEY_SET as another key. */
|
||||
List_Node *next; /* Points to next element on the list. */
|
||||
const char *key; /* Each keyword string stored here. */
|
||||
const char *rest; /* Additional information for building hash function. */
|
||||
const char *char_set; /* Set of characters to hash, specified by user. */
|
||||
int length; /* Length of the key. */
|
||||
int hash_value; /* Hash value for the key. */
|
||||
int occurrence; /* A metric for frequency of key set occurrences. */
|
||||
int index; /* Position of this node relative to other nodes. */
|
||||
|
||||
List_Node (char *key, int len);
|
||||
static void set_sort (char *base, int len);
|
||||
};
|
||||
|
||||
#endif
|
||||
72
src/main.cc
Normal file
72
src/main.cc
Normal file
@@ -0,0 +1,72 @@
|
||||
/* Driver program for the Gen_Perf hash function generator
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
/* Simple driver program for the Gen_Perf.hash function generator.
|
||||
Most of the hard work is done in class Gen_Perf and its class methods. */
|
||||
|
||||
#include "config.h"
|
||||
#include <sys/types.h>
|
||||
#if LARGE_STACK_ARRAYS && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include "options.h"
|
||||
#include "gen-perf.h"
|
||||
#include "trace.h"
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
T (Trace t ("main");)
|
||||
|
||||
#if LARGE_STACK_ARRAYS && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) && defined(RLIMIT_STACK)
|
||||
/* Get rid of any avoidable limit on stack size. */
|
||||
{
|
||||
struct rlimit rlim;
|
||||
if (getrlimit (RLIMIT_STACK, &rlim) == 0)
|
||||
if (rlim.rlim_cur < rlim.rlim_max)
|
||||
{
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
setrlimit (RLIMIT_STACK, &rlim);
|
||||
}
|
||||
}
|
||||
#endif /* RLIMIT_STACK */
|
||||
|
||||
/* Sets the Options. */
|
||||
option (argc, argv);
|
||||
|
||||
/* Initializes the key word list. */
|
||||
Gen_Perf generate_table;
|
||||
|
||||
/* Generates and prints the Gen_Perf hash table. */
|
||||
int status = generate_table ();
|
||||
|
||||
/* Don't use exit() here, it skips the destructors. */
|
||||
return status;
|
||||
}
|
||||
87
src/new.cc
Normal file
87
src/new.cc
Normal file
@@ -0,0 +1,87 @@
|
||||
/* Defines a buffered memory allocation abstraction that reduces calls to
|
||||
malloc.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* declares malloc(), exit() */
|
||||
#include "trace.h"
|
||||
|
||||
/* Determine default alignment. If your C++ compiler does not
|
||||
like this then try something like #define DEFAULT_ALIGNMENT 8. */
|
||||
struct fooalign {char x; double d;};
|
||||
const int ALIGNMENT = ((char *)&((struct fooalign *) 0)->d - (char *)0);
|
||||
|
||||
/* Provide an abstraction that cuts down on the number of
|
||||
calls to NEW by buffering the memory pool from which
|
||||
strings are allocated. */
|
||||
|
||||
void *
|
||||
operator new (size_t size)
|
||||
{
|
||||
T (Trace t ("operator new");)
|
||||
static char *buf_start = 0; /* Large array used to reduce calls to NEW. */
|
||||
static char *buf_end = 0; /* Indicates end of BUF_START. */
|
||||
static size_t buf_size = 4096; /* Size of buffer pointed to by BUF_START. */
|
||||
char *temp;
|
||||
|
||||
/* Align this on correct boundaries, just to be safe... */
|
||||
size = ((size + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
|
||||
|
||||
/* If we are about to overflow our buffer we'll just grab another
|
||||
chunk of memory. Since we never free the original memory it
|
||||
doesn't matter that no one points to the beginning of that
|
||||
chunk. Note we use a heuristic that grows the buffer either by
|
||||
size of the request or by twice the previous size, whichever is
|
||||
larger. */
|
||||
|
||||
if (buf_start + size >= buf_end)
|
||||
{
|
||||
buf_size *= 2;
|
||||
if (buf_size < size)
|
||||
buf_size = size;
|
||||
if ((buf_start = (char *)malloc (buf_size)) != (char *)0)
|
||||
buf_end = buf_start + buf_size;
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "Virtual memory exhausted in `operator new'\n");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
temp = buf_start;
|
||||
buf_start += size;
|
||||
return temp;
|
||||
}
|
||||
|
||||
/* We need this deletion operator in order to make the linker happy.
|
||||
Because `operator new' and `operator delete' always come together. */
|
||||
|
||||
void
|
||||
operator delete (void *ptr)
|
||||
#ifdef HAVE_THROW_DECL
|
||||
throw()
|
||||
#endif
|
||||
{
|
||||
T (Trace t ("operator delete");)
|
||||
// We cannot call free here, as it doesn't match the mallocs.
|
||||
// free ((char *) ptr);
|
||||
(void) ptr;
|
||||
}
|
||||
668
src/options.cc
Normal file
668
src/options.cc
Normal file
@@ -0,0 +1,668 @@
|
||||
/* Handles parsing the Options provided to the user.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* declares atoi(), abs(), exit() */
|
||||
#include <string.h> /* declares strcmp() */
|
||||
#include "getopt.h"
|
||||
#include "options.h"
|
||||
#include "iterator.h"
|
||||
#include "trace.h"
|
||||
#include "vectors.h"
|
||||
#include "version.h"
|
||||
|
||||
/* Global option coordinator for the entire program. */
|
||||
Options option;
|
||||
|
||||
/* Records the program name. */
|
||||
const char *program_name;
|
||||
|
||||
/* Size to jump on a collision. */
|
||||
static const int DEFAULT_JUMP_VALUE = 5;
|
||||
|
||||
/* Default name for generated lookup function. */
|
||||
static const char *const DEFAULT_NAME = "in_word_set";
|
||||
|
||||
/* Default name for the key component. */
|
||||
static const char *const DEFAULT_KEY = "name";
|
||||
|
||||
/* Default name for the generated class. */
|
||||
static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash";
|
||||
|
||||
/* Default name for generated hash function. */
|
||||
static const char *const DEFAULT_HASH_NAME = "hash";
|
||||
|
||||
/* Default name for generated hash table array. */
|
||||
static const char *const DEFAULT_WORDLIST_NAME = "wordlist";
|
||||
|
||||
/* Default delimiters that separate keywords from their attributes. */
|
||||
static const char *const DEFAULT_DELIMITERS = ",\n";
|
||||
|
||||
int Options::option_word;
|
||||
int Options::total_switches;
|
||||
int Options::total_keysig_size;
|
||||
int Options::size;
|
||||
int Options::key_pos;
|
||||
int Options::jump;
|
||||
int Options::initial_asso_value;
|
||||
int Options::argument_count;
|
||||
int Options::iterations;
|
||||
char **Options::argument_vector;
|
||||
const char *Options::function_name;
|
||||
const char *Options::key_name;
|
||||
const char *Options::class_name;
|
||||
const char *Options::hash_name;
|
||||
const char *Options::wordlist_name;
|
||||
const char *Options::delimiters;
|
||||
char Options::key_positions[MAX_KEY_POS];
|
||||
|
||||
/* Prints program usage to given stream. */
|
||||
|
||||
void
|
||||
Options::short_usage (FILE * strm)
|
||||
{
|
||||
T (Trace t ("Options::short_usage");)
|
||||
fprintf (strm, "Usage: %s [-cCdDef[num]GhH<hashname>i<init>Ijk<keys>K<keyname>lL<language>nN<function name>ors<size>S<switches>tTvW<wordlistname>Z<class name>7] [input-file]\n"
|
||||
"Try `%s --help' for more information.\n",
|
||||
program_name, program_name);
|
||||
}
|
||||
|
||||
void
|
||||
Options::long_usage (FILE * strm)
|
||||
{
|
||||
T (Trace t ("Options::long_usage");)
|
||||
fprintf (strm,
|
||||
"GNU `gperf' generates perfect hash functions.\n"
|
||||
"\n"
|
||||
"Usage: %s [OPTION]... [INPUT-FILE]\n"
|
||||
"\n"
|
||||
"If a long option shows an argument as mandatory, then it is mandatory\n"
|
||||
"for the equivalent short option also.\n"
|
||||
"\n"
|
||||
"Input file interpretation:\n"
|
||||
" -e, --delimiters=DELIMITER-LIST\n"
|
||||
" Allow user to provide a string containing delimiters\n"
|
||||
" used to separate keywords from their attributes.\n"
|
||||
" Default is \",\\n\".\n"
|
||||
" -t, --struct-type Allows the user to include a structured type\n"
|
||||
" declaration for generated code. Any text before %%%%\n"
|
||||
" is considered part of the type declaration. Key\n"
|
||||
" words and additional fields may follow this, one\n"
|
||||
" group of fields per line.\n"
|
||||
"\n"
|
||||
"Language for the output code:\n"
|
||||
" -L, --language=LANGUAGE-NAME\n"
|
||||
" Generates code in the specified language. Languages\n"
|
||||
" handled are currently C++, ANSI-C, C, and KR-C. The\n"
|
||||
" default is C.\n"
|
||||
"\n"
|
||||
"Details in the output code:\n"
|
||||
" -K, --slot-name=NAME Select name of the keyword component in the keyword\n"
|
||||
" structure.\n"
|
||||
" -H, --hash-fn-name=NAME\n"
|
||||
" Specify name of generated hash function. Default is\n"
|
||||
" `hash'.\n"
|
||||
" -N, --lookup-fn-name=NAME\n"
|
||||
" Specify name of generated lookup function. Default\n"
|
||||
" name is `in_word_set'.\n"
|
||||
" -Z, --class-name=NAME Specify name of generated C++ class. Default name is\n"
|
||||
" `Perfect_Hash'.\n"
|
||||
" -7, --seven-bit Assume 7-bit characters.\n"
|
||||
" -c, --compare-strncmp Generate comparison code using strncmp rather than\n"
|
||||
" strcmp.\n"
|
||||
" -C, --readonly-tables Make the contents of generated lookup tables\n"
|
||||
" constant, i.e., readonly.\n"
|
||||
" -E, --enum Define constant values using an enum local to the\n"
|
||||
" lookup function rather than with defines.\n"
|
||||
" -I, --includes Include the necessary system include file <string.h>\n"
|
||||
" at the beginning of the code.\n"
|
||||
" -G, --global Generate the static table of keywords as a static\n"
|
||||
" global variable, rather than hiding it inside of the\n"
|
||||
" lookup function (which is the default behavior).\n"
|
||||
" -W, --word-array-name=NAME\n"
|
||||
" Specify name of word list array. Default name is\n"
|
||||
" `wordlist'.\n"
|
||||
" -S, --switch=COUNT Causes the generated C code to use a switch\n"
|
||||
" statement scheme, rather than an array lookup table.\n"
|
||||
" This can lead to a reduction in both time and space\n"
|
||||
" requirements for some keyfiles. The COUNT argument\n"
|
||||
" determines how many switch statements are generated.\n"
|
||||
" A value of 1 generates 1 switch containing all the\n"
|
||||
" elements, a value of 2 generates 2 tables with 1/2\n"
|
||||
" the elements in each table, etc. If COUNT is very\n"
|
||||
" large, say 1000000, the generated C code does a\n"
|
||||
" binary search.\n"
|
||||
" -T, --omit-struct-type\n"
|
||||
" Prevents the transfer of the type declaration to the\n"
|
||||
" output file. Use this option if the type is already\n"
|
||||
" defined elsewhere.\n"
|
||||
"\n"
|
||||
"Algorithm employed by gperf:\n"
|
||||
" -k, --key-positions=KEYS\n"
|
||||
" Select the key positions used in the hash function.\n"
|
||||
" The allowable choices range between 1-%d, inclusive.\n"
|
||||
" The positions are separated by commas, ranges may be\n"
|
||||
" used, and key positions may occur in any order.\n"
|
||||
" Also, the meta-character '*' causes the generated\n"
|
||||
" hash function to consider ALL key positions, and $\n"
|
||||
" indicates the ``final character'' of a key, e.g.,\n"
|
||||
" $,1,2,4,6-10.\n"
|
||||
" -l, --compare-strlen Compare key lengths before trying a string\n"
|
||||
" comparison. This helps cut down on the number of\n"
|
||||
" string comparisons made during the lookup.\n"
|
||||
" -D, --duplicates Handle keywords that hash to duplicate values. This\n"
|
||||
" is useful for certain highly redundant keyword sets.\n"
|
||||
" -f, --fast=ITERATIONS Generate the gen-perf.hash function ``fast''. This\n"
|
||||
" decreases gperf's running time at the cost of\n"
|
||||
" minimizing generated table size. The numeric\n"
|
||||
" argument represents the number of times to iterate\n"
|
||||
" when resolving a collision. `0' means ``iterate by\n"
|
||||
" the number of keywords''.\n"
|
||||
" -i, --initial-asso=N Provide an initial value for the associate values\n"
|
||||
" array. Default is 0. Setting this value larger helps\n"
|
||||
" inflate the size of the final table.\n"
|
||||
" -j, --jump=JUMP-VALUE Affects the ``jump value'', i.e., how far to advance\n"
|
||||
" the associated character value upon collisions. Must\n"
|
||||
" be an odd number, default is %d.\n"
|
||||
" -n, --no-strlen Do not include the length of the keyword when\n"
|
||||
" computing the hash function.\n"
|
||||
" -o, --occurrence-sort Reorders input keys by frequency of occurrence of\n"
|
||||
" the key sets. This should decrease the search time\n"
|
||||
" dramatically.\n"
|
||||
" -r, --random Utilizes randomness to initialize the associated\n"
|
||||
" values table.\n"
|
||||
" -s, --size-multiple=N Affects the size of the generated hash table. The\n"
|
||||
" numeric argument N indicates ``how many times larger\n"
|
||||
" or smaller'' the associated value range should be,\n"
|
||||
" in relationship to the number of keys, e.g. a value\n"
|
||||
" of 3 means ``allow the maximum associated value to\n"
|
||||
" be about 3 times larger than the number of input\n"
|
||||
" keys.'' Conversely, a value of -3 means ``make the\n"
|
||||
" maximum associated value about 3 times smaller than\n"
|
||||
" the number of input keys. A larger table should\n"
|
||||
" decrease the time required for an unsuccessful\n"
|
||||
" search, at the expense of extra table space. Default\n"
|
||||
" value is 1.\n"
|
||||
"\n"
|
||||
"Informative output:\n"
|
||||
" -h, --help Print this message.\n"
|
||||
" -v, --version Print the gperf version number.\n"
|
||||
" -d, --debug Enables the debugging option (produces verbose\n"
|
||||
" output to the standard error).\n"
|
||||
"\n"
|
||||
"Report bugs to <bug-gnu-utils@gnu.org>.\n"
|
||||
, program_name, MAX_KEY_POS - 1, DEFAULT_JUMP_VALUE);
|
||||
}
|
||||
|
||||
/* Output command-line Options. */
|
||||
|
||||
void
|
||||
Options::print_options (void)
|
||||
{
|
||||
T (Trace t ("Options::print_options");)
|
||||
int i;
|
||||
|
||||
printf ("/* Command-line: ");
|
||||
|
||||
for (i = 0; i < argument_count; i++)
|
||||
printf ("%s ", argument_vector[i]);
|
||||
|
||||
printf (" */");
|
||||
}
|
||||
|
||||
/* Sorts the key positions *IN REVERSE ORDER!!*
|
||||
This makes further routines more efficient. Especially when generating code.
|
||||
Uses a simple Insertion Sort since the set is probably ordered.
|
||||
Returns 1 if there are no duplicates, 0 otherwise. */
|
||||
|
||||
inline int
|
||||
Options::key_sort (char *base, int len)
|
||||
{
|
||||
T (Trace t ("Options::key_sort");)
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = len - 1; i < j; i++)
|
||||
{
|
||||
int curr, tmp;
|
||||
|
||||
for (curr = i + 1,tmp = base[curr]; curr > 0 && tmp >= base[curr - 1]; curr--)
|
||||
if ((base[curr] = base[curr - 1]) == tmp) /* oh no, a duplicate!!! */
|
||||
return 0;
|
||||
|
||||
base[curr] = tmp;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Sets the default Options. */
|
||||
|
||||
Options::Options (void)
|
||||
{
|
||||
T (Trace t ("Options::Options");)
|
||||
key_positions[0] = WORD_START;
|
||||
key_positions[1] = WORD_END;
|
||||
key_positions[2] = EOS;
|
||||
total_keysig_size = 2;
|
||||
delimiters = DEFAULT_DELIMITERS;
|
||||
jump = DEFAULT_JUMP_VALUE;
|
||||
option_word = DEFAULTCHARS | C;
|
||||
function_name = DEFAULT_NAME;
|
||||
key_name = DEFAULT_KEY;
|
||||
hash_name = DEFAULT_HASH_NAME;
|
||||
wordlist_name = DEFAULT_WORDLIST_NAME;
|
||||
class_name = DEFAULT_CLASS_NAME;
|
||||
total_switches = size = 1;
|
||||
initial_asso_value = iterations = 0;
|
||||
}
|
||||
|
||||
/* Dumps option status when debug is set. */
|
||||
|
||||
Options::~Options (void)
|
||||
{
|
||||
T (Trace t ("Options::~Options");)
|
||||
if (option_word & DEBUG)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
fprintf (stderr, "\ndumping Options:"
|
||||
"\nDEBUG is.......: %s"
|
||||
"\nORDER is.......: %s"
|
||||
"\nTYPE is........: %s"
|
||||
"\nRANDOM is......: %s"
|
||||
"\nDEFAULTCHARS is: %s"
|
||||
"\nSWITCH is......: %s"
|
||||
"\nNOLENGTH is....: %s"
|
||||
"\nLENTABLE is....: %s"
|
||||
"\nDUP is.........: %s"
|
||||
"\nFAST is........: %s"
|
||||
"\nCOMP is........: %s"
|
||||
"\nNOTYPE is......: %s"
|
||||
"\nGLOBAL is......: %s"
|
||||
"\nCONST is.......: %s"
|
||||
"\nKRC is.........: %s"
|
||||
"\nC is...........: %s"
|
||||
"\nANSIC is.......: %s"
|
||||
"\nCPLUSPLUS is...: %s"
|
||||
"\nENUM is........: %s"
|
||||
"\nINCLUDE is.....: %s"
|
||||
"\nSEVENBIT is....: %s"
|
||||
"\niterations = %d"
|
||||
"\nlookup function name = %s"
|
||||
"\nhash function name = %s"
|
||||
"\nword list name = %s"
|
||||
"\nkey name = %s"
|
||||
"\njump value = %d"
|
||||
"\nmax associated value = %d"
|
||||
"\ninitial associated value = %d"
|
||||
"\ndelimiters = %s"
|
||||
"\nnumber of switch statements = %d\n",
|
||||
option_word & DEBUG ? "enabled" : "disabled",
|
||||
option_word & ORDER ? "enabled" : "disabled",
|
||||
option_word & TYPE ? "enabled" : "disabled",
|
||||
option_word & RANDOM ? "enabled" : "disabled",
|
||||
option_word & DEFAULTCHARS ? "enabled" : "disabled",
|
||||
option_word & SWITCH ? "enabled" : "disabled",
|
||||
option_word & NOLENGTH ? "enabled" : "disabled",
|
||||
option_word & LENTABLE ? "enabled" : "disabled",
|
||||
option_word & DUP ? "enabled" : "disabled",
|
||||
option_word & FAST ? "enabled" : "disabled",
|
||||
option_word & COMP ? "enabled" : "disabled",
|
||||
option_word & NOTYPE ? "enabled" : "disabled",
|
||||
option_word & GLOBAL ? "enabled" : "disabled",
|
||||
option_word & CONST ? "enabled" : "disabled",
|
||||
option_word & KRC ? "enabled" : "disabled",
|
||||
option_word & C ? "enabled" : "disabled",
|
||||
option_word & ANSIC ? "enabled" : "disabled",
|
||||
option_word & CPLUSPLUS ? "enabled" : "disabled",
|
||||
option_word & ENUM ? "enabled" : "disabled",
|
||||
option_word & INCLUDE ? "enabled" : "disabled",
|
||||
option_word & SEVENBIT ? "enabled" : "disabled",
|
||||
iterations,
|
||||
function_name, hash_name, wordlist_name, key_name,
|
||||
jump, size - 1, initial_asso_value, delimiters, total_switches);
|
||||
if (option_word & ALLCHARS)
|
||||
fprintf (stderr, "all characters are used in the hash function\n");
|
||||
|
||||
fprintf (stderr, "maximum keysig size = %d\nkey positions are: \n",
|
||||
total_keysig_size);
|
||||
|
||||
for (ptr = key_positions; *ptr != EOS; ptr++)
|
||||
if (*ptr == WORD_END)
|
||||
fprintf (stderr, "$\n");
|
||||
else
|
||||
fprintf (stderr, "%d\n", *ptr);
|
||||
|
||||
fprintf (stderr, "finished dumping Options\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Parses the command line Options and sets appropriate flags in option_word. */
|
||||
|
||||
static const struct option long_options[] =
|
||||
{
|
||||
{ "delimiters", required_argument, 0, 'e' },
|
||||
{ "struct-type", no_argument, 0, 't' },
|
||||
{ "language", required_argument, 0, 'L' },
|
||||
{ "slot-name", required_argument, 0, 'K' },
|
||||
{ "hash-fn-name", required_argument, 0, 'H' },
|
||||
{ "lookup-fn-name", required_argument, 0, 'N' },
|
||||
{ "class-name", required_argument, 0, 'Z' },
|
||||
{ "seven-bit", no_argument, 0, '7' },
|
||||
{ "compare-strncmp", no_argument, 0, 'c' },
|
||||
{ "readonly-tables", no_argument, 0, 'C' },
|
||||
{ "enum", no_argument, 0, 'E' },
|
||||
{ "includes", no_argument, 0, 'I' },
|
||||
{ "global", no_argument, 0, 'G' },
|
||||
{ "word-array-name", required_argument, 0, 'W' },
|
||||
{ "switch", required_argument, 0, 'S' },
|
||||
{ "omit-struct-type", no_argument, 0, 'T' },
|
||||
{ "key-positions", required_argument, 0, 'k' },
|
||||
{ "compare-strlen", no_argument, 0, 'l' },
|
||||
{ "duplicates", no_argument, 0, 'D' },
|
||||
{ "fast", required_argument, 0, 'f' },
|
||||
{ "initial-asso", required_argument, 0, 'i' },
|
||||
{ "jump", required_argument, 0, 'j' },
|
||||
{ "no-strlen", no_argument, 0, 'n' },
|
||||
{ "occurrence-sort", no_argument, 0, 'o' },
|
||||
{ "random", no_argument, 0, 'r' },
|
||||
{ "size-multiple", required_argument, 0, 's' },
|
||||
{ "help", no_argument, 0, 'h' },
|
||||
{ "version", no_argument, 0, 'v' },
|
||||
{ "debug", no_argument, 0, 'd' },
|
||||
{ 0, no_argument, 0, 0 }
|
||||
};
|
||||
|
||||
void
|
||||
Options::operator() (int argc, char *argv[])
|
||||
{
|
||||
T (Trace t ("Options::operator()");)
|
||||
int option_char;
|
||||
|
||||
program_name = argv[0];
|
||||
argument_count = argc;
|
||||
argument_vector = argv;
|
||||
|
||||
while ((option_char =
|
||||
getopt_long (argument_count, argument_vector,
|
||||
"adcCDe:Ef:gGhH:i:Ij:k:K:lL:nN:oprs:S:tTvW:Z:7",
|
||||
long_options, (int *)0))
|
||||
!= -1)
|
||||
{
|
||||
switch (option_char)
|
||||
{
|
||||
case 'a': /* Generated code uses the ANSI prototype format. */
|
||||
break; /* This is now the default. */
|
||||
case 'c': /* Generate strncmp rather than strcmp. */
|
||||
{
|
||||
option_word |= COMP;
|
||||
break;
|
||||
}
|
||||
case 'C': /* Make the generated tables readonly (const). */
|
||||
{
|
||||
option_word |= CONST;
|
||||
break;
|
||||
}
|
||||
case 'd': /* Enable debugging option. */
|
||||
{
|
||||
option_word |= DEBUG;
|
||||
fprintf (stderr, "Starting program %s, version %s, with debugging on.\n",
|
||||
program_name, version_string);
|
||||
break;
|
||||
}
|
||||
case 'D': /* Enable duplicate option. */
|
||||
{
|
||||
option_word |= DUP;
|
||||
break;
|
||||
}
|
||||
case 'e': /* Allows user to provide keyword/attribute separator */
|
||||
{
|
||||
option.delimiters = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case 'E':
|
||||
{
|
||||
option_word |= ENUM;
|
||||
break;
|
||||
}
|
||||
case 'f': /* Generate the hash table ``fast.'' */
|
||||
{
|
||||
option_word |= FAST;
|
||||
if ((iterations = atoi (/*getopt*/optarg)) < 0)
|
||||
{
|
||||
fprintf (stderr, "iterations value must not be negative, assuming 0\n");
|
||||
iterations = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'g': /* Use the ``inline'' keyword for generated sub-routines, ifdef __GNUC__. */
|
||||
break; /* This is now the default. */
|
||||
case 'G': /* Make the keyword table a global variable. */
|
||||
{
|
||||
option_word |= GLOBAL;
|
||||
break;
|
||||
}
|
||||
case 'h': /* Displays a list of helpful Options to the user. */
|
||||
{
|
||||
long_usage (stdout);
|
||||
exit (0);
|
||||
}
|
||||
case 'H': /* Sets the name for the hash function */
|
||||
{
|
||||
hash_name = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case 'i': /* Sets the initial value for the associated values array. */
|
||||
{
|
||||
if ((initial_asso_value = atoi (/*getopt*/optarg)) < 0)
|
||||
fprintf (stderr, "Initial value %d should be non-zero, ignoring and continuing.\n", initial_asso_value);
|
||||
if (option[RANDOM])
|
||||
fprintf (stderr, "warning, -r option superceeds -i, ignoring -i option and continuing\n");
|
||||
break;
|
||||
}
|
||||
case 'I': /* Enable #include statements. */
|
||||
{
|
||||
option_word |= INCLUDE;
|
||||
break;
|
||||
}
|
||||
case 'j': /* Sets the jump value, must be odd for later algorithms. */
|
||||
{
|
||||
if ((jump = atoi (/*getopt*/optarg)) < 0)
|
||||
{
|
||||
fprintf (stderr, "Jump value %d must be a positive number.\n", jump);
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
else if (jump && ((jump % 2) == 0))
|
||||
fprintf (stderr, "Jump value %d should be odd, adding 1 and continuing...\n", jump++);
|
||||
break;
|
||||
}
|
||||
case 'k': /* Sets key positions used for hash function. */
|
||||
{
|
||||
const int BAD_VALUE = -1;
|
||||
int value;
|
||||
Iterator expand (/*getopt*/optarg, 1, MAX_KEY_POS - 1, WORD_END, BAD_VALUE, EOS);
|
||||
|
||||
if (/*getopt*/optarg [0] == '*') /* Use all the characters for hashing!!!! */
|
||||
option_word = (option_word & ~DEFAULTCHARS) | ALLCHARS;
|
||||
else
|
||||
{
|
||||
char *key_pos;
|
||||
|
||||
for (key_pos = key_positions; (value = expand ()) != EOS; key_pos++)
|
||||
if (value == BAD_VALUE)
|
||||
{
|
||||
fprintf (stderr, "Illegal key value or range, use 1,2,3-%d,'$' or '*'.\n",
|
||||
MAX_KEY_POS - 1);
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
else
|
||||
*key_pos = value;;
|
||||
|
||||
*key_pos = EOS;
|
||||
|
||||
if (! (total_keysig_size = (key_pos - key_positions)))
|
||||
{
|
||||
fprintf (stderr, "No keys selected.\n");
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
else if (! key_sort (key_positions, total_keysig_size))
|
||||
{
|
||||
fprintf (stderr, "Duplicate keys selected\n");
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (total_keysig_size != 2
|
||||
|| (key_positions[0] != 1 || key_positions[1] != WORD_END))
|
||||
option_word &= ~DEFAULTCHARS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'K': /* Make this the keyname for the keyword component field. */
|
||||
{
|
||||
key_name = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case 'l': /* Create length table to avoid extra string compares. */
|
||||
{
|
||||
option_word |= LENTABLE;
|
||||
break;
|
||||
}
|
||||
case 'L': /* Deal with different generated languages. */
|
||||
{
|
||||
option_word &= ~(KRC | C | ANSIC | CPLUSPLUS);
|
||||
if (!strcmp (/*getopt*/optarg, "KR-C"))
|
||||
option_word |= KRC;
|
||||
else if (!strcmp (/*getopt*/optarg, "C"))
|
||||
option_word |= C;
|
||||
else if (!strcmp (/*getopt*/optarg, "ANSI-C"))
|
||||
option_word |= ANSIC;
|
||||
else if (!strcmp (/*getopt*/optarg, "C++"))
|
||||
option_word |= CPLUSPLUS;
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "unsupported language option %s, defaulting to C\n", /*getopt*/optarg);
|
||||
option_word |= C;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'n': /* Don't include the length when computing hash function. */
|
||||
{
|
||||
option_word |= NOLENGTH;
|
||||
break;
|
||||
}
|
||||
case 'N': /* Make generated lookup function name be optarg */
|
||||
{
|
||||
function_name = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case 'o': /* Order input by frequency of key set occurrence. */
|
||||
{
|
||||
option_word |= ORDER;
|
||||
break;
|
||||
}
|
||||
case 'p': /* Generated lookup function a pointer instead of int. */
|
||||
break; /* This is now the default. */
|
||||
case 'r': /* Utilize randomness to initialize the associated values table. */
|
||||
{
|
||||
option_word |= RANDOM;
|
||||
if (option.initial_asso_value != 0)
|
||||
fprintf (stderr, "warning, -r option superceeds -i, disabling -i option and continuing\n");
|
||||
break;
|
||||
}
|
||||
case 's': /* Range of associated values, determines size of final table. */
|
||||
{
|
||||
if (abs (size = atoi (/*getopt*/optarg)) > 50)
|
||||
fprintf (stderr, "%d is excessive, did you really mean this?! (try `%s --help' for help)\n", size, program_name);
|
||||
break;
|
||||
}
|
||||
case 'S': /* Generate switch statement output, rather than lookup table. */
|
||||
{
|
||||
option_word |= SWITCH;
|
||||
if ((option.total_switches = atoi (/*getopt*/optarg)) <= 0)
|
||||
{
|
||||
fprintf (stderr, "number of switches %s must be a positive number\n", /*getopt*/optarg);
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 't': /* Enable the TYPE mode, allowing arbitrary user structures. */
|
||||
{
|
||||
option_word |= TYPE;
|
||||
break;
|
||||
}
|
||||
case 'T': /* Don't print structure definition. */
|
||||
{
|
||||
option_word |= NOTYPE;
|
||||
break;
|
||||
}
|
||||
case 'v': /* Print out the version and quit. */
|
||||
fprintf (stdout, "GNU gperf %s\n", version_string);
|
||||
exit (0);
|
||||
case 'W': /* Sets the name for the hash table array */
|
||||
{
|
||||
wordlist_name = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case 'Z': /* Set the class name. */
|
||||
{
|
||||
class_name = /*getopt*/optarg;
|
||||
break;
|
||||
}
|
||||
case '7': /* Assume 7-bit characters. */
|
||||
{
|
||||
option_word |= SEVENBIT;
|
||||
Vectors::ALPHA_SIZE = 128;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (argv[/*getopt*/optind] && ! freopen (argv[/*getopt*/optind], "r", stdin))
|
||||
{
|
||||
fprintf (stderr, "Cannot open keyword file `%s'\n", argv[/*getopt*/optind]);
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (++/*getopt*/optind < argc)
|
||||
{
|
||||
fprintf (stderr, "Extra trailing arguments to %s.\n", program_name);
|
||||
short_usage (stderr);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef __OPTIMIZE__
|
||||
|
||||
#define INLINE /* not inline */
|
||||
#include "options.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif /* not defined __OPTIMIZE__ */
|
||||
157
src/options.h
Normal file
157
src/options.h
Normal file
@@ -0,0 +1,157 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Handles parsing the Options provided to the user.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
/* This module provides a uniform interface to the various options available
|
||||
to a user of the gperf hash function generator. In addition to the
|
||||
run-time options, found in the Option_Type below, there is also the
|
||||
hash table Size and the Keys to be used in the hashing.
|
||||
The overall design of this module was an experiment in using C++
|
||||
classes as a mechanism to enhance centralization of option and
|
||||
and error handling, which tend to get out of hand in a C program. */
|
||||
|
||||
#ifndef options_h
|
||||
#define options_h 1
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Enumerate the potential debugging Options. */
|
||||
|
||||
enum Option_Type
|
||||
{
|
||||
DEBUG = 01, /* Enable debugging (prints diagnostics to stderr). */
|
||||
ORDER = 02, /* Apply ordering heuristic to speed-up search time. */
|
||||
ALLCHARS = 04, /* Use all characters in hash function. */
|
||||
TYPE = 010, /* Handle user-defined type structured keyword input. */
|
||||
RANDOM = 020, /* Randomly initialize the associated values table. */
|
||||
DEFAULTCHARS = 040, /* Make default char positions be 1,$ (end of keyword). */
|
||||
SWITCH = 0100, /* Generate switch output to save space. */
|
||||
NOLENGTH = 0200, /* Don't include keyword length in hash computations. */
|
||||
LENTABLE = 0400, /* Generate a length table for string comparison. */
|
||||
DUP = 01000, /* Handle duplicate hash values for keywords. */
|
||||
FAST = 02000, /* Generate the hash function ``fast.'' */
|
||||
NOTYPE = 04000, /* Don't include user-defined type definition in output -- it's already defined elsewhere. */
|
||||
COMP = 010000, /* Generate strncmp rather than strcmp. */
|
||||
GLOBAL = 020000, /* Make the keyword table a global variable. */
|
||||
CONST = 040000, /* Make the generated tables readonly (const). */
|
||||
KRC = 0100000, /* Generate K&R C code: no prototypes, no const. */
|
||||
C = 0200000, /* Generate C code: no prototypes, but const (user can #define it away). */
|
||||
ANSIC = 0400000, /* Generate ISO/ANSI C code: prototypes and const, but no class. */
|
||||
CPLUSPLUS = 01000000, /* Generate C++ code: prototypes, const, class, inline, enum. */
|
||||
ENUM = 02000000, /* Use enum for constants. */
|
||||
INCLUDE = 04000000, /* Generate #include statements. */
|
||||
SEVENBIT = 010000000 /* Assume 7-bit, not 8-bit, characters. */
|
||||
};
|
||||
|
||||
/* Define some useful constants (these don't really belong here, but I'm
|
||||
not sure where else to put them!). These should be consts, but g++
|
||||
doesn't seem to do the right thing with them at the moment... ;-( */
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_KEY_POS = 128 - 1, /* Max size of each word's key set. */
|
||||
WORD_START = 1, /* Signals the start of a word. */
|
||||
WORD_END = 0, /* Signals the end of a word. */
|
||||
EOS = MAX_KEY_POS /* Signals end of the key list. */
|
||||
};
|
||||
|
||||
/* Class manager for gperf program Options. */
|
||||
|
||||
class Options
|
||||
{
|
||||
public:
|
||||
Options (void);
|
||||
~Options (void);
|
||||
int operator[] (Option_Type option);
|
||||
void operator() (int argc, char *argv[]);
|
||||
void operator= (enum Option_Type);
|
||||
void operator!= (enum Option_Type);
|
||||
static void print_options (void);
|
||||
static void set_asso_max (int r);
|
||||
static int get_asso_max (void);
|
||||
static void reset (void);
|
||||
static int get (void);
|
||||
static int get_iterations (void);
|
||||
static int get_max_keysig_size (void);
|
||||
static void set_keysig_size (int);
|
||||
static int get_jump (void);
|
||||
static int initial_value (void);
|
||||
static int get_total_switches (void);
|
||||
static const char *get_function_name (void);
|
||||
static const char *get_key_name (void);
|
||||
static const char *get_class_name (void);
|
||||
static const char *get_hash_name (void);
|
||||
static const char *get_wordlist_name (void);
|
||||
static const char *get_delimiter (void);
|
||||
|
||||
private:
|
||||
static int option_word; /* Holds the user-specified Options. */
|
||||
static int total_switches; /* Number of switch statements to generate. */
|
||||
static int total_keysig_size; /* Total number of distinct key_positions. */
|
||||
static int size; /* Range of the hash table. */
|
||||
static int key_pos; /* Tracks current key position for Iterator. */
|
||||
static int jump; /* Jump length when trying alternative values. */
|
||||
static int initial_asso_value; /* Initial value for asso_values table. */
|
||||
static int argument_count; /* Records count of command-line arguments. */
|
||||
static int iterations; /* Amount to iterate when a collision occurs. */
|
||||
static char **argument_vector; /* Stores a pointer to command-line vector. */
|
||||
static const char *function_name; /* Names used for generated lookup function. */
|
||||
static const char *key_name; /* Name used for keyword key. */
|
||||
static const char *class_name; /* Name used for generated C++ class. */
|
||||
static const char *hash_name; /* Name used for generated hash function. */
|
||||
static const char *wordlist_name; /* Name used for hash table array. */
|
||||
static const char *delimiters; /* Separates keywords from other attributes. */
|
||||
static char key_positions[MAX_KEY_POS]; /* Contains user-specified key choices. */
|
||||
static int key_sort (char *base, int len); /* Sorts key positions in REVERSE order. */
|
||||
static void short_usage (FILE * strm); /* Prints proper program usage. */
|
||||
static void long_usage (FILE * strm); /* Prints proper program usage. */
|
||||
};
|
||||
|
||||
/* Global option coordinator for the entire program. */
|
||||
extern Options option;
|
||||
|
||||
/* Set to 1 if your want to stack-allocate some large arrays.
|
||||
This requires compiler support for variable-size arrays on the stack
|
||||
(not ANSI). */
|
||||
#ifndef LARGE_STACK_ARRAYS
|
||||
#if defined(__GNUG__) && !defined(__STRICT_ANSI__)
|
||||
#define LARGE_STACK_ARRAYS 1
|
||||
#else
|
||||
#define LARGE_STACK_ARRAYS 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Set to 1 if the stack is large enough for holding a text line. */
|
||||
#ifndef LARGE_STACK
|
||||
#define LARGE_STACK 1
|
||||
#endif
|
||||
|
||||
#ifdef __OPTIMIZE__
|
||||
|
||||
#include "trace.h"
|
||||
#define INLINE inline
|
||||
#include "options.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
175
src/options.icc
Normal file
175
src/options.icc
Normal file
@@ -0,0 +1,175 @@
|
||||
/* Inline Functions for options.{h,cc}.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
// This needs:
|
||||
//#include "trace.h"
|
||||
|
||||
/* TRUE if option enable, else FALSE. */
|
||||
INLINE int
|
||||
Options::operator[] (Option_Type option)
|
||||
{
|
||||
T (Trace t ("Options::operator[]");)
|
||||
return option_word & option;
|
||||
}
|
||||
|
||||
/* Enables option OPT. */
|
||||
INLINE void
|
||||
Options::operator = (enum Option_Type opt)
|
||||
{
|
||||
T (Trace t ("Options::operator=");)
|
||||
option_word |= opt;
|
||||
}
|
||||
|
||||
/* Disables option OPT. */
|
||||
INLINE void
|
||||
Options::operator != (enum Option_Type opt)
|
||||
{
|
||||
T (Trace t ("Options::operator!=");)
|
||||
option_word &= ~opt;
|
||||
}
|
||||
|
||||
/* Initializes the key Iterator. */
|
||||
INLINE void
|
||||
Options::reset (void)
|
||||
{
|
||||
T (Trace t ("Options::reset");)
|
||||
key_pos = 0;
|
||||
}
|
||||
|
||||
/* Returns current key_position and advance index. */
|
||||
INLINE int
|
||||
Options::get (void)
|
||||
{
|
||||
T (Trace t ("Options::get");)
|
||||
return key_positions[key_pos++];
|
||||
}
|
||||
|
||||
/* Sets the size of the table size. */
|
||||
INLINE void
|
||||
Options::set_asso_max (int r)
|
||||
{
|
||||
T (Trace t ("Options::set_asso_max");)
|
||||
size = r;
|
||||
}
|
||||
|
||||
/* Returns the size of the table size. */
|
||||
INLINE int
|
||||
Options::get_asso_max (void)
|
||||
{
|
||||
T (Trace t ("Options::get_asso_max");)
|
||||
return size;
|
||||
}
|
||||
|
||||
/* Returns total distinct key positions. */
|
||||
INLINE int
|
||||
Options::get_max_keysig_size (void)
|
||||
{
|
||||
T (Trace t ("Options::get_max_keysig_size");)
|
||||
return total_keysig_size;
|
||||
}
|
||||
|
||||
/* Sets total distinct key positions. */
|
||||
INLINE void
|
||||
Options::set_keysig_size (int size)
|
||||
{
|
||||
T (Trace t ("Options::set_keysig_size");)
|
||||
total_keysig_size = size;
|
||||
}
|
||||
|
||||
/* Returns the jump value. */
|
||||
INLINE int
|
||||
Options::get_jump (void)
|
||||
{
|
||||
T (Trace t ("Options::get_jump");)
|
||||
return jump;
|
||||
}
|
||||
|
||||
/* Returns the generated function name. */
|
||||
INLINE const char *
|
||||
Options::get_function_name (void)
|
||||
{
|
||||
T (Trace t ("Options::get_function_name");)
|
||||
return function_name;
|
||||
}
|
||||
|
||||
/* Returns the keyword key name. */
|
||||
INLINE const char *
|
||||
Options::get_key_name (void)
|
||||
{
|
||||
T (Trace t ("Options::get_key_name");)
|
||||
return key_name;
|
||||
}
|
||||
|
||||
/* Returns the hash function name. */
|
||||
INLINE const char *
|
||||
Options::get_hash_name (void)
|
||||
{
|
||||
T (Trace t ("Options::get_hash_name");)
|
||||
return hash_name;
|
||||
}
|
||||
|
||||
/* Returns the hash table array name. */
|
||||
INLINE const char *
|
||||
Options::get_wordlist_name (void)
|
||||
{
|
||||
T (Trace t ("Options::get_wordlist_name");)
|
||||
return wordlist_name;
|
||||
}
|
||||
|
||||
/* Returns the generated class name. */
|
||||
INLINE const char *
|
||||
Options::get_class_name (void)
|
||||
{
|
||||
T (Trace t ("Options::get_class_name");)
|
||||
return class_name;
|
||||
}
|
||||
|
||||
/* Returns the initial associated character value. */
|
||||
INLINE int
|
||||
Options::initial_value (void)
|
||||
{
|
||||
T (Trace t ("Options::initial_value");)
|
||||
return initial_asso_value;
|
||||
}
|
||||
|
||||
/* Returns the iterations value. */
|
||||
INLINE int
|
||||
Options::get_iterations (void)
|
||||
{
|
||||
T (Trace t ("Options::get_iterations");)
|
||||
return iterations;
|
||||
}
|
||||
|
||||
/* Returns the string used to delimit keywords from other attributes. */
|
||||
INLINE const char *
|
||||
Options::get_delimiter ()
|
||||
{
|
||||
T (Trace t ("Options::get_delimiter");)
|
||||
return delimiters;
|
||||
}
|
||||
|
||||
/* Gets the total number of switch statements to generate. */
|
||||
INLINE int
|
||||
Options::get_total_switches ()
|
||||
{
|
||||
T (Trace t ("Options::get_total_switches");)
|
||||
return total_switches;
|
||||
}
|
||||
97
src/read-line.cc
Normal file
97
src/read-line.cc
Normal file
@@ -0,0 +1,97 @@
|
||||
/* Correctly reads an arbitrarily size string.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "read-line.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h> /* declares memcpy() */
|
||||
#include "options.h"
|
||||
#include "trace.h"
|
||||
|
||||
/* Recursively fills up the buffer. */
|
||||
|
||||
#define CHUNK_SIZE 4096
|
||||
|
||||
/* CHUNKS is the number of chunks (each of size CHUNK_SIZE) which have
|
||||
already been read and which are temporarily stored on the stack.
|
||||
This function reads the remainder of the line, allocates a buffer
|
||||
for the entire line, fills the part beyond &buffer[chunks*CHUNK_SIZE],
|
||||
and returns &buffer[chunks*CHUNK_SIZE]. */
|
||||
|
||||
char *
|
||||
Read_Line::readln_aux (int chunks)
|
||||
{
|
||||
T (Trace t ("Read_Line::readln_aux");)
|
||||
#if LARGE_STACK
|
||||
char buf[CHUNK_SIZE];
|
||||
#else
|
||||
// Note: we don't use new, because that invokes a custom operator new.
|
||||
char *buf = (char*)malloc(CHUNK_SIZE);
|
||||
if (buf == NULL)
|
||||
abort ();
|
||||
#endif
|
||||
char *bufptr = buf;
|
||||
char *ptr;
|
||||
int c;
|
||||
|
||||
while (c = getc (fp), c != EOF && c != '\n') /* fill the current buffer */
|
||||
{
|
||||
*bufptr++ = c;
|
||||
if (bufptr - buf == CHUNK_SIZE)
|
||||
{
|
||||
if ((ptr = readln_aux (chunks + 1)) != NULL)
|
||||
|
||||
/* prepend remainder to ptr buffer */
|
||||
{
|
||||
ptr -= CHUNK_SIZE;
|
||||
memcpy (ptr, buf, CHUNK_SIZE);
|
||||
}
|
||||
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
if (c == EOF && bufptr == buf && chunks == 0)
|
||||
ptr = NULL;
|
||||
else
|
||||
{
|
||||
size_t s1 = chunks * CHUNK_SIZE;
|
||||
size_t s2 = bufptr - buf;
|
||||
|
||||
ptr = new char[s1+s2+1];
|
||||
ptr += s1;
|
||||
ptr[s2] = '\0';
|
||||
memcpy (ptr, buf, s2);
|
||||
}
|
||||
done:
|
||||
#if !LARGE_STACK
|
||||
free (buf);
|
||||
#endif
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
#ifndef __OPTIMIZE__
|
||||
|
||||
#define INLINE /* not inline */
|
||||
#include "read-line.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif /* not defined __OPTIMIZE__ */
|
||||
53
src/read-line.h
Normal file
53
src/read-line.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Reads arbitrarily long string from input file, returning it as a
|
||||
dynamically allocated buffer.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
/* Returns a pointer to an arbitrary length string. Returns NULL on error or EOF
|
||||
The storage for the string is dynamically allocated by new. */
|
||||
|
||||
#ifndef read_line_h
|
||||
#define read_line_h 1
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
class Read_Line
|
||||
{
|
||||
private:
|
||||
char *readln_aux (int chunks);
|
||||
FILE *fp; /* FILE pointer to the input stream. */
|
||||
|
||||
public:
|
||||
Read_Line (FILE *stream = stdin) : fp (stream) {}
|
||||
char *get_line (void);
|
||||
};
|
||||
|
||||
#ifdef __OPTIMIZE__
|
||||
|
||||
#include "trace.h"
|
||||
#define INLINE inline
|
||||
#include "read-line.icc"
|
||||
#undef INLINE
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
47
src/read-line.icc
Normal file
47
src/read-line.icc
Normal file
@@ -0,0 +1,47 @@
|
||||
/* Inline Functions for read-line.{h,cc}.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
// This needs:
|
||||
//#include <stdio.h>
|
||||
//#include "trace.h"
|
||||
|
||||
/* Returns the ``next'' line, ignoring comments beginning with '#'. */
|
||||
INLINE char *
|
||||
Read_Line::get_line (void)
|
||||
{
|
||||
T (Trace t ("Read_Line::get_line");)
|
||||
int c;
|
||||
|
||||
while ((c = getc (fp)) == '#')
|
||||
{
|
||||
while (c = getc (fp), c != EOF && c != '\n')
|
||||
;
|
||||
|
||||
if (c == EOF)
|
||||
return (char *)0;
|
||||
}
|
||||
|
||||
if (c == EOF)
|
||||
return (char *)0;
|
||||
|
||||
ungetc (c, stdin);
|
||||
return readln_aux (0);
|
||||
}
|
||||
35
src/trace.cc
Normal file
35
src/trace.cc
Normal file
@@ -0,0 +1,35 @@
|
||||
/* Tracing function calls.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "trace.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int Trace::nesting = 0;
|
||||
|
||||
Trace::Trace (const char *n)
|
||||
{
|
||||
fprintf (stderr, "%*scalling %s\n", 3 * nesting++, "", name = n);
|
||||
}
|
||||
|
||||
Trace::~Trace (void)
|
||||
{
|
||||
fprintf (stderr, "%*sleaving %s\n", 3 * --nesting, "", name);
|
||||
}
|
||||
40
src/trace.h
Normal file
40
src/trace.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/* Tracing function calls.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#ifndef trace_h
|
||||
#define trace_h 1
|
||||
|
||||
#ifdef TRACE
|
||||
#define T(X) X
|
||||
#else
|
||||
#define T(X)
|
||||
#endif
|
||||
|
||||
class Trace
|
||||
{
|
||||
private:
|
||||
static int nesting;
|
||||
const char *name;
|
||||
public:
|
||||
Trace (const char *n);
|
||||
~Trace (void);
|
||||
};
|
||||
|
||||
#endif
|
||||
25
src/vectors.cc
Normal file
25
src/vectors.cc
Normal file
@@ -0,0 +1,25 @@
|
||||
/* Static class data members that are shared between several classes.
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#include "vectors.h"
|
||||
|
||||
int Vectors::ALPHA_SIZE = MAX_ALPHA_SIZE;
|
||||
int Vectors::occurrences[MAX_ALPHA_SIZE];
|
||||
int Vectors::asso_values[MAX_ALPHA_SIZE];
|
||||
37
src/vectors.h
Normal file
37
src/vectors.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/* This may look like C code, but it is really -*- C++ -*- */
|
||||
|
||||
/* Static class data members that are shared between several classes via
|
||||
inheritance.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
#ifndef vectors_h
|
||||
#define vectors_h 1
|
||||
|
||||
static const int MAX_ALPHA_SIZE = 256;
|
||||
|
||||
struct Vectors
|
||||
{
|
||||
static int ALPHA_SIZE; /* Size of alphabet. */
|
||||
static int occurrences[MAX_ALPHA_SIZE]; /* Counts occurrences of each key set character. */
|
||||
static int asso_values[MAX_ALPHA_SIZE]; /* Value associated with each character. */
|
||||
};
|
||||
|
||||
#endif
|
||||
22
src/version.cc
Normal file
22
src/version.cc
Normal file
@@ -0,0 +1,22 @@
|
||||
/* Current program version number.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
const char *version_string = "2.7";
|
||||
23
src/version.h
Normal file
23
src/version.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/* Current program version number.
|
||||
|
||||
Copyright (C) 1989-1998 Free Software Foundation, Inc.
|
||||
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
|
||||
This file is part of GNU GPERF.
|
||||
|
||||
GNU GPERF is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU GPERF is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
|
||||
|
||||
/* Current release version. */
|
||||
extern const char *version_string;
|
||||
232
tests/Makefile.in
Normal file
232
tests/Makefile.in
Normal file
@@ -0,0 +1,232 @@
|
||||
# Makefile for gperf/tests
|
||||
|
||||
# Copyright (C) 1989, 1992, 1993, 1995, 1998 Free Software Foundation, Inc.
|
||||
# written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
#
|
||||
# This file is part of GNU GPERF.
|
||||
#
|
||||
# GNU GPERF is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 1, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GPERF is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU GPERF; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
|
||||
|
||||
#### Start of system configuration section. ####
|
||||
|
||||
# Directories used by "make":
|
||||
srcdir = @srcdir@
|
||||
|
||||
# Programs used by "make":
|
||||
# C compiler
|
||||
CC = @CC@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
# C++ compiler
|
||||
CXX = @CXX@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CXXCPP = @CXXCPP@
|
||||
# Other
|
||||
MV = mv
|
||||
LN = ln
|
||||
RM = rm -f
|
||||
@SET_MAKE@
|
||||
|
||||
#### End of system configuration section. ####
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
VPATH = $(srcdir)
|
||||
|
||||
GPERF = ../src/gperf
|
||||
|
||||
all :
|
||||
|
||||
install : all
|
||||
|
||||
installdirs :
|
||||
|
||||
uninstall :
|
||||
|
||||
check : check-link-c check-link-c++ check-c check-ada check-modula3 check-pascal check-test
|
||||
@true
|
||||
|
||||
extracheck : @CHECK_LANG_SYNTAX@
|
||||
@true
|
||||
|
||||
check-link-c: force
|
||||
@echo "performing some tests of the perfect hash generator"
|
||||
$(CC) -c $(CFLAGS) $(srcdir)/test.c
|
||||
$(GPERF) -p -c -l -S1 -o $(srcdir)/c.gperf > cinset.c
|
||||
$(CC) $(CFLAGS) -o cout cinset.c test.o
|
||||
|
||||
check-link-c++: force
|
||||
|
||||
check-c:
|
||||
@echo "testing ANSI C reserved words, all items should be found in the set"
|
||||
./cout -v < $(srcdir)/c.gperf > c.out
|
||||
diff $(srcdir)/c.exp c.out
|
||||
|
||||
check-ada:
|
||||
$(GPERF) -k1,4,'$$' $(srcdir)/ada.gperf > adainset.c
|
||||
# double '$$' is only there since make gets confused; program wants only 1 '$'
|
||||
$(CC) $(CFLAGS) -o aout adainset.c test.o
|
||||
@echo "testing Ada reserved words, all items should be found in the set"
|
||||
./aout -v < $(srcdir)/ada.gperf > ada-res.out
|
||||
diff $(srcdir)/ada-res.exp ada-res.out
|
||||
$(GPERF) -p -D -k1,'$$' -s 2 -o $(srcdir)/adadefs.gperf > preinset.c
|
||||
$(CC) $(CFLAGS) -o preout preinset.c test.o
|
||||
@echo "testing Ada predefined words, all items should be found in the set"
|
||||
./preout -v < $(srcdir)/adadefs.gperf > ada-pred.out
|
||||
diff $(srcdir)/ada-pred.exp ada-pred.out
|
||||
|
||||
check-modula3:
|
||||
$(GPERF) -k1,2,'$$' -o $(srcdir)/modula3.gperf > m3inset.c
|
||||
$(CC) $(CFLAGS) -o m3out m3inset.c test.o
|
||||
@echo "testing Modula3 reserved words, all items should be found in the set"
|
||||
./m3out -v < $(srcdir)/modula3.gperf > modula.out
|
||||
diff $(srcdir)/modula.exp modula.out
|
||||
|
||||
check-pascal:
|
||||
$(GPERF) -o -S2 -p < $(srcdir)/pascal.gperf > pinset.c
|
||||
$(CC) $(CFLAGS) -o pout pinset.c test.o
|
||||
@echo "testing Pascal reserved words, all items should be found in the set"
|
||||
./pout -v < $(srcdir)/pascal.gperf > pascal.out
|
||||
diff $(srcdir)/pascal.exp pascal.out
|
||||
|
||||
# these next 5 are demos that show off the generated code
|
||||
check-test:
|
||||
$(GPERF) -p -j1 -g -o -t -N is_reserved_word -k1,3,'$$' < $(srcdir)/c-parse.gperf > test-1.out
|
||||
diff $(srcdir)/test-1.exp test-1.out
|
||||
$(GPERF) -n -k1-8 -l < $(srcdir)/modula2.gperf > test-2.out
|
||||
diff $(srcdir)/test-2.exp test-2.out
|
||||
$(GPERF) -p -j 1 -o -a -C -g -t -k1,4,$$ < $(srcdir)/gplus.gperf > test-3.out
|
||||
diff $(srcdir)/test-3.exp test-3.out
|
||||
$(GPERF) -D -p -t < $(srcdir)/c-parse.gperf > test-4.out
|
||||
diff $(srcdir)/test-4.exp test-4.out
|
||||
$(GPERF) -g -o -j1 -t -p -N is_reserved_word < $(srcdir)/gpc.gperf > test-5.out
|
||||
diff $(srcdir)/test-5.exp test-5.out
|
||||
# prints out the help message
|
||||
-$(GPERF) -h > test-6.out 2>&1
|
||||
diff $(srcdir)/test-6.exp test-6.out
|
||||
@echo "only if, do, for, case, goto, else, while, and return should be found "
|
||||
./aout -v < $(srcdir)/c.gperf > test-7.out
|
||||
diff $(srcdir)/test-7.exp test-7.out
|
||||
|
||||
# The following validates valid language syntax with different parameters.
|
||||
# Works only with gcc and g++, and only on platforms where "gcc -ansi" is
|
||||
# usable. (There are still platforms where gcc-2.8.0's fixincludes does not
|
||||
# work well enough.)
|
||||
|
||||
VALIDATE = CC='$(CC)' CFLAGS='$(CFLAGS)' CXX='$(CXX)' CXXFLAGS='$(CXXFLAGS)' GPERF='$(GPERF)' ./validate
|
||||
|
||||
check-lang-syntax : force
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -c
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -G
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -G -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -G -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -c
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -G
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 10 -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -S 1000
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 10
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 10 -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 10 -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 10 -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 10 -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -p -S 1000
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -K key_name
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -H hash_function_name
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest1.gperf -W word_list_name
|
||||
sed -e 's,in_word_set,lookup_function_name,g' < jstest1.gperf > tmp-jstest1.gperf && \
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -N lookup_function_name
|
||||
sed -e 's,Perfect_Hash,class_name,g' < jstest1.gperf > tmp-jstest1.gperf && \
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -Z class_name
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -c
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -G
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -G -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -G -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -c
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -C
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -E
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -G
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -D
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 10 -D -l
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -S 1000
|
||||
sed -e 's,name,key_name,g' < jstest2.gperf > tmp-jstest2.gperf && \
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -K key_name
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 jstest2.gperf -t -p -H hash_function_name
|
||||
sed -e 's,in_word_set,lookup_function_name,g' < jstest2.gperf > tmp-jstest2.gperf && \
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -N lookup_function_name
|
||||
sed -e 's,Perfect_Hash,class_name,g' < jstest2.gperf > tmp-jstest2.gperf && \
|
||||
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -Z class_name
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -c
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -C
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -E
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -G
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -G -C
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -G -E
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -l
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -D
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -D -l
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -c
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -C
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -E
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -G
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -l
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -D
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 10 -D -l
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -S 1000
|
||||
sed -e 's,name,key_name,g' < jstest3.gperf > tmp-jstest3.gperf && \
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -K key_name
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 jstest3.gperf -t -p -H hash_function_name
|
||||
sed -e 's,in_word_set,lookup_function_name,g' < jstest3.gperf > tmp-jstest3.gperf && \
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -N lookup_function_name
|
||||
sed -e 's,Perfect_Hash,class_name,g' < jstest3.gperf > tmp-jstest3.gperf && \
|
||||
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -Z class_name
|
||||
|
||||
mostlyclean : clean
|
||||
|
||||
clean : force
|
||||
$(RM) *.o core *inset.c output.* *.out aout cout m3out pout preout tmp-* valitest*
|
||||
|
||||
distclean : clean
|
||||
$(RM) config.status config.log config.cache Makefile
|
||||
|
||||
maintainer-clean : distclean
|
||||
|
||||
force :
|
||||
|
||||
54
tests/ada-pred.exp
Normal file
54
tests/ada-pred.exp
Normal file
@@ -0,0 +1,54 @@
|
||||
in word set boolean
|
||||
in word set character
|
||||
in word set constraint_error
|
||||
in word set false
|
||||
in word set float
|
||||
in word set integer
|
||||
in word set natural
|
||||
in word set numeric_error
|
||||
in word set positive
|
||||
in word set program_error
|
||||
in word set storage_error
|
||||
in word set string
|
||||
in word set tasking_error
|
||||
in word set true
|
||||
in word set address
|
||||
in word set aft
|
||||
in word set base
|
||||
in word set callable
|
||||
in word set constrained
|
||||
in word set count
|
||||
in word set delta
|
||||
in word set digits
|
||||
in word set emax
|
||||
in word set epsilon
|
||||
in word set first
|
||||
in word set firstbit
|
||||
in word set fore
|
||||
in word set image
|
||||
in word set large
|
||||
in word set last
|
||||
in word set lastbit
|
||||
in word set length
|
||||
in word set machine_emax
|
||||
in word set machine_emin
|
||||
in word set machine_mantissa
|
||||
in word set machine_overflows
|
||||
in word set machine_radix
|
||||
in word set machine_rounds
|
||||
in word set mantissa
|
||||
in word set pos
|
||||
in word set position
|
||||
in word set pred
|
||||
in word set range
|
||||
in word set safe_emax
|
||||
in word set safe_large
|
||||
in word set safe_small
|
||||
in word set size
|
||||
in word set small
|
||||
in word set storage_size
|
||||
in word set succ
|
||||
in word set terminated
|
||||
in word set val
|
||||
in word set value
|
||||
in word set width
|
||||
63
tests/ada-res.exp
Normal file
63
tests/ada-res.exp
Normal file
@@ -0,0 +1,63 @@
|
||||
in word set else
|
||||
in word set exit
|
||||
in word set terminate
|
||||
in word set type
|
||||
in word set raise
|
||||
in word set range
|
||||
in word set reverse
|
||||
in word set declare
|
||||
in word set end
|
||||
in word set record
|
||||
in word set exception
|
||||
in word set not
|
||||
in word set then
|
||||
in word set return
|
||||
in word set separate
|
||||
in word set select
|
||||
in word set digits
|
||||
in word set renames
|
||||
in word set subtype
|
||||
in word set elsif
|
||||
in word set function
|
||||
in word set for
|
||||
in word set package
|
||||
in word set procedure
|
||||
in word set private
|
||||
in word set while
|
||||
in word set when
|
||||
in word set new
|
||||
in word set entry
|
||||
in word set delay
|
||||
in word set case
|
||||
in word set constant
|
||||
in word set at
|
||||
in word set abort
|
||||
in word set accept
|
||||
in word set and
|
||||
in word set delta
|
||||
in word set access
|
||||
in word set abs
|
||||
in word set pragma
|
||||
in word set array
|
||||
in word set use
|
||||
in word set out
|
||||
in word set do
|
||||
in word set others
|
||||
in word set of
|
||||
in word set or
|
||||
in word set all
|
||||
in word set limited
|
||||
in word set loop
|
||||
in word set null
|
||||
in word set task
|
||||
in word set in
|
||||
in word set is
|
||||
in word set if
|
||||
in word set rem
|
||||
in word set mod
|
||||
in word set begin
|
||||
in word set body
|
||||
in word set xor
|
||||
in word set goto
|
||||
in word set generic
|
||||
in word set with
|
||||
63
tests/ada.gperf
Normal file
63
tests/ada.gperf
Normal file
@@ -0,0 +1,63 @@
|
||||
else
|
||||
exit
|
||||
terminate
|
||||
type
|
||||
raise
|
||||
range
|
||||
reverse
|
||||
declare
|
||||
end
|
||||
record
|
||||
exception
|
||||
not
|
||||
then
|
||||
return
|
||||
separate
|
||||
select
|
||||
digits
|
||||
renames
|
||||
subtype
|
||||
elsif
|
||||
function
|
||||
for
|
||||
package
|
||||
procedure
|
||||
private
|
||||
while
|
||||
when
|
||||
new
|
||||
entry
|
||||
delay
|
||||
case
|
||||
constant
|
||||
at
|
||||
abort
|
||||
accept
|
||||
and
|
||||
delta
|
||||
access
|
||||
abs
|
||||
pragma
|
||||
array
|
||||
use
|
||||
out
|
||||
do
|
||||
others
|
||||
of
|
||||
or
|
||||
all
|
||||
limited
|
||||
loop
|
||||
null
|
||||
task
|
||||
in
|
||||
is
|
||||
if
|
||||
rem
|
||||
mod
|
||||
begin
|
||||
body
|
||||
xor
|
||||
goto
|
||||
generic
|
||||
with
|
||||
54
tests/adadefs.gperf
Normal file
54
tests/adadefs.gperf
Normal file
@@ -0,0 +1,54 @@
|
||||
boolean
|
||||
character
|
||||
constraint_error
|
||||
false
|
||||
float
|
||||
integer
|
||||
natural
|
||||
numeric_error
|
||||
positive
|
||||
program_error
|
||||
storage_error
|
||||
string
|
||||
tasking_error
|
||||
true
|
||||
address
|
||||
aft
|
||||
base
|
||||
callable
|
||||
constrained
|
||||
count
|
||||
delta
|
||||
digits
|
||||
emax
|
||||
epsilon
|
||||
first
|
||||
firstbit
|
||||
fore
|
||||
image
|
||||
large
|
||||
last
|
||||
lastbit
|
||||
length
|
||||
machine_emax
|
||||
machine_emin
|
||||
machine_mantissa
|
||||
machine_overflows
|
||||
machine_radix
|
||||
machine_rounds
|
||||
mantissa
|
||||
pos
|
||||
position
|
||||
pred
|
||||
range
|
||||
safe_emax
|
||||
safe_large
|
||||
safe_small
|
||||
size
|
||||
small
|
||||
storage_size
|
||||
succ
|
||||
terminated
|
||||
val
|
||||
value
|
||||
width
|
||||
47
tests/c++.gperf
Normal file
47
tests/c++.gperf
Normal file
@@ -0,0 +1,47 @@
|
||||
asm
|
||||
auto
|
||||
break
|
||||
case
|
||||
catch
|
||||
char
|
||||
class
|
||||
const
|
||||
continue
|
||||
default
|
||||
delete
|
||||
do
|
||||
double
|
||||
else
|
||||
enum
|
||||
extern
|
||||
float
|
||||
for
|
||||
friend
|
||||
goto
|
||||
if
|
||||
inline
|
||||
int
|
||||
long
|
||||
new
|
||||
operator
|
||||
overload
|
||||
private
|
||||
protected
|
||||
public
|
||||
register
|
||||
return
|
||||
short
|
||||
signed
|
||||
sizeof
|
||||
static
|
||||
struct
|
||||
switch
|
||||
template
|
||||
this
|
||||
typedef
|
||||
union
|
||||
unsigned
|
||||
virtual
|
||||
void
|
||||
volatile
|
||||
while
|
||||
56
tests/c-parse.gperf
Normal file
56
tests/c-parse.gperf
Normal file
@@ -0,0 +1,56 @@
|
||||
%{
|
||||
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */
|
||||
%}
|
||||
struct resword { char *name; short token; enum rid rid; };
|
||||
%%
|
||||
__alignof, ALIGNOF, NORID
|
||||
__alignof__, ALIGNOF, NORID
|
||||
__asm, ASM, NORID
|
||||
__asm__, ASM, NORID
|
||||
__attribute, ATTRIBUTE, NORID
|
||||
__attribute__, ATTRIBUTE, NORID
|
||||
__const, TYPE_QUAL, RID_CONST
|
||||
__const__, TYPE_QUAL, RID_CONST
|
||||
__inline, SCSPEC, RID_INLINE
|
||||
__inline__, SCSPEC, RID_INLINE
|
||||
__signed, TYPESPEC, RID_SIGNED
|
||||
__signed__, TYPESPEC, RID_SIGNED
|
||||
__typeof, TYPEOF, NORID
|
||||
__typeof__, TYPEOF, NORID
|
||||
__volatile, TYPE_QUAL, RID_VOLATILE
|
||||
__volatile__, TYPE_QUAL, RID_VOLATILE
|
||||
asm, ASM, NORID
|
||||
auto, SCSPEC, RID_AUTO
|
||||
break, BREAK, NORID
|
||||
case, CASE, NORID
|
||||
char, TYPESPEC, RID_CHAR
|
||||
const, TYPE_QUAL, RID_CONST
|
||||
continue, CONTINUE, NORID
|
||||
default, DEFAULT, NORID
|
||||
do, DO, NORID
|
||||
double, TYPESPEC, RID_DOUBLE
|
||||
else, ELSE, NORID
|
||||
enum, ENUM, NORID
|
||||
extern, SCSPEC, RID_EXTERN
|
||||
float, TYPESPEC, RID_FLOAT
|
||||
for, FOR, NORID
|
||||
goto, GOTO, NORID
|
||||
if, IF, NORID
|
||||
inline, SCSPEC, RID_INLINE
|
||||
int, TYPESPEC, RID_INT
|
||||
long, TYPESPEC, RID_LONG
|
||||
register, SCSPEC, RID_REGISTER
|
||||
return, RETURN, NORID
|
||||
short, TYPESPEC, RID_SHORT
|
||||
signed, TYPESPEC, RID_SIGNED
|
||||
sizeof, SIZEOF, NORID
|
||||
static, SCSPEC, RID_STATIC
|
||||
struct, STRUCT, NORID
|
||||
switch, SWITCH, NORID
|
||||
typedef, SCSPEC, RID_TYPEDEF
|
||||
typeof, TYPEOF, NORID
|
||||
union, UNION, NORID
|
||||
unsigned, TYPESPEC, RID_UNSIGNED
|
||||
void, TYPESPEC, RID_VOID
|
||||
volatile, TYPE_QUAL, RID_VOLATILE
|
||||
while, WHILE, NORID
|
||||
32
tests/c.exp
Normal file
32
tests/c.exp
Normal file
@@ -0,0 +1,32 @@
|
||||
in word set if
|
||||
in word set do
|
||||
in word set int
|
||||
in word set for
|
||||
in word set case
|
||||
in word set char
|
||||
in word set auto
|
||||
in word set goto
|
||||
in word set else
|
||||
in word set long
|
||||
in word set void
|
||||
in word set enum
|
||||
in word set float
|
||||
in word set short
|
||||
in word set union
|
||||
in word set break
|
||||
in word set while
|
||||
in word set const
|
||||
in word set double
|
||||
in word set static
|
||||
in word set extern
|
||||
in word set struct
|
||||
in word set return
|
||||
in word set sizeof
|
||||
in word set switch
|
||||
in word set signed
|
||||
in word set typedef
|
||||
in word set default
|
||||
in word set unsigned
|
||||
in word set continue
|
||||
in word set register
|
||||
in word set volatile
|
||||
32
tests/c.gperf
Normal file
32
tests/c.gperf
Normal file
@@ -0,0 +1,32 @@
|
||||
if
|
||||
do
|
||||
int
|
||||
for
|
||||
case
|
||||
char
|
||||
auto
|
||||
goto
|
||||
else
|
||||
long
|
||||
void
|
||||
enum
|
||||
float
|
||||
short
|
||||
union
|
||||
break
|
||||
while
|
||||
const
|
||||
double
|
||||
static
|
||||
extern
|
||||
struct
|
||||
return
|
||||
sizeof
|
||||
switch
|
||||
signed
|
||||
typedef
|
||||
default
|
||||
unsigned
|
||||
continue
|
||||
register
|
||||
volatile
|
||||
1214
tests/configure
vendored
Executable file
1214
tests/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
45
tests/configure.in
Normal file
45
tests/configure.in
Normal file
@@ -0,0 +1,45 @@
|
||||
dnl autoconf configuration for gperf/tests
|
||||
|
||||
dnl Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
dnl written by Douglas C. Schmidt (schmidt@ics.uci.edu)
|
||||
dnl
|
||||
dnl This file is part of GNU GPERF.
|
||||
dnl
|
||||
dnl GNU GPERF is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 1, or (at your option)
|
||||
dnl any later version.
|
||||
dnl
|
||||
dnl GNU GPERF is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with GNU GPERF; see the file COPYING. If not, write to the
|
||||
dnl Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
dnl MA 02111-1307, USA.
|
||||
|
||||
AC_INIT(c-parse.gperf)
|
||||
AC_PROG_MAKE_SET
|
||||
dnl
|
||||
dnl checks for programs
|
||||
dnl
|
||||
AC_PROG_CC
|
||||
dnl sets variable CC
|
||||
AC_PROG_CPP
|
||||
dnl sets variable CPP
|
||||
AC_PROG_CXX
|
||||
dnl sets variable CXX
|
||||
AC_PROG_CXXCPP
|
||||
dnl sets variable CXXCPP
|
||||
if test $ac_cv_prog_gcc = yes -a $ac_cv_prog_gxx = yes; then
|
||||
CHECK_LANG_SYNTAX='check-lang-syntax'
|
||||
else
|
||||
CHECK_LANG_SYNTAX=''
|
||||
fi
|
||||
AC_SUBST(CHECK_LANG_SYNTAX)
|
||||
dnl
|
||||
dnl That's it.
|
||||
dnl
|
||||
AC_OUTPUT(Makefile)
|
||||
48
tests/gpc.gperf
Normal file
48
tests/gpc.gperf
Normal file
@@ -0,0 +1,48 @@
|
||||
%{
|
||||
/* ISO Pascal 7185 reserved words.
|
||||
*
|
||||
* For GNU Pascal compiler (GPC) by jtv@hut.fi
|
||||
*
|
||||
* run this through the Doug Schmidt's gperf program
|
||||
* with command
|
||||
* gperf -g -o -j1 -t -p -N is_reserved_word
|
||||
*
|
||||
*/
|
||||
%}
|
||||
struct resword { char *name; short token; short iclass;};
|
||||
%%
|
||||
And, AND, PASCAL_ISO
|
||||
Array, ARRAY, PASCAL_ISO
|
||||
Begin, BEGIN_, PASCAL_ISO
|
||||
Case, CASE, PASCAL_ISO
|
||||
Const, CONST, PASCAL_ISO
|
||||
Div, DIV, PASCAL_ISO
|
||||
Do, DO, PASCAL_ISO
|
||||
Downto, DOWNTO, PASCAL_ISO
|
||||
Else, ELSE, PASCAL_ISO
|
||||
End, END, PASCAL_ISO
|
||||
File, FILE_, PASCAL_ISO
|
||||
For, FOR, PASCAL_ISO
|
||||
Function, FUNCTION, PASCAL_ISO
|
||||
Goto, GOTO, PASCAL_ISO
|
||||
If, IF, PASCAL_ISO
|
||||
In, IN, PASCAL_ISO
|
||||
Label, LABEL, PASCAL_ISO
|
||||
Mod, MOD, PASCAL_ISO
|
||||
Nil, NIL, PASCAL_ISO
|
||||
Not, NOT, PASCAL_ISO
|
||||
Of, OF, PASCAL_ISO
|
||||
Or, OR, PASCAL_ISO
|
||||
Packed, PACKED, PASCAL_ISO
|
||||
Procedure, PROCEDURE, PASCAL_ISO
|
||||
Program,PROGRAM,PASCAL_ISO
|
||||
Record, RECORD, PASCAL_ISO
|
||||
Repeat, REPEAT, PASCAL_ISO
|
||||
Set, SET, PASCAL_ISO
|
||||
Then, THEN, PASCAL_ISO
|
||||
To, TO, PASCAL_ISO
|
||||
Type, TYPE, PASCAL_ISO
|
||||
Until, UNTIL, PASCAL_ISO
|
||||
Var, VAR, PASCAL_ISO
|
||||
While, WHILE, PASCAL_ISO
|
||||
With, WITH, PASCAL_ISO
|
||||
76
tests/gplus.gperf
Normal file
76
tests/gplus.gperf
Normal file
@@ -0,0 +1,76 @@
|
||||
%{
|
||||
/* Command-line: gperf -p -j1 -g -o -t -N is_reserved_word -k1,4,$ gplus.gperf */
|
||||
%}
|
||||
struct resword { char *name; short token; enum rid rid;};
|
||||
%%
|
||||
__alignof, ALIGNOF, NORID
|
||||
__alignof__, ALIGNOF, NORID
|
||||
__asm, ASM, NORID
|
||||
__asm__, ASM, NORID
|
||||
__attribute, ATTRIBUTE, NORID
|
||||
__attribute__, ATTRIBUTE, NORID
|
||||
__const, TYPE_QUAL, RID_CONST
|
||||
__const__, TYPE_QUAL, RID_CONST
|
||||
__inline, SCSPEC, RID_INLINE
|
||||
__inline__, SCSPEC, RID_INLINE
|
||||
__signed, TYPESPEC, RID_SIGNED
|
||||
__signed__, TYPESPEC, RID_SIGNED
|
||||
__typeof, TYPEOF, NORID
|
||||
__typeof__, TYPEOF, NORID
|
||||
__volatile, TYPE_QUAL, RID_VOLATILE
|
||||
__volatile__, TYPE_QUAL, RID_VOLATILE
|
||||
all, ALL, NORID /* Extension */,
|
||||
except, EXCEPT, NORID /* Extension */,
|
||||
exception, AGGR, RID_EXCEPTION /* Extension */,
|
||||
raise, RAISE, NORID /* Extension */,
|
||||
raises, RAISES, NORID /* Extension */,
|
||||
reraise, RERAISE, NORID /* Extension */,
|
||||
try, TRY, NORID /* Extension */,
|
||||
asm, ASM, NORID,
|
||||
auto, SCSPEC, RID_AUTO,
|
||||
break, BREAK, NORID,
|
||||
case, CASE, NORID,
|
||||
catch, CATCH, NORID,
|
||||
char, TYPESPEC, RID_CHAR,
|
||||
class, AGGR, RID_CLASS,
|
||||
const, TYPE_QUAL, RID_CONST,
|
||||
continue, CONTINUE, NORID,
|
||||
default, DEFAULT, NORID,
|
||||
delete, DELETE, NORID,
|
||||
do, DO, NORID,
|
||||
double, TYPESPEC, RID_DOUBLE,
|
||||
dynamic, DYNAMIC, NORID,
|
||||
else, ELSE, NORID,
|
||||
enum, ENUM, NORID,
|
||||
extern, SCSPEC, RID_EXTERN,
|
||||
float, TYPESPEC, RID_FLOAT,
|
||||
for, FOR, NORID,
|
||||
friend, SCSPEC, RID_FRIEND,
|
||||
goto, GOTO, NORID,
|
||||
if, IF, NORID,
|
||||
inline, SCSPEC, RID_INLINE,
|
||||
int, TYPESPEC, RID_INT,
|
||||
long, TYPESPEC, RID_LONG,
|
||||
new, NEW, NORID,
|
||||
operator, OPERATOR, NORID,
|
||||
overload, OVERLOAD, NORID,
|
||||
private, PRIVATE, NORID,
|
||||
protected, PROTECTED, NORID,
|
||||
public, PUBLIC, NORID,
|
||||
register, SCSPEC, RID_REGISTER,
|
||||
return, RETURN, NORID,
|
||||
short, TYPESPEC, RID_SHORT,
|
||||
signed, TYPESPEC, RID_SIGNED,
|
||||
sizeof, SIZEOF, NORID,
|
||||
static, SCSPEC, RID_STATIC,
|
||||
struct, AGGR, RID_RECORD,
|
||||
switch, SWITCH, NORID,
|
||||
this, THIS, NORID,
|
||||
typedef, SCSPEC, RID_TYPEDEF,
|
||||
typeof, TYPEOF, NORID,
|
||||
union, AGGR, RID_UNION,
|
||||
unsigned, TYPESPEC, RID_UNSIGNED,
|
||||
virtual, SCSPEC, RID_VIRTUAL,
|
||||
void, TYPESPEC, RID_VOID,
|
||||
volatile, TYPE_QUAL, RID_VOLATILE,
|
||||
while, WHILE, NORID,
|
||||
63
tests/irc.gperf
Normal file
63
tests/irc.gperf
Normal file
@@ -0,0 +1,63 @@
|
||||
%{
|
||||
extern int m_text(), m_private(), m_who(), m_whois(), m_user(), m_list();
|
||||
extern int m_topic(), m_invite(), m_channel(), m_version(), m_quit();
|
||||
extern int m_server(), m_kill(), m_info(), m_links(), m_summon(), m_stats();
|
||||
extern int m_users(), m_nick(), m_error(), m_help(), m_whoreply();
|
||||
extern int m_squit(), m_restart(), m_away(), m_die(), m_connect();
|
||||
extern int m_ping(), m_pong(), m_oper(), m_pass(), m_wall(), m_trace();
|
||||
extern int m_time(), m_rehash(), m_names(), m_namreply(), m_admin();
|
||||
extern int m_linreply(), m_notice(), m_lusers(), m_voice(), m_grph();
|
||||
extern int m_xtra(), m_motd();
|
||||
%}
|
||||
struct Message {
|
||||
char *cmd;
|
||||
int (* func)();
|
||||
int count;
|
||||
int parameters;
|
||||
};
|
||||
%%
|
||||
NICK, m_nick, 0, 1
|
||||
MSG, m_text, 0, 1
|
||||
PRIVMSG, m_private, 0, 2
|
||||
WHO, m_who, 0, 1
|
||||
WHOIS, m_whois, 0, 4
|
||||
USER, m_user, 0, 4
|
||||
SERVER, m_server, 0, 2
|
||||
LIST, m_list, 0, 1
|
||||
TOPIC, m_topic, 0, 1
|
||||
INVITE, m_invite, 0, 2
|
||||
CHANNEL, m_channel, 0, 1
|
||||
VERSION, m_version, 0, 1
|
||||
QUIT, m_quit, 0, 2
|
||||
SQUIT, m_squit, 0, 2
|
||||
KILL, m_kill, 0, 2
|
||||
INFO, m_info, 0, 1
|
||||
LINKS, m_links, 0, 1
|
||||
SUMMON, m_summon, 0, 1
|
||||
STATS, m_stats, 0, 1
|
||||
USERS, m_users, 0, 1
|
||||
RESTART, m_restart, 0, 1
|
||||
WHOREPLY,m_whoreply, 0, 7
|
||||
HELP, m_help, 0, 2
|
||||
ERROR, m_error, 0, 1
|
||||
AWAY, m_away, 0, 1
|
||||
DIE, m_die, 0, 1
|
||||
CONNECT, m_connect, 0, 3
|
||||
PING, m_ping, 0, 2
|
||||
PONG, m_pong, 0, 3
|
||||
OPER, m_oper, 0, 3
|
||||
PASS, m_pass, 0, 2
|
||||
WALL, m_wall, 0, 1
|
||||
TIME, m_time, 0, 1
|
||||
REHASH, m_rehash, 0, 1
|
||||
NAMES, m_names, 0, 1
|
||||
NAMREPLY,m_namreply, 0, 3
|
||||
ADMIN, m_admin, 0, 1
|
||||
TRACE, m_trace, 0, 1
|
||||
LINREPLY,m_linreply, 0, 2
|
||||
NOTICE, m_notice, 0, 2
|
||||
LUSERS, m_lusers, 0, 1
|
||||
VOICE, m_voice, 0, 2
|
||||
GRPH, m_grph, 0, 2
|
||||
XTRA, m_xtra, 0, 2
|
||||
MOTD, m_motd, 0, 2
|
||||
73
tests/jscript.gperf
Normal file
73
tests/jscript.gperf
Normal file
@@ -0,0 +1,73 @@
|
||||
%{
|
||||
/* Command-line: gperf -k'1,2,$' -t -p -K 'name' -H 'js_kw_hash' -N 'js_kw_lookup' -a -g jscript.gperf */
|
||||
%}
|
||||
struct js_keyword {
|
||||
char * name;
|
||||
int token;
|
||||
}
|
||||
|
||||
%%
|
||||
# Javascript reserved words, see "keywords.html"
|
||||
abstract, TK_ABSTRACT
|
||||
boolean, TK_BOOLEAN
|
||||
break, TK_BREAK
|
||||
byte, TK_BYTE
|
||||
case, TK_CASE
|
||||
catch, TK_CATCH
|
||||
char, TK_CHAR
|
||||
class, TK_CLASS
|
||||
const, TK_CONST
|
||||
continue, TK_CONTINUE
|
||||
default, TK_DEFAULT
|
||||
do, TK_DO
|
||||
double, TK_DOUBLE
|
||||
else, TK_ELSE
|
||||
extends, TK_EXTENDS
|
||||
false, TK_FALSE
|
||||
final, TK_FINAL
|
||||
finally, TK_FINALLY
|
||||
float, TK_FLOAT
|
||||
for, TK_FOR
|
||||
function, TK_FUNCTION
|
||||
goto, TK_GOTO
|
||||
if, TK_IF
|
||||
implements, TK_IMPLEMENTS
|
||||
import, TK_IMPORT
|
||||
in, TK_IN
|
||||
instanceof, TK_INSTANCEOF
|
||||
int, TK_INT
|
||||
interface, TK_INTERFACE
|
||||
long, TK_LONG
|
||||
native, TK_NATIVE
|
||||
new, TK_NEW
|
||||
null, TK_NULL
|
||||
package, TK_PACKAGE
|
||||
private, TK_PRIVATE
|
||||
protected, TK_PROTECTED
|
||||
public, TK_PUBLIC
|
||||
return, TK_RETURN
|
||||
short, TK_SHORT
|
||||
static, TK_STATIC
|
||||
super, TK_SUPER
|
||||
switch, TK_SWITCH
|
||||
synchronized, TK_SYNCHRONIZED
|
||||
this, TK_THIS
|
||||
throw, TK_THROW
|
||||
throws, TK_THROWS
|
||||
transient, TK_TRANSIENT
|
||||
true, TK_TRUE
|
||||
try, TK_TRY
|
||||
var, TK_VAR
|
||||
void, TK_VOID
|
||||
while, TK_WHILE
|
||||
with, TK_WITH
|
||||
%%
|
||||
|
||||
int js_keyword_lookup (register const char *str, register int len)
|
||||
{
|
||||
struct js_keyword * keyword = js_kw_lookup(str,len);
|
||||
if (keyword)
|
||||
return keyword->token;
|
||||
else
|
||||
return TK_IDENT;
|
||||
}
|
||||
142
tests/jstest1.gperf
Normal file
142
tests/jstest1.gperf
Normal file
@@ -0,0 +1,142 @@
|
||||
abstract
|
||||
boolean
|
||||
break
|
||||
byte
|
||||
case
|
||||
catch
|
||||
char
|
||||
class
|
||||
const
|
||||
continue
|
||||
default
|
||||
do
|
||||
double
|
||||
else
|
||||
extends
|
||||
false
|
||||
final
|
||||
finally
|
||||
float
|
||||
for
|
||||
function
|
||||
goto
|
||||
if
|
||||
implements
|
||||
import
|
||||
in
|
||||
instanceof
|
||||
int
|
||||
interface
|
||||
long
|
||||
native
|
||||
new
|
||||
null
|
||||
package
|
||||
private
|
||||
protected
|
||||
public
|
||||
return
|
||||
short
|
||||
static
|
||||
super
|
||||
switch
|
||||
synchronized
|
||||
this
|
||||
throw
|
||||
throws
|
||||
transient
|
||||
true
|
||||
try
|
||||
var
|
||||
void
|
||||
while
|
||||
with
|
||||
%%
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define CONST const
|
||||
#else
|
||||
#define CONST
|
||||
#endif
|
||||
static CONST char* testdata[] = {
|
||||
"bogus",
|
||||
"abstract",
|
||||
"boolean",
|
||||
"break",
|
||||
"byte",
|
||||
"case",
|
||||
"catch",
|
||||
"char",
|
||||
"class",
|
||||
"const",
|
||||
"continue",
|
||||
"default",
|
||||
"do",
|
||||
"double",
|
||||
"else",
|
||||
"extends",
|
||||
"false",
|
||||
"final",
|
||||
"finally",
|
||||
"float",
|
||||
"for",
|
||||
"function",
|
||||
"goto",
|
||||
"if",
|
||||
"implements",
|
||||
"import",
|
||||
"in",
|
||||
"instanceof",
|
||||
"int",
|
||||
"interface",
|
||||
"long",
|
||||
"native",
|
||||
"new",
|
||||
"null",
|
||||
"package",
|
||||
"private",
|
||||
"protected",
|
||||
"public",
|
||||
"return",
|
||||
"short",
|
||||
"static",
|
||||
"super",
|
||||
"switch",
|
||||
"synchronized",
|
||||
"this",
|
||||
"throw",
|
||||
"throws",
|
||||
"transient",
|
||||
"true",
|
||||
"try",
|
||||
"var",
|
||||
"void",
|
||||
"while",
|
||||
"with"
|
||||
};
|
||||
int main ()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
|
||||
{
|
||||
#ifdef CPLUSPLUS_TEST
|
||||
CONST char * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#else
|
||||
CONST char * resword = in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#endif
|
||||
if (i > 0)
|
||||
{
|
||||
if (!resword)
|
||||
exit (1);
|
||||
if (strcmp(testdata[i],resword))
|
||||
exit (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resword)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
147
tests/jstest2.gperf
Normal file
147
tests/jstest2.gperf
Normal file
@@ -0,0 +1,147 @@
|
||||
struct js_keyword {
|
||||
char * name;
|
||||
int token;
|
||||
}
|
||||
%%
|
||||
abstract, 1
|
||||
boolean, 2
|
||||
break, 3
|
||||
byte, 4
|
||||
case, 5
|
||||
catch, 6
|
||||
char, 7
|
||||
class, 8
|
||||
const, 9
|
||||
continue, 10
|
||||
default, 11
|
||||
do, 12
|
||||
double, 13
|
||||
else, 14
|
||||
extends, 15
|
||||
false, 16
|
||||
final, 17
|
||||
finally, 18
|
||||
float, 19
|
||||
for, 20
|
||||
function, 21
|
||||
goto, 22
|
||||
if, 23
|
||||
implements, 24
|
||||
import, 25
|
||||
in, 26
|
||||
instanceof, 27
|
||||
int, 28
|
||||
interface, 29
|
||||
long, 30
|
||||
native, 31
|
||||
new, 32
|
||||
null, 33
|
||||
package, 34
|
||||
private, 35
|
||||
protected, 36
|
||||
public, 37
|
||||
return, 38
|
||||
short, 39
|
||||
static, 40
|
||||
super, 41
|
||||
switch, 42
|
||||
synchronized, 43
|
||||
this, 44
|
||||
throw, 45
|
||||
throws, 46
|
||||
transient, 47
|
||||
true, 48
|
||||
try, 49
|
||||
var, 50
|
||||
void, 51
|
||||
while, 52
|
||||
with, 53
|
||||
%%
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define CONST const
|
||||
#else
|
||||
#define CONST
|
||||
#endif
|
||||
static CONST char* testdata[] = {
|
||||
"bogus",
|
||||
"abstract",
|
||||
"boolean",
|
||||
"break",
|
||||
"byte",
|
||||
"case",
|
||||
"catch",
|
||||
"char",
|
||||
"class",
|
||||
"const",
|
||||
"continue",
|
||||
"default",
|
||||
"do",
|
||||
"double",
|
||||
"else",
|
||||
"extends",
|
||||
"false",
|
||||
"final",
|
||||
"finally",
|
||||
"float",
|
||||
"for",
|
||||
"function",
|
||||
"goto",
|
||||
"if",
|
||||
"implements",
|
||||
"import",
|
||||
"in",
|
||||
"instanceof",
|
||||
"int",
|
||||
"interface",
|
||||
"long",
|
||||
"native",
|
||||
"new",
|
||||
"null",
|
||||
"package",
|
||||
"private",
|
||||
"protected",
|
||||
"public",
|
||||
"return",
|
||||
"short",
|
||||
"static",
|
||||
"super",
|
||||
"switch",
|
||||
"synchronized",
|
||||
"this",
|
||||
"throw",
|
||||
"throws",
|
||||
"transient",
|
||||
"true",
|
||||
"try",
|
||||
"var",
|
||||
"void",
|
||||
"while",
|
||||
"with"
|
||||
};
|
||||
int main ()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
|
||||
{
|
||||
#ifdef CPLUSPLUS_TEST
|
||||
CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#else
|
||||
CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#endif
|
||||
if (i > 0)
|
||||
{
|
||||
if (!resword)
|
||||
exit (1);
|
||||
if (strcmp(testdata[i],resword->name))
|
||||
exit (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resword)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
147
tests/jstest3.gperf
Normal file
147
tests/jstest3.gperf
Normal file
@@ -0,0 +1,147 @@
|
||||
struct js_keyword {
|
||||
const char * name;
|
||||
int token;
|
||||
}
|
||||
%%
|
||||
abstract, 1
|
||||
boolean, 2
|
||||
break, 3
|
||||
byte, 4
|
||||
case, 5
|
||||
catch, 6
|
||||
char, 7
|
||||
class, 8
|
||||
const, 9
|
||||
continue, 10
|
||||
default, 11
|
||||
do, 12
|
||||
double, 13
|
||||
else, 14
|
||||
extends, 15
|
||||
false, 16
|
||||
final, 17
|
||||
finally, 18
|
||||
float, 19
|
||||
for, 20
|
||||
function, 21
|
||||
goto, 22
|
||||
if, 23
|
||||
implements, 24
|
||||
import, 25
|
||||
in, 26
|
||||
instanceof, 27
|
||||
int, 28
|
||||
interface, 29
|
||||
long, 30
|
||||
native, 31
|
||||
new, 32
|
||||
null, 33
|
||||
package, 34
|
||||
private, 35
|
||||
protected, 36
|
||||
public, 37
|
||||
return, 38
|
||||
short, 39
|
||||
static, 40
|
||||
super, 41
|
||||
switch, 42
|
||||
synchronized, 43
|
||||
this, 44
|
||||
throw, 45
|
||||
throws, 46
|
||||
transient, 47
|
||||
true, 48
|
||||
try, 49
|
||||
var, 50
|
||||
void, 51
|
||||
while, 52
|
||||
with, 53
|
||||
%%
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define CONST const
|
||||
#else
|
||||
#define CONST
|
||||
#endif
|
||||
static CONST char* testdata[] = {
|
||||
"bogus",
|
||||
"abstract",
|
||||
"boolean",
|
||||
"break",
|
||||
"byte",
|
||||
"case",
|
||||
"catch",
|
||||
"char",
|
||||
"class",
|
||||
"const",
|
||||
"continue",
|
||||
"default",
|
||||
"do",
|
||||
"double",
|
||||
"else",
|
||||
"extends",
|
||||
"false",
|
||||
"final",
|
||||
"finally",
|
||||
"float",
|
||||
"for",
|
||||
"function",
|
||||
"goto",
|
||||
"if",
|
||||
"implements",
|
||||
"import",
|
||||
"in",
|
||||
"instanceof",
|
||||
"int",
|
||||
"interface",
|
||||
"long",
|
||||
"native",
|
||||
"new",
|
||||
"null",
|
||||
"package",
|
||||
"private",
|
||||
"protected",
|
||||
"public",
|
||||
"return",
|
||||
"short",
|
||||
"static",
|
||||
"super",
|
||||
"switch",
|
||||
"synchronized",
|
||||
"this",
|
||||
"throw",
|
||||
"throws",
|
||||
"transient",
|
||||
"true",
|
||||
"try",
|
||||
"var",
|
||||
"void",
|
||||
"while",
|
||||
"with"
|
||||
};
|
||||
int main ()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
|
||||
{
|
||||
#ifdef CPLUSPLUS_TEST
|
||||
CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#else
|
||||
CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
|
||||
#endif
|
||||
if (i > 0)
|
||||
{
|
||||
if (!resword)
|
||||
exit (1);
|
||||
if (strcmp(testdata[i],resword->name))
|
||||
exit (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resword)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
116
tests/makeinfo.gperf
Normal file
116
tests/makeinfo.gperf
Normal file
@@ -0,0 +1,116 @@
|
||||
COMMAND;
|
||||
%%
|
||||
!, cm_force_sentence_end, false
|
||||
', insert_self, false
|
||||
*, cm_asterisk, false
|
||||
., cm_force_sentence_end, false
|
||||
:, cm_force_abbreviated_whitespace, false
|
||||
?, cm_force_sentence_end, false
|
||||
@, insert_self, false
|
||||
TeX, cm_TeX, true
|
||||
`, insert_self, false
|
||||
appendix, cm_appendix, false
|
||||
appendixsec, cm_appendixsec, false
|
||||
appendixsubsec, cm_appendixsubsec, false
|
||||
asis, cm_asis, true
|
||||
b, cm_bold, true
|
||||
br, cm_br, false
|
||||
bullet, cm_bullet, true
|
||||
bye, cm_bye, false
|
||||
c, cm_comment, false
|
||||
center, cm_center, false
|
||||
chapter, cm_chapter, false
|
||||
cindex, cm_cindex, false
|
||||
cite, cm_cite, true
|
||||
code, cm_code, true
|
||||
comment, cm_comment, false
|
||||
contents, do_nothing, false
|
||||
copyright, cm_copyright, true
|
||||
ctrl, cm_ctrl, true
|
||||
defcodeindex, cm_defindex, false
|
||||
defindex, cm_defindex, false
|
||||
dfn, cm_dfn, true
|
||||
display, cm_display, false
|
||||
dots, cm_dots, true
|
||||
emph, cm_emph, true
|
||||
end, cm_end, false
|
||||
enumerate, cm_enumerate, false
|
||||
equiv, cm_equiv, true
|
||||
error, cm_error, true
|
||||
example, cm_example, false
|
||||
exdent, cm_exdent, false
|
||||
expansion, cm_expansion, true
|
||||
file, cm_file, true
|
||||
findex, cm_findex, false
|
||||
format, cm_format, false
|
||||
group, cm_group, false
|
||||
i, cm_italic, true
|
||||
iappendix, cm_appendix, false
|
||||
iappendixsec, cm_appendixsec, false
|
||||
iappendixsubsec, cm_appendixsubsec, false
|
||||
ichapter, cm_chapter, false
|
||||
ifinfo, cm_ifinfo, false
|
||||
iftex, cm_iftex, false
|
||||
ignore, cm_ignore, false
|
||||
include, cm_include, false
|
||||
inforef, cm_inforef, true
|
||||
input, cm_include, false
|
||||
isection, cm_section, false
|
||||
isubsection, cm_subsection, false
|
||||
isubsubsection, cm_subsubsection, false
|
||||
item, cm_item, false
|
||||
itemize, cm_itemize, false
|
||||
itemx, cm_itemx, false
|
||||
iunnumbered, cm_unnumbered, false
|
||||
iunnumberedsec, cm_unnumberedsec, false
|
||||
iunnumberedsubsec, cm_unnumberedsubsec, false
|
||||
kbd, cm_kbd, true
|
||||
key, cm_key, true
|
||||
kindex, cm_kindex, false
|
||||
lisp, cm_lisp, false
|
||||
menu, cm_menu
|
||||
minus, cm_minus, true
|
||||
need, cm_need, false
|
||||
node, cm_node, false
|
||||
noindent, cm_noindent, false
|
||||
page, do_nothing, false
|
||||
pindex, cm_pindex, false
|
||||
point, cm_point, true
|
||||
print, cm_print, true
|
||||
printindex, cm_printindex, false
|
||||
pxref, cm_pxref, true
|
||||
quotation, cm_quotation, false
|
||||
r, cm_roman, true
|
||||
ref, cm_xref, true
|
||||
refill, cm_refill, false
|
||||
result, cm_result, true
|
||||
samp, cm_samp, true
|
||||
sc, cm_sc, true
|
||||
section, cm_section, false
|
||||
setchapternewpage, cm_setchapternewpage, false
|
||||
setfilename, cm_setfilename, false
|
||||
settitle, cm_settitle, false
|
||||
smallexample, cm_smallexample, false
|
||||
sp, cm_sp, false
|
||||
strong, cm_strong, true
|
||||
subsection, cm_subsection, false
|
||||
subsubsection, cm_subsubsection, false
|
||||
summarycontents, do_nothing, false
|
||||
syncodeindex, cm_synindex, false
|
||||
synindex, cm_synindex, false
|
||||
t, cm_title, true
|
||||
table, cm_table, false
|
||||
tex, cm_tex, false
|
||||
tindex, cm_tindex, false
|
||||
titlepage, cm_titlepage, false
|
||||
unnumbered, cm_unnumbered, false
|
||||
unnumberedsec, cm_unnumberedsec, false
|
||||
unnumberedsubsec, cm_unnumberedsubsec, false
|
||||
var, cm_var, true
|
||||
vindex, cm_vindex, false
|
||||
w, cm_w, true
|
||||
xref, cm_xref, true
|
||||
{, insert_self, false
|
||||
}, insert_self, false
|
||||
infoinclude, cm_infoinclude, false
|
||||
footnote, cm_footnote, false
|
||||
106
tests/modula.exp
Normal file
106
tests/modula.exp
Normal file
@@ -0,0 +1,106 @@
|
||||
in word set AND
|
||||
in word set ARRAY
|
||||
in word set BEGIN
|
||||
in word set BITS
|
||||
in word set BY
|
||||
in word set CASE
|
||||
in word set CONST
|
||||
in word set DIV
|
||||
in word set DO
|
||||
in word set ELSE
|
||||
in word set ELSIF
|
||||
in word set END
|
||||
in word set EVAL
|
||||
in word set EXCEPT
|
||||
in word set EXCEPTION
|
||||
in word set EXIT
|
||||
in word set EXPORTS
|
||||
in word set FINALLY
|
||||
in word set FOR
|
||||
in word set FROM
|
||||
in word set IF
|
||||
in word set IMPORT
|
||||
in word set INTERFACE
|
||||
in word set IN
|
||||
in word set INLINE
|
||||
in word set LOCK
|
||||
in word set METHODS
|
||||
in word set MOD
|
||||
in word set MODULE
|
||||
in word set NOT
|
||||
in word set OBJECT
|
||||
in word set OF
|
||||
in word set OR
|
||||
in word set PROCEDURE
|
||||
in word set RAISES
|
||||
in word set READONLY
|
||||
in word set RECORD
|
||||
in word set REF
|
||||
in word set REPEAT
|
||||
in word set RETURN
|
||||
in word set SET
|
||||
in word set THEN
|
||||
in word set TO
|
||||
in word set TRY
|
||||
in word set TYPE
|
||||
in word set TYPECASE
|
||||
in word set UNSAFE
|
||||
in word set UNTIL
|
||||
in word set UNTRACED
|
||||
in word set VALUE
|
||||
in word set VAR
|
||||
in word set WHILE
|
||||
in word set WITH
|
||||
in word set and
|
||||
in word set array
|
||||
in word set begin
|
||||
in word set bits
|
||||
in word set by
|
||||
in word set case
|
||||
in word set const
|
||||
in word set div
|
||||
in word set do
|
||||
in word set else
|
||||
in word set elsif
|
||||
in word set end
|
||||
in word set eval
|
||||
in word set except
|
||||
in word set exception
|
||||
in word set exit
|
||||
in word set exports
|
||||
in word set finally
|
||||
in word set for
|
||||
in word set from
|
||||
in word set if
|
||||
in word set import
|
||||
in word set interface
|
||||
in word set in
|
||||
in word set inline
|
||||
in word set lock
|
||||
in word set methods
|
||||
in word set mod
|
||||
in word set module
|
||||
in word set not
|
||||
in word set object
|
||||
in word set of
|
||||
in word set or
|
||||
in word set procedure
|
||||
in word set raises
|
||||
in word set readonly
|
||||
in word set record
|
||||
in word set ref
|
||||
in word set repeat
|
||||
in word set return
|
||||
in word set set
|
||||
in word set then
|
||||
in word set to
|
||||
in word set try
|
||||
in word set type
|
||||
in word set typecase
|
||||
in word set unsafe
|
||||
in word set until
|
||||
in word set untraced
|
||||
in word set value
|
||||
in word set var
|
||||
in word set while
|
||||
in word set with
|
||||
40
tests/modula2.gperf
Normal file
40
tests/modula2.gperf
Normal file
@@ -0,0 +1,40 @@
|
||||
AND
|
||||
ARRAY
|
||||
BEGIN
|
||||
BY
|
||||
CASE
|
||||
CONST
|
||||
DEFINITION
|
||||
DIV
|
||||
DO
|
||||
ELSE
|
||||
ELSIF
|
||||
END
|
||||
EXIT
|
||||
EXPORT
|
||||
FOR
|
||||
FROM
|
||||
IF
|
||||
IMPLEMENTATION
|
||||
IMPORT
|
||||
IN
|
||||
LOOP
|
||||
MOD
|
||||
MODULE
|
||||
NOT
|
||||
OF
|
||||
OR
|
||||
POINTER
|
||||
PROCEDURE
|
||||
QUALIFIED
|
||||
RECORD
|
||||
REPEAT
|
||||
RETURN
|
||||
SET
|
||||
THEN
|
||||
TO
|
||||
TYPE
|
||||
UNTIL
|
||||
VAR
|
||||
WHILE
|
||||
WITH
|
||||
106
tests/modula3.gperf
Normal file
106
tests/modula3.gperf
Normal file
@@ -0,0 +1,106 @@
|
||||
AND
|
||||
ARRAY
|
||||
BEGIN
|
||||
BITS
|
||||
BY
|
||||
CASE
|
||||
CONST
|
||||
DIV
|
||||
DO
|
||||
ELSE
|
||||
ELSIF
|
||||
END
|
||||
EVAL
|
||||
EXCEPT
|
||||
EXCEPTION
|
||||
EXIT
|
||||
EXPORTS
|
||||
FINALLY
|
||||
FOR
|
||||
FROM
|
||||
IF
|
||||
IMPORT
|
||||
INTERFACE
|
||||
IN
|
||||
INLINE
|
||||
LOCK
|
||||
METHODS
|
||||
MOD
|
||||
MODULE
|
||||
NOT
|
||||
OBJECT
|
||||
OF
|
||||
OR
|
||||
PROCEDURE
|
||||
RAISES
|
||||
READONLY
|
||||
RECORD
|
||||
REF
|
||||
REPEAT
|
||||
RETURN
|
||||
SET
|
||||
THEN
|
||||
TO
|
||||
TRY
|
||||
TYPE
|
||||
TYPECASE
|
||||
UNSAFE
|
||||
UNTIL
|
||||
UNTRACED
|
||||
VALUE
|
||||
VAR
|
||||
WHILE
|
||||
WITH
|
||||
and
|
||||
array
|
||||
begin
|
||||
bits
|
||||
by
|
||||
case
|
||||
const
|
||||
div
|
||||
do
|
||||
else
|
||||
elsif
|
||||
end
|
||||
eval
|
||||
except
|
||||
exception
|
||||
exit
|
||||
exports
|
||||
finally
|
||||
for
|
||||
from
|
||||
if
|
||||
import
|
||||
interface
|
||||
in
|
||||
inline
|
||||
lock
|
||||
methods
|
||||
mod
|
||||
module
|
||||
not
|
||||
object
|
||||
of
|
||||
or
|
||||
procedure
|
||||
raises
|
||||
readonly
|
||||
record
|
||||
ref
|
||||
repeat
|
||||
return
|
||||
set
|
||||
then
|
||||
to
|
||||
try
|
||||
type
|
||||
typecase
|
||||
unsafe
|
||||
until
|
||||
untraced
|
||||
value
|
||||
var
|
||||
while
|
||||
with
|
||||
36
tests/pascal.exp
Normal file
36
tests/pascal.exp
Normal file
@@ -0,0 +1,36 @@
|
||||
in word set with
|
||||
in word set array
|
||||
in word set and
|
||||
in word set function
|
||||
in word set case
|
||||
in word set var
|
||||
in word set const
|
||||
in word set until
|
||||
in word set then
|
||||
in word set set
|
||||
in word set record
|
||||
in word set program
|
||||
in word set procedure
|
||||
in word set or
|
||||
in word set packed
|
||||
in word set not
|
||||
in word set nil
|
||||
in word set label
|
||||
in word set in
|
||||
in word set repeat
|
||||
in word set of
|
||||
in word set goto
|
||||
in word set forward
|
||||
in word set for
|
||||
in word set while
|
||||
in word set file
|
||||
in word set else
|
||||
in word set downto
|
||||
in word set do
|
||||
in word set div
|
||||
in word set to
|
||||
in word set type
|
||||
in word set end
|
||||
in word set mod
|
||||
in word set begin
|
||||
in word set if
|
||||
36
tests/pascal.gperf
Normal file
36
tests/pascal.gperf
Normal file
@@ -0,0 +1,36 @@
|
||||
with
|
||||
array
|
||||
and
|
||||
function
|
||||
case
|
||||
var
|
||||
const
|
||||
until
|
||||
then
|
||||
set
|
||||
record
|
||||
program
|
||||
procedure
|
||||
or
|
||||
packed
|
||||
not
|
||||
nil
|
||||
label
|
||||
in
|
||||
repeat
|
||||
of
|
||||
goto
|
||||
forward
|
||||
for
|
||||
while
|
||||
file
|
||||
else
|
||||
downto
|
||||
do
|
||||
div
|
||||
to
|
||||
type
|
||||
end
|
||||
mod
|
||||
begin
|
||||
if
|
||||
153
tests/test-1.exp
Normal file
153
tests/test-1.exp
Normal file
@@ -0,0 +1,153 @@
|
||||
/* C code produced by gperf version 2.7 */
|
||||
/* Command-line: ../src/gperf -p -j1 -g -o -t -N is_reserved_word -k1,3,$ */
|
||||
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */
|
||||
struct resword { char *name; short token; enum rid rid; };
|
||||
|
||||
#define TOTAL_KEYWORDS 51
|
||||
#define MIN_WORD_LENGTH 2
|
||||
#define MAX_WORD_LENGTH 13
|
||||
#define MIN_HASH_VALUE 8
|
||||
#define MAX_HASH_VALUE 82
|
||||
/* maximum key range = 75, duplicates = 0 */
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#endif
|
||||
static unsigned int
|
||||
hash (str, len)
|
||||
register const char *str;
|
||||
register unsigned int len;
|
||||
{
|
||||
static unsigned char asso_values[] =
|
||||
{
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 0, 83, 1, 2, 34,
|
||||
19, 6, 11, 29, 0, 17, 83, 0, 23, 28,
|
||||
26, 30, 31, 83, 15, 1, 0, 28, 13, 4,
|
||||
83, 83, 5, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
|
||||
83, 83, 83, 83, 83, 83
|
||||
};
|
||||
register int hval = len;
|
||||
|
||||
switch (hval)
|
||||
{
|
||||
default:
|
||||
case 3:
|
||||
hval += asso_values[(unsigned char)str[2]];
|
||||
case 2:
|
||||
case 1:
|
||||
hval += asso_values[(unsigned char)str[0]];
|
||||
break;
|
||||
}
|
||||
return hval + asso_values[(unsigned char)str[len - 1]];
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#endif
|
||||
struct resword *
|
||||
is_reserved_word (str, len)
|
||||
register const char *str;
|
||||
register unsigned int len;
|
||||
{
|
||||
static struct resword wordlist[] =
|
||||
{
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"__asm__", ASM, NORID},
|
||||
{""},
|
||||
{"__typeof__", TYPEOF, NORID},
|
||||
{"__signed__", TYPESPEC, RID_SIGNED},
|
||||
{"__alignof__", ALIGNOF, NORID},
|
||||
{"break", BREAK, NORID},
|
||||
{"__attribute__", ATTRIBUTE, NORID},
|
||||
{""}, {""},
|
||||
{"else", ELSE, NORID},
|
||||
{"__attribute", ATTRIBUTE, NORID},
|
||||
{"__typeof", TYPEOF, NORID},
|
||||
{"int", TYPESPEC, RID_INT},
|
||||
{"__alignof", ALIGNOF, NORID},
|
||||
{"struct", STRUCT, NORID},
|
||||
{"sizeof", SIZEOF, NORID},
|
||||
{"switch", SWITCH, NORID},
|
||||
{"__volatile__", TYPE_QUAL, RID_VOLATILE},
|
||||
{""},
|
||||
{"__inline__", SCSPEC, RID_INLINE},
|
||||
{"__signed", TYPESPEC, RID_SIGNED},
|
||||
{"__volatile", TYPE_QUAL, RID_VOLATILE},
|
||||
{"if", IF, NORID},
|
||||
{"__inline", SCSPEC, RID_INLINE},
|
||||
{"while", WHILE, NORID},
|
||||
{""},
|
||||
{"__asm", ASM, NORID},
|
||||
{"auto", SCSPEC, RID_AUTO},
|
||||
{"short", TYPESPEC, RID_SHORT},
|
||||
{"default", DEFAULT, NORID},
|
||||
{"extern", SCSPEC, RID_EXTERN},
|
||||
{""}, {""},
|
||||
{"__const", TYPE_QUAL, RID_CONST},
|
||||
{"static", SCSPEC, RID_STATIC},
|
||||
{"__const__", TYPE_QUAL, RID_CONST},
|
||||
{"for", FOR, NORID},
|
||||
{"case", CASE, NORID},
|
||||
{"float", TYPESPEC, RID_FLOAT},
|
||||
{"return", RETURN, NORID},
|
||||
{"typeof", TYPEOF, NORID},
|
||||
{"typedef", SCSPEC, RID_TYPEDEF},
|
||||
{"volatile", TYPE_QUAL, RID_VOLATILE},
|
||||
{"do", DO, NORID},
|
||||
{"inline", SCSPEC, RID_INLINE},
|
||||
{"void", TYPESPEC, RID_VOID},
|
||||
{"char", TYPESPEC, RID_CHAR},
|
||||
{"signed", TYPESPEC, RID_SIGNED},
|
||||
{"unsigned", TYPESPEC, RID_UNSIGNED},
|
||||
{""}, {""},
|
||||
{"double", TYPESPEC, RID_DOUBLE},
|
||||
{"asm", ASM, NORID},
|
||||
{""}, {""},
|
||||
{"goto", GOTO, NORID},
|
||||
{""},
|
||||
{"const", TYPE_QUAL, RID_CONST},
|
||||
{"enum", ENUM, NORID},
|
||||
{"register", SCSPEC, RID_REGISTER},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"continue", CONTINUE, NORID},
|
||||
{""},
|
||||
{"union", UNION, NORID},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"long", TYPESPEC, RID_LONG}
|
||||
};
|
||||
|
||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||
{
|
||||
register int key = hash (str, len);
|
||||
|
||||
if (key <= MAX_HASH_VALUE && key >= 0)
|
||||
{
|
||||
register const char *s = wordlist[key].name;
|
||||
|
||||
if (*str == *s && !strcmp (str + 1, s + 1))
|
||||
return &wordlist[key];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
202
tests/test-2.exp
Normal file
202
tests/test-2.exp
Normal file
@@ -0,0 +1,202 @@
|
||||
/* C code produced by gperf version 2.7 */
|
||||
/* Command-line: ../src/gperf -n -k1-8 -l */
|
||||
|
||||
#define TOTAL_KEYWORDS 40
|
||||
#define MIN_WORD_LENGTH 2
|
||||
#define MAX_WORD_LENGTH 14
|
||||
#define MIN_HASH_VALUE 1
|
||||
#define MAX_HASH_VALUE 256
|
||||
/* maximum key range = 256, duplicates = 0 */
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#endif
|
||||
static unsigned int
|
||||
hash (str, len)
|
||||
register const char *str;
|
||||
register unsigned int len;
|
||||
{
|
||||
static unsigned short asso_values[] =
|
||||
{
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 25, 30, 35, 21, 0,
|
||||
30, 15, 30, 45, 257, 257, 0, 5, 45, 0,
|
||||
10, 0, 1, 20, 25, 15, 30, 40, 15, 5,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
|
||||
257, 257, 257, 257, 257, 257
|
||||
};
|
||||
register int hval = 0;
|
||||
|
||||
switch (len)
|
||||
{
|
||||
default:
|
||||
case 8:
|
||||
hval += asso_values[(unsigned char)str[7]];
|
||||
case 7:
|
||||
hval += asso_values[(unsigned char)str[6]];
|
||||
case 6:
|
||||
hval += asso_values[(unsigned char)str[5]];
|
||||
case 5:
|
||||
hval += asso_values[(unsigned char)str[4]];
|
||||
case 4:
|
||||
hval += asso_values[(unsigned char)str[3]];
|
||||
case 3:
|
||||
hval += asso_values[(unsigned char)str[2]];
|
||||
case 2:
|
||||
hval += asso_values[(unsigned char)str[1]];
|
||||
case 1:
|
||||
hval += asso_values[(unsigned char)str[0]];
|
||||
break;
|
||||
}
|
||||
return hval;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#endif
|
||||
const char *
|
||||
in_word_set (str, len)
|
||||
register const char *str;
|
||||
register unsigned int len;
|
||||
{
|
||||
static unsigned char lengthtable[] =
|
||||
{
|
||||
0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 2, 3, 0,
|
||||
0, 0, 2, 3, 0, 0, 0, 2, 4, 0, 0, 0, 4, 6,
|
||||
0, 0, 0, 3, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0,
|
||||
3, 5, 6, 0, 0, 6, 0, 0, 0, 0, 3, 0, 0, 0,
|
||||
3, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 9,
|
||||
0, 4, 6, 6, 0, 0, 2, 3, 0, 0, 0, 5, 3, 0,
|
||||
0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0,
|
||||
0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
|
||||
7, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0,
|
||||
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 10
|
||||
};
|
||||
static const char * wordlist[] =
|
||||
{
|
||||
"",
|
||||
"OR",
|
||||
"", "", "", "", "", "", "", "",
|
||||
"LOOP",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"ELSE",
|
||||
"DO",
|
||||
"", "", "",
|
||||
"TO",
|
||||
"MOD",
|
||||
"", "", "",
|
||||
"OF",
|
||||
"FOR",
|
||||
"", "", "",
|
||||
"BY",
|
||||
"FROM",
|
||||
"", "", "",
|
||||
"TYPE",
|
||||
"MODULE",
|
||||
"", "", "",
|
||||
"SET",
|
||||
"", "", "", "", "",
|
||||
"EXPORT",
|
||||
"", "", "", "",
|
||||
"VAR",
|
||||
"ARRAY",
|
||||
"RECORD",
|
||||
"", "",
|
||||
"REPEAT",
|
||||
"", "", "", "",
|
||||
"END",
|
||||
"", "", "",
|
||||
"NOT",
|
||||
"", "", "", "",
|
||||
"IF",
|
||||
"", "", "", "",
|
||||
"CASE",
|
||||
"", "",
|
||||
"PROCEDURE",
|
||||
"",
|
||||
"EXIT",
|
||||
"IMPORT",
|
||||
"RETURN",
|
||||
"", "",
|
||||
"IN",
|
||||
"AND",
|
||||
"", "", "",
|
||||
"ELSIF",
|
||||
"DIV",
|
||||
"", "", "",
|
||||
"THEN",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"IMPLEMENTATION",
|
||||
"", "", "", "",
|
||||
"WHILE",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"CONST",
|
||||
"POINTER",
|
||||
"", "", "",
|
||||
"UNTIL",
|
||||
"", "", "", "",
|
||||
"BEGIN",
|
||||
"", "", "", "",
|
||||
"WITH",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"",
|
||||
"QUALIFIED",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "",
|
||||
"DEFINITION"
|
||||
};
|
||||
|
||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||
{
|
||||
register int key = hash (str, len);
|
||||
|
||||
if (key <= MAX_HASH_VALUE && key >= 0)
|
||||
if (len == lengthtable[key])
|
||||
{
|
||||
register const char *s = wordlist[key];
|
||||
|
||||
if (*str == *s && !strcmp (str + 1, s + 1))
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user