shtool-scpp - GNU shtool C source file pre-processor
Contents
Description
This command is an additional ANSI C source file pre-processor for sharing cpp(1) code segments, internal
variables and internal functions. The intention for this comes from writing libraries in ANSI C. Here a
common shared internal header file is usually used for sharing information between the library source
files.
The operation is to parse special constructs in files, generate a few things out of these constructs and
insert them at position mark in tfile by writing the output to ofile. Additionally the files are never
touched or modified. Instead the constructs are removed later by the cpp(1) phase of the build process.
The only prerequisite is that every file has a ``"#include ""ofile"""'' at the top.
This command provides the following features: First it avoids namespace pollution and reduces prototyping
efforts for internal symbols by recognizing functions and variables which are defined with the storage
class identifier ``cname''. For instance if cname is ``intern'', a function ``"intern void *foobar(int
quux)"'' in one of the files is translated into both a ``"#define foobar __foobar"'' and a ``"extern void
*foobar(int quux);"'' in ofile. Additionally a global ``"#define" cname "/**/"'' is also created in ofile
to let the compiler silently ignore this additional storage class identifier.
Second, the library source files usually want to share "typedef"s, "#define"s, etc. over the source file
boundaries. To achieve this one can either place this stuff manually into tfile or use the second feature
of scpp: All code in files encapsulated with ``"#if "dname ... "#endif"'' is automatically copied to
ofile. Additionally a global ``"#define" dname 0'' is also created in ofile to let the compiler silently
skip this parts (because it was already found in the header).
Example
# Makefile
SRCS=foo_bar.c foo_quux.c
foo_p.h: foo_p.h.in
shtool scpp -o foo_p.h -t foo_p.h.in \
-M %%MARK%% -D cpp -C intern $(SRCS)
/* foo_p.h.in */
#ifndef FOO_P_H
#define FOO_P_H
%%MARK%%
#endif /* FOO_P_H */
/* foo_bar.c */
#include "foo_p.h"
#if cpp
#define OURS_INIT 4711
#endif
intern int ours;
static int myone = 0815;
intern int bar(void)
{
ours += myone;
}
/* foo_quux.c */
#include "foo_p.h"
int main(int argc, char *argv[])
{
int i;
ours = OURS_INIT
for (i = 0; i < 10; i++) {
bar();
printf("ours now %d\n", ours);
}
return 0;
}
History
The GNUshtoolscpp command was originally written by Ralf S. Engelschall <rse@engelschall.com> in 1999
for GNUshtool. Its was prompted by the need to have a pre-processing facility in the GNUpth project.
Name
shtool-scpp - GNU shtool C source file pre-processor
Options
The following command line options are available.
-v, --verbose
Display some processing information.
-p, --preserve
Preserves ofile independent of the generated ``#line'' lines. This is useful for Makefiles if the
real contents of ofile will not change, just line numbers. Default is to overwrite.
-f, --filterfilter
Apply one or more pre-processing sed(1) filter commands (usually of type ``"s/.../.../"'') to each
input file before their input is parsed. This option can occur multiple times.
-o, --outputofile
Output file name. Default is "lib.h".
-t, --templatetfile
Template file name. Default is "lib.h.in".
-M, --markmark
Mark to be replaced by generated constructs. Default is "%%MARK%%".
-D, --definedname
FIXME. Default is "cpp".
-C, --classcname
FIXME. Default is "intern".
See Also
shtool(1), cpp(1). 18-Jul-2008 shtool 2.0.8 SHTOOL-SCPP.TMP(1)
Synopsis
shtoolscpp [-v|--verbose] [-p|--preserve] [-f|--filterfilter] [-o|--outputofile] [-t|--templatetfile]
[-M|--markmark] [-D|--definedname] [-C|--classcname] file [file ...]
