+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yys;
+ YYSTYPE yyv;
+#if YYLSP_NEEDED
+ YYLTYPE yyl;
+#endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+#define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+#if YYLSP_NEEDED
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ + 2 * YYSTACK_GAP_MAX)
+#else
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAX)
+#endif
+
+/* Relocate the TYPE STACK from its old location to the new one. The
+ local variables SIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+#define YYSTACK_RELOCATE(Type, Stack) \
+do \
+ { \
+ size_t yynewbytes; \
+ __yy_memcpy (yyptr, (char *) (Stack), size * sizeof (Type)); \
+ (Stack) = (Type *) yyptr; \
+ yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX; \
+ yynewbytes -= yynewbytes % sizeof (union yyalloc); \
+ yyptr += yynewbytes; \
+ } \
+while (0)
+