Run in batch (non-interactive) mode. Execute the commands provided on standard
input as usual, but do not print any prompts. Exit with status 0 if and only
if all commands complete successfully.
-
+.Pp
This option implies
.Fl -quiet .
.It Fl i , -interactive
as if it were entered at the prompt, then exit. This option can be specified
multiple times; all commands are run in the same order as specified on the
command line.
-
+.Pp
This option implies
.Fl -batch .
.It Fl f , -file Ar file
are specified, any
.Fl -file
option is ignored.
-
+.Pp
This option implies
.Fl -batch .
.It Fl V , -version
The C context-free grammar has many ambiguities regarding declarations.
Ordinarily, these ambiguities are resolved by the context in which the
declaration appears, such as which typedef names are currently in scope.
-
+.Pp
For example, the meaning of the declaration
.Ic int f(int (foo))
depends on whether or not a typedef named
declares
.Va f
as a function that takes an int and returns an int.
-
+.Pp
Since
.Nm
isn't a C compiler, on several occasions it has to arbitrarily pick one of two
Nick Bowler <nbowler@draconx.ca>
.Sh COPYRIGHT
Copyright \(co 2011 Nick Bowler
-
+.Pp
Permission is granted to copy, distribute and/or modify this manual under the
terms of the Do What The Fuck You Want To Public License, version 2.
.Sh SEE ALSO
.Nd C library for making sense of C declarations
.Sh SYNOPSIS
.Fd #include <cdecl.h>
-
+.Pp
.Fd struct cdecl *cdecl_parse_decl(const char *declstr);
.Fd struct cdecl *cdecl_parse_english(const char *english);
.Fd void cdecl_free(struct cdecl *decl);
-
+.Pp
.Fd size_t cdecl_explain(char *buf, size_t n, struct cdecl *decl);
.Fd size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl);
-
+.Pp
.Fd int cdecl_spec_kind(struct cdecl_declspec *spec);
.Sh DESCRIPTION
.Nm
the syntax of English declarations, please see the
.Xr cdecl99 1
manual page.
-
+.Pp
.Nm
is intended to be portable to any system with a working C implementation that
at least makes an effort to support C99. The library maintains no global state
struct cdecl_declarator *declarators;
};
.Ed
-
+.Pp
At the top level, every declaration consists of one or more declaration
specifiers followed by one or more full declarators; hence, the
.Va specifiers
identical for all elements of the list. But when the same kind of list is used
to represent function parameters, the specifiers may be different for each
element.
-
+.Pp
There are four kinds of declaration specifiers: storage-class, function and
type specifiers, as well as type qualifiers. All are represented by the
structure:
char *ident;
};
.Ed
-
+.Pp
When multiple declaration specifiers are present, they are represented as
a singly-linked list, one element for each specifier. Specifiers can appear
in any order. The function
-
+.Pp
.Fd int cdecl_spec_kind(struct cdecl_declspec *spec);
-
+.Pp
can be used to determine what kind of specifier
.Fa spec
is. The result is one of the following values:
.It Dv CDECL_SPEC_QUAL Ta Type qualifier.
.It Dv CDECL_SPEC_FUNC Ta Function specifier.
.El
-
+.Pp
The following table describes all the possible types of declaration specifiers.
.Bl -column ".Dv CDECL_TYPE_IMAGINARY"
.It Em Em Type Ta Em Description
.It Dv CDECL_QUAL_CONST Ta Fa const No type qualifier.
.It Dv CDECL_FUNC_INLINE Ta Fa inline No function specifier.
.El
-
+.Pp
Declarators are represented by the structure:
.Bd -literal -offset indent
struct cdecl_declarator {
} u;
};
.Ed
-
+.Pp
There are five types of declarators, distinguished by the
.Va type
struct member. The union
struct cdecl_declspec *qualifiers;
};
.Ed
-
+.Pp
If the
.Va qualifiers
member is non-null, then it points to the first element of a singly-linked list
uintmax_t length;
};
.Ed
-
+.Pp
If the
.Va vla
member is non-null, then this declarator is a variable-length array declarator.
_Bool variadic;
};
.Ed
-
+.Pp
If
.Va parameters
is null, then this is a non-prototype function declarator. Otherwise,
is true, then the function is variadic.
.Sh PARSING DECLARATIONS
To parse a declaration, the function
-
+.Pp
.Fd struct cdecl *cdecl_parse_decl(const char *declstr);
-
+.Pp
can be used. The provided string is parsed as a C declaration. If successful,
this function returns a pointer to an abstract syntax tree representing the
declaration. If the parse fails for any reason, the function returns NULL.
-
+.Pp
Similarly, English declarations can be parsed by using the function
-
+.Pp
.Fd struct cdecl *cdecl_parse_english(const char *english);
-
+.Pp
When the AST is no longer needed, it must be freed by passing it to the
function
-
+.Pp
.Fd void cdecl_free(struct cdecl *decl);
.Sh RENDERING DECLARATIONS
On the other hand, the abstract syntax tree can be rendered to a string for
output. One can use the function
-
+.Pp
.Fd size_t cdecl_explain(char *buf, size_t n, struct cdecl *decl);
-
+.Pp
to format the AST pointed to by
.Fa decl
into something resembling English. At most one full declarator is rendered
should be called on each
.Dv struct cdecl
in the singly-linked list.
-
+.Pp
In a manner similar to that of
.Xr snprintf 3 ,
at most
was written if a value less than
.Fa n
is returned.
-
+.Pp
Similarly, the function
-
+.Pp
.Fd size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl);
-
+.Pp
will render the AST pointed to by
.Fa decl
into C code.
Nick Bowler <nbowler@draconx.ca>
.Sh COPYRIGHT
Copyright \(co 2011 Nick Bowler
-
+.Pp
Permission is granted to copy, distribute and/or modify this manual under the
terms of the Do What The Fuck You Want To Public License, version 2.
.Sh SEE ALSO