I have noticed and corrected a number of portability problems with
byacc's generated parser, also adjusted things so that it does not
provoke a couple of gcc warnings that are not commonly requested but
that my project uses.
More specifically:
- stdlib.h is not available in pre-C89 environments. I made its
inclusion conditional on __STDC__ || __cplusplus, which is not
perfect but will do. Otherwise, I declare malloc and realloc by
hand.
- 'const' is not available either in K+R C. #define it to nothing
if neither __STDC__ nor __cplusplus is defined.
- Change the declarations of yyname[] and yyrule[] placed in y.code.c
in -r mode to match their actual definitions in y.tab.c.
- gcc can be asked to issue warnings if a function definition is
seen without a previous prototype - even if the definition is
written in prototype form. The project I'm using byacc with has
this warning turned on. I therefore added explicit prototypes for
both yygrowstack and yyparse, conditioned on __STDC__ ||
__cplusplus.
A patch is appended. Also, I don't have a patch for this, but I have
to change the line in the Makefile reading
MAN1=yacc.1 yyfix.1
to use MAN= instead, or yyfix.1 is not installed. This may be a
problem with my copy of pmake.
Please cc: me directly on any responses, I am not subscribed to this
list.
Thank you.
zw
--- byacc-1.9.1.orig/skeleton.c
+++ byacc-1.9.1/skeleton.c
@@ -54,11 +54,13 @@
char *banner[] =
{
+ "#if !(defined(__cplusplus) || __STDC__)",
+ "#define const",
+ "#endif",
"#ifndef lint",
"static char const ",
"yyrcsid[] = \"$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06
bde Exp $\";",
"#endif",
- "#include <stdlib.h>",
"#define YYBYACC 1",
"#define YYMAJOR 1",
"#define YYMINOR 9",
@@ -84,8 +86,8 @@
"extern const short yytable[];",
"extern const short yycheck[];",
"#if YYDEBUG",
- "extern char *yyname[];",
- "extern char *yyrule[];",
+ "extern const char * const yyname[];",
+ "extern const char * const yyrule[];",
"#endif",
0
};
@@ -127,6 +129,14 @@
char *body[] =
{
"/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
+ "#if defined(__cplusplus) || __STDC__",
+ "#include <stdlib.h>",
+ "static int yygrowstack(void);",
+ "#else",
+ "char *malloc();",
+ "char *realloc();",
+ "#endif",
+ "",
"static int yygrowstack()",
"{",
" int newsize, i;",
@@ -177,6 +187,7 @@
"#if defined(__cplusplus) || __STDC__",
"#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM",
"#define YYPARSE_PARAM_DECL",
+ "extern int yyparse (YYPARSE_PARAM_ARG);",
"#else /* ! ANSI-C/C++ */",
"#define YYPARSE_PARAM_ARG YYPARSE_PARAM",
"#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;",
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message