initial import 1.2
commit
b990aa019e
@ -0,0 +1,39 @@
|
|||||||
|
*~
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.lo
|
||||||
|
*.la
|
||||||
|
*.dvi
|
||||||
|
*.synctex.gz
|
||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
autom4te.cache/
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
aclocal.m4
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.status
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
depcomp
|
||||||
|
install-sh
|
||||||
|
intltool-extract.in
|
||||||
|
intltool-merge.in
|
||||||
|
intltool-update.in
|
||||||
|
lib/libtdata-0.2.pc
|
||||||
|
libtool
|
||||||
|
ltmain.sh
|
||||||
|
missing
|
||||||
|
mkinstalldirs
|
||||||
|
po/Makefile.in.in
|
||||||
|
po/POTFILES
|
||||||
|
po/stamp-it
|
||||||
|
stamp-h1
|
||||||
|
include/version.h
|
||||||
|
.emacs.desktop
|
||||||
|
nbproject
|
||||||
|
config.guess.dh-orig
|
||||||
|
config.sub.dh-orig
|
@ -0,0 +1,5 @@
|
|||||||
|
This software was developed by Askele companies group.
|
||||||
|
* EU part: http://askele.com
|
||||||
|
* NW European part of Russia: http://askele-ingria.com
|
||||||
|
Team:
|
||||||
|
* General SW Architect and PM: Alexander Vdolainen <vdo@askele.com>
|
@ -0,0 +1,3 @@
|
|||||||
|
Askele business software license.
|
||||||
|
|
||||||
|
Libs and others might be under LGPLv3.
|
@ -0,0 +1,166 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser 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
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
2013-09-22 Alexander Vdolainen <vdo@askele.com>
|
||||||
|
* (a set of files): added autotools
|
||||||
|
|
||||||
|
2014-11-23 Alexander Vdolainen <vdo@askele.com>
|
||||||
|
* Initial import of 0.2 version
|
||||||
|
|
||||||
|
|
||||||
|
Copyright 2013-2014 Askele, Inc.
|
||||||
|
Copying and distribution of this file, with or without modification, are
|
||||||
|
permitted provided the copyright notice and this notice are preserved.
|
@ -0,0 +1,370 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the shell commands `./configure; make; make install' should
|
||||||
|
configure, build, and install this package. The following
|
||||||
|
more-detailed instructions are generic; see the `README' file for
|
||||||
|
instructions specific to this package. Some packages provide this
|
||||||
|
`INSTALL' file but do not implement all of the features documented
|
||||||
|
below. The lack of an optional feature in a given package is not
|
||||||
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
|
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, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
|
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 you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You need `configure.ac' 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.
|
||||||
|
|
||||||
|
Running `configure' might take a while. 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, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the `make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior `make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. 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.
|
||||||
|
|
||||||
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
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 can use 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 `..'. This
|
||||||
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU `make', it is safer 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.
|
||||||
|
|
||||||
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' 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. In general, the
|
||||||
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
|
specifying just `--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to `configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
`make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, `make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
|
time for the entire installation to be relocated. The approach of
|
||||||
|
makefile variable overrides for each directory variable is required by
|
||||||
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
|
However, some platforms have known limitations with the semantics of
|
||||||
|
shared libraries that end up requiring recompilation when using this
|
||||||
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
`/alternate/directory' before all installation names. The approach of
|
||||||
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
|
at `configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
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'.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of `make' will be. For these packages, running `./configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with `make V=1'; while running `./configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with `make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
|
CC is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX `make' updates targets which have the same time stamps as
|
||||||
|
their prerequisites, which makes it generally unusable when shipped
|
||||||
|
generated files such as `configure' are involved. Use GNU `make'
|
||||||
|
instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
|
to try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out
|
||||||
|
automatically, but needs to determine by the type of machine the package
|
||||||
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
|
a message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS
|
||||||
|
KERNEL-OS
|
||||||
|
|
||||||
|
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 machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
|
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--help=short'
|
||||||
|
`--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
`configure', and exit. The `short' variant lists options used
|
||||||
|
only in the top level, while the `recursive' variant lists options
|
||||||
|
also present in any nested packages.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
|
for more details, including other options available for fine-tuning
|
||||||
|
the installation locations.
|
||||||
|
|
||||||
|
`--no-create'
|
||||||
|
`-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS = po include lib
|
||||||
|
|
||||||
|
libsexprdocdir = ${prefix}/doc/libsexpr
|
||||||
|
libsexprdoc_DATA = \
|
||||||
|
README\
|
||||||
|
COPYING\
|
||||||
|
AUTHORS\
|
||||||
|
ChangeLog\
|
||||||
|
INSTALL\
|
||||||
|
NEWS
|
||||||
|
|
||||||
|
|
||||||
|
INTLTOOL_FILES = intltool-extract.in \
|
||||||
|
intltool-merge.in \
|
||||||
|
intltool-update.in
|
||||||
|
|
||||||
|
EXTRA_DIST = $(libsexprdoc_DATA) \
|
||||||
|
$(INTLTOOL_FILES)
|
||||||
|
|
||||||
|
DISTCLEANFILES = intltool-extract \
|
||||||
|
intltool-merge \
|
||||||
|
intltool-update \
|
||||||
|
po/.intltool-merge-cache
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
|
||||||
|
|
||||||
|
# Remove doc directory on uninstall
|
||||||
|
uninstall-local:
|
||||||
|
-rm -r $(libsexprdocdir)
|
@ -0,0 +1,157 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
|
srcdir=`dirname $0`
|
||||||
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
DIE=0
|
||||||
|
|
||||||
|
if [ -n "$GNOME2_DIR" ]; then
|
||||||
|
ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS"
|
||||||
|
LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH"
|
||||||
|
PATH="$GNOME2_DIR/bin:$PATH"
|
||||||
|
export PATH
|
||||||
|
export LD_LIBRARY_PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
(test -f $srcdir/configure.ac) || {
|
||||||
|
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||||
|
echo " top-level package directory"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`autoconf' installed."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
(grep "^IT_PROG_INTLTOOL" $srcdir/configure.ac >/dev/null) && {
|
||||||
|
(intltoolize --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`intltool' installed."
|
||||||
|
echo "You can get it from:"
|
||||||
|
echo " ftp://ftp.gnome.org/pub/GNOME/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.ac >/dev/null) && {
|
||||||
|
(xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`xml-i18n-toolize' installed."
|
||||||
|
echo "You can get it from:"
|
||||||
|
echo " ftp://ftp.gnome.org/pub/GNOME/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && {
|
||||||
|
(libtool --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`libtool' installed."
|
||||||
|
echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.ac >/dev/null) && {
|
||||||
|
(grep "sed.*POTFILES" $srcdir/configure.ac) > /dev/null || \
|
||||||
|
(glib-gettextize --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`glib' installed."
|
||||||
|
echo "You can get it from: ftp://ftp.gtk.org/pub/gtk"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(automake --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: You must have \`automake' installed."
|
||||||
|
echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
NO_AUTOMAKE=yes
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# if no automake, don't bother testing for aclocal
|
||||||
|
test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "**Error**: Missing \`aclocal'. The version of \`automake'"
|
||||||
|
echo "installed doesn't appear recent enough."
|
||||||
|
echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
if test "$DIE" -eq 1; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$*"; then
|
||||||
|
echo "**Warning**: I am going to run \`configure' with no arguments."
|
||||||
|
echo "If you wish to pass any to it, please specify them on the"
|
||||||
|
echo \`$0\'" command line."
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $CC in
|
||||||
|
xlc )
|
||||||
|
am_opt=--include-deps;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
for coin in `find $srcdir -path $srcdir/CVS -prune -o -name configure.ac -print`
|
||||||
|
do
|
||||||
|
dr=`dirname $coin`
|
||||||
|
if test -f $dr/NO-AUTO-GEN; then
|
||||||
|
echo skipping $dr -- flagged as no auto-gen
|
||||||
|
else
|
||||||
|
echo processing $dr
|
||||||
|
( cd $dr
|
||||||
|
|
||||||
|
aclocalinclude="$ACLOCAL_FLAGS"
|
||||||
|
|
||||||
|
if grep "^AM_GLIB_GNU_GETTEXT" configure.ac >/dev/null; then
|
||||||
|
echo "Creating $dr/aclocal.m4 ..."
|
||||||
|
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
|
||||||
|
echo "Running glib-gettextize... Ignore non-fatal messages."
|
||||||
|
echo "no" | glib-gettextize --force --copy
|
||||||
|
echo "Making $dr/aclocal.m4 writable ..."
|
||||||
|
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||||
|
fi
|
||||||
|
if grep "^IT_PROG_INTLTOOL" configure.ac >/dev/null; then
|
||||||
|
echo "Running intltoolize..."
|
||||||
|
intltoolize --copy --force --automake
|
||||||
|
fi
|
||||||
|
if grep "^AM_PROG_XML_I18N_TOOLS" configure.ac >/dev/null; then
|
||||||
|
echo "Running xml-i18n-toolize..."
|
||||||
|
xml-i18n-toolize --copy --force --automake
|
||||||
|
fi
|
||||||
|
if grep "^LT_INIT" configure.ac >/dev/null; then
|
||||||
|
if test -z "$NO_LIBTOOLIZE" ; then
|
||||||
|
echo "Running libtoolize..."
|
||||||
|
libtoolize --force --copy
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "Running aclocal $aclocalinclude ..."
|
||||||
|
aclocal $aclocalinclude
|
||||||
|
if grep "^A[CM]_CONFIG_HEADER" configure.ac >/dev/null; then
|
||||||
|
echo "Running autoheader..."
|
||||||
|
autoheader
|
||||||
|
fi
|
||||||
|
echo "Running automake --gnu $am_opt ..."
|
||||||
|
automake --add-missing --copy --gnu $am_opt
|
||||||
|
echo "Running autoconf ..."
|
||||||
|
autoconf
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test x$NOCONFIGURE = x; then
|
||||||
|
echo Running $srcdir/configure "$@" ...
|
||||||
|
$srcdir/configure "$@" \
|
||||||
|
&& echo Now type \`make\' to compile. || exit 1
|
||||||
|
else
|
||||||
|
echo Skipping configure process.
|
||||||
|
fi
|
@ -0,0 +1,42 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_INIT(libsexpr, 1.2)
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([1.11])
|
||||||
|
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
AC_PROG_CC
|
||||||
|
|
||||||
|
dnl ***************************************************************************
|
||||||
|
dnl Internationalization
|
||||||
|
dnl ***************************************************************************
|
||||||
|
IT_PROG_INTLTOOL([0.35.0])
|
||||||
|
|
||||||
|
GETTEXT_PACKAGE=libsexpr
|
||||||
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [GETTEXT package name])
|
||||||
|
AM_GLIB_GNU_GETTEXT
|
||||||
|
|
||||||
|
|
||||||
|
LT_INIT
|
||||||
|
|
||||||
|
dnl *****************
|
||||||
|
dnl ***** options *****
|
||||||
|
dnl *****************
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([build_examples],
|
||||||
|
AS_HELP_STRING([--enable-build-examples], [Enable examples build]))
|
||||||
|
|
||||||
|
AS_IF([test "x$enable_build_examples" = "xyes"], [
|
||||||
|
AC_DEFINE([BUILD_EXAMPLES], 1, [build of examples enabled])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
lib/libsexpr-1.2.pc
|
||||||
|
lib/Makefile
|
||||||
|
include/Makefile
|
||||||
|
po/Makefile.in])
|
@ -0,0 +1,6 @@
|
|||||||
|
libsexpr for Debian
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
<possible notes regarding this package - if none, delete this file>
|
||||||
|
|
||||||
|
-- Alexander Vdolainen <vdo@daze> Mon, 24 Nov 2014 11:52:48 +0200
|
@ -0,0 +1,9 @@
|
|||||||
|
libsexpr for Debian
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
<this file describes information about the source package, see Debian policy
|
||||||
|
manual section 4.14. You WILL either need to modify or delete this file>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
libsexpr (1.2-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
|
||||||
|
|
||||||
|
-- Alexander Vdolainen <vdo@daze> Mon, 24 Nov 2014 11:52:48 +0200
|
@ -0,0 +1 @@
|
|||||||
|
8
|
@ -0,0 +1,23 @@
|
|||||||
|
Source: libsexpr
|
||||||
|
Priority: extra
|
||||||
|
Maintainer: Alexander Vdolainen <vdo@askele.com>
|
||||||
|
Build-Depends: debhelper (>= 8.0.0), autotools-dev
|
||||||
|
Standards-Version: 3.9.3
|
||||||
|
Section: libs
|
||||||
|
Homepage: http://askele.com/software
|
||||||
|
#Vcs-Git: git://git.debian.org/collab-maint/libsexpr.git
|
||||||
|
#Vcs-Browser: http://git.debian.org/?p=collab-maint/libsexpr.git;a=summary
|
||||||
|
|
||||||
|
Package: libsexpr-dev
|
||||||
|
Section: libdevel
|
||||||
|
Architecture: any
|
||||||
|
Depends: libsexpr (= ${binary:Version})
|
||||||
|
Description: Development files for libsexpr
|
||||||
|
Development files for library working with S-expressions
|
||||||
|
|
||||||
|
Package: libsexpr
|
||||||
|
Section: libs
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
|
Description: C library for working with S-expressions
|
||||||
|
Library used to parse, evaluate S-expressions
|
@ -0,0 +1,38 @@
|
|||||||
|
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: libsexpr
|
||||||
|
Source: <url://example.com>
|
||||||
|
|
||||||
|
Files: *
|
||||||
|
Copyright: <years> <put author's name and email here>
|
||||||
|
<years> <likewise for another author>
|
||||||
|
License: <special license>
|
||||||
|
<Put the license of the package here indented by 1 space>
|
||||||
|
<This follows the format of Description: lines in control file>
|
||||||
|
.
|
||||||
|
<Including paragraphs>
|
||||||
|
|
||||||
|
# If you want to use GPL v2 or later for the /debian/* files use
|
||||||
|
# the following clauses, or change it to suit. Delete these two lines
|
||||||
|
Files: debian/*
|
||||||
|
Copyright: 2014 Alexander Vdolainen <vdo@daze>
|
||||||
|
License: GPL-2+
|
||||||
|
This package 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 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
.
|
||||||
|
This package 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, see <http://www.gnu.org/licenses/>
|
||||||
|
.
|
||||||
|
On Debian systems, the complete text of the GNU General
|
||||||
|
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
||||||
|
|
||||||
|
# Please also look if there are files or directories which have a
|
||||||
|
# different copyright/license attached and list them here.
|
||||||
|
# Please avoid to pick license terms that are more restrictive than the
|
||||||
|
# packaged work, as it may make Debian's contributions unacceptable upstream.
|
@ -0,0 +1,2 @@
|
|||||||
|
NEWS
|
||||||
|
README
|
@ -0,0 +1,47 @@
|
|||||||
|
#! /bin/sh -e
|
||||||
|
# /usr/lib/emacsen-common/packages/install/libsexpr
|
||||||
|
|
||||||
|
# Written by Jim Van Zandt <jrv@debian.org>, borrowing heavily
|
||||||
|
# from the install scripts for gettext by Santiago Vila
|
||||||
|
# <sanvila@ctv.es> and octave by Dirk Eddelbuettel <edd@debian.org>.
|
||||||
|
|
||||||
|
FLAVOR=$1
|
||||||
|
PACKAGE=libsexpr
|
||||||
|
|
||||||
|
if [ ${FLAVOR} = emacs ]; then exit 0; fi
|
||||||
|
|
||||||
|
echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR}
|
||||||
|
|
||||||
|
#FLAVORTEST=`echo $FLAVOR | cut -c-6`
|
||||||
|
#if [ ${FLAVORTEST} = xemacs ] ; then
|
||||||
|
# SITEFLAG="-no-site-file"
|
||||||
|
#else
|
||||||
|
# SITEFLAG="--no-site-file"
|
||||||
|
#fi
|
||||||
|
FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile"
|
||||||
|
|
||||||
|
ELDIR=/usr/share/emacs/site-lisp/${PACKAGE}
|
||||||
|
ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE}
|
||||||
|
ELRELDIR=../../../emacs/site-lisp/${PACKAGE}
|
||||||
|
|
||||||
|
# Install-info-altdir does not actually exist.
|
||||||
|
# Maybe somebody will write it.
|
||||||
|
if test -x /usr/sbin/install-info-altdir; then
|
||||||
|
echo install/${PACKAGE}: install Info links for ${FLAVOR}
|
||||||
|
install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/share/info/${PACKAGE}.info.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -m 755 -d ${ELCDIR}
|
||||||
|
cd ${ELDIR}
|
||||||
|
FILES=`echo *.el`
|
||||||
|
cd ${ELCDIR}
|
||||||
|
ln -sf ${ELRELDIR}/*.el .
|
||||||
|
|
||||||
|
cat << EOF > path.el
|
||||||
|
(debian-pkg-add-load-path-item ".")
|
||||||
|
(setq byte-compile-warnings nil)
|
||||||
|
EOF
|
||||||
|
${FLAVOR} ${FLAGS} ${FILES}
|
||||||
|
rm -f path.el
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
# /usr/lib/emacsen-common/packages/remove/libsexpr
|
||||||
|
|
||||||
|
FLAVOR=$1
|
||||||
|
PACKAGE=libsexpr
|
||||||
|
|
||||||
|
if [ ${FLAVOR} != emacs ]; then
|
||||||
|
if test -x /usr/sbin/install-info-altdir; then
|
||||||
|
echo remove/${PACKAGE}: removing Info links for ${FLAVOR}
|
||||||
|
install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/share/info/libsexpr.info.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
|
||||||
|
rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
|
||||||
|
fi
|
@ -0,0 +1,27 @@
|
|||||||
|
;; -*-emacs-lisp-*-
|
||||||
|
;;
|
||||||
|
;; Emacs startup file, e.g. /etc/emacs/site-start.d/50libsexpr.el
|
||||||
|
;; for the Debian libsexpr package
|
||||||
|
;;
|
||||||
|
;; Originally contributed by Nils Naumann <naumann@unileoben.ac.at>
|
||||||
|
;; Modified by Dirk Eddelbuettel <edd@debian.org>
|
||||||
|
;; Adapted for dh-make by Jim Van Zandt <jrv@debian.org>
|
||||||
|
|
||||||
|
;; The libsexpr package follows the Debian/GNU Linux 'emacsen' policy and
|
||||||
|
;; byte-compiles its elisp files for each 'emacs flavor' (emacs19,
|
||||||
|
;; xemacs19, emacs20, xemacs20...). The compiled code is then
|
||||||
|
;; installed in a subdirectory of the respective site-lisp directory.
|
||||||
|
;; We have to add this to the load-path:
|
||||||
|
(let ((package-dir (concat "/usr/share/"
|
||||||
|
(symbol-name debian-emacs-flavor)
|
||||||
|
"/site-lisp/libsexpr")))
|
||||||
|
;; If package-dir does not exist, the libsexpr package must have
|
||||||
|
;; removed but not purged, and we should skip the setup.
|
||||||
|
(when (file-directory-p package-dir)
|
||||||
|
(if (fboundp 'debian-pkg-add-load-path-item)
|
||||||
|
(debian-pkg-add-load-path-item package-dir)
|
||||||
|
(setq load-path (cons package-dir load-path)))
|
||||||
|
(autoload 'libsexpr-mode "libsexpr-mode"
|
||||||
|
"Major mode for editing libsexpr files." t)
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.libsexpr$" . libsexpr-mode))))
|
||||||
|
|
@ -0,0 +1,154 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: libsexpr
|
||||||
|
# Required-Start: $network $local_fs
|
||||||
|
# Required-Stop:
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: <Enter a short description of the software>
|
||||||
|
# Description: <Enter a long description of the software>
|
||||||
|
# <...>
|
||||||
|
# <...>
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Author: Alexander Vdolainen <vdo@daze>
|
||||||
|
|
||||||
|
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||||
|
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||||
|
DESC=libsexpr # Introduce a short description here
|
||||||
|
NAME=libsexpr # Introduce the short server's name here
|
||||||
|
DAEMON=/usr/sbin/libsexpr # Introduce the server's location here
|
||||||
|
DAEMON_ARGS="" # Arguments to run the daemon with
|
||||||
|
PIDFILE=/var/run/$NAME.pid
|
||||||
|
SCRIPTNAME=/etc/init.d/$NAME
|
||||||
|
|
||||||
|
# Exit if the package is not installed
|
||||||
|
[ -x $DAEMON ] || exit 0
|
||||||
|
|
||||||
|
# Read configuration variable file if it is present
|
||||||
|
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
|
||||||
|
|
||||||
|
# Load the VERBOSE setting and other rcS variables
|
||||||
|
. /lib/init/vars.sh
|
||||||
|
|
||||||
|
# Define LSB log_* functions.
|
||||||
|
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
#
|
||||||
|
# Function that starts the daemon/service
|
||||||
|
#
|
||||||
|
do_start()
|
||||||
|
{
|
||||||
|
# Return
|
||||||
|
# 0 if daemon has been started
|
||||||
|
# 1 if daemon was already running
|
||||||
|
# 2 if daemon could not be started
|
||||||
|
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|
||||||
|
|| return 1
|
||||||
|
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
|
||||||
|
$DAEMON_ARGS \
|
||||||
|
|| return 2
|
||||||
|
# Add code here, if necessary, that waits for the process to be ready
|
||||||
|
# to handle requests from services started subsequently which depend
|
||||||
|
# on this one. As a last resort, sleep for some time.
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Function that stops the daemon/service
|
||||||
|
#
|
||||||
|
do_stop()
|
||||||
|
{
|
||||||
|
# Return
|
||||||
|
# 0 if daemon has been stopped
|
||||||
|
# 1 if daemon was already stopped
|
||||||
|
# 2 if daemon could not be stopped
|
||||||
|
# other if a failure occurred
|
||||||
|
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
|
||||||
|
RETVAL="$?"
|
||||||
|
[ "$RETVAL" = 2 ] && return 2
|
||||||
|
# Wait for children to finish too if this is a daemon that forks
|
||||||
|
# and if the daemon is only ever run from this initscript.
|
||||||
|
# If the above conditions are not satisfied then add some other code
|
||||||
|
# that waits for the process to drop all resources that could be
|
||||||
|
# needed by services started subsequently. A last resort is to
|
||||||
|
# sleep for some time.
|
||||||
|
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||||
|
[ "$?" = 2 ] && return 2
|
||||||
|
# Many daemons don't delete their pidfiles when they exit.
|
||||||
|
rm -f $PIDFILE
|
||||||
|
return "$RETVAL"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Function that sends a SIGHUP to the daemon/service
|
||||||
|
#
|
||||||
|
do_reload() {
|
||||||
|
#
|
||||||
|
# If the daemon can reload its configuration without
|
||||||
|
# restarting (for example, when it is sent a SIGHUP),
|
||||||
|
# then implement that here.
|
||||||
|
#
|
||||||
|
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
|
||||||
|
do_start
|
||||||
|
case "$?" in
|
||||||
|
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||||
|
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||||
|
do_stop
|
||||||
|
case "$?" in
|
||||||
|
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||||
|
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||||
|
;;
|
||||||
|
#reload|force-reload)
|
||||||
|
#
|
||||||
|
# If do_reload() is not implemented then leave this commented out
|
||||||
|
# and leave 'force-reload' as an alias for 'restart'.
|
||||||
|
#
|
||||||
|
#log_daemon_msg "Reloading $DESC" "$NAME"
|
||||||
|
#do_reload
|
||||||
|
#log_end_msg $?
|
||||||
|
#;;
|
||||||
|
restart|force-reload)
|
||||||
|
#
|
||||||
|
# If the "reload" option is implemented then remove the
|
||||||
|
# 'force-reload' alias
|
||||||
|
#
|
||||||
|
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||||
|
do_stop
|
||||||
|
case "$?" in
|
||||||
|
0|1)
|
||||||
|
do_start
|
||||||
|
case "$?" in
|
||||||
|
0) log_end_msg 0 ;;
|
||||||
|
1) log_end_msg 1 ;; # Old process is still running
|
||||||
|
*) log_end_msg 1 ;; # Failed to start
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Failed to stop
|
||||||
|
log_end_msg 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||||
|
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
:
|
@ -0,0 +1,2 @@
|
|||||||
|
usr/lib
|
||||||
|
usr/include
|
@ -0,0 +1,4 @@
|
|||||||
|
usr/include/*
|
||||||
|
usr/lib/lib*.a
|
||||||
|
usr/lib/lib*.so
|
||||||
|
usr/lib/pkgconfig/*
|
@ -0,0 +1,4 @@
|
|||||||
|
#
|
||||||
|
# Regular cron jobs for the libsexpr package
|
||||||
|
#
|
||||||
|
0 4 * * * root [ -x /usr/bin/libsexpr_maintenance ] && /usr/bin/libsexpr_maintenance
|
@ -0,0 +1,10 @@
|
|||||||
|
# Defaults for libsexpr initscript
|
||||||
|
# sourced by /etc/init.d/libsexpr
|
||||||
|
# installed at /etc/default/libsexpr by the maintainer scripts
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is a POSIX shell fragment
|
||||||
|
#
|
||||||
|
|
||||||
|
# Additional options that are passed to the Daemon.
|
||||||
|
DAEMON_OPTS=""
|
@ -0,0 +1 @@
|
|||||||
|
usr/lib
|
@ -0,0 +1,20 @@
|
|||||||
|
Document: libsexpr
|
||||||
|
Title: Debian libsexpr Manual
|
||||||
|
Author: <insert document author here>
|
||||||
|
Abstract: This manual describes what libsexpr is
|
||||||
|
and how it can be used to
|
||||||
|
manage online manuals on Debian systems.
|
||||||
|
Section: unknown
|
||||||
|
|
||||||
|
Format: debiandoc-sgml
|
||||||
|
Files: /usr/share/doc/libsexpr/libsexpr.sgml.gz
|
||||||
|
|
||||||
|
Format: postscript
|
||||||
|
Files: /usr/share/doc/libsexpr/libsexpr.ps.gz
|
||||||
|
|
||||||
|
Format: text
|
||||||
|
Files: /usr/share/doc/libsexpr/libsexpr.text.gz
|
||||||
|
|
||||||
|
Format: HTML
|
||||||
|
Index: /usr/share/doc/libsexpr/html/index.html
|
||||||
|
Files: /usr/share/doc/libsexpr/html/*.html
|
@ -0,0 +1 @@
|
|||||||
|
usr/lib/lib*.so.*
|
@ -0,0 +1,56 @@
|
|||||||
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
.\" (C) Copyright 2014 Alexander Vdolainen <vdo@daze>,
|
||||||
|
.\"
|
||||||
|
.\" First parameter, NAME, should be all caps
|
||||||
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
.TH LIBSEXPR SECTION "November 24, 2014"
|
||||||
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
|
.\"
|
||||||
|
.\" Some roff macros, for reference:
|
||||||
|
.\" .nh disable hyphenation
|
||||||
|
.\" .hy enable hyphenation
|
||||||
|
.\" .ad l left justify
|
||||||
|
.\" .ad b justify to both left and right margins
|
||||||
|
.\" .nf disable filling
|
||||||
|
.\" .fi enable filling
|
||||||
|
.\" .br insert line break
|
||||||
|
.\" .sp <n> insert n+1 empty lines
|
||||||
|
.\" for manpage-specific macros, see man(7)
|
||||||
|
.SH NAME
|
||||||
|
libsexpr \- program to do something
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B libsexpr
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
.br
|
||||||
|
.B bar
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This manual page documents briefly the
|
||||||
|
.B libsexpr
|
||||||
|
and
|
||||||
|
.B bar
|
||||||
|
commands.
|
||||||
|
.PP
|
||||||
|
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
.\" respectively.
|
||||||
|
\fBlibsexpr\fP is a program that...
|
||||||
|
.SH OPTIONS
|
||||||
|
These programs follow the usual GNU command line syntax, with long
|
||||||
|
options starting with two dashes (`-').
|
||||||
|
A summary of options is included below.
|
||||||
|
For a complete description, see the Info files.
|
||||||
|
.TP
|
||||||
|
.B \-h, \-\-help
|
||||||
|
Show summary of options.
|
||||||
|
.TP
|
||||||
|
.B \-v, \-\-version
|
||||||
|
Show version of program.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR bar (1),
|
||||||
|
.BR baz (1).
|
||||||
|
.br
|
||||||
|
The programs are documented fully by
|
||||||
|
.IR "The Rise and Fall of a Fooish Bar" ,
|
||||||
|
available via the Info system.
|
@ -0,0 +1,154 @@
|
|||||||
|
<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
|
||||||
|
|
||||||
|
<!-- Process this file with docbook-to-man to generate an nroff manual
|
||||||
|
page: `docbook-to-man manpage.sgml > manpage.1'. You may view
|
||||||
|
the manual page with: `docbook-to-man manpage.sgml | nroff -man |
|
||||||
|
less'. A typical entry in a Makefile or Makefile.am is:
|
||||||
|
|
||||||
|
manpage.1: manpage.sgml
|
||||||
|
docbook-to-man $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
The docbook-to-man binary is found in the docbook-to-man package.
|
||||||
|
Please remember that if you create the nroff version in one of the
|
||||||
|
debian/rules file targets (such as build), you will need to include
|
||||||
|
docbook-to-man in your Build-Depends control field.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
|
||||||
|
<!ENTITY dhfirstname "<firstname>FIRSTNAME</firstname>">
|
||||||
|
<!ENTITY dhsurname "<surname>SURNAME</surname>">
|
||||||
|
<!-- Please adjust the date whenever revising the manpage. -->
|
||||||
|
<!ENTITY dhdate "<date>November 24, 2014</date>">
|
||||||
|
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
|
||||||
|
allowed: see man(7), man(1). -->
|
||||||
|
<!ENTITY dhsection "<manvolnum>SECTION</manvolnum>">
|
||||||
|
<!ENTITY dhemail "<email>vdo@daze</email>">
|
||||||
|
<!ENTITY dhusername "Alexander Vdolainen">
|
||||||
|
<!ENTITY dhucpackage "<refentrytitle>LIBSEXPR</refentrytitle>">
|
||||||
|
<!ENTITY dhpackage "libsexpr">
|
||||||
|
|
||||||
|
<!ENTITY debian "<productname>Debian</productname>">
|
||||||
|
<!ENTITY gnu "<acronym>GNU</acronym>">
|
||||||
|
<!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
|
||||||
|
]>
|
||||||
|
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<address>
|
||||||
|
&dhemail;
|
||||||
|
</address>
|
||||||
|
<author>
|
||||||
|
&dhfirstname;
|
||||||
|
&dhsurname;
|
||||||
|
</author>
|
||||||
|
<copyright>
|
||||||
|
<year>2003</year>
|
||||||
|
<holder>&dhusername;</holder>
|
||||||
|
</copyright>
|
||||||
|
&dhdate;
|
||||||
|
</refentryinfo>
|
||||||
|
<refmeta>
|
||||||
|
&dhucpackage;
|
||||||
|
|
||||||
|
&dhsection;
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>&dhpackage;</refname>
|
||||||
|
|
||||||
|
<refpurpose>program to do something</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>&dhpackage;</command>
|
||||||
|
|
||||||
|
<arg><option>-e <replaceable>this</replaceable></option></arg>
|
||||||
|
|
||||||
|
<arg><option>--example <replaceable>that</replaceable></option></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
<refsect1>
|
||||||
|
<title>DESCRIPTION</title>
|
||||||
|
|
||||||
|
<para>This manual page documents briefly the
|
||||||
|
<command>&dhpackage;</command> and <command>bar</command>
|
||||||
|
commands.</para>
|
||||||
|
|
||||||
|
<para>This manual page was written for the &debian; distribution
|
||||||
|
because the original program does not have a manual page.
|
||||||
|
Instead, it has documentation in the &gnu;
|
||||||
|
<application>Info</application> format; see below.</para>
|
||||||
|
|
||||||
|
<para><command>&dhpackage;</command> is a program that...</para>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
<refsect1>
|
||||||
|
<title>OPTIONS</title>
|
||||||
|
|
||||||
|
<para>These programs follow the usual &gnu; command line syntax,
|
||||||
|
with long options starting with two dashes (`-'). A summary of
|
||||||
|
options is included below. For a complete description, see the
|
||||||
|
<application>Info</application> files.</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-h</option>
|
||||||
|
<option>--help</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Show summary of options.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-v</option>
|
||||||
|
<option>--version</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Show version of program.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1>
|
||||||
|
<title>SEE ALSO</title>
|
||||||
|
|
||||||
|
<para>bar (1), baz (1).</para>
|
||||||
|
|
||||||
|
<para>The programs are documented fully by <citetitle>The Rise and
|
||||||
|
Fall of a Fooish Bar</citetitle> available via the
|
||||||
|
<application>Info</application> system.</para>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1>
|
||||||
|
<title>AUTHOR</title>
|
||||||
|
|
||||||
|
<para>This manual page was written by &dhusername; &dhemail; for
|
||||||
|
the &debian; system (and may be used by others). Permission is
|
||||||
|
granted to copy, distribute and/or modify this document under
|
||||||
|
the terms of the &gnu; General Public License, Version 2 any
|
||||||
|
later version published by the Free Software Foundation.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
On Debian systems, the complete text of the GNU General Public
|
||||||
|
License can be found in /usr/share/common-licenses/GPL.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-omittag:t
|
||||||
|
sgml-shorttag:t
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-always-quote-attributes:t
|
||||||
|
sgml-indent-step:2
|
||||||
|
sgml-indent-data:t
|
||||||
|
sgml-parent-document:nil
|
||||||
|
sgml-default-dtd-file:nil
|
||||||
|
sgml-exposed-tags:nil
|
||||||
|
sgml-local-catalogs:nil
|
||||||
|
sgml-local-ecat-files:nil
|
||||||
|
End:
|
||||||
|
-->
|
@ -0,0 +1,291 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
`xsltproc -''-nonet \
|
||||||
|
-''-param man.charmap.use.subset "0" \
|
||||||
|
-''-param make.year.ranges "1" \
|
||||||
|
-''-param make.single.year.ranges "1" \
|
||||||
|
/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl \
|
||||||
|
manpage.xml'
|
||||||
|
|
||||||
|
A manual page <package>.<section> will be generated. You may view the
|
||||||
|
manual page with: nroff -man <package>.<section> | less'. A typical entry
|
||||||
|
in a Makefile or Makefile.am is:
|
||||||
|
|
||||||
|
DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl
|
||||||
|
XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
|
||||||
|
|
||||||
|
manpage.1: manpage.xml
|
||||||
|
$(XP) $(DB2MAN) $<
|
||||||
|
|
||||||
|
The xsltproc binary is found in the xsltproc package. The XSL files are in
|
||||||
|
docbook-xsl. A description of the parameters you can use can be found in the
|
||||||
|
docbook-xsl-doc-* packages. Please remember that if you create the nroff
|
||||||
|
version in one of the debian/rules file targets (such as build), you will need
|
||||||
|
to include xsltproc and docbook-xsl in your Build-Depends control field.
|
||||||
|
Alternatively use the xmlto command/package. That will also automatically
|
||||||
|
pull in xsltproc and docbook-xsl.
|
||||||
|
|
||||||
|
Notes for using docbook2x: docbook2x-man does not automatically create the
|
||||||
|
AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
|
||||||
|
<refsect1> ... </refsect1>.
|
||||||
|
|
||||||
|
To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
|
||||||
|
read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
|
||||||
|
found in the docbook-xsl-doc-html package.
|
||||||
|
|
||||||
|
Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
|
||||||
|
|
||||||
|
General documentation about man-pages and man-page-formatting:
|
||||||
|
man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
|
||||||
|
<!ENTITY dhfirstname "FIRSTNAME">
|
||||||
|
<!ENTITY dhsurname "SURNAME">
|
||||||
|
<!-- dhusername could also be set to "&dhfirstname; &dhsurname;". -->
|
||||||
|
<!ENTITY dhusername "Alexander Vdolainen">
|
||||||
|
<!ENTITY dhemail "vdo@daze">
|
||||||
|
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
|
||||||
|
allowed: see man(7), man(1) and
|
||||||
|
http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
|
||||||
|
<!ENTITY dhsection "SECTION">
|
||||||
|
<!-- TITLE should be something like "User commands" or similar (see
|
||||||
|
http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
|
||||||
|
<!ENTITY dhtitle "libsexpr User Manual">
|
||||||
|
<!ENTITY dhucpackage "LIBSEXPR">
|
||||||
|
<!ENTITY dhpackage "libsexpr">
|
||||||
|
]>
|
||||||
|
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<title>&dhtitle;</title>
|
||||||
|
<productname>&dhpackage;</productname>
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname>&dhfirstname;</firstname>
|
||||||
|
<surname>&dhsurname;</surname>
|
||||||
|
<contrib>Wrote this manpage for the Debian system.</contrib>
|
||||||
|
<address>
|
||||||
|
<email>&dhemail;</email>
|
||||||
|
</address>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
<copyright>
|
||||||
|
<year>2007</year>
|
||||||
|
<holder>&dhusername;</holder>
|
||||||
|
</copyright>
|
||||||
|
<legalnotice>
|
||||||
|
<para>This manual page was written for the Debian system
|
||||||
|
(and may be used by others).</para>
|
||||||
|
<para>Permission is granted to copy, distribute and/or modify this
|
||||||
|
document under the terms of the GNU General Public License,
|
||||||
|
Version 2 or (at your option) any later version published by
|
||||||
|
the Free Software Foundation.</para>
|
||||||
|
<para>On Debian systems, the complete text of the GNU General Public
|
||||||
|
License can be found in
|
||||||
|
<filename>/usr/share/common-licenses/GPL</filename>.</para>
|
||||||
|
</legalnotice>
|
||||||
|
</refentryinfo>
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>&dhucpackage;</refentrytitle>
|
||||||
|
<manvolnum>&dhsection;</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>&dhpackage;</refname>
|
||||||
|
<refpurpose>program to do something</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>&dhpackage;</command>
|
||||||
|
<!-- These are several examples, how syntaxes could look -->
|
||||||
|
<arg choice="plain"><option>-e <replaceable>this</replaceable></option></arg>
|
||||||
|
<arg choice="opt"><option>--example=<parameter>that</parameter></option></arg>
|
||||||
|
<arg choice="opt">
|
||||||
|
<group choice="req">
|
||||||
|
<arg choice="plain"><option>-e</option></arg>
|
||||||
|
<arg choice="plain"><option>--example</option></arg>
|
||||||
|
</group>
|
||||||
|
<replaceable class="option">this</replaceable>
|
||||||
|
</arg>
|
||||||
|
<arg choice="opt">
|
||||||
|
<group choice="req">
|
||||||
|
<arg choice="plain"><option>-e</option></arg>
|
||||||
|
<arg choice="plain"><option>--example</option></arg>
|
||||||
|
</group>
|
||||||
|
<group choice="req">
|
||||||
|
<arg choice="plain"><replaceable>this</replaceable></arg>
|
||||||
|
<arg choice="plain"><replaceable>that</replaceable></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>&dhpackage;</command>
|
||||||
|
<!-- Normally the help and version options make the programs stop
|
||||||
|
right after outputting the requested information. -->
|
||||||
|
<group choice="opt">
|
||||||
|
<arg choice="plain">
|
||||||
|
<group choice="req">
|
||||||
|
<arg choice="plain"><option>-h</option></arg>
|
||||||
|
<arg choice="plain"><option>--help</option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
<arg choice="plain">
|
||||||
|
<group choice="req">
|
||||||
|
<arg choice="plain"><option>-v</option></arg>
|
||||||
|
<arg choice="plain"><option>--version</option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
</group>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
<refsect1 id="description">
|
||||||
|
<title>DESCRIPTION</title>
|
||||||
|
<para>This manual page documents briefly the
|
||||||
|
<command>&dhpackage;</command> and <command>bar</command>
|
||||||
|
commands.</para>
|
||||||
|
<para>This manual page was written for the Debian distribution
|
||||||
|
because the original program does not have a manual page.
|
||||||
|
Instead, it has documentation in the GNU <citerefentry>
|
||||||
|
<refentrytitle>info</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</citerefentry> format; see below.</para>
|
||||||
|
<para><command>&dhpackage;</command> is a program that...</para>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="options">
|
||||||
|
<title>OPTIONS</title>
|
||||||
|
<para>The program follows the usual GNU command line syntax,
|
||||||
|
with long options starting with two dashes (`-'). A summary of
|
||||||
|
options is included below. For a complete description, see the
|
||||||
|
<citerefentry>
|
||||||
|
<refentrytitle>info</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</citerefentry> files.</para>
|
||||||
|
<variablelist>
|
||||||
|
<!-- Use the variablelist.term.separator and the
|
||||||
|
variablelist.term.break.after parameters to
|
||||||
|
control the term elements. -->
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-e <replaceable>this</replaceable></option></term>
|
||||||
|
<term><option>--example=<replaceable>that</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Does this and that.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-h</option></term>
|
||||||
|
<term><option>--help</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Show summary of options.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-v</option></term>
|
||||||
|
<term><option>--version</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Show version of program.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="files">
|
||||||
|
<title>FILES</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/foo.conf</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The system-wide configuration file to control the
|
||||||
|
behaviour of <application>&dhpackage;</application>. See
|
||||||
|
<citerefentry>
|
||||||
|
<refentrytitle>foo.conf</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
</citerefentry> for further details.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>${HOME}/.foo.conf</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The per-user configuration file to control the
|
||||||
|
behaviour of <application>&dhpackage;</application>. See
|
||||||
|
<citerefentry>
|
||||||
|
<refentrytitle>foo.conf</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
</citerefentry> for further details.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="environment">
|
||||||
|
<title>ENVIRONMENT</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><envar>FOO_CONF</envar></term>
|
||||||
|
<listitem>
|
||||||
|
<para>If used, the defined file is used as configuration
|
||||||
|
file (see also <xref linkend="files"/>).</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="diagnostics">
|
||||||
|
<title>DIAGNOSTICS</title>
|
||||||
|
<para>The following diagnostics may be issued
|
||||||
|
on <filename class="devicefile">stderr</filename>:</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errortext>Bad configuration file. Exiting.</errortext></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The configuration file seems to contain a broken configuration
|
||||||
|
line. Use the <option>--verbose</option> option, to get more info.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para><command>&dhpackage;</command> provides some return codes, that can
|
||||||
|
be used in scripts:</para>
|
||||||
|
<segmentedlist>
|
||||||
|
<segtitle>Code</segtitle>
|
||||||
|
<segtitle>Diagnostic</segtitle>
|
||||||
|
<seglistitem>
|
||||||
|
<seg><errorcode>0</errorcode></seg>
|
||||||
|
<seg>Program exited successfully.</seg>
|
||||||
|
</seglistitem>
|
||||||
|
<seglistitem>
|
||||||
|
<seg><errorcode>1</errorcode></seg>
|
||||||
|
<seg>The configuration file seems to be broken.</seg>
|
||||||
|
</seglistitem>
|
||||||
|
</segmentedlist>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="bugs">
|
||||||
|
<!-- Or use this section to tell about upstream BTS. -->
|
||||||
|
<title>BUGS</title>
|
||||||
|
<para>The program is currently limited to only work
|
||||||
|
with the <package>foobar</package> library.</para>
|
||||||
|
<para>The upstreams <acronym>BTS</acronym> can be found
|
||||||
|
at <ulink url="http://bugzilla.foo.tld"/>.</para>
|
||||||
|
</refsect1>
|
||||||
|
<refsect1 id="see_also">
|
||||||
|
<title>SEE ALSO</title>
|
||||||
|
<!-- In alpabetical order. -->
|
||||||
|
<para><citerefentry>
|
||||||
|
<refentrytitle>bar</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</citerefentry>, <citerefentry>
|
||||||
|
<refentrytitle>baz</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</citerefentry>, <citerefentry>
|
||||||
|
<refentrytitle>foo.conf</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
</citerefentry></para>
|
||||||
|
<para>The programs are documented fully by <citetitle>The Rise and
|
||||||
|
Fall of a Fooish Bar</citetitle> available via the <citerefentry>
|
||||||
|
<refentrytitle>info</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</citerefentry> system.</para>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
@ -0,0 +1,2 @@
|
|||||||
|
?package(libsexpr):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\
|
||||||
|
title="libsexpr" command="/usr/bin/libsexpr"
|
@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# postinst script for libsexpr
|
||||||
|
#
|
||||||
|
# see: dh_installdeb(1)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# summary of how this script can be called:
|
||||||
|
# * <postinst> `configure' <most-recently-configured-version>
|
||||||
|
# * <old-postinst> `abort-upgrade' <new version>
|
||||||
|
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
||||||
|
# <new-version>
|
||||||
|
# * <postinst> `abort-remove'
|
||||||
|
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
||||||
|
# <failed-install-package> <version> `removing'
|
||||||
|
# <conflicting-package> <version>
|
||||||
|
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||||
|
# the debian-policy package
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
configure)
|
||||||
|
;;
|
||||||
|
|
||||||
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "postinst called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# dh_installdeb will replace this with shell code automatically
|
||||||
|
# generated by other debhelper scripts.
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# postrm script for libsexpr
|
||||||
|
#
|
||||||
|
# see: dh_installdeb(1)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# summary of how this script can be called:
|
||||||
|
# * <postrm> `remove'
|
||||||
|
# * <postrm> `purge'
|
||||||
|
# * <old-postrm> `upgrade' <new-version>
|
||||||
|
# * <new-postrm> `failed-upgrade' <old-version>
|
||||||
|
# * <new-postrm> `abort-install'
|
||||||
|
# * <new-postrm> `abort-install' <old-version>
|
||||||
|
# * <new-postrm> `abort-upgrade' <old-version>
|
||||||
|
# * <disappearer's-postrm> `disappear' <overwriter>
|
||||||
|
# <overwriter-version>
|
||||||
|
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||||
|
# the debian-policy package
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "postrm called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# dh_installdeb will replace this with shell code automatically
|
||||||
|
# generated by other debhelper scripts.
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# preinst script for libsexpr
|
||||||
|
#
|
||||||
|
# see: dh_installdeb(1)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# summary of how this script can be called:
|
||||||
|
# * <new-preinst> `install'
|
||||||
|
# * <new-preinst> `install' <old-version>
|
||||||
|
# * <new-preinst> `upgrade' <old-version>
|
||||||
|
# * <old-preinst> `abort-upgrade' <new-version>
|
||||||
|
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||||
|
# the debian-policy package
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
install|upgrade)
|
||||||
|
;;
|
||||||
|
|
||||||
|
abort-upgrade)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "preinst called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# dh_installdeb will replace this with shell code automatically
|
||||||
|
# generated by other debhelper scripts.
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# prerm script for libsexpr
|
||||||
|
#
|
||||||
|
# see: dh_installdeb(1)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# summary of how this script can be called:
|
||||||
|
# * <prerm> `remove'
|
||||||
|
# * <old-prerm> `upgrade' <new-version>
|
||||||
|
# * <new-prerm> `failed-upgrade' <old-version>
|
||||||
|
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
|
||||||
|
# * <deconfigured's-prerm> `deconfigure' `in-favour'
|
||||||
|
# <package-being-installed> <version> `removing'
|
||||||
|
# <conflicting-package> <version>
|
||||||
|
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||||
|
# the debian-policy package
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
remove|upgrade|deconfigure)
|
||||||
|
;;
|
||||||
|
|
||||||
|
failed-upgrade)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "prerm called with unknown argument \`$1'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# dh_installdeb will replace this with shell code automatically
|
||||||
|
# generated by other debhelper scripts.
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# -*- makefile -*-
|
||||||
|
# Sample debian/rules that uses debhelper.
|
||||||
|
# This file was originally written by Joey Hess and Craig Small.
|
||||||
|
# As a special exception, when this file is copied by dh-make into a
|
||||||
|
# dh-make output file, you may use that output file without restriction.
|
||||||
|
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@ --with autotools-dev
|
@ -0,0 +1 @@
|
|||||||
|
liblibsexpr 1.2 libsexpr (>> 1.2-0), libsexpr (<< 1.2-99)
|
@ -0,0 +1 @@
|
|||||||
|
3.0 (quilt)
|
@ -0,0 +1,23 @@
|
|||||||
|
# Example watch control file for uscan
|
||||||
|
# Rename this file to "watch" and then you can run the "uscan" command
|
||||||
|
# to check for upstream updates and more.
|
||||||
|
# See uscan(1) for format
|
||||||
|
|
||||||
|
# Compulsory line, this is a version 3 file
|
||||||
|
version=3
|
||||||
|
|
||||||
|
# Uncomment to examine a Webpage
|
||||||
|
# <Webpage URL> <string match>
|
||||||
|
#http://www.example.com/downloads.php libsexpr-(.*)\.tar\.gz
|
||||||
|
|
||||||
|
# Uncomment to examine a Webserver directory
|
||||||
|
#http://www.example.com/pub/libsexpr-(.*)\.tar\.gz
|
||||||
|
|
||||||
|
# Uncommment to examine a FTP server
|
||||||
|
#ftp://ftp.example.com/pub/libsexpr-(.*)\.tar\.gz debian uupdate
|
||||||
|
|
||||||
|
# Uncomment to find new files on sourceforge, for devscripts >= 2.9
|
||||||
|
# http://sf.net/libsexpr/libsexpr-(.*)\.tar\.gz
|
||||||
|
|
||||||
|
# Uncomment to find new files on GooglePages
|
||||||
|
# http://example.googlepages.com/foo.html libsexpr-(.*)\.tar\.gz
|
@ -0,0 +1,2 @@
|
|||||||
|
nobase_include_HEADERS = sexpr/cstring.h sexpr/faststack.h sexpr/sexp_errors.h \
|
||||||
|
sexpr/sexp.h sexpr/sexp_memory.h sexpr/sexp_ops.h sexpr/sexp_vis.h
|
@ -0,0 +1,146 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* cstring.h : c string library to make Ron happy. Wrapper around plain
|
||||||
|
* C strings that handles automatically growing the string as data is
|
||||||
|
* concattenated to the end. (note: this is an improved version of cstring
|
||||||
|
* from supermon. Migrate it into that library eventually... )
|
||||||
|
*
|
||||||
|
* -matt sottile
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
#ifndef __CSTRING_H__
|
||||||
|
#define __CSTRING_H__
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure wrapping the character pointer and size counters (allocated vs.
|
||||||
|
* actual used).
|
||||||
|
*/
|
||||||
|
typedef struct __cstring {
|
||||||
|
/**
|
||||||
|
* Base address of the string.
|
||||||
|
*/
|
||||||
|
char *base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size of the memory allocated and pointed to by the base pointer.
|
||||||
|
*/
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current size of the string stored in the buffer. len >= curlen
|
||||||
|
* always, and when len < curlen would be true after a concat operation,
|
||||||
|
* we realloc bigger space to keep len >= curlen.
|
||||||
|
*/
|
||||||
|
size_t curlen;
|
||||||
|
} CSTRING;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the growth size. Values less than one are ignored.
|
||||||
|
*/
|
||||||
|
void sgrowsize(size_t s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new CSTRING of the given size.
|
||||||
|
* A NULL return value indicates that something went wrong and that
|
||||||
|
* sexp_errno should be checked for the cause.
|
||||||
|
*/
|
||||||
|
CSTRING *snew(size_t s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concatenate the second argument to the CSTRING passed in the first.
|
||||||
|
* The second argument must be a pointer to a null terminated string.
|
||||||
|
* A NULL return value indicates that something went wrong and that
|
||||||
|
* sexp_errno should be checked for the cause. The contents of s are
|
||||||
|
* left alone. As such, the caller should check the pointer returned
|
||||||
|
* before overwriting the value of s, as this may result in a memory
|
||||||
|
* leak if an error condition occurs.
|
||||||
|
*/
|
||||||
|
CSTRING *sadd(CSTRING *s, char *a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a character to the end of the CSTRING.
|
||||||
|
* A NULL return value indicates that something went wrong and that
|
||||||
|
* sexp_errno should be checked for the cause. The contents of s are
|
||||||
|
* left alone. As such, the caller should check the pointer returned
|
||||||
|
* before overwriting the value of s, as this may result in a memory
|
||||||
|
* leak if an error condition occurs.
|
||||||
|
*/
|
||||||
|
CSTRING *saddch(CSTRING *s, char a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trim the allocated memory to precisely the string length plus one char
|
||||||
|
* to hold the null terminator
|
||||||
|
* A NULL return value indicates that something went wrong and that
|
||||||
|
* sexp_errno should be checked for the cause. The contents of s are
|
||||||
|
* left alone. As such, the caller should check the pointer returned
|
||||||
|
* before overwriting the value of s, as this may result in a memory
|
||||||
|
* leak if an error condition occurs.
|
||||||
|
*/
|
||||||
|
CSTRING *strim(CSTRING *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the base pointer of the CSTRING. NULL either means the base
|
||||||
|
* pointer was null, or the CSTRING itself was NULL.
|
||||||
|
*/
|
||||||
|
char *toCharPtr(CSTRING *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the current length to zero, effectively dumping the string without
|
||||||
|
* deallocating it so we can use it later without reallocating any memory.
|
||||||
|
*/
|
||||||
|
void sempty(CSTRING *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the CSTRING struct and the data it points at.
|
||||||
|
*/
|
||||||
|
void sdestroy(CSTRING *s);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* __CSTRING_H__ */
|
@ -0,0 +1,157 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* \file faststack.h
|
||||||
|
*
|
||||||
|
* \brief Implementation of a fast stack with smart memory management.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
#ifndef __FASTSTACK_H__
|
||||||
|
#define __FASTSTACK_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure representing a single level in the stack. Has a pointer to the
|
||||||
|
* level above and below itself and a pointer to a generic blob of data
|
||||||
|
* associated with this level.
|
||||||
|
*/
|
||||||
|
typedef struct stack_level {
|
||||||
|
/**
|
||||||
|
* Pointer to the level above this one. If NULL, then this level is the
|
||||||
|
* top of the stack. If above is non-NULL, this level *may* be the top,
|
||||||
|
* but all that can be guaranteed is that there are other allocated
|
||||||
|
* but potentially unused levels above this one.
|
||||||
|
*/
|
||||||
|
struct stack_level *above;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to the level below this one. If NULL, then this level is the
|
||||||
|
* bottom.
|
||||||
|
*/
|
||||||
|
struct stack_level *below;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to some data associated with this level. User is responsible
|
||||||
|
* for knowing what to cast the \c void \c * pointer into.
|
||||||
|
*/
|
||||||
|
void *data;
|
||||||
|
} stack_lvl_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper around the stack levels - keeps a pointer to the current top and
|
||||||
|
* bottom of the stack and a count of the current height. This allows the top
|
||||||
|
* to have non-null above pointer resulting from previously allocated stack
|
||||||
|
* levels that may be recycled later without \c malloc overhead.
|
||||||
|
*/
|
||||||
|
typedef struct stack_wrapper {
|
||||||
|
/**
|
||||||
|
* The top of the stack. If this is NULL, the stack is empty.
|
||||||
|
*/
|
||||||
|
stack_lvl_t *top;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The bottom of the stack. If this is NULL, the stack is empty.
|
||||||
|
*/
|
||||||
|
stack_lvl_t *bottom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current height of the stack, in terms of allocated and used levels.
|
||||||
|
*/
|
||||||
|
int height;
|
||||||
|
} faststack_t;
|
||||||
|
|
||||||
|
/** functions **/
|
||||||
|
|
||||||
|
/* this is for C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a pointer to an empty stack structure. If the return value is
|
||||||
|
* NULL, one should check sexp_errno to determine why.
|
||||||
|
*/
|
||||||
|
faststack_t *make_stack(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a stack structure, destroy it and free all of the stack levels.
|
||||||
|
* <B>Important note</B> : This function <I>does not</I> free the data
|
||||||
|
* pointed to from each level of the stack - the user is responsible
|
||||||
|
* for freeing this data themselves before calling this function to
|
||||||
|
* prevent memory leakage.
|
||||||
|
*/
|
||||||
|
void destroy_stack(faststack_t *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a stack, push a new level on referring to the data pointer.
|
||||||
|
* If a new level cannot be allocated, NULL is returned and sexp_errno
|
||||||
|
* is set with the appropriate error condition. Memory allocation errors
|
||||||
|
* will result in SEXP_ERR_MEMORY, while a null stack will result in
|
||||||
|
* SEXP_ERR_BAD_STACK.
|
||||||
|
*/
|
||||||
|
faststack_t *push(faststack_t *cur_stack, void *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a stack, pop a level off and return a pointer to that level.
|
||||||
|
* The user is responsible for extracting the data, but the stack_lvl_t
|
||||||
|
* structures pointed to from the level (above and below) should be left
|
||||||
|
* alone. If NULL is returned, either the stack contained nothing, or
|
||||||
|
* the incoming stack s was NULL. Consult sexp_errno to determine which
|
||||||
|
* was the case -- SEXP_ERR_BAD_STACK indicates a null stack was passed in.
|
||||||
|
*/
|
||||||
|
stack_lvl_t *pop(faststack_t *s);
|
||||||
|
|
||||||
|
/* this is for C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a stack \a s, examine the data pointer at the top.
|
||||||
|
*/
|
||||||
|
#define top_data(s) (s->top->data)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a stack \a s, check to see if the stack is empty or not. Value
|
||||||
|
* is boolean true or false.
|
||||||
|
*/
|
||||||
|
#define empty_stack(s) (s->top == NULL)
|
||||||
|
|
||||||
|
#endif /* __FASTSTACK_H__ */
|
@ -0,0 +1,771 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SEXP_H__
|
||||||
|
#define __SEXP_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h> /* for BUFSIZ only */
|
||||||
|
|
||||||
|
/* local includes */
|
||||||
|
#include <sexpr/faststack.h>
|
||||||
|
#include <sexpr/cstring.h>
|
||||||
|
#include <sexpr/sexp_memory.h>
|
||||||
|
#include <sexpr/sexp_errors.h>
|
||||||
|
/* doxygen documentation groups defined here */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup IO I/O routines
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup parser Parser routines
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \mainpage A small and quick S-expression parsing library.
|
||||||
|
*
|
||||||
|
* \section intro Introduction
|
||||||
|
*
|
||||||
|
* This library was created to provide s-expression parsing and manipulation
|
||||||
|
* facilities to C and C++ programs. The primary goals were speed and
|
||||||
|
* efficiency - low memory impact, and the highest speed we could achieve in
|
||||||
|
* parsing. Suprisingly, no other libraries on the net were found that were
|
||||||
|
* not bloated with features or involved embedding a full-fledged LISP or
|
||||||
|
* Scheme interpreter into our programs. So, this library evolved to fill
|
||||||
|
* this gap. As such, it does not guarantee that every valid LISP
|
||||||
|
* expression is parseable, and many features that are not required aren't
|
||||||
|
* implemented. See Rivest's S-expression library for an example of a much
|
||||||
|
* more featureful library.
|
||||||
|
*
|
||||||
|
* What features does this library include? At the heart of the code is a
|
||||||
|
* continuation-based parser implementing a basic parser state machine.
|
||||||
|
* Continuations allow users to accumulate multiple streams of characters,
|
||||||
|
* and parse each stream simultaneously. A continuation allows the parser
|
||||||
|
* to stop midstream, start working on a new expression, and return to the
|
||||||
|
* first without corruption of complex state management in the users code.
|
||||||
|
* No threads, no forking, nothing more than a data structure that must be
|
||||||
|
* passed in and captured as data becomes available to parse. Once an
|
||||||
|
* expression has been parsed, a simple structure is returned that
|
||||||
|
* represents the "abstract syntax tree" of the parsed expression. For the
|
||||||
|
* majority of users, the parser and this data structure will be all that
|
||||||
|
* they will ever need to see. For convenience reasons, other functions
|
||||||
|
* such as I/O wrappers and AST traversal routines have been included, but
|
||||||
|
* they are not required if users don't wish to use them.
|
||||||
|
*
|
||||||
|
* \section credits Credits
|
||||||
|
*
|
||||||
|
* SFSEXP: Small, Fast S-Expression Library version 1.2, October 2007 \n
|
||||||
|
* Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
*
|
||||||
|
* \section license License Information
|
||||||
|
*
|
||||||
|
* Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
* material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
* Alamos National Laboratory, which is operated by the University of
|
||||||
|
* California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
* to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
* THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
* LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
* derivative works, such modified software should be clearly marked, so as not
|
||||||
|
* to confuse it with the version available from LANL.
|
||||||
|
*
|
||||||
|
* Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
*
|
||||||
|
* LA-CC-04-094
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file sexp.h
|
||||||
|
*
|
||||||
|
* \brief API for a small, fast and portable s-expression parser library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*==============*/
|
||||||
|
/* ENUMERATIONS */
|
||||||
|
/*==============*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An element in an s-expression can be one of three types: a <i>value</i>
|
||||||
|
* represents an atom with an associated text value. A <i>list</i>
|
||||||
|
* represents an s-expression, and the element contains a pointer to
|
||||||
|
* the head element of the associated s-expression.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/**
|
||||||
|
* An atom of some type. See atom type (aty) field of element structure
|
||||||
|
* for details as to which atom type this is.
|
||||||
|
*/
|
||||||
|
SEXP_VALUE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list. This means the element points to an element representing the
|
||||||
|
* head of a list.
|
||||||
|
*/
|
||||||
|
SEXP_LIST
|
||||||
|
} elt_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For an element that represents a value, the value can be interpreted
|
||||||
|
* as a more specific type. A <i>basic</i> value is a simple string with
|
||||||
|
* no whitespace (and therefore no quotes required). A <i>double quote</i>
|
||||||
|
* value, or <i>dquote</i>, is one that contains characters (such as
|
||||||
|
* whitespace) that requires quotation marks to contain the string. A
|
||||||
|
* <i>single quote</i> value, or <i>squote</i>, represents an element that is
|
||||||
|
* prefaced with a single tick-mark. This can be either an atom or
|
||||||
|
* s-expression, and the result is that the parser does not attempt to parse
|
||||||
|
* the element following the tick mark. It is simply stored as text. This
|
||||||
|
* is similar to the meaning of a tick mark in the Scheme or LISP family
|
||||||
|
* of programming languages. Finally, <i>binary</I> allows raw binary to
|
||||||
|
* be stored within an atom. Note that if the binary type is used, the data
|
||||||
|
* is stored in bindata with the length in binlength. Otherwise, the data
|
||||||
|
* us stored in the val field with val_used and val_allocated tracking the
|
||||||
|
* size of the value string and the total memory allocated for it.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/**
|
||||||
|
* Basic, unquoted value.
|
||||||
|
*/
|
||||||
|
SEXP_BASIC,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Single quote (tick-mark) value - contains a string representing
|
||||||
|
* a non-parsed portion of the s-expression.
|
||||||
|
*/
|
||||||
|
SEXP_SQUOTE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Double-quoted string. Similar to a basic value, but potentially
|
||||||
|
* containing white-space.
|
||||||
|
*/
|
||||||
|
SEXP_DQUOTE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binary data. This is used when the specialized parser is active
|
||||||
|
* and supports inlining of binary blobs of data inside an expression.
|
||||||
|
*/
|
||||||
|
SEXP_BINARY
|
||||||
|
} atom_t;
|
||||||
|
|
||||||
|
/*============*/
|
||||||
|
/* STRUCTURES */
|
||||||
|
/*============*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An s-expression is represented as a linked structure of elements,
|
||||||
|
* where each element is either an <I>atom</I> or <I>list</I>. An
|
||||||
|
* atom corresponds to a string, while a list corresponds to an
|
||||||
|
* s-expression. The following grammar represents our definition of
|
||||||
|
* an s-expression:<P>
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* sexpr ::= ( sx )
|
||||||
|
* sx ::= atom sxtail | sexpr sxtail | 'sexpr sxtail | 'atom sxtail | NULL
|
||||||
|
* sxtail ::= sx | NULL
|
||||||
|
* atom ::= quoted | value
|
||||||
|
* quoted ::= "ws_string"
|
||||||
|
* value ::= nws_string
|
||||||
|
* </pre>
|
||||||
|
* <P>
|
||||||
|
*
|
||||||
|
* An atom can either be a quoted string, which is a string containing
|
||||||
|
* whitespace (possibly) surrounded by double quotes, or a non-whitespace
|
||||||
|
* string that does not require surrounding quotes. An element representing
|
||||||
|
* an atom will have a type of <i>value</i> and data stored in the <i>val</i>
|
||||||
|
* field. An element of type <i>list</i> represents an s-expression
|
||||||
|
* corresponding to <i>sexpr</i> in the grammar, and will have a pointer to
|
||||||
|
* the head of the appropriate s-expression. Details regarding these fields
|
||||||
|
* and their values given with the fields themselves. Notice that a single
|
||||||
|
* quote can appear directly before an s-expression or atom, similar to the
|
||||||
|
* use in LISP.
|
||||||
|
*/
|
||||||
|
typedef struct elt {
|
||||||
|
/**
|
||||||
|
* The element has a type that determines how the structure is used.
|
||||||
|
* If the type is <B>SEXP_VALUE</B>, then a programmer knows that
|
||||||
|
* either the val field or bindata field is meaningful dependin on
|
||||||
|
* the value of the aty field, and contains the data associated with
|
||||||
|
* this element of the s-expression. If the type is
|
||||||
|
* <B>SEXP_LIST</B>, then the list field contains a pointer to the
|
||||||
|
* s-expression element representing the head of the list. For each
|
||||||
|
* case, the field for the opposite case contains no meaningful data
|
||||||
|
* and using them in any way is likely to cause an error.
|
||||||
|
*/
|
||||||
|
elt_t ty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the type of the element is <B>SEXP_VALUE</B> and the aty field
|
||||||
|
* is not <B>SEXP_BINARY</B>, this field will contain the actual data
|
||||||
|
* represented by this element.
|
||||||
|
*/
|
||||||
|
char *val;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of bytes allocated for val.
|
||||||
|
*/
|
||||||
|
size_t val_allocated;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of bytes used in val (<= val_allocated).
|
||||||
|
*/
|
||||||
|
size_t val_used;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the type of the element is <B>SEXP_LIST</B>, this field will contain
|
||||||
|
* a pointer to the head element of the list.
|
||||||
|
*/
|
||||||
|
struct elt *list;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <I>next</I> field is a pointer to the next element in the current
|
||||||
|
* expression. If this element is the last element in the s-expression,
|
||||||
|
* this field will be <I>NULL</I>.
|
||||||
|
*/
|
||||||
|
struct elt *next;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For elements that represent <I>values</I>, this field will specify the
|
||||||
|
* specific type of value that it represents. This can be used by
|
||||||
|
* functions to determine how this value should be printed (ie: how it
|
||||||
|
* should be quoted) or interpreted (ie: interpreting s-expressions that
|
||||||
|
* are prefixed with a tick-mark.). This value also indicates whether or
|
||||||
|
* not the programmer should look in the val field or bindata field for
|
||||||
|
* the atom data.
|
||||||
|
*/
|
||||||
|
atom_t aty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For elements that represent <i>binary</I> blobs, this field will
|
||||||
|
* point to a memory location where the data resides. The length
|
||||||
|
* of this memory blob is the next field. char* implies byte sized
|
||||||
|
* elements. This is only used in INLINE_BINARY parser mode.
|
||||||
|
* <B>IMPORTANT NOTE</B>: The data in this field is freed on a
|
||||||
|
* destroy_sexp() call, so users should copy it to memory they allocate
|
||||||
|
* if they wish it to persist after the sexp_t has been freed.
|
||||||
|
*/
|
||||||
|
char *bindata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The length of the data pointed at by bindata in bytes.
|
||||||
|
*/
|
||||||
|
size_t binlength;
|
||||||
|
} sexp_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parser mode flag used by continuation to toggle special parser
|
||||||
|
* behaviour.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/**
|
||||||
|
* normal (LISP-style) s-expression parser behaviour.
|
||||||
|
*/
|
||||||
|
PARSER_NORMAL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* treat atoms beginning with \#b\# as inlined binary data. everything
|
||||||
|
* else is treated the same as in PARSER_NORMAL mode.
|
||||||
|
*/
|
||||||
|
PARSER_INLINE_BINARY,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if the event_handlers field in the continuation contains a non-null
|
||||||
|
* value, the handlers specified in the parser_event_handlers_t struct
|
||||||
|
* will be called as appropriate, but the parser will not allocate a
|
||||||
|
* structure composed of sexp_t structs. Note that if the event_handlers
|
||||||
|
* is set to null and this mode is selected, the user would be better off
|
||||||
|
* not calling anything in the first place, as they are telling the parser
|
||||||
|
* to walk the string, but do nothing productive in the process.
|
||||||
|
*/
|
||||||
|
PARSER_EVENTS_ONLY
|
||||||
|
} parsermode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some users would prefer to, instead of parsing a full string and walking
|
||||||
|
* a potentially huge sexp_t structure, use an XML SAX-style parser where
|
||||||
|
* events are triggered as certain parts of the s-expression are encountered.
|
||||||
|
* This structure contains a set of function pointers that are called by
|
||||||
|
* the parser as it hits expression start and end, and completes reading
|
||||||
|
* atoms and binary data. NOTE: The parser_event_handler struct that is
|
||||||
|
* a field in the continuation data structure is NOT freed by
|
||||||
|
* destroy_continuation since structs for callbacks are ALWAYS malloc'd
|
||||||
|
* by the user, not the library.
|
||||||
|
*/
|
||||||
|
typedef struct parser_event_handlers {
|
||||||
|
/**
|
||||||
|
* The start_sexpr function pointer is called when an open parenthesis
|
||||||
|
* is encountered starting an expression.
|
||||||
|
*/
|
||||||
|
void (* start_sexpr)(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The end_sexpr function pointer is called when an close parenthesis
|
||||||
|
* is encountered ending an expression.
|
||||||
|
*/
|
||||||
|
void (* end_sexpr)(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The characters function pointer is called when an atom is completely
|
||||||
|
* parsed. The function must take three arguments: a pointer to the
|
||||||
|
* atom data, the number of elements the atom contains, and the
|
||||||
|
* specific type of atom that the data represents.
|
||||||
|
*/
|
||||||
|
void (* characters)(const char *data, size_t len, atom_t aty);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The binary function pointer is called when the parser is functioning
|
||||||
|
* in INLINE_BINARY mode and binary data is encountered. The function
|
||||||
|
* must take two arguments: a pointer to the beginning of the binary data
|
||||||
|
* and the number of bytes of data present.
|
||||||
|
*/
|
||||||
|
void (* binary)(const char *data, size_t len);
|
||||||
|
} parser_event_handlers_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A continuation is used by the parser to save and restore state between
|
||||||
|
* invocations to support partial parsing of strings. For example, if we
|
||||||
|
* pass the string "(foo bar)(goo car)" to the parser, we want to be able
|
||||||
|
* to retrieve each s-expression one at a time - it would be difficult to
|
||||||
|
* return all s-expressions at once without knowing how many there are in
|
||||||
|
* advance (this would require more memory management than we want...).
|
||||||
|
* So, by using a continuation-based parser, we can call it with this string
|
||||||
|
* and have it return a continuation when it has parsed the first
|
||||||
|
* s-expression. Once we have processed the s-expression (accessible
|
||||||
|
* through the <i>last_sexpr</i> field of the continuation), we can call
|
||||||
|
* the parser again with the same string and continuation, and it will be
|
||||||
|
* able to pick up where it left off.<P>
|
||||||
|
*
|
||||||
|
* We use continuations instead of a state-ful parser to allow multiple
|
||||||
|
* concurrent strings to be parsed by simply maintaining a set of
|
||||||
|
* continuations. Manipulating continuations by hand is required if the
|
||||||
|
* continuation-based parser is called directly. This is <b>not
|
||||||
|
* recommended</b> unless you are willing to deal with potential errors and
|
||||||
|
* are willing to learn exactly how the continuation relates to the
|
||||||
|
* internals of the parser. A simpler approach is to use either the
|
||||||
|
* <i>parse_sexp</i> function that simply returns an s-expression without
|
||||||
|
* exposing the continuations, or the <i>iparse_sexp</i> function that
|
||||||
|
* allows iteratively popping one s-expression at a time from a string
|
||||||
|
* containing one or more s-expressions. Refer to the documentation for
|
||||||
|
* each parsing function for further details on behavior and usage.
|
||||||
|
*/
|
||||||
|
typedef struct pcont {
|
||||||
|
/**
|
||||||
|
* The parser stack used for iterative parsing.
|
||||||
|
*/
|
||||||
|
faststack_t *stack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The last full s-expression encountered by the parser. If this is
|
||||||
|
* NULL, the parser has not encountered a full s-expression and more
|
||||||
|
* data is required for the current s-expression being parsed. If this
|
||||||
|
* is non-NULL, then the parser has encountered one s-expression and may
|
||||||
|
* be partially through parsing the next s-expression.
|
||||||
|
*/
|
||||||
|
sexp_t *last_sexp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to a temporary buffer used to store atom values during parsing.
|
||||||
|
*/
|
||||||
|
char *val;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current number of bytes allocated for val.
|
||||||
|
*/
|
||||||
|
size_t val_allocated;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current number of used bytes in val.
|
||||||
|
*/
|
||||||
|
size_t val_used;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to the character following the last character in the current
|
||||||
|
* atom value being parsed.
|
||||||
|
*/
|
||||||
|
char *vcur;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to the last character to examine in the string being parsed.
|
||||||
|
* When the parser is called with the continuation, this is the first
|
||||||
|
* character that will be processed. If this is NULL, the parser will
|
||||||
|
* start parsing at the beginning of the string passed into the parser.
|
||||||
|
*/
|
||||||
|
char *lastPos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a pointer to the beginning of the current string being
|
||||||
|
* processed. lastPos is a pointer to some value inside the string
|
||||||
|
* that this points to.
|
||||||
|
*/
|
||||||
|
char *sbuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the depth of parenthesis (the number of left parens encountered)
|
||||||
|
* that the parser is currently working with.
|
||||||
|
*/
|
||||||
|
unsigned int depth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the depth of parenthesis encountered after a single quote (tick)
|
||||||
|
* if the character immediately following the tick was a left paren.
|
||||||
|
*/
|
||||||
|
unsigned int qdepth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the state ID of the current state of the parser in the
|
||||||
|
* DFA representing the parser. The current parser is a DFA based parser
|
||||||
|
* to simplify restoring the proper state from a continuation.
|
||||||
|
*/
|
||||||
|
unsigned int state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a flag indicating whether the next character to be processed
|
||||||
|
* should be assumed to have been prefaced with a '\' character to escape
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
unsigned int esc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag whether or not we are processing an atom that was preceeded by
|
||||||
|
* a single quote.
|
||||||
|
*/
|
||||||
|
unsigned int squoted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error code. Used to indicate that the continuation being returned does
|
||||||
|
* not represent a successful parsing and thus the contents aren't of much
|
||||||
|
* value.
|
||||||
|
*/
|
||||||
|
sexp_errcode_t error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode. The parsers' specialized behaviours can be activated by
|
||||||
|
* tweaking the mode setting. There are currently two available:
|
||||||
|
* normal and inline_binary. Inline_binary treats atoms that start
|
||||||
|
* with \#b\# specially, assuming that they have the structure:
|
||||||
|
*
|
||||||
|
* \#b\#s\#data
|
||||||
|
*
|
||||||
|
* Where s is a positive (greater than 0) integer representing the length
|
||||||
|
* of the data, and data is s bytes of binary data following the \#
|
||||||
|
* sign. After the s bytes, it is assumed normal s-expression data
|
||||||
|
* continues.
|
||||||
|
*/
|
||||||
|
parsermode_t mode;
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------
|
||||||
|
* These fields below are related to dealing with INLINE_BINARY mode
|
||||||
|
* ----------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Length to expect of the current binary data being read in.
|
||||||
|
* this also corresponds to the size of the memory allocated for
|
||||||
|
* reading this binary data into.
|
||||||
|
*/
|
||||||
|
size_t binexpected;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of bytes of the binary blob that have already been read in.
|
||||||
|
*/
|
||||||
|
size_t binread;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to the memory containing the binary data being read in.
|
||||||
|
*/
|
||||||
|
char *bindata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to a structure holding handlers for sexpr events. NULL for
|
||||||
|
* normal parser operation. This field is NOT freed by
|
||||||
|
* destroy_continuation and must be free'd by the user. This is because
|
||||||
|
* these are malloc'd outside the library ALWAYS, so they are the user's
|
||||||
|
* responsibility.
|
||||||
|
*/
|
||||||
|
parser_event_handlers_t *event_handlers;
|
||||||
|
} pcont_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup IO
|
||||||
|
* This structure is a wrapper around a standard I/O file descriptor and
|
||||||
|
* the parsing infrastructure (continuation and a buffer) required to
|
||||||
|
* parse off of it. This is used so that routines can hide the loops and
|
||||||
|
* details required to accumulate up data read off of the file descriptor
|
||||||
|
* and parse expressions individually out of it.
|
||||||
|
*/
|
||||||
|
typedef struct sexp_iowrap {
|
||||||
|
/**
|
||||||
|
* Continuation used to parse off of the file descriptor.
|
||||||
|
*/
|
||||||
|
pcont_t *cc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The file descriptor. Currently CANNOT be a socket since implementation
|
||||||
|
* uses read(), not recv().
|
||||||
|
*/
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buffer to read data into before parsing.
|
||||||
|
*/
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte count for last read. If it is -1, there was an error. Otherwise,
|
||||||
|
* it will be a value from 0 to BUFSIZ.
|
||||||
|
*/
|
||||||
|
int cnt;
|
||||||
|
} sexp_iowrap_t;
|
||||||
|
|
||||||
|
/*========*/
|
||||||
|
/* GLOBAL */
|
||||||
|
/*========*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global value indicating the most recent error condition encountered.
|
||||||
|
* This value can be reset to SEXP_ERR_OK by calling sexp_errno_reset().
|
||||||
|
*/
|
||||||
|
extern sexp_errcode_t sexp_errno;
|
||||||
|
|
||||||
|
/*===========*/
|
||||||
|
/* FUNCTIONS */
|
||||||
|
/*===========*/
|
||||||
|
|
||||||
|
/* this is for C++ users */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* \ingroup parser
|
||||||
|
* Set the parameters on atom value buffer allocation and growth sizes.
|
||||||
|
* This is an important point for performance tuning, as many factors in
|
||||||
|
* the expected expression structure must be taken into account such as:
|
||||||
|
*
|
||||||
|
* - Average size of atom values
|
||||||
|
* - Variance in sizes of atom values
|
||||||
|
* - Amount of memory that is tolerably ''wasted'' (allocated but not
|
||||||
|
* used)
|
||||||
|
*
|
||||||
|
* The \a ss parameter specifies the initial size of all atom buffers.
|
||||||
|
* Ideally, this should be sufficiently large to capture MOST atom values,
|
||||||
|
* or at least close enough such that one growth is required. The
|
||||||
|
* \a gs parameter specifies the number of bytes to increase the buffer size
|
||||||
|
* by when space is exhausted. A safe choice for parameter sizes would
|
||||||
|
* be on the order of the average size for \a ss, and one standard
|
||||||
|
* deviation for \a gs. This ensures that 50% of all expressions are
|
||||||
|
* guaranteed to fit in the initial buffer, and rougly 80-90% will fit in
|
||||||
|
* one growth. If memory is not an issue, choosing ss to be the mean plus
|
||||||
|
* one standard deviation will capture 80-90% of expressions in the initial
|
||||||
|
* buffer, and a gs of one standard deviation will capture nearly all
|
||||||
|
* expressions.
|
||||||
|
*
|
||||||
|
* Note: These parameters can be tuned at runtime as needs change, and they
|
||||||
|
* will be applied to all expressions and expression elements parsed after
|
||||||
|
* they are modified. They will not be applied retroactively to expressions
|
||||||
|
* that have already been parsed.
|
||||||
|
*/
|
||||||
|
sexp_errcode_t set_parser_buffer_params(size_t ss, size_t gs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return an allocated sexp_t. This structure may be an already allocated
|
||||||
|
* one from the stack or a new one if none are available. Use this instead
|
||||||
|
* of manually mallocing if you want to avoid excessive mallocs. <I>Note:
|
||||||
|
* Mallocing your own expressions is fine - you can even use
|
||||||
|
* sexp_t_deallocate to deallocate them and put them in the pool.</I>
|
||||||
|
* Also, if the stack has not been initialized yet, this does so.
|
||||||
|
*/
|
||||||
|
sexp_t *sexp_t_allocate(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* given a malloc'd sexp_t element, put it back into the already-allocated
|
||||||
|
* element stack. This method will allocate a stack if one has not been
|
||||||
|
* allocated already.
|
||||||
|
*/
|
||||||
|
void sexp_t_deallocate(sexp_t *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In the event that someone wants us to release ALL of the memory used
|
||||||
|
* between calls by the library, they can free it. If you don't call
|
||||||
|
* this, the caches will be persistent for the lifetime of the library
|
||||||
|
* user. Note that in the event of an error condition resulting in
|
||||||
|
* sexp_errno being set, the user might consider calling this to clean up
|
||||||
|
* any memory that may be lingering around that should be cleaned up.
|
||||||
|
*/
|
||||||
|
void sexp_cleanup(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* print a sexp_t struct as a string in the LISP style. If the buffer
|
||||||
|
* is large enough and the conversion is successful, the return value
|
||||||
|
* represents the length of the string contained in the buffer. If the
|
||||||
|
* buffer was too small, or some other error occurred, the return
|
||||||
|
* value is -1 and the contents of the buffer should not be assumed to
|
||||||
|
* contain any useful information. When the return value is -1, the
|
||||||
|
* caller should check the contents of sexp_errno for details on what
|
||||||
|
* error may have occurred.
|
||||||
|
*/
|
||||||
|
int print_sexp(char *loc, size_t size, const sexp_t *e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* print a sexp_t structure to a buffer, growing it as necessary instead
|
||||||
|
* of relying on fixed size buffers like print_sexp. Important argument
|
||||||
|
* to tune for performance reasons is <tt>ss</tt> - the
|
||||||
|
* buffer start size. The growsize used by the CSTRING routines also should
|
||||||
|
* be considered for tuning via the sgrowsize() function. This routine no
|
||||||
|
* longer requires the user to specify the growsize, and uses the current
|
||||||
|
* setting without changing it.
|
||||||
|
*/
|
||||||
|
int print_sexp_cstr(CSTRING **s, const sexp_t *e, size_t ss);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new sexp_t element representing a list.
|
||||||
|
*/
|
||||||
|
sexp_t *new_sexp_list(sexp_t *l);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new sexp_t element representing a value. The user must
|
||||||
|
* specify the precise type of the atom. This used to default to
|
||||||
|
* SEXP_BASIC, but this can lead to errors if the user did not expect this
|
||||||
|
* assumption. By explicitly passing in the atom type, the caller should
|
||||||
|
* ensure that the data in the buffer is valid given the requested atom
|
||||||
|
* type. For performance reasons, such checks are left to the caller if
|
||||||
|
* they are desired, and not performed in the library if they are not
|
||||||
|
* wanted.
|
||||||
|
*/
|
||||||
|
sexp_t *new_sexp_atom(const char *buf, size_t bs, atom_t aty);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create an initial continuation for parsing the given string
|
||||||
|
*/
|
||||||
|
pcont_t *init_continuation(char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* destroy a continuation. This involves cleaning up what it contains,
|
||||||
|
* and cleaning up the continuation itself.
|
||||||
|
*/
|
||||||
|
void destroy_continuation (pcont_t * pc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup IO
|
||||||
|
* create an IO wrapper structure around a file descriptor. A NULL return
|
||||||
|
* value indicates some problem occurred allocating the wrapper, so the
|
||||||
|
* user should check the value of sexp_errno for further information.
|
||||||
|
*/
|
||||||
|
sexp_iowrap_t *init_iowrap(int fd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup IO
|
||||||
|
* destroy an IO wrapper structure. The file descriptor wrapped in the
|
||||||
|
* wrapper will <B>not</B> be closed, so the caller is responsible
|
||||||
|
* for manually calling close on the file descriptor.
|
||||||
|
*/
|
||||||
|
void destroy_iowrap(sexp_iowrap_t *iow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup IO
|
||||||
|
* given and IO wrapper handle, read one s-expression
|
||||||
|
* off of it. this expression may be contained in a continuation,
|
||||||
|
* so there is no guarantee that under the covers an IO read
|
||||||
|
* actually is occuring. A return value of NULL can either indicate
|
||||||
|
* a parser error or no more data on the input IO handle. In the
|
||||||
|
* event that NULL is returned, the user should check to see if
|
||||||
|
* sexp_errno contains SEXP_ERR_IO_EMPTY (no more data) or a more
|
||||||
|
* problematic error.
|
||||||
|
*/
|
||||||
|
sexp_t *read_one_sexp(sexp_iowrap_t *iow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup parser
|
||||||
|
* wrapper around parser for compatibility.
|
||||||
|
*/
|
||||||
|
sexp_t *parse_sexp(char *s, size_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup parser
|
||||||
|
* wrapper around parser for friendlier continuation use
|
||||||
|
* pre-condition : continuation (cc) is NON-NULL!
|
||||||
|
*/
|
||||||
|
sexp_t *iparse_sexp(char *s, size_t len, pcont_t *cc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup parser
|
||||||
|
* given a LISP style s-expression string, parse it into a set of
|
||||||
|
* connected sexp_t structures.
|
||||||
|
*/
|
||||||
|
pcont_t *cparse_sexp(char *s, size_t len, pcont_t *pc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* given a sexp_t structure, free the memory it uses (and recursively free
|
||||||
|
* the memory used by all sexp_t structures that it references). Note
|
||||||
|
* that this will call the deallocation routine for sexp_t elements.
|
||||||
|
* This means that memory isn't freed, but stored away in a cache of
|
||||||
|
* pre-allocated elements. This is an optimization to speed up the
|
||||||
|
* parser to eliminate wasteful free and re-malloc calls. Note: If using
|
||||||
|
* inlined binary mode, this will free the data pointed to by the bindata
|
||||||
|
* field. So, if you care about the data after the lifetime of the
|
||||||
|
* s-expression, make sure to make a copy before cleaning up the sexpr.
|
||||||
|
*/
|
||||||
|
void destroy_sexp(sexp_t *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset the value of sexp_errno to SEXP_ERR_OK.
|
||||||
|
*/
|
||||||
|
void reset_sexp_errno(void);
|
||||||
|
|
||||||
|
/* this is for C++ users */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "sexp_ops.h"
|
||||||
|
|
||||||
|
#endif /* __SEXP_H__ */
|
||||||
|
|
@ -0,0 +1,139 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SEXP_ERRORS_H__
|
||||||
|
#define __SEXP_ERRORS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file sexp_errors.h
|
||||||
|
*
|
||||||
|
* \brief Error conditions are enumerated here along with any routines for
|
||||||
|
* translating error codes to human readable messages.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error codes used by the library are defined in this enumeration. They
|
||||||
|
* are either used as values for the error field within the continuation
|
||||||
|
* structures, or as return values for functions with a return type of
|
||||||
|
* sexp_errcode_t.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/**
|
||||||
|
* no error.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_OK = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* memory error. malloc/realloc/calloc failures may result in this error
|
||||||
|
* code. this can either result from the system calls failing, or in the
|
||||||
|
* limited memory mode of the library, the memory limit being exceeded.
|
||||||
|
* In limited memory mode, if this error condition is present, one should
|
||||||
|
* check the memory limits that were in place during the erroneous call.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_MEMORY,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* badly formed expression. Missing, misplaced, or mismatched parenthesis
|
||||||
|
* will result in this error.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_BADFORM,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a sexp_t that is inconsistent will result in this error code. An example
|
||||||
|
* is a SEXP_BASIC sexp_t with a null val field but a non-zero val_used
|
||||||
|
* value. Similar cases exist for SEXP_DQUOTE, SQUOTE, and BINARY types.
|
||||||
|
* This value is also used in the parser to flag a case where an inlined
|
||||||
|
* binary block is given a negative length.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_BADCONTENT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if a null string is passed into the parser, this error occurs.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_NULLSTRING,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* general IO related errors, such as failure of fopen(). these are
|
||||||
|
* basically non-starters with respect to getting the IO routines going.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_IO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* I/O routines that return NULL may simply have nothing to read. This is
|
||||||
|
* sometimes an error condition if the io wrapper continuation contains a
|
||||||
|
* partially complete s-expression, but nothing more is present (yet) on the
|
||||||
|
* file descriptor.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_IO_EMPTY,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* when running the library under limited memory (ie, _SEXP_LIMIT_MEMORY_
|
||||||
|
* defined at build time), this error will be produced when the memory
|
||||||
|
* limit is exceeded.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_MEM_LIMIT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* buffer for unparsing is full.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_BUFFER_FULL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* routines that take parameters such as memory limits, growth sizes, or
|
||||||
|
* default sizes, can produce this error if a bad value has been passed in.
|
||||||
|
* this error usually will indicate that the parameters were bad and the
|
||||||
|
* default values were used instead (ie, it is non-fatal.).
|
||||||
|
*/
|
||||||
|
SEXP_ERR_BAD_PARAM,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bad stack state encountered.
|
||||||
|
*/
|
||||||
|
SEXP_ERR_BAD_STACK,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unknown parser state
|
||||||
|
*/
|
||||||
|
SEXP_ERR_UNKNOWN_STATE
|
||||||
|
|
||||||
|
} sexp_errcode_t;
|
||||||
|
|
||||||
|
#endif /* __SEXP_ERRORS_H__ */
|
@ -0,0 +1,165 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SEXP_MEMORY_H__
|
||||||
|
#define __SEXP_MEMORY_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file sexp_memory.h
|
||||||
|
*
|
||||||
|
* \brief Wrappers around basic memory allocation/deallocation routines to
|
||||||
|
* allow memory usage limiting. Only enabled if _SEXP_LIMIT_MEMORY_
|
||||||
|
* is defined when building the library, otherwise the routines
|
||||||
|
* are defined to be the standard malloc/calloc/realloc/free
|
||||||
|
* functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _SEXP_LIMIT_MEMORY_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup memory Memory management routines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Wrapper around malloc, will check and increment memory usage
|
||||||
|
* counters if space is available. Returns NULL if no memory left
|
||||||
|
* to use, otherwise returns whatever malloc returns.
|
||||||
|
* Due to the fact that NULL could mean either the memory limit was exceeded
|
||||||
|
* or the system call returned NULL, the user must check sexp_errno to
|
||||||
|
* determine the root cause.
|
||||||
|
*/
|
||||||
|
void *sexp_malloc(size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Wrapper around calloc, will check and increment memory usage
|
||||||
|
* counters if space is available. Returns NULL if no memory left
|
||||||
|
* to use, otherwise returns whatever calloc returns
|
||||||
|
* Due to the fact that NULL could mean either the memory limit was exceeded
|
||||||
|
* or the system call returned NULL, the user must check sexp_errno to
|
||||||
|
* determine the root cause.
|
||||||
|
*/
|
||||||
|
void *sexp_calloc(size_t count, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Wrapper around free. Instead of trusting sizeof(ptr) to return the
|
||||||
|
* proper value, we explicitly pass the size of memory associated with
|
||||||
|
* ptr. Decrements memory usage counter and frees ptr.
|
||||||
|
*/
|
||||||
|
void sexp_free(void *ptr, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Wrapper around realloc. Instead of trusting sizeof(ptr) to return the
|
||||||
|
* proper value, we explicitly pass the size of memory associated with
|
||||||
|
* ptr as the oldsize. Increments the memory usage counter by
|
||||||
|
* (size-oldsize) if enough space available for realloc.
|
||||||
|
* Returns NULL if no memory left to use, otherwise returns whatever
|
||||||
|
* realloc returns.
|
||||||
|
* Due to the fact that NULL could mean either the memory limit was exceeded
|
||||||
|
* or the system call returned NULL, the user must check sexp_errno to
|
||||||
|
* determine the root cause.
|
||||||
|
*/
|
||||||
|
void *sexp_realloc(void *ptr, size_t size, size_t oldsize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Return the memory limit imposed by the library if memory limiting was
|
||||||
|
* enabled at compile time.
|
||||||
|
*/
|
||||||
|
size_t get_sexp_max_memory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Return the amount of memory used.
|
||||||
|
*/
|
||||||
|
size_t get_sexp_used_memory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* Set the memory limit if memory limiting was enabled. If the new value
|
||||||
|
* is zero or less, -1 is returned and sexp_errno is set. Similarly, if
|
||||||
|
* the new value is less than the current amount used by the library,
|
||||||
|
* -1 is returned and sexp_errno is set. If the new value is valid, the
|
||||||
|
* new value is returned.
|
||||||
|
*/
|
||||||
|
int set_sexp_max_memory(size_t newsize);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* _SEXP_LIMIT_MEMORY_ not defined. This is a macro that maps to calloc().
|
||||||
|
*/
|
||||||
|
#define sexp_calloc(count,size) calloc(count,size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* _SEXP_LIMIT_MEMORY_ not defined. This is a macro that maps to malloc().
|
||||||
|
*/
|
||||||
|
#define sexp_malloc(size) malloc(size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* _SEXP_LIMIT_MEMORY_ not defined. This is a macro that maps to free().
|
||||||
|
*/
|
||||||
|
#define sexp_free(ptr,size) free(ptr)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup memory
|
||||||
|
* _SEXP_LIMIT_MEMORY_ not defined. This is a macro that maps to realloc().
|
||||||
|
*/
|
||||||
|
#define sexp_realloc(ptr,size,oldsize) realloc((ptr),(size))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __SEXP_MEMORY_H__ */
|
@ -0,0 +1,138 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SEXP_OPS_H__
|
||||||
|
#define __SEXP_OPS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file sexp_ops.h
|
||||||
|
*
|
||||||
|
* \brief A collection of useful operations to perform on s-expressions.
|
||||||
|
*
|
||||||
|
* A set of routines for operating on s-expressions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*========*/
|
||||||
|
/* MACROS */
|
||||||
|
/*========*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the head of a list \a s by reference, not copy.
|
||||||
|
*/
|
||||||
|
#define hd_sexp(s) ((s)->list)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the tail of a list \a s by reference, not copy.
|
||||||
|
*/
|
||||||
|
#define tl_sexp(s) ((s)->list->next)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the element following the argument \a s.
|
||||||
|
*/
|
||||||
|
#define next_sexp(s) ((s)->next)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the continuation \a c by setting the \c lastPos pointer to
|
||||||
|
* \c NULL.
|
||||||
|
*/
|
||||||
|
#define reset_pcont(c) ((c)->lastPos = NULL)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an atom in a sexpression data structure and return a pointer to
|
||||||
|
* it. Return NULL if the string doesn't occur anywhere as an atom.
|
||||||
|
* This is a depth-first search algorithm.
|
||||||
|
*
|
||||||
|
* \param name Value to search for.
|
||||||
|
* \param start Root element of the s-expression to search from.
|
||||||
|
* \return If the value is found, return a pointer to the first
|
||||||
|
* occurrence in a depth-first traversal. NULL if not found.
|
||||||
|
*/
|
||||||
|
sexp_t *find_sexp(const char *name, sexp_t *start);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Breadth first search for s-expressions. Depth first search will find
|
||||||
|
* the first occurance of a string in an s-expression by basically finding
|
||||||
|
* the earliest occurance in the string representation of the expression
|
||||||
|
* itself. Breadth first search will find the first occurance of a string
|
||||||
|
* in relation to the structure of the expression itself (IE: the instance
|
||||||
|
* with the lowest depth will be found).
|
||||||
|
*
|
||||||
|
* \param name Value to search for.
|
||||||
|
* \param start Root element of the s-expression to search from.
|
||||||
|
* \return If the value is found, return a pointer to the first
|
||||||
|
* occurrence in a breadth-first traversal. NULL if not found.
|
||||||
|
*/
|
||||||
|
sexp_t *bfs_find_sexp(const char *name, sexp_t *start);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an s-expression, determine the length of the list that it encodes.
|
||||||
|
* A null expression has length 0. An atom has length 1. A list has
|
||||||
|
* length equal to the number of sexp_t elements from the list head
|
||||||
|
* to the end of the ->next linked list from that point.
|
||||||
|
*
|
||||||
|
* \param sx S-expression input.
|
||||||
|
* \return Number of sexp_t elements at the same level as sx, 0 for
|
||||||
|
* NULL, 1 for an atom.
|
||||||
|
*/
|
||||||
|
int sexp_list_length(const sexp_t *sx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy an s-expression. This is a deep copy - so the resulting s-expression
|
||||||
|
* shares no pointers with the original. The new one can be changed without
|
||||||
|
* damaging the contents of the original.
|
||||||
|
*
|
||||||
|
* \param sx S-expression to copy.
|
||||||
|
* \return A pointer to a copy of sx. This is a deep copy, so no memory
|
||||||
|
* is shared between the original and the returned copy.
|
||||||
|
*/
|
||||||
|
sexp_t *copy_sexp(const sexp_t *sx);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __SEXP_OPS_H__ */
|
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* \defgroup viz Visualization and debugging routines
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file sexp_vis.h
|
||||||
|
*
|
||||||
|
* \brief API for emitting graphviz data structure visualizations.
|
||||||
|
*/
|
||||||
|
#ifndef __SEXP_VIS_H__
|
||||||
|
#define __SEXP_VIS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup viz
|
||||||
|
*
|
||||||
|
* Given a s-expression and a filename, this routine creates a DOT-file that
|
||||||
|
* can be used to generate a visualization of the s-expression data structure.
|
||||||
|
* This is useful for debugging to ensure that the structure is correct and
|
||||||
|
* follows what was expected by the programmer. Non-trivial s-expressions
|
||||||
|
* can yield very large visualizations though. Sometimes it is more
|
||||||
|
* practical to visualize a portion of the structure if one knows where a bug
|
||||||
|
* is likely to occur.
|
||||||
|
*
|
||||||
|
* \param sx S-expression data structure to create a DOT file based on.
|
||||||
|
* \param fname Filename of the DOT file to emit.
|
||||||
|
*/
|
||||||
|
sexp_errcode_t sexp_to_dotfile(const sexp_t *sx, const char *fname);
|
||||||
|
|
||||||
|
#endif /* __SEXP_VIS_H__ */
|
@ -0,0 +1,34 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
AM_CPPFLAGS = \
|
||||||
|
-DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \
|
||||||
|
-DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
|
||||||
|
-DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\" \
|
||||||
|
$(LIBTDATA_CFLAGS) -I../include
|
||||||
|
|
||||||
|
AM_CFLAGS =\
|
||||||
|
-Wall\
|
||||||
|
-g
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libsexpr.la
|
||||||
|
|
||||||
|
|
||||||
|
libsexpr_la_SOURCES = \
|
||||||
|
cstring.c event_temp.c faststack.c io.c \
|
||||||
|
parser.c sexp.c sexp_memory.c sexp_ops.c sexp_vis.c
|
||||||
|
|
||||||
|
libsexpr_la_LDFLAGS =
|
||||||
|
|
||||||
|
libsexpr_la_LIBADD =
|
||||||
|
|
||||||
|
##include_HEADERS = \
|
||||||
|
## ../include/sexpr/cstring.h ../include/sexpr/faststack.h ../include/sexpr/sexp_errors.h \
|
||||||
|
## ../include/sexpr/sexp.h ../include/sexpr/sexp_memory.h ../include/sexpr/sexp_ops.h \
|
||||||
|
## ../include/sexpr/sexp_vis.h
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libsexpr-1.2.pc
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
libsexpr-1.2.pc.in
|
||||||
|
|
@ -0,0 +1,225 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Implementation of stuff in cstring.h to make ron happy
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sexpr/cstring.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sexpr/sexp_memory.h>
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* growth size for cstrings -- default is 8k. use sgrowsize() to adjust.
|
||||||
|
*/
|
||||||
|
static size_t cstring_growsize = 8192;
|
||||||
|
|
||||||
|
void sgrowsize(size_t s) {
|
||||||
|
if (s < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cstring_growsize = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSTRING *snew(size_t s) {
|
||||||
|
CSTRING *cs;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
cs = (CSTRING *)sexp_malloc(sizeof(CSTRING));
|
||||||
|
#else
|
||||||
|
cs = sexp_malloc(sizeof(CSTRING));
|
||||||
|
#endif
|
||||||
|
if (cs == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cs->len = s;
|
||||||
|
cs->curlen = 0;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
cs->base = (char *)sexp_calloc(sizeof(char),s);
|
||||||
|
#else
|
||||||
|
cs->base = sexp_calloc(sizeof(char),s);
|
||||||
|
#endif
|
||||||
|
if (cs->base == NULL) {
|
||||||
|
sexp_free(cs,sizeof(CSTRING));
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cs;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSTRING *sadd(CSTRING *s, char *a) {
|
||||||
|
int alen;
|
||||||
|
char *newbase;
|
||||||
|
|
||||||
|
/* no string, so bail */
|
||||||
|
if (s == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nothing to add, return s */
|
||||||
|
if (a == NULL) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
alen = strlen(a);
|
||||||
|
|
||||||
|
if (s->curlen + alen >= s->len) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
newbase = (char *)sexp_realloc(s->base,
|
||||||
|
s->len+cstring_growsize+alen,
|
||||||
|
s->len);
|
||||||
|
#else
|
||||||
|
newbase = sexp_realloc(s->base,
|
||||||
|
s->len+cstring_growsize+alen,
|
||||||
|
s->len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* do NOT destroy s anymore. if realloc fails, the original data is
|
||||||
|
still valid, so just report the error to sexp_errno and return NULL.
|
||||||
|
*/
|
||||||
|
if (newbase == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->len += cstring_growsize + alen;
|
||||||
|
s->base = newbase;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&s->base[s->curlen],a,alen);
|
||||||
|
s->curlen += alen;
|
||||||
|
s->base[s->curlen] = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSTRING *saddch(CSTRING *s, char a) {
|
||||||
|
char *newbase;
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->curlen + 1 >= s->len) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
newbase = (char *)sexp_realloc(s->base,
|
||||||
|
s->len+cstring_growsize+1,
|
||||||
|
s->len);
|
||||||
|
#else
|
||||||
|
newbase = sexp_realloc(s->base,
|
||||||
|
s->len+cstring_growsize+1,
|
||||||
|
s->len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* do NOT destroy s anymore. if realloc fails, the original data is
|
||||||
|
still valid, so just report the error to sexp_errno and return NULL.
|
||||||
|
*/
|
||||||
|
if (newbase == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->len += cstring_growsize+1;
|
||||||
|
s->base = newbase;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->base[s->curlen] = a;
|
||||||
|
s->curlen++;
|
||||||
|
s->base[s->curlen] = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSTRING *strim(CSTRING *s) {
|
||||||
|
char *newbase;
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no trimming necessary? */
|
||||||
|
if (s->len == s->curlen+1) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
newbase = (char *)sexp_realloc(s->base,
|
||||||
|
s->curlen+1,
|
||||||
|
s->len);
|
||||||
|
#else
|
||||||
|
newbase = sexp_realloc(s->base,
|
||||||
|
s->curlen+1,
|
||||||
|
s->len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* do NOT destroy s anymore. if realloc fails, the original data is
|
||||||
|
still valid, so just report the error to sexp_errno and return NULL.
|
||||||
|
*/
|
||||||
|
if (newbase == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->len = s->curlen+1;
|
||||||
|
s->base = newbase;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *toCharPtr(CSTRING *s) {
|
||||||
|
if (s == NULL) return NULL;
|
||||||
|
return s->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sempty(CSTRING *s) {
|
||||||
|
if (s == NULL) return;
|
||||||
|
s->curlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sdestroy(CSTRING *s) {
|
||||||
|
if (s == NULL) return;
|
||||||
|
sexp_free(s->base,s->len);
|
||||||
|
sexp_free(s,sizeof(CSTRING));
|
||||||
|
}
|
@ -0,0 +1,896 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
static size_t sexp_val_start_size = 256;
|
||||||
|
static size_t sexp_val_grow_size = 64;
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* event parser : based on cparse_sexp from v1.91 of this file. separate out
|
||||||
|
* in the event that the parser mode is PARSER_EVENTS_ONLY.
|
||||||
|
*/
|
||||||
|
pcont_t *
|
||||||
|
eparse_sexp (char *str, size_t len, pcont_t *lc)
|
||||||
|
{
|
||||||
|
char *t, *s;
|
||||||
|
register size_t binexpected = 0;
|
||||||
|
register size_t binread = 0;
|
||||||
|
register parsermode_t mode = PARSER_NORMAL;
|
||||||
|
register size_t val_allocated = 0;
|
||||||
|
register unsigned int squoted = 0;
|
||||||
|
register size_t val_used = 0;
|
||||||
|
register unsigned int state = 1;
|
||||||
|
register unsigned int depth = 0;
|
||||||
|
register unsigned int qdepth = 0;
|
||||||
|
register unsigned int elts = 0;
|
||||||
|
register unsigned int esc = 0;
|
||||||
|
pcont_t *cc;
|
||||||
|
char *val, *vcur, *bindata = NULL;
|
||||||
|
faststack_t *stack;
|
||||||
|
char *bufEnd;
|
||||||
|
int keepgoing = 1;
|
||||||
|
parser_event_handlers_t *event_handlers = NULL;
|
||||||
|
|
||||||
|
/* make sure non-null string */
|
||||||
|
if (str == NULL) {
|
||||||
|
lc->error = SEXP_ERR_NULLSTRING;
|
||||||
|
return lc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first, if we have a non null continuation passed in, restore state. */
|
||||||
|
if (lc != NULL) {
|
||||||
|
cc = lc;
|
||||||
|
binexpected = cc->binexpected;
|
||||||
|
binread = cc->binread;
|
||||||
|
bindata = cc->bindata;
|
||||||
|
val_used = cc->val_used;
|
||||||
|
val_allocated = cc->val_allocated;
|
||||||
|
squoted = cc->squoted;
|
||||||
|
val = cc->val;
|
||||||
|
vcur = cc->vcur;
|
||||||
|
state = cc->state;
|
||||||
|
depth = cc->depth;
|
||||||
|
qdepth = cc->qdepth;
|
||||||
|
stack = cc->stack;
|
||||||
|
esc = cc->esc;
|
||||||
|
mode = cc->mode;
|
||||||
|
event_handlers = cc->event_handlers;
|
||||||
|
s = str;
|
||||||
|
if (cc->lastPos != NULL)
|
||||||
|
t = cc->lastPos;
|
||||||
|
else {
|
||||||
|
t = s;
|
||||||
|
cc->sbuffer = str;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* new continuation... */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
cc = (pcont_t *)sexp_malloc(sizeof(pcont_t));
|
||||||
|
#else
|
||||||
|
cc = sexp_malloc(sizeof(pcont_t));
|
||||||
|
#endif
|
||||||
|
assert(cc != NULL);
|
||||||
|
|
||||||
|
cc->mode = mode;
|
||||||
|
|
||||||
|
/* allocate atom buffer */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
cc->val = val = (char *)sexp_malloc(sizeof(char)*sexp_val_start_size);
|
||||||
|
#else
|
||||||
|
cc->val = val = sexp_malloc(sizeof(char)*sexp_val_start_size);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
|
||||||
|
cc->val_used = val_used = 0;
|
||||||
|
cc->val_allocated = val_allocated = sexp_val_start_size;
|
||||||
|
|
||||||
|
vcur = val;
|
||||||
|
|
||||||
|
/* allocate stack */
|
||||||
|
cc->stack = stack = make_stack();
|
||||||
|
cc->bindata = NULL;
|
||||||
|
cc->binread = cc->binexpected = 0;
|
||||||
|
|
||||||
|
/* event handlers are null */
|
||||||
|
cc->event_handlers = NULL;
|
||||||
|
|
||||||
|
/* t is temp pointer into s for current position */
|
||||||
|
s = str;
|
||||||
|
t = s;
|
||||||
|
cc->sbuffer = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufEnd = cc->sbuffer+len;
|
||||||
|
|
||||||
|
/* guard for loop - see end of loop for info. Put it out here in the
|
||||||
|
event that we're restoring state from a continuation and need to
|
||||||
|
check before we start up. */
|
||||||
|
if (state != 15 && t[0] == '\0') keepgoing = 0;
|
||||||
|
|
||||||
|
/*==================*/
|
||||||
|
/* main parser loop */
|
||||||
|
/*==================*/
|
||||||
|
while (keepgoing == 1 && t != bufEnd)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* based on the current state in the FSM, do something */
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
switch (t[0])
|
||||||
|
{
|
||||||
|
/* space,tab,CR,LF considered white space */
|
||||||
|
case '\n':
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
case '\r':
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
/* semicolon starts a comment that extends until a \n is
|
||||||
|
encountered. */
|
||||||
|
case ';':
|
||||||
|
t++;
|
||||||
|
state = 11;
|
||||||
|
break;
|
||||||
|
/* enter state 2 for open paren */
|
||||||
|
case '(':
|
||||||
|
state = 2;
|
||||||
|
t++;
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->start_sexpr != NULL)
|
||||||
|
event_handlers->start_sexpr();
|
||||||
|
break;
|
||||||
|
/* enter state 3 for close paren */
|
||||||
|
case ')':
|
||||||
|
state = 3;
|
||||||
|
break;
|
||||||
|
/* begin quoted string - enter state 5 */
|
||||||
|
case '\"':
|
||||||
|
state = 5;
|
||||||
|
/* set cur pointer to beginning of val buffer */
|
||||||
|
vcur = val;
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
/* single quote - enter state 7 */
|
||||||
|
case '\'':
|
||||||
|
state = 7;
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
/* other characters are assumed to be atom parts */
|
||||||
|
default:
|
||||||
|
/* set cur pointer to beginning of val buffer */
|
||||||
|
vcur = val;
|
||||||
|
|
||||||
|
/** NOTE: the following code originally required a transition
|
||||||
|
to state 4 before processing the first atom character --
|
||||||
|
this required two iterations for the first character
|
||||||
|
of each atom. merging this into here allows us to process
|
||||||
|
what we already know to be a valid atom character before
|
||||||
|
entering state 4. **/
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
/* if the atom starts with # and we're in inline
|
||||||
|
binary mode, we need to go to state 12 to start
|
||||||
|
checking for the #b# prefix. otherwise,
|
||||||
|
if it's not a # or we're just in normal mode,
|
||||||
|
proceed to state 4 as usual. */
|
||||||
|
if (t[0] == '#' && mode == PARSER_INLINE_BINARY) {
|
||||||
|
state = 12;
|
||||||
|
} else {
|
||||||
|
state = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* open paren */
|
||||||
|
depth++;
|
||||||
|
|
||||||
|
elts++;
|
||||||
|
|
||||||
|
if (stack->height < 1)
|
||||||
|
stack->height++;
|
||||||
|
|
||||||
|
stack->height++;
|
||||||
|
|
||||||
|
state = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
/** close paren **/
|
||||||
|
|
||||||
|
/* check for close parens that were never opened. */
|
||||||
|
if (depth == 0) {
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->val = val;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
cc->error = SEXP_ERR_BADFORM;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
t++;
|
||||||
|
depth--;
|
||||||
|
|
||||||
|
stack->height--;
|
||||||
|
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->end_sexpr != NULL)
|
||||||
|
event_handlers->end_sexpr();
|
||||||
|
|
||||||
|
state = 1;
|
||||||
|
|
||||||
|
/** if depth = 0 then we finished a sexpr, and we return **/
|
||||||
|
if (depth == 0) {
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->val = val;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
stack->height = 0;
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4: /** parsing atom **/
|
||||||
|
if (esc == 1 && (t[0] == '\"' || t[0] == '(' ||
|
||||||
|
t[0] == ')' || t[0] == '\'' ||
|
||||||
|
t[0] == '\\')) {
|
||||||
|
vcur--; /* back up to overwrite the \ */
|
||||||
|
vcur[0] = t[0];
|
||||||
|
vcur++;
|
||||||
|
t++;
|
||||||
|
esc = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* look at an ascii table - these ranges are the non-whitespace, non
|
||||||
|
paren and quote characters that are legal in atoms */
|
||||||
|
if (!((t[0] >= '*' && t[0] <= '~') ||
|
||||||
|
((unsigned char)(t[0]) > 127) ||
|
||||||
|
(t[0] == '!') ||
|
||||||
|
(t[0] >= '#' && t[0] <= '&')))
|
||||||
|
{
|
||||||
|
vcur[0] = '\0';
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
elts++;
|
||||||
|
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->characters != NULL) {
|
||||||
|
if (squoted != 0)
|
||||||
|
event_handlers->characters(val,val_used,SEXP_SQUOTE);
|
||||||
|
else
|
||||||
|
event_handlers->characters(val,val_used,SEXP_BASIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
vcur = val;
|
||||||
|
val_used = 0;
|
||||||
|
|
||||||
|
if (stack->height < 1) {
|
||||||
|
/* looks like this expression was just a basic atom - so
|
||||||
|
return it. */
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
cc->val = val;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->squoted = 0;
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (t[0]) {
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
/** NOTE: we know whitespace following atom, so spin ahead
|
||||||
|
one and let state 1 do what it needs to for the next
|
||||||
|
character. **/
|
||||||
|
state = 1;
|
||||||
|
t++;
|
||||||
|
squoted = 0;
|
||||||
|
break;
|
||||||
|
case ')':
|
||||||
|
squoted = 0;
|
||||||
|
state = 3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
squoted = 0;
|
||||||
|
state = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (esc == 1 && (t[0] == '\"' ||
|
||||||
|
t[0] == '\'' ||
|
||||||
|
t[0] == '(' ||
|
||||||
|
t[0] == ')' ||
|
||||||
|
t[0] == '\\')) {
|
||||||
|
vcur--;
|
||||||
|
vcur[0] = t[0];
|
||||||
|
vcur++;
|
||||||
|
/** NO NEED TO UPDATE VAL COUNTS **/
|
||||||
|
t++;
|
||||||
|
esc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t[0] == '\"')
|
||||||
|
{
|
||||||
|
state = 6;
|
||||||
|
|
||||||
|
if (squoted == 1) {
|
||||||
|
vcur[0] = '\"';
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
}
|
||||||
|
|
||||||
|
vcur[0] = '\0';
|
||||||
|
|
||||||
|
val_used++;
|
||||||
|
elts++;
|
||||||
|
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->characters != NULL) {
|
||||||
|
if (squoted == 1)
|
||||||
|
event_handlers->characters(val,val_used,SEXP_SQUOTE);
|
||||||
|
else
|
||||||
|
event_handlers->characters(val,val_used,SEXP_DQUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
vcur = val;
|
||||||
|
val_used = 0;
|
||||||
|
|
||||||
|
if (stack->height < 1) {
|
||||||
|
/* looks like this expression was just a basic double
|
||||||
|
quoted atom - so return it. */
|
||||||
|
t++; /* spin past the quote */
|
||||||
|
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->squoted = 0;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
cc->val = val;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->lastPos = t++;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vcur[0] = t[0];
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
if (t[0] == '\\') {
|
||||||
|
esc = 1;
|
||||||
|
} else
|
||||||
|
esc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
vcur = val;
|
||||||
|
state = 1;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if (t[0] == '\"')
|
||||||
|
{
|
||||||
|
state = 5;
|
||||||
|
vcur = val;
|
||||||
|
t++;
|
||||||
|
|
||||||
|
vcur[0] = '\"';
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
squoted = 1;
|
||||||
|
}
|
||||||
|
else if (t[0] == '(')
|
||||||
|
{
|
||||||
|
vcur = val;
|
||||||
|
state = 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vcur = val;
|
||||||
|
state = 4;
|
||||||
|
squoted = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (esc == 0) {
|
||||||
|
if (t[0] == '(')
|
||||||
|
{
|
||||||
|
qdepth++;
|
||||||
|
}
|
||||||
|
else if (t[0] == ')')
|
||||||
|
{
|
||||||
|
qdepth--;
|
||||||
|
state = 9;
|
||||||
|
}
|
||||||
|
else if (t[0] == '\"')
|
||||||
|
{
|
||||||
|
state = 10;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
esc = 0;
|
||||||
|
}
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
t++;
|
||||||
|
/* let it fall through to state 9 if we know we're transitioning
|
||||||
|
into that state */
|
||||||
|
if (state != 9)
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (qdepth == 0)
|
||||||
|
{
|
||||||
|
state = 1;
|
||||||
|
vcur[0] = '\0';
|
||||||
|
|
||||||
|
elts++;
|
||||||
|
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->characters != NULL)
|
||||||
|
event_handlers->characters(val,val_used,SEXP_SQUOTE);
|
||||||
|
|
||||||
|
vcur = val;
|
||||||
|
val_used = 0;
|
||||||
|
|
||||||
|
if (stack->height < 1) {
|
||||||
|
/* looks like the whole expression was a single
|
||||||
|
quoted value! So return it. */
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
cc->squoted = 0;
|
||||||
|
cc->val = val;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
state = 8;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
if (t[0] == '\"' && esc == 0)
|
||||||
|
{
|
||||||
|
state = 8;
|
||||||
|
}
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
if (t[0] == '\n') {
|
||||||
|
state = 1;
|
||||||
|
}
|
||||||
|
t++;
|
||||||
|
break;
|
||||||
|
case 12: /* pre: we saw a # and we're in inline binary mode */
|
||||||
|
if (t[0] == 'b') {
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
state = 13; /* so far, #b */
|
||||||
|
t++;
|
||||||
|
} else {
|
||||||
|
state = 4; /* not #b, so plain ol' atom */
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 13: /* pre: we saw a #b and we're in inline binary mode */
|
||||||
|
if (t[0] == '#') {
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
state = 14; /* so far, #b# - we're definitely in binary
|
||||||
|
land now. */
|
||||||
|
/* reset vcur to val, overwrite #b# with the size string. */
|
||||||
|
vcur = val;
|
||||||
|
val_used = 0;
|
||||||
|
t++;
|
||||||
|
} else {
|
||||||
|
state = 4; /* not #b#, so plain ol' atom */
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
/**
|
||||||
|
* so far we've read #b#. Now, the steps of the process become:
|
||||||
|
* proceed to read bytes in until we see # again. This will be
|
||||||
|
* an ASCII representation of the size. At this point, we want
|
||||||
|
* to read as many bytes as specified by this size string after
|
||||||
|
* the #.
|
||||||
|
*/
|
||||||
|
if (t[0] == '#') { /* done with size string */
|
||||||
|
t++;
|
||||||
|
state = 15;
|
||||||
|
vcur[0] = '\0';
|
||||||
|
|
||||||
|
binexpected = atoi(val);
|
||||||
|
assert(binexpected > 0);
|
||||||
|
binread = 0;
|
||||||
|
#ifdef __cplusplus
|
||||||
|
bindata = (char *)sexp_malloc(sizeof(char)*binexpected);
|
||||||
|
#else
|
||||||
|
bindata = sexp_malloc(sizeof(char)*binexpected);
|
||||||
|
#endif
|
||||||
|
assert(bindata != NULL);
|
||||||
|
} else { /* still reading size string */
|
||||||
|
vcur[0] = t[0];
|
||||||
|
if (t[0] == '\\') esc = 1;
|
||||||
|
else esc = 0;
|
||||||
|
val_used++;
|
||||||
|
|
||||||
|
if (val_used == val_allocated) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
val = (char *)sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#else
|
||||||
|
val = sexp_realloc(val,
|
||||||
|
val_allocated+sexp_val_grow_size,
|
||||||
|
val_allocated);
|
||||||
|
#endif
|
||||||
|
assert(val != NULL);
|
||||||
|
vcur = val + val_used;
|
||||||
|
val_allocated += sexp_val_grow_size;
|
||||||
|
} else vcur++;
|
||||||
|
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 15: /* reading binary blob */
|
||||||
|
bindata[binread] = t[0];
|
||||||
|
binread++;
|
||||||
|
t++;
|
||||||
|
|
||||||
|
if (binread == binexpected) {
|
||||||
|
/* state = 1 -- create a sexp_t and head back */
|
||||||
|
|
||||||
|
elts++;
|
||||||
|
|
||||||
|
if (event_handlers != NULL &&
|
||||||
|
event_handlers->binary != NULL)
|
||||||
|
event_handlers->binary(bindata, binread);
|
||||||
|
|
||||||
|
sexp_free(bindata,binread);
|
||||||
|
bindata = NULL;
|
||||||
|
binread = binexpected = 0;
|
||||||
|
|
||||||
|
state = 1;
|
||||||
|
|
||||||
|
val_used = 0;
|
||||||
|
vcur = val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf (stderr, "eparse_sexp: unknown parser state %d.\n", state);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the null check used to be part of the guard on the while loop.
|
||||||
|
unfortunately, if we're in state 15, null is considered a
|
||||||
|
perfectly valid byte. This means the length passed in better
|
||||||
|
be accurate for the parser to not walk off the end of the
|
||||||
|
string! */
|
||||||
|
if (state != 15 && t[0] == '\0') keepgoing = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depth == 0 && elts > 0) {
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
cc->val = val;
|
||||||
|
cc->squoted = squoted;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = 1;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->esc = 0;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
stack->height = 0;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
} else {
|
||||||
|
cc->bindata = bindata;
|
||||||
|
cc->binread = binread;
|
||||||
|
cc->binexpected = binexpected;
|
||||||
|
cc->mode = mode;
|
||||||
|
cc->val = val;
|
||||||
|
cc->esc = esc;
|
||||||
|
cc->squoted = squoted;
|
||||||
|
cc->vcur = vcur;
|
||||||
|
cc->val_allocated = val_allocated;
|
||||||
|
cc->val_used = val_used;
|
||||||
|
if (t[0] == '\0' || t == bufEnd)
|
||||||
|
cc->lastPos = NULL;
|
||||||
|
else
|
||||||
|
cc->lastPos = t;
|
||||||
|
cc->depth = depth;
|
||||||
|
cc->qdepth = qdepth;
|
||||||
|
cc->state = state;
|
||||||
|
cc->stack = stack;
|
||||||
|
cc->last_sexp = NULL;
|
||||||
|
cc->event_handlers = event_handlers;
|
||||||
|
cc->error = SEXP_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cc;
|
||||||
|
}
|
@ -0,0 +1,228 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
/**
|
||||||
|
* faststack.c : implementation of fast stack.
|
||||||
|
*
|
||||||
|
* matt sottile / matt@lanl.gov
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sexpr/faststack.h>
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create an empty stack.
|
||||||
|
*/
|
||||||
|
faststack_t *
|
||||||
|
make_stack ()
|
||||||
|
{
|
||||||
|
faststack_t *s;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
s = (faststack_t *)sexp_malloc (sizeof (faststack_t));
|
||||||
|
#else
|
||||||
|
s = sexp_malloc (sizeof (faststack_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->top = s->bottom = NULL;
|
||||||
|
s->height = 0;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* free all levels of a stack
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
destroy_stack (faststack_t * s)
|
||||||
|
{
|
||||||
|
stack_lvl_t *sl;
|
||||||
|
|
||||||
|
/* return if stack is null. no error condition - just return. */
|
||||||
|
if (s == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* start at the bottom */
|
||||||
|
sl = s->bottom;
|
||||||
|
|
||||||
|
/* if bottom is null, no levels to free. just free stack itself then. */
|
||||||
|
if (sl == NULL) {
|
||||||
|
sexp_free(s, sizeof(faststack_t));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go up to the top of the allocated stack */
|
||||||
|
while (sl->above != NULL)
|
||||||
|
sl = sl->above;
|
||||||
|
|
||||||
|
/* until we get to the bottom (where below is null), free the data
|
||||||
|
at each level and the level itself. */
|
||||||
|
while (sl->below != NULL)
|
||||||
|
{
|
||||||
|
sl = sl->below;
|
||||||
|
sexp_free (sl->above, sizeof(stack_lvl_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free the bottom level */
|
||||||
|
sexp_free (sl, sizeof(stack_lvl_t));
|
||||||
|
|
||||||
|
/* free the stack wrapper itself. */
|
||||||
|
sexp_free (s, sizeof(faststack_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* push a level onto the cur_stack. reuse levels that have
|
||||||
|
* been previously allocated, allocate a new one if none
|
||||||
|
* are available.
|
||||||
|
*/
|
||||||
|
faststack_t *
|
||||||
|
push (faststack_t * cur_stack, void *data)
|
||||||
|
{
|
||||||
|
stack_lvl_t *top;
|
||||||
|
|
||||||
|
if (cur_stack == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_BAD_STACK;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
top = cur_stack->top;
|
||||||
|
stack_lvl_t *tmp;
|
||||||
|
|
||||||
|
/* if top isn't null, try to push above it. */
|
||||||
|
if (top != NULL)
|
||||||
|
{
|
||||||
|
/* if above isn't null, set the stack top to it and set the
|
||||||
|
data */
|
||||||
|
if (top->above != NULL)
|
||||||
|
{
|
||||||
|
top = cur_stack->top = cur_stack->top->above;
|
||||||
|
top->data = data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* otherwise, allocate a new level. */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
tmp = top->above = (stack_level *)sexp_malloc (sizeof (stack_lvl_t));
|
||||||
|
#else
|
||||||
|
tmp = top->above = sexp_malloc (sizeof (stack_lvl_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tmp == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp->below = cur_stack->top;
|
||||||
|
tmp->above = NULL;
|
||||||
|
cur_stack->top = tmp;
|
||||||
|
tmp->data = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cur_stack->bottom != NULL)
|
||||||
|
{
|
||||||
|
cur_stack->top = cur_stack->bottom;
|
||||||
|
cur_stack->top->data = data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef __cplusplus
|
||||||
|
tmp = cur_stack->top =
|
||||||
|
(stack_lvl_t *)sexp_malloc (sizeof (stack_lvl_t));
|
||||||
|
#else
|
||||||
|
tmp = cur_stack->top = sexp_malloc (sizeof (stack_lvl_t));
|
||||||
|
#endif
|
||||||
|
if (tmp == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_stack->bottom = tmp;
|
||||||
|
tmp->above = NULL;
|
||||||
|
tmp->below = NULL;
|
||||||
|
tmp->data = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_stack->height++;
|
||||||
|
|
||||||
|
return cur_stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pop the top of the stack, return the stack level that was
|
||||||
|
* popped of.
|
||||||
|
*/
|
||||||
|
stack_lvl_t *
|
||||||
|
pop (faststack_t * s)
|
||||||
|
{
|
||||||
|
stack_lvl_t *top;
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_BAD_STACK;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
top = s->top;
|
||||||
|
|
||||||
|
/* if stack top isn't null, set the top pointer to the next
|
||||||
|
level down and return the old top. */
|
||||||
|
if (top != NULL && s->height > 0)
|
||||||
|
{
|
||||||
|
s->top = s->top->below;
|
||||||
|
s->height--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (s->height < 1) return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return top;
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize an io-wrapper
|
||||||
|
*/
|
||||||
|
sexp_iowrap_t *init_iowrap(int fd) {
|
||||||
|
sexp_iowrap_t *iow;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
iow = (sexp_iowrap_t *)sexp_malloc(sizeof(sexp_iowrap_t));
|
||||||
|
#else
|
||||||
|
iow = sexp_malloc(sizeof(sexp_iowrap_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (iow == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
iow->cc = NULL;
|
||||||
|
iow->fd = fd;
|
||||||
|
iow->cnt = 0;
|
||||||
|
iow->buf[0] = '\0';
|
||||||
|
|
||||||
|
return iow;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void destroy_iowrap(sexp_iowrap_t *iow) {
|
||||||
|
if (iow == NULL) return; /* idiot */
|
||||||
|
|
||||||
|
destroy_continuation(iow->cc);
|
||||||
|
sexp_free(iow, sizeof(sexp_iowrap_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
sexp_t *read_one_sexp(sexp_iowrap_t *iow) {
|
||||||
|
sexp_t *sx = NULL;
|
||||||
|
|
||||||
|
if (iow == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* check if we have more to parse from the continuation. */
|
||||||
|
if (iow->cc != NULL && iow->cc->lastPos != NULL) {
|
||||||
|
iow->cc = cparse_sexp(iow->buf, iow->cnt, iow->cc);
|
||||||
|
|
||||||
|
if (iow->cc == NULL) return NULL; /* cparse_sexp set sexp_errno */
|
||||||
|
if (iow->cc->last_sexp != NULL) {
|
||||||
|
sx = iow->cc->last_sexp;
|
||||||
|
iow->cc->last_sexp = NULL;
|
||||||
|
return sx;
|
||||||
|
}
|
||||||
|
iow->cnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iow->cnt == 0) {
|
||||||
|
iow->cnt = read(iow->fd,iow->buf,BUFSIZ);
|
||||||
|
|
||||||
|
if (iow->cnt == 0) {
|
||||||
|
sexp_errno = SEXP_ERR_IO_EMPTY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iow->cc = cparse_sexp(iow->buf,iow->cnt,iow->cc);
|
||||||
|
|
||||||
|
while (iow->cc->last_sexp == NULL) {
|
||||||
|
if (iow->cc->error != SEXP_ERR_OK) {
|
||||||
|
sexp_errno = iow->cc->error;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
iow->cnt = read(iow->fd,iow->buf,BUFSIZ);
|
||||||
|
|
||||||
|
if (iow->cnt == 0) {
|
||||||
|
sexp_errno = SEXP_ERR_IO_EMPTY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
iow->cc = cparse_sexp(iow->buf,iow->cnt,iow->cc);
|
||||||
|
iow->cnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sx = iow->cc->last_sexp;
|
||||||
|
iow->cc->last_sexp = NULL;
|
||||||
|
|
||||||
|
return sx;
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
datarootdir=@datarootdir@
|
||||||
|
datadir=@datadir@
|
||||||
|
includedir=@includedir@/sexpr/liblibsexpr-1.2
|
||||||
|
|
||||||
|
Name: liblibsexpr
|
||||||
|
Description: Small, fast s-expression handling library used by Askele and Askele Ingria products (so called sexpr).
|
||||||
|
Version: @VERSION@
|
||||||
|
Requires:
|
||||||
|
Libs: -L${libdir} -llibsexpr
|
||||||
|
Cflags: -I${includedir}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,546 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
#include <sexpr/faststack.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* global error code that can be set by sexp library calls. default
|
||||||
|
* is SEXP_ERR_OK.
|
||||||
|
*/
|
||||||
|
sexp_errcode_t sexp_errno = SEXP_ERR_OK;
|
||||||
|
|
||||||
|
void reset_sexp_errno() {
|
||||||
|
sexp_errno = SEXP_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively walk an s-expression and free it.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
destroy_sexp (sexp_t * s)
|
||||||
|
{
|
||||||
|
if (s == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (s->ty == SEXP_LIST) {
|
||||||
|
destroy_sexp (s->list);
|
||||||
|
} else if (s->ty == SEXP_VALUE) {
|
||||||
|
if (s->aty == SEXP_BINARY && s->bindata != NULL) {
|
||||||
|
sexp_free(s->bindata, s->binlength);
|
||||||
|
} else if (s->val != NULL) {
|
||||||
|
sexp_free(s->val, s->val_allocated);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s->val = NULL;
|
||||||
|
s->bindata = NULL;
|
||||||
|
|
||||||
|
destroy_sexp (s->next);
|
||||||
|
|
||||||
|
s->next = s->list = NULL;
|
||||||
|
|
||||||
|
sexp_t_deallocate(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterative method to walk sx and turn it back into the string
|
||||||
|
* representation of the s-expression. Fills the buffer.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
print_sexp (char *buf, size_t size, const sexp_t * sx)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
int sz;
|
||||||
|
char *b = buf, *tc;
|
||||||
|
size_t left = size;
|
||||||
|
int depth = 0;
|
||||||
|
faststack_t *stack;
|
||||||
|
stack_lvl_t *top;
|
||||||
|
sexp_t *tdata;
|
||||||
|
sexp_t *fakehead;
|
||||||
|
sexp_t tmp;
|
||||||
|
|
||||||
|
if (sx == NULL) {
|
||||||
|
buf[0] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = *sx;
|
||||||
|
tmp.next = tmp.list = NULL;
|
||||||
|
|
||||||
|
fakehead = copy_sexp(&tmp);
|
||||||
|
|
||||||
|
if (fakehead == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fakehead->list = sx->list;
|
||||||
|
fakehead->next = NULL; /* this is the important part of fakehead */
|
||||||
|
|
||||||
|
stack = make_stack ();
|
||||||
|
if (stack == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
push (stack, fakehead);
|
||||||
|
|
||||||
|
while (stack->top != NULL)
|
||||||
|
{
|
||||||
|
top = stack->top;
|
||||||
|
tdata = (sexp_t *) top->data;
|
||||||
|
|
||||||
|
if (tdata == NULL)
|
||||||
|
{
|
||||||
|
pop (stack);
|
||||||
|
|
||||||
|
if (depth > 0)
|
||||||
|
{
|
||||||
|
b[0] = ')';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
depth--;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stack->top == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
top = stack->top;
|
||||||
|
top->data = ((sexp_t *) top->data)->next;
|
||||||
|
if (top->data != NULL)
|
||||||
|
{
|
||||||
|
b[0] = ' ';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tdata->ty == SEXP_VALUE)
|
||||||
|
{
|
||||||
|
if (tdata->aty == SEXP_DQUOTE)
|
||||||
|
{
|
||||||
|
b[0] = '\"';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
}
|
||||||
|
else if (tdata->aty == SEXP_SQUOTE)
|
||||||
|
{
|
||||||
|
b[0] = '\'';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdata->aty != SEXP_BINARY && tdata->val_used > 0) {
|
||||||
|
tc = tdata->val;
|
||||||
|
/* copy value into string */
|
||||||
|
while (tc[0] != 0 && left > 0)
|
||||||
|
{
|
||||||
|
/* escape characters that need escaping. */
|
||||||
|
if ((tc[0] == '\"' || tc[0] == '\\') &&
|
||||||
|
tdata->aty == SEXP_DQUOTE)
|
||||||
|
{
|
||||||
|
b[0] = '\\';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
if (left == 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
b[0] = tc[0];
|
||||||
|
b++;
|
||||||
|
tc++;
|
||||||
|
left--;
|
||||||
|
if (left == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (left > 3) {
|
||||||
|
b[0] = '#'; b[1] = 'b'; b[2] = '#';
|
||||||
|
b+=3;
|
||||||
|
left-=3;
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
if ((size_t)(sz = snprintf(b,left,"%lu#",(unsigned long)tdata->binlength)) >= left) {
|
||||||
|
#else
|
||||||
|
if ((sz = _snprintf(b,left,"%lu#",tdata->binlength)) >= left) {
|
||||||
|
#endif
|
||||||
|
left = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
b += sz;
|
||||||
|
left -= sz;
|
||||||
|
|
||||||
|
if (left < tdata->binlength) {
|
||||||
|
left = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdata->binlength > 0) {
|
||||||
|
memcpy(b,tdata->bindata,tdata->binlength);
|
||||||
|
left -= tdata->binlength;
|
||||||
|
b+=tdata->binlength;
|
||||||
|
}
|
||||||
|
|
||||||
|
b[0] = ' ';
|
||||||
|
left--;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
left = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdata->aty == SEXP_DQUOTE && left > 0)
|
||||||
|
{
|
||||||
|
b[0] = '\"';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left < 0)
|
||||||
|
left = 0;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
top->data = ((sexp_t *) top->data)->next;
|
||||||
|
|
||||||
|
if (top->data != NULL)
|
||||||
|
{
|
||||||
|
b[0] = ' ';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tdata->ty == SEXP_LIST)
|
||||||
|
{
|
||||||
|
depth++;
|
||||||
|
b[0] = '(';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
push (stack, tdata->list);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BADCONTENT;
|
||||||
|
destroy_stack (stack);
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (depth != 0)
|
||||||
|
{
|
||||||
|
b[0] = ')';
|
||||||
|
b++;
|
||||||
|
left--;
|
||||||
|
depth--;
|
||||||
|
if (left == 0)
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BUFFER_FULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left != 0) {
|
||||||
|
b[0] = 0;
|
||||||
|
retval = (size-left);
|
||||||
|
} else {
|
||||||
|
b--;
|
||||||
|
b[0] = 0;
|
||||||
|
retval = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy_stack (stack);
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterative method to walk sx and turn it back into the string
|
||||||
|
* representation of the s-expression. Fills the CSTRING that is
|
||||||
|
* passed in. If *s == NULL (new CSTRING, never used), snew() is called
|
||||||
|
* and passed back. If *s != NULL, *s is used as the CSTRING to print
|
||||||
|
* into. In the last case, the recycled CSTRING must have sempty() called
|
||||||
|
* to reset the allocated vs. used counters to make it appear to be empty.
|
||||||
|
* the code will assume that sempty() was called by the user!
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
print_sexp_cstr (CSTRING **s, const sexp_t *sx, size_t ss)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
char *tc;
|
||||||
|
int depth = 0;
|
||||||
|
faststack_t *stack;
|
||||||
|
stack_lvl_t *top;
|
||||||
|
sexp_t *tdata;
|
||||||
|
sexp_t *fakehead;
|
||||||
|
CSTRING *_s = NULL;
|
||||||
|
char sbuf[32];
|
||||||
|
unsigned int i;
|
||||||
|
sexp_t tmp;
|
||||||
|
|
||||||
|
if (sx == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*s == NULL)
|
||||||
|
_s = snew(ss);
|
||||||
|
else
|
||||||
|
_s = *s;
|
||||||
|
|
||||||
|
tmp = *sx;
|
||||||
|
tmp.next = tmp.list = NULL;
|
||||||
|
|
||||||
|
fakehead = copy_sexp(&tmp);
|
||||||
|
|
||||||
|
if (fakehead == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fakehead->list = sx->list;
|
||||||
|
fakehead->next = NULL; /* this is the important part of fakehead */
|
||||||
|
|
||||||
|
stack = make_stack ();
|
||||||
|
if (stack == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
push (stack, fakehead);
|
||||||
|
|
||||||
|
while (stack->top != NULL)
|
||||||
|
{
|
||||||
|
top = stack->top;
|
||||||
|
tdata = (sexp_t *) top->data;
|
||||||
|
|
||||||
|
if (tdata == NULL)
|
||||||
|
{
|
||||||
|
pop (stack);
|
||||||
|
|
||||||
|
if (depth > 0)
|
||||||
|
{
|
||||||
|
_s = saddch(_s, ')');
|
||||||
|
depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stack->top == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
top = stack->top;
|
||||||
|
top->data = ((sexp_t *) top->data)->next;
|
||||||
|
if (top->data != NULL)
|
||||||
|
{
|
||||||
|
_s = saddch(_s, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tdata->ty == SEXP_VALUE)
|
||||||
|
{
|
||||||
|
if (tdata->aty == SEXP_DQUOTE)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,'\"');
|
||||||
|
}
|
||||||
|
else if (tdata->aty == SEXP_SQUOTE)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,'\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdata->aty == SEXP_BINARY) {
|
||||||
|
sprintf(sbuf,"#b#%lu#",(unsigned long)tdata->binlength);
|
||||||
|
|
||||||
|
_s = sadd(_s,sbuf);
|
||||||
|
|
||||||
|
for (i=0;i<tdata->binlength;i++)
|
||||||
|
_s = saddch(_s,tdata->bindata[i]);
|
||||||
|
_s = saddch(_s,' ');
|
||||||
|
} else {
|
||||||
|
if (tdata->val_used > 0) {
|
||||||
|
tc = tdata->val;
|
||||||
|
|
||||||
|
/* copy value into string */
|
||||||
|
while (tc[0] != 0)
|
||||||
|
{
|
||||||
|
/* escape characters that need escaping. */
|
||||||
|
if ((tc[0] == '\"' ||
|
||||||
|
tc[0] == '\\') && tdata->aty == SEXP_DQUOTE)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,'\\');
|
||||||
|
}
|
||||||
|
|
||||||
|
_s = saddch(_s,tc[0]);
|
||||||
|
tc++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdata->aty == SEXP_DQUOTE)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,'\"');
|
||||||
|
}
|
||||||
|
|
||||||
|
top->data = ((sexp_t *) top->data)->next;
|
||||||
|
|
||||||
|
if (top->data != NULL)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tdata->ty == SEXP_LIST)
|
||||||
|
{
|
||||||
|
depth++;
|
||||||
|
_s = saddch(_s,'(');
|
||||||
|
push (stack, tdata->list);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sexp_errno = SEXP_ERR_BADCONTENT;
|
||||||
|
destroy_stack (stack);
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (depth != 0)
|
||||||
|
{
|
||||||
|
_s = saddch(_s,')');
|
||||||
|
depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
*s = _s;
|
||||||
|
if (_s == NULL)
|
||||||
|
retval = 0;
|
||||||
|
else
|
||||||
|
retval = _s->curlen;
|
||||||
|
|
||||||
|
destroy_stack (stack);
|
||||||
|
sexp_t_deallocate(fakehead);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new sexp_t element representing a list.
|
||||||
|
*/
|
||||||
|
sexp_t *new_sexp_list(sexp_t *l) {
|
||||||
|
sexp_t *sx = sexp_t_allocate();
|
||||||
|
|
||||||
|
if (sx == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sx->ty = SEXP_LIST;
|
||||||
|
|
||||||
|
sx->list = l;
|
||||||
|
sx->next = NULL;
|
||||||
|
|
||||||
|
sx->val = NULL;
|
||||||
|
sx->val_used = sx->val_allocated = 0;
|
||||||
|
|
||||||
|
return sx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* allocate a new sexp_t element representing a value
|
||||||
|
*/
|
||||||
|
sexp_t *new_sexp_atom(const char *buf, size_t bs, atom_t aty) {
|
||||||
|
sexp_t *sx = sexp_t_allocate();
|
||||||
|
|
||||||
|
if (sx == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sx->ty = SEXP_VALUE;
|
||||||
|
sx->aty = aty;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
sx->val = (char *)sexp_malloc(sizeof(char)*(bs+1));
|
||||||
|
#else
|
||||||
|
sx->val = sexp_malloc(sizeof(char)*(bs+1));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sx->val == NULL) {
|
||||||
|
sexp_t_deallocate(sx);
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sx->val_used = sx->val_allocated = bs+1;
|
||||||
|
|
||||||
|
strcpy(sx->val,buf);
|
||||||
|
|
||||||
|
sx->list = sx->next = NULL;
|
||||||
|
|
||||||
|
return sx;
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
#include <sexpr/sexp_errors.h>
|
||||||
|
#include <sexpr/sexp_memory.h>
|
||||||
|
|
||||||
|
#ifdef _SEXP_LIMIT_MEMORY_
|
||||||
|
|
||||||
|
static size_t sexp_max_memory = 32*1024*1024; /* default: 32MB */
|
||||||
|
static size_t sexp_used_memory = 0;
|
||||||
|
|
||||||
|
size_t get_sexp_max_memory() {
|
||||||
|
return sexp_max_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t get_sexp_used_memory() {
|
||||||
|
return sexp_used_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
int set_sexp_max_memory(size_t newsize) {
|
||||||
|
if (newsize > 0) {
|
||||||
|
if (newsize < sexp_used_memory) {
|
||||||
|
sexp_errno = SEXP_ERR_BAD_PARAM;
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
sexp_max_memory = newsize;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sexp_errno = SEXP_ERR_BAD_PARAM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sexp_max_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *sexp_malloc(size_t size) {
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
if (sexp_used_memory+size > sexp_max_memory) {
|
||||||
|
sexp_errno = SEXP_ERR_MEM_LIMIT;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = malloc(size);
|
||||||
|
if (ptr != NULL) sexp_used_memory += size;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *sexp_calloc(size_t count, size_t size) {
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
if (sexp_used_memory+(size*count) > sexp_max_memory) {
|
||||||
|
sexp_errno = SEXP_ERR_MEM_LIMIT;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = calloc(count, size);
|
||||||
|
if (ptr != NULL) sexp_used_memory += size*count;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sexp_free(void *ptr, size_t size) {
|
||||||
|
if (sexp_used_memory < size) {
|
||||||
|
fprintf(stderr,"ERROR: sexp_free called too many times!\n");
|
||||||
|
} else {
|
||||||
|
sexp_used_memory -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *sexp_realloc(void *ptr, size_t size, size_t oldsize) {
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (sexp_used_memory+(size-oldsize) > sexp_max_memory) {
|
||||||
|
sexp_errno = SEXP_ERR_MEM_LIMIT;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = realloc(ptr,size);
|
||||||
|
if (p != NULL) sexp_used_memory += size-oldsize;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _SEXP_LIMIT_MEMORY_ */
|
@ -0,0 +1,230 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sexpr/sexp_ops.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an s-expression, find the atom inside of it with the
|
||||||
|
* value matchine name, and return a reference to it. If the atom
|
||||||
|
* doesn't occur inside start, return NULL.
|
||||||
|
*/
|
||||||
|
sexp_t *
|
||||||
|
find_sexp (const char *name, sexp_t * start)
|
||||||
|
{
|
||||||
|
sexp_t *temp;
|
||||||
|
|
||||||
|
if (start == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (start->ty == SEXP_LIST)
|
||||||
|
{
|
||||||
|
temp = find_sexp (name, start->list);
|
||||||
|
if (temp == NULL)
|
||||||
|
return find_sexp (name, start->next);
|
||||||
|
else
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (start->val != NULL && strcmp (start->val, name) == 0)
|
||||||
|
return start;
|
||||||
|
else
|
||||||
|
return find_sexp (name, start->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL; /* shouldn't get here */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Breadth first search - look at ->next before ->list when seeing list
|
||||||
|
* elements of an expression.
|
||||||
|
*/
|
||||||
|
sexp_t *bfs_find_sexp(const char *str, sexp_t *sx) {
|
||||||
|
sexp_t *t = sx;
|
||||||
|
sexp_t *rt;
|
||||||
|
|
||||||
|
if (sx == NULL) return NULL;
|
||||||
|
|
||||||
|
while (t != NULL) {
|
||||||
|
if (t->ty == SEXP_VALUE) {
|
||||||
|
if (t->val != NULL) {
|
||||||
|
if (strcmp(t->val,str) == 0) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
t = sx;
|
||||||
|
while (t != NULL) {
|
||||||
|
if (t->ty == SEXP_LIST) {
|
||||||
|
rt = bfs_find_sexp(str,t->list);
|
||||||
|
if (rt != NULL) return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Give the length of a s-expression list.
|
||||||
|
*/
|
||||||
|
int sexp_list_length(const sexp_t *sx) {
|
||||||
|
int len = 0;
|
||||||
|
const sexp_t *t;
|
||||||
|
|
||||||
|
if (sx == NULL) return 0;
|
||||||
|
|
||||||
|
if (sx->ty == SEXP_VALUE) return 1;
|
||||||
|
|
||||||
|
t = sx->list;
|
||||||
|
|
||||||
|
while (t != NULL) {
|
||||||
|
len++;
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy an s-expression.
|
||||||
|
*/
|
||||||
|
sexp_t *copy_sexp(const sexp_t *s) {
|
||||||
|
sexp_t *snew;
|
||||||
|
|
||||||
|
if (s == NULL) return NULL;
|
||||||
|
|
||||||
|
snew = sexp_t_allocate();
|
||||||
|
if (snew == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize fields to null and zero, and fill in only those necessary. */
|
||||||
|
snew->val_allocated = snew->val_used = 0;
|
||||||
|
snew->val = NULL;
|
||||||
|
snew->list = snew->next = NULL;
|
||||||
|
snew->bindata = NULL;
|
||||||
|
snew->binlength = 0;
|
||||||
|
|
||||||
|
/* now start copying in data and setting appropriate fields. */
|
||||||
|
snew->ty = s->ty;
|
||||||
|
|
||||||
|
/* values */
|
||||||
|
if (snew->ty == SEXP_VALUE) {
|
||||||
|
snew->aty = s->aty;
|
||||||
|
|
||||||
|
/* binary */
|
||||||
|
if (snew->aty == SEXP_BINARY) {
|
||||||
|
if (s->bindata == NULL && s->binlength > 0) {
|
||||||
|
sexp_errno = SEXP_ERR_BADCONTENT;
|
||||||
|
sexp_t_deallocate(snew);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
snew->binlength = s->binlength;
|
||||||
|
|
||||||
|
if (s->bindata == NULL) {
|
||||||
|
snew->bindata = NULL;
|
||||||
|
} else {
|
||||||
|
/** allocate space **/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
snew->bindata = (char *)sexp_malloc(sizeof(char)*s->binlength);
|
||||||
|
#else
|
||||||
|
snew->bindata = sexp_malloc(sizeof(char)*s->binlength);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (snew->bindata == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
sexp_t_deallocate(snew);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(snew->bindata,s->bindata,s->binlength*sizeof(char));
|
||||||
|
|
||||||
|
/* non-binary */
|
||||||
|
} else {
|
||||||
|
if (s->val == NULL && (s->val_used > 0 || s->val_allocated > 0)) {
|
||||||
|
sexp_errno = SEXP_ERR_BADCONTENT;
|
||||||
|
sexp_t_deallocate(snew);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
snew->val_used = snew->val_allocated = s->val_used;
|
||||||
|
|
||||||
|
if (s->val == NULL) {
|
||||||
|
snew->val = NULL;
|
||||||
|
} else {
|
||||||
|
/** allocate space **/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
snew->val = (char *)sexp_malloc(sizeof(char)*s->val_used);
|
||||||
|
#else
|
||||||
|
snew->val = sexp_malloc(sizeof(char)*s->val_used);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (snew->val == NULL) {
|
||||||
|
sexp_errno = SEXP_ERR_MEMORY;
|
||||||
|
sexp_t_deallocate(snew);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(snew->val,s->val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snew->list = copy_sexp(s->list);
|
||||||
|
}
|
||||||
|
|
||||||
|
snew->next = copy_sexp(s->next);
|
||||||
|
|
||||||
|
return snew;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,130 @@
|
|||||||
|
/**
|
||||||
|
@cond IGNORE
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
SFSEXP: Small, Fast S-Expression Library version 1.2
|
||||||
|
Written by Matthew Sottile (matt@cs.uoregon.edu)
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
Copyright (2003-2006). The Regents of the University of California. This
|
||||||
|
material was produced under U.S. Government contract W-7405-ENG-36 for Los
|
||||||
|
Alamos National Laboratory, which is operated by the University of
|
||||||
|
California for the U.S. Department of Energy. The U.S. Government has rights
|
||||||
|
to use, reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
|
||||||
|
THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
|
||||||
|
LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to produce
|
||||||
|
derivative works, such modified software should be clearly marked, so as not
|
||||||
|
to confuse it with the version available from LANL.
|
||||||
|
|
||||||
|
Additionally, this library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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 Lesser General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, U SA
|
||||||
|
|
||||||
|
LA-CC-04-094
|
||||||
|
|
||||||
|
@endcond
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ported to Jari OS by Alfeiks Kaanoken <madtirra@jarios.org>
|
||||||
|
* (c) Jari OS Core dev team 2005-2009 <http://jarios.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sexpr/faststack.h>
|
||||||
|
#include <sexpr/sexp.h>
|
||||||
|
|
||||||
|
void _sexp_to_dotfile(const sexp_t *sx, FILE *fp) {
|
||||||
|
const sexp_t *tmp;
|
||||||
|
|
||||||
|
tmp = sx;
|
||||||
|
|
||||||
|
while (tmp != NULL) {
|
||||||
|
fprintf(fp," sx%lu [shape=record,label=\"",(unsigned long)tmp);
|
||||||
|
if (tmp->ty == SEXP_VALUE) {
|
||||||
|
fprintf(fp,"{ <type> SEXP_VALUE | ");
|
||||||
|
switch (tmp->aty) {
|
||||||
|
case SEXP_BASIC:
|
||||||
|
fprintf(fp,"SEXP_BASIC }");
|
||||||
|
break;
|
||||||
|
case SEXP_SQUOTE:
|
||||||
|
fprintf(fp,"SEXP_SQUOTE }");
|
||||||
|
break;
|
||||||
|
case SEXP_DQUOTE:
|
||||||
|
fprintf(fp,"SEXP_DQUOTE }");
|
||||||
|
break;
|
||||||
|
case SEXP_BINARY:
|
||||||
|
fprintf(fp,"SEXP_BINARY }");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(fp,"ATY Unknown }");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
fprintf(fp,"<type> SEXP_LIST");
|
||||||
|
|
||||||
|
if (tmp->ty == SEXP_LIST) {
|
||||||
|
fprintf(fp,"| <list> list | <next> next\"];\n");
|
||||||
|
|
||||||
|
if (tmp->list != NULL) {
|
||||||
|
fprintf(fp," sx%lu:list -> sx%lu:type;\n",
|
||||||
|
(unsigned long)tmp,
|
||||||
|
(unsigned long)tmp->list);
|
||||||
|
_sexp_to_dotfile(tmp->list,fp);
|
||||||
|
if (tmp->next != NULL)
|
||||||
|
fprintf(fp," sx%lu:next -> sx%lu:type;\n",
|
||||||
|
(unsigned long)tmp,
|
||||||
|
(unsigned long)tmp->next);
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tmp->aty == SEXP_BINARY)
|
||||||
|
fprintf(fp,"| binlength=%lu | <next> next\"];\n",
|
||||||
|
(unsigned long)tmp->binlength);
|
||||||
|
else
|
||||||
|
fprintf(fp,"| { va=%lu | vu=%lu } | val=%s | <next> next\"];\n",
|
||||||
|
(unsigned long)tmp->val_allocated,
|
||||||
|
(unsigned long)tmp->val_used,
|
||||||
|
tmp->val);
|
||||||
|
|
||||||
|
if (tmp->next != NULL)
|
||||||
|
fprintf(fp," sx%lu:next -> sx%lu:type;\n",
|
||||||
|
(unsigned long)tmp,
|
||||||
|
(unsigned long)tmp->next);
|
||||||
|
tmp = tmp->next;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sexp_errcode_t sexp_to_dotfile(const sexp_t *sx, const char *fname) {
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if (sx == NULL || fname == NULL) {
|
||||||
|
return SEXP_ERR_NULLSTRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(fname,"w+");
|
||||||
|
if (fp == NULL) {
|
||||||
|
return SEXP_ERR_IO;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp,"digraph sexp {\n");
|
||||||
|
|
||||||
|
_sexp_to_dotfile(sx,fp);
|
||||||
|
|
||||||
|
fprintf(fp,"}\n");
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return SEXP_ERR_OK;
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
# please keep this list sorted alphabetically
|
||||||
|
#
|
@ -0,0 +1,3 @@
|
|||||||
|
# List of source files containing translatable strings.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue