Even though we have a fallback for _Bool when building the library,
it is missing in some source files that include cdecl.h. But more
importantly, it is not available to downstream users of the installed
header file.
As far as I'm aware, all compilers which support _Bool in any mode also
support it in strict C89 mode, so it should be sufficient to just use
_Bool if configure detected support for it. We integrate the newfangled
bake-config script so that the installed header embeds this config.
There is also one inline function which returns _Bool. We can just
change it to return int instead, since there is no ABI implication.
dist_man_MANS = doc/cdecl99.1 doc/libcdecl.3
dist_man_MANS = doc/cdecl99.1 doc/libcdecl.3
-include_HEADERS = src/cdecl.h
noinst_HEADERS = conf_pre.h conf_post.h common/src/help.h common/src/tap.h \
noinst_HEADERS = conf_pre.h conf_post.h common/src/help.h common/src/tap.h \
- common/src/xtra.h src/scan.h src/parse.h t/declgen.h t/test.h
+ common/src/xtra.h src/cdecl.h src/scan.h src/parse.h \
+ t/declgen.h t/test.h
+nodist_include_HEADERS = src/config/cdecl.h
+src/config/cdecl.h: config.h src/cdecl.h $(DX_BASEDIR)/scripts/bake-config.awk
+ $(AM_V_GEN) $(MKDIR_P) $(@D)
+ $(AM_V_at) $(AWK) -f $(DX_BASEDIR)/scripts/bake-config.awk \
+ config.h $(srcdir)/src/cdecl.h >$@-t
+ $(AM_V_at) mv -f $@-t $@
+EXTRA_DIST += $(DX_BASEDIR)/scripts/bake-config.awk
+CLEANFILES += src/config/cdecl.h
+
shared_gl_objects = $(gnulib_symfiles:.glsym=.lo)
static_gl_objects = $(gnulib_extra_objects:.lo=.@OBJEXT@)
shared_gl_objects = $(gnulib_symfiles:.glsym=.lo)
static_gl_objects = $(gnulib_extra_objects:.lo=.@OBJEXT@)
t_installcheck_SHORTNAME = x
installcheck-local:
t_installcheck_SHORTNAME = x
installcheck-local:
- rm -f t/installcheck$(EXEEXT)
+ rm -f t/installcheck$(EXEEXT) $(t_installcheck_OBJECTS)
$(MAKE) $(AM_MAKEFLAGS) t/installcheck$(EXEEXT)
t/installcheck$(EXEEXT) | diff - $(srcdir)/t/installcheck.exp
.PHONY: installcheck-local
$(MAKE) $(AM_MAKEFLAGS) t/installcheck$(EXEEXT)
t/installcheck$(EXEEXT) | diff - $(srcdir)/t/installcheck.exp
.PHONY: installcheck-local
.Dt LIBCDECL \&3 "Cdecl99 Developer's Manual"
.Os cdecl99
.Sh NAME
.Dt LIBCDECL \&3 "Cdecl99 Developer's Manual"
.Os cdecl99
.Sh NAME
.Fd const struct cdecl_error *cdecl_get_error(void);
.Pp
.Fd int cdecl_spec_kind(struct cdecl_declspec *spec);
.Fd const struct cdecl_error *cdecl_get_error(void);
.Pp
.Fd int cdecl_spec_kind(struct cdecl_declspec *spec);
-.Fd bool cdecl_is_abstract(struct cdecl_declarator *declarator);
+.Fd int cdecl_is_abstract(struct cdecl_declarator *declarator);
.Sh DESCRIPTION
.Nm
provides support for parsing C declarations and translating them to something
.Sh DESCRIPTION
.Nm
provides support for parsing C declarations and translating them to something
Since a null declarator may be deeply nested in the declarator chain, the
function
.Pp
Since a null declarator may be deeply nested in the declarator chain, the
function
.Pp
-.Fd bool cdecl_is_abstract(struct cdecl_declarator *declarator);
+.Fd int cdecl_is_abstract(struct cdecl_declarator *declarator);
.Pp
can be used to determine whether or not a given declarator declares an
identifier.
.Pp
can be used to determine whether or not a given declarator declares an
identifier.
Otherwise, this is an incomplete array declarator.
.Ss Function Declarators
.Bd -literal -offset indent
Otherwise, this is an incomplete array declarator.
.Ss Function Declarators
.Bd -literal -offset indent
+typedef _Bool cdecl_bool; /* depends on configuration */
struct cdecl_function {
struct cdecl *parameters;
struct cdecl_function {
struct cdecl *parameters;
};
.Ed
.Pp
If
.Va parameters
};
.Ed
.Pp
If
.Va parameters
-is null, then this is a non-prototype function declarator.
+is null, then this is a non-prototype function declarator with an empty
+identifier list.
Otherwise,
.Va parameters
points to the first element of a singly-linked list of declarations
Otherwise,
.Va parameters
points to the first element of a singly-linked list of declarations
one full declarator (abstract or otherwise).
If
.Va variadic
one full declarator (abstract or otherwise).
If
.Va variadic
-is true, then the function is variadic.
+is non-zero, then the function is variadic.
+.Pp
+Please note that if the compiler used to build the library does not support
+.Vt _Bool ,
+then
+.Vt cdecl_bool
+will be defined as
+.Vt signed char
+instead.
+In most cases these will have a compatible binary representation, provided
+that applications do not set
+.Va variadic
+to any values besides 0 or 1.
-Note that old-style function declarations with non-empty identifier lists are
-not directly represented here: this is because they are syntactically identical
-to a prototype where every parameter is a typedef name.
-Since
+Old-style function declarations with non-empty identifier lists cannot be
+directly represented by this structure.
+Such declarations are syntactically identical to a prototype with every
+parameter consisting solely of a typedef name.
-isn't a C compiler, there is no way for its parser to tell these two kinds of
-declarations apart.
+cannot tell these apart when parsing and thus will return a parameter
+list, which can be rendered as expected.
.Sh ERROR HANDLING
Some functions in
.Nm
.Sh ERROR HANDLING
Some functions in
.Nm
/*.stamp
/cmdlist.h
/commands.h
/*.stamp
/cmdlist.h
/commands.h
/errmsg.h
/execute.c
/keywords.c
/errmsg.h
/execute.c
/keywords.c
- * Copyright © 2011, 2021, 2023 Nick Bowler
+ * Copyright © 2011, 2021, 2023 Nick Bowler
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stddef.h>
#include <stdint.h>
#include <stddef.h>
#include <stdint.h>
+/* Compatibility typedefs */
+#if HAVE__BOOL
+typedef _Bool cdecl_bool;
+#else
+typedef signed char cdecl_bool;
+#endif
+
/* Declaration specifier kinds. */
enum {
CDECL_SPEC_TYPE = 256,
CDECL_SPEC_STOR = 512,
CDECL_SPEC_QUAL = 1024,
/* Declaration specifier kinds. */
enum {
CDECL_SPEC_TYPE = 256,
CDECL_SPEC_STOR = 512,
CDECL_SPEC_QUAL = 1024,
- CDECL_SPEC_FUNC = 2048,
CDECL_QUAL_RESTRICT = CDECL_SPEC_QUAL,
CDECL_QUAL_VOLATILE,
CDECL_QUAL_CONST,
CDECL_QUAL_RESTRICT = CDECL_SPEC_QUAL,
CDECL_QUAL_VOLATILE,
CDECL_QUAL_CONST,
- CDECL_FUNC_INLINE = CDECL_SPEC_FUNC,
+ CDECL_FUNC_INLINE = CDECL_SPEC_FUNC
};
/* Declarator types. */
};
/* Declarator types. */
CDECL_DECL_IDENT,
CDECL_DECL_POINTER,
CDECL_DECL_ARRAY,
CDECL_DECL_IDENT,
CDECL_DECL_POINTER,
CDECL_DECL_ARRAY,
} array;
struct cdecl_function {
struct cdecl *parameters;
} array;
struct cdecl_function {
struct cdecl *parameters;
} function;
} u;
} *declarators;
} function;
} u;
} *declarators;
return spec->type & ~(CDECL_SPEC_TYPE-1u);
}
return spec->type & ~(CDECL_SPEC_TYPE-1u);
}
-static inline _Bool cdecl_is_abstract(const struct cdecl_declarator *d)
+static inline int cdecl_is_abstract(const struct cdecl_declarator *d)
{
while (d->child)
d = d->child;
{
while (d->child)
d = d->child;
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+/* Define configuration macros used in cdecl.h to expand to syntax errors. */
+#define HAVE__BOOL (0xdeadc0de * "HAVE__BOOL")
+
#include <cdecl.h>
int main(void)
#include <cdecl.h>
int main(void)