# 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>
typedef size_t uintptr_t;
# endif
-// Version mismatch.
+/* Version mismatch. */
# define EX_MISMATCH 63
/*---------.
# 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)
} while (0)
+/* Append the ending 0, finish Obs, and return the string. */
+# define obstack_finish0(Obs) \
+ (obstack_1grow (Obs, '\0'), (char *) obstack_finish (Obs))
/*-----------------------------------------.