# include <stddef.h>
# include <stdlib.h>
# include <string.h>
+
+# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+# define STREQ(L, R) (strcmp(L, R) == 0)
+# define STRNEQ(L, R) (!STREQ(L, R))
+
+/* Just like strncmp, but the second argument must be a literal string
+ and you don't specify the length. */
+# define STRNCMP_LIT(S, Literal) \
+ strncmp (S, "" Literal "", sizeof (Literal) - 1)
+
+/* Whether Literal is a prefix of S. */
+# define STRPREFIX_LIT(Literal, S) \
+ (STRNCMP_LIT (S, Literal) == 0)
+
# include <unistd.h>
# include <inttypes.h>
-#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
-#define STREQ(L, R) (strcmp(L, R) == 0)
-#define STRNEQ(L, R) (!STREQ(L, R))
-
# ifndef UINTPTR_MAX
/* This isn't perfect, but it's good enough for Bison, which needs
only to hash pointers. */
# endif
# endif
-/* The __-protected variants of `format' and `printf' attributes
+/* The __-protected variants of 'format' and 'printf' attributes
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
# define __format__ format
# define obstack_chunk_free free
# include <obstack.h>
-# define obstack_sgrow(Obs, Str) \
+/* String-grow: append Str to Obs. */
+
+# define obstack_sgrow(Obs, Str) \
obstack_grow (Obs, Str, strlen (Str))
/* Output Str escaped for our postprocessing (i.e., escape M4 special
# define obstack_escape(Obs, Str) \
do { \
- char const *p; \
- for (p = Str; *p; p++) \
- switch (*p) \
+ char const *p__; \
+ for (p__ = Str; *p__; p__++) \
+ switch (*p__) \
{ \
case '$': obstack_sgrow (Obs, "$]["); break; \
case '@': obstack_sgrow (Obs, "@@" ); break; \
case '[': obstack_sgrow (Obs, "@{" ); break; \
case ']': obstack_sgrow (Obs, "@}" ); break; \
- default: obstack_1grow (Obs, *p ); break; \
+ default: obstack_1grow (Obs, *p__ ); break; \
} \
} while (0)
/* Append the ending 0, finish Obs, and return the string. */
-# define obstack_finish0(Obs) \
+# define obstack_finish0(Obs) \
(obstack_1grow (Obs, '\0'), (char *) obstack_finish (Obs))