1 /* GNU m4 -- A simple macro processor
2 Copyright (C) 1989-1994, 2004-2010, 2013 Free Software Foundation,
5 This file is part of GNU M4.
7 GNU M4 is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU M4 is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 /* This module handles frozen files. */
27 #include "binary-io.h"
28 #include "close-stream.h"
33 static void produce_mem_dump (FILE *, const char *, size_t);
34 static void produce_resyntax_dump (m4
*, FILE *);
35 static void produce_syntax_dump (FILE *, m4_syntax_table
*, char);
36 static void produce_module_dump (FILE *, m4_module
*);
37 static void produce_symbol_dump (m4
*, FILE *, m4_symbol_table
*);
38 static void *dump_symbol_CB (m4_symbol_table
*, const char *,
39 size_t, m4_symbol
*, void *);
40 static void issue_expect_message (m4
*, int);
41 static int decode_char (m4
*, FILE *, bool *);
44 /* Dump an ASCII-encoded representation of LEN bytes at MEM to FILE.
45 MEM may contain embedded NUL characters. */
47 produce_mem_dump (FILE *file
, const char *mem
, size_t len
)
49 char *quoted
= quotearg_style_mem (escape_quoting_style
, mem
, len
);
50 /* Any errors will be detected by ferror later. */
51 fwrite (quoted
, strlen (quoted
), 1, file
);
55 /* Produce the 'R14\nPOSIX_EXTENDED\n' frozen file dump of the current
56 default regular expression syntax. Note that it would be a little
57 faster to use the encoded syntax in this format as used by re_compile(),
58 but the representation of RE_SYNTAX_POSIX_EXTENDED may change in
59 future (or alternative) implementations of re_compile, so we use an
60 unencoded representation here. */
63 produce_resyntax_dump (m4
*context
, FILE *file
)
65 int code
= m4_get_regexp_syntax_opt (context
);
67 /* Don't dump default syntax code (`0' for GNU_EMACS). */
70 const char *resyntax
= m4_regexp_syntax_decode (code
);
73 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
74 _("invalid regexp syntax code `%d'"), code
);
76 /* No need to use produce_mem_dump, since we know all resyntax
77 names are already ASCII-encoded. */
78 xfprintf (file
, "R%zu\n%s\n", strlen (resyntax
), resyntax
);
83 produce_syntax_dump (FILE *file
, m4_syntax_table
*syntax
, char ch
)
85 char buf
[UCHAR_MAX
+ 1];
86 int code
= m4_syntax_code (ch
);
90 for (i
= 0; i
< UCHAR_MAX
+ 1; ++i
)
91 if (m4_has_syntax (syntax
, i
, code
) && code
!= syntax
->orig
[i
])
94 /* If code falls in M4_SYNTAX_MASKS, then we must treat it
95 specially, since it will not be found in syntax->orig. */
97 && ((code
== M4_SYNTAX_RQUOTE
&& *buf
== *DEF_RQUOTE
)
98 || (code
== M4_SYNTAX_ECOMM
&& *buf
== *DEF_ECOMM
)))
101 if (count
|| (code
& M4_SYNTAX_MASKS
))
103 xfprintf (file
, "S%c%d\n", ch
, count
);
104 produce_mem_dump (file
, buf
, count
);
109 /* Store the debug mode in textual format. */
111 produce_debugmode_state (FILE *file
, int flags
)
113 /* This code tracks the number of bits in M4_DEBUG_TRACE_VERBOSE. */
116 verify ((1 << (sizeof str
- 1)) - 1 == M4_DEBUG_TRACE_VERBOSE
);
117 if (flags
& M4_DEBUG_TRACE_ARGS
)
119 if (flags
& M4_DEBUG_TRACE_EXPANSION
)
121 if (flags
& M4_DEBUG_TRACE_QUOTE
)
123 if (flags
& M4_DEBUG_TRACE_ALL
)
125 if (flags
& M4_DEBUG_TRACE_LINE
)
127 if (flags
& M4_DEBUG_TRACE_FILE
)
129 if (flags
& M4_DEBUG_TRACE_PATH
)
131 if (flags
& M4_DEBUG_TRACE_CALL
)
133 if (flags
& M4_DEBUG_TRACE_INPUT
)
135 if (flags
& M4_DEBUG_TRACE_CALLID
)
137 if (flags
& M4_DEBUG_TRACE_MODULE
)
139 if (flags
& M4_DEBUG_TRACE_STACK
)
141 if (flags
& M4_DEBUG_TRACE_DEREF
)
143 if (flags
& M4_DEBUG_TRACE_OUTPUT_DUMPDEF
)
147 xfprintf (file
, "d%d\n%s\n", offset
, str
);
150 /* The modules must be dumped in the order in which they will be
151 reloaded from the frozen file. libltdl stores handles in a push
152 down stack, so we need to dump them in the reverse order to that. */
154 produce_module_dump (FILE *file
, m4_module
*module
)
156 const char *name
= m4_get_module_name (module
);
157 size_t len
= strlen (name
);
159 module
= m4__module_next (module
);
161 produce_module_dump (file
, module
);
163 xfprintf (file
, "M%zu\n", len
);
164 produce_mem_dump (file
, name
, len
);
168 /* Process all entries in one bucket, from the last to the first.
169 This order ensures that, at reload time, pushdef's will be
170 executed with the oldest definitions first. */
172 produce_symbol_dump (m4
*context
, FILE *file
, m4_symbol_table
*symtab
)
174 if (m4_symtab_apply (symtab
, true, dump_symbol_CB
, file
))
178 /* Given a stack of symbol values starting with VALUE, destructively
179 reverse the stack and return the pointer to what was previously the
180 last value in the stack. VALUE may be NULL. The symbol table that
181 owns the value stack should not be modified or consulted until this
182 is called again to undo the effect. */
183 static m4_symbol_value
*
184 reverse_symbol_value_stack (m4_symbol_value
*value
)
186 m4_symbol_value
*result
= NULL
;
187 m4_symbol_value
*next
;
190 next
= VALUE_NEXT (value
);
191 VALUE_NEXT (value
) = result
;
198 /* Dump the stack of values for SYMBOL, with name SYMBOL_NAME and
199 length LEN, located in SYMTAB. USERDATA is interpreted as the
202 dump_symbol_CB (m4_symbol_table
*symtab
, const char *symbol_name
, size_t len
,
203 m4_symbol
*symbol
, void *userdata
)
205 FILE *file
= (FILE *) userdata
;
206 m4_symbol_value
*value
;
207 m4_symbol_value
*last
;
209 last
= value
= reverse_symbol_value_stack (m4_get_symbol_value (symbol
));
212 m4_module
*module
= VALUE_MODULE (value
);
213 const char *module_name
= module
? m4_get_module_name (module
) : NULL
;
214 size_t module_len
= module_name
? strlen (module_name
) : 0;
216 if (m4_is_symbol_value_text (value
))
218 const char *text
= m4_get_symbol_value_text (value
);
219 size_t text_len
= m4_get_symbol_value_len (value
);
220 xfprintf (file
, "T%zu,%zu", len
, text_len
);
222 xfprintf (file
, ",%zu", module_len
);
225 produce_mem_dump (file
, symbol_name
, len
);
227 produce_mem_dump (file
, text
, text_len
);
231 produce_mem_dump (file
, module_name
, module_len
);
235 else if (m4_is_symbol_value_func (value
))
237 const m4_builtin
*bp
= m4_get_symbol_value_builtin (value
);
240 assert (!"INTERNAL ERROR: builtin not found in builtin table!");
241 bp_len
= strlen (bp
->name
);
243 xfprintf (file
, "F%zu,%zu", len
, bp_len
);
245 xfprintf (file
, ",%zu", module_len
);
248 produce_mem_dump (file
, symbol_name
, len
);
250 produce_mem_dump (file
, bp
->name
, bp_len
);
254 produce_mem_dump (file
, module_name
, module_len
);
258 else if (m4_is_symbol_value_placeholder (value
))
259 ; /* Nothing to do for a builtin we couldn't reload earlier. */
261 assert (!"dump_symbol_CB");
262 value
= VALUE_NEXT (value
);
264 reverse_symbol_value_stack (last
);
265 if (m4_get_symbol_traced (symbol
))
266 xfprintf (file
, "t%zu\n%s\n", len
, symbol_name
);
270 /* Produce a frozen state to the given file NAME. */
272 produce_frozen_state (m4
*context
, const char *name
)
274 FILE *file
= fopen (name
, O_BINARY
? "wb" : "w");
276 const m4_string_pair
*pair
;
280 m4_error (context
, 0, errno
, NULL
, _("cannot open %s"),
281 quotearg_style (locale_quoting_style
, name
));
285 /* Write a recognizable header. */
287 xfprintf (file
, "# This is a frozen state file generated by GNU %s %s\n",
289 fputs ("V2\n", file
);
291 /* Dump quote delimiters. */
292 pair
= m4_get_syntax_quotes (M4SYNTAX
);
293 if (STRNEQ (pair
->str1
, DEF_LQUOTE
) || STRNEQ (pair
->str2
, DEF_RQUOTE
))
295 xfprintf (file
, "Q%zu,%zu\n", pair
->len1
, pair
->len2
);
296 produce_mem_dump (file
, pair
->str1
, pair
->len1
);
298 produce_mem_dump (file
, pair
->str2
, pair
->len2
);
302 /* Dump comment delimiters. */
303 pair
= m4_get_syntax_comments (M4SYNTAX
);
304 if (STRNEQ (pair
->str1
, DEF_BCOMM
) || STRNEQ (pair
->str2
, DEF_ECOMM
))
306 xfprintf (file
, "C%zu,%zu\n", pair
->len1
, pair
->len2
);
307 produce_mem_dump (file
, pair
->str1
, pair
->len1
);
309 produce_mem_dump (file
, pair
->str2
, pair
->len2
);
313 /* Dump regular expression syntax. */
314 produce_resyntax_dump (context
, file
);
316 /* Dump syntax table. */
317 str
= "I@WLBOD${}SA(),RE";
319 produce_syntax_dump (file
, M4SYNTAX
, *str
++);
321 /* Dump debugmode state. */
322 produce_debugmode_state (file
, m4_get_debug_level_opt (context
));
324 /* Dump all loaded modules. */
325 produce_module_dump (file
, m4__module_next (NULL
));
327 /* Dump all symbols. */
328 produce_symbol_dump (context
, file
, M4SYMTAB
);
330 /* Let diversions be issued from output.c module, its cleaner to have this
331 piece of code there. */
332 m4_freeze_diversions (context
, file
);
336 fputs ("# End of frozen state file\n", file
);
337 if (close_stream (file
) != 0)
338 m4_error (context
, EXIT_FAILURE
, errno
, NULL
,
339 _("unable to create frozen state"));
342 /* Issue a message saying that some character is an EXPECTED character. */
344 issue_expect_message (m4
*context
, int expected
)
346 if (expected
== '\n')
347 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
348 _("expecting line feed in frozen file"));
350 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
351 _("expecting character `%c' in frozen file"), expected
);
355 /* Reload frozen state. */
357 /* Read the next character from the IN stream. Various escape
358 sequences are converted, and returned. EOF is returned if the end
359 of file is reached whilst reading the character, or on an
360 unrecognized escape sequence. */
363 decode_char (m4
*context
, FILE *in
, bool *advance_line
)
371 m4_set_current_line (context
, m4_get_current_line (context
) + 1);
372 *advance_line
= false;
380 case 'a': return '\a';
381 case 'b': return '\b';
382 case 'f': return '\f';
383 case 'n': return '\n';
384 case 'r': return '\r';
385 case 't': return '\t';
386 case 'v': return '\v';
387 case '\\': return '\\';
391 m4_set_current_line (context
, m4_get_current_line (context
) + 1);
396 if (next
>= '0' && next
<= '9')
397 ch
= (next
- '0') * 16;
398 else if (next
>= 'a' && next
<= 'f')
399 ch
= (next
- 'a' + 10) * 16;
400 else if (next
>= 'A' && next
<= 'F')
401 ch
= (next
- 'A' + 10) * 16;
405 if (next
>= '0' && next
<= '9')
407 else if (next
>= 'a' && next
<= 'f')
408 ch
+= next
- 'a' + 10;
409 else if (next
>= 'A' && next
<= 'F')
410 ch
+= next
- 'A' + 10;
414 case '0': case '1': case '2': case '3':
418 case '4': case '5': case '6': case '7':
419 if (ch
>= '0' && ch
<= '7')
421 value
= value
* 8 + ch
- '0';
429 if (ch
>= '0' && ch
<= '7')
430 value
= value
* 8 + ch
- '0';
441 *advance_line
= true;
446 /* Reload state from the given file NAME. We are seeking speed,
450 reload_frozen_state (m4
*context
, const char *name
)
461 bool advance_line
= true;
463 #define GET_CHARACTER \
468 m4_set_current_line (context, \
469 m4_get_current_line (context) + 1); \
470 advance_line = false; \
472 character = getc (file); \
473 if (character == '\n') \
474 advance_line = true; \
478 #define GET_NUMBER(Number, AllowNeg) \
481 unsigned int n = 0; \
482 while (isdigit (character) && n <= INT_MAX / 10) \
484 n = 10 * n + character - '0'; \
487 if (((AllowNeg) ? INT_MIN: INT_MAX) < n \
488 || isdigit (character)) \
489 m4_error (context, EXIT_FAILURE, 0, NULL, \
490 _("integer overflow in frozen file")); \
495 #define GET_STRING(File, Buf, BufSize, StrLen, UseChar) \
498 size_t len = (StrLen); \
503 ungetc (character, File); \
506 assert (character == '\n'); \
507 advance_line = false; \
510 CHECK_ALLOCATION ((Buf), (BufSize), len); \
515 ? decode_char (context, File, &advance_line) \
518 m4_error (context, EXIT_FAILURE, 0, NULL, \
519 _("premature end of frozen file")); \
524 while (version > 1 && character == '\\') \
533 #define VALIDATE(Expected) \
536 if (character != (Expected)) \
537 issue_expect_message (context, (Expected)); \
541 #define CHECK_ALLOCATION(Where, Allocated, Needed) \
544 if ((Needed) + 1 > (Allocated)) \
547 (Allocated) = (Needed) + 1; \
548 (Where) = xcharalloc (Allocated); \
553 /* Skip comments (`#' at beginning of line) and blank lines, setting
554 character to the next directive or to EOF. */
556 #define GET_DIRECTIVE \
560 if (character == '#') \
562 while (character != EOF && character != '\n') \
567 while (character == '\n')
569 filepath
= m4_path_search (context
, name
, NULL
);
570 file
= m4_fopen (context
, filepath
, "r");
572 m4_error (context
, EXIT_FAILURE
, errno
, NULL
, _("cannot open %s"),
573 quotearg_style (locale_quoting_style
, name
));
574 m4_set_current_file (context
, name
);
577 string
[0] = xcharalloc (allocated
[0]);
579 string
[1] = xcharalloc (allocated
[1]);
581 string
[2] = xcharalloc (allocated
[2]);
583 /* Validate format version. Accept both `1' (m4 1.3 and 1.4.x) and
588 GET_NUMBER (version
, false);
594 m4__module_open (context
, "m4", NULL
);
595 if (m4_get_posixly_correct_opt (context
))
596 m4__module_open (context
, "traditional", NULL
);
598 m4__module_open (context
, "gnu", NULL
);
599 /* Disable { and } categories, since ${11} was not supported in
601 m4_set_syntax (M4SYNTAX
, 'O', '+', "{}", 2);
605 m4_error (context
, EXIT_MISMATCH
, 0, NULL
,
606 _("frozen file version %d greater than max supported of 2"),
609 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
610 _("ill-formed frozen file, version directive expected"));
615 while (character
!= EOF
)
620 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
621 _("ill-formed frozen file, unknown directive %c"),
625 /* Set debugmode flags. */
628 /* 'd' operator is not supported in format version 1. */
629 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
630 ill-formed frozen file, version 2 directive `%c' encountered"), 'd');
634 GET_NUMBER (number
[0], false);
636 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
639 if (m4_debug_decode (context
, string
[0], number
[0]) < 0)
640 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
641 _("unknown debug mode %s"),
642 quotearg_style_mem (locale_quoting_style
, string
[0],
649 /* Get string lengths. */
651 GET_NUMBER (number
[0], false);
654 GET_NUMBER (number
[1], false);
656 if (character
== ',')
660 /* 'F' operator accepts an optional third argument for
661 format versions 2 or later. */
663 GET_NUMBER (number
[2], false);
666 /* 3 argument 'F' operations are invalid for format
668 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
669 ill-formed frozen file, version 2 directive `%c' encountered"), 'F');
679 /* Get string contents. */
681 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
687 GET_STRING (file
, string
[1], allocated
[1], number
[1], true);
688 if (version
> 1 && number
[2])
693 GET_STRING (file
, string
[2], allocated
[2], number
[2], true);
696 /* Enter a macro having a builtin function as a definition. */
698 m4_module
*module
= NULL
;
699 m4_symbol_value
*token
;
701 // Builtins cannot contain a NUL byte.
702 if (strlen (string
[1]) < number
[1])
703 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
704 ill-formed frozen file, invalid builtin %s encountered"),
705 quotearg_style_mem (locale_quoting_style
, string
[1],
709 if (strlen (string
[2]) < number
[2])
710 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
711 ill-formed frozen file, invalid module %s encountered"),
712 quotearg_style_mem (locale_quoting_style
,
713 string
[2], number
[2]));
714 module
= m4__module_find (string
[2]);
716 token
= m4_builtin_find_by_name (module
, string
[1]);
720 token
= (m4_symbol_value
*) xzalloc (sizeof *token
);
721 m4_set_symbol_value_placeholder (token
, xstrdup (string
[1]));
722 VALUE_MODULE (token
) = module
;
723 VALUE_MIN_ARGS (token
) = 0;
724 VALUE_MAX_ARGS (token
) = -1;
726 m4_symbol_pushdef (M4SYMTAB
, string
[0], number
[0], token
);
732 /* Load a module, but *without* perturbing the symbol table.
733 Note that any expansion from loading the module which would
734 have been seen when loading it originally is discarded
735 when loading it from a frozen file. */
739 /* 'M' operator is not supported in format version 1. */
740 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
741 ill-formed frozen file, version 2 directive `%c' encountered"), 'M');
745 GET_NUMBER (number
[0], false);
747 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
750 if (strlen (string
[0]) < number
[0])
751 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
752 ill-formed frozen file, invalid module %s encountered"),
753 quotearg_style_mem (locale_quoting_style
,
754 string
[0], number
[0]));
755 m4__module_open (context
, string
[0], NULL
);
763 /* 'R' operator is not supported in format version 1. */
764 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
765 ill-formed frozen file, version 2 directive `%c' encountered"), 'R');
769 GET_NUMBER (number
[0], false);
771 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
774 m4_set_regexp_syntax_opt (context
,
775 m4_regexp_syntax_encode (string
[0]));
776 if (m4_get_regexp_syntax_opt (context
) < 0
777 || strlen (string
[0]) < number
[0])
779 m4_error (context
, EXIT_FAILURE
, 0, NULL
,
780 _("bad syntax-spec %s"),
781 quotearg_style_mem (locale_quoting_style
, string
[0],
791 /* 'S' operator is not supported in format version 1. */
792 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
793 ill-formed frozen file, version 2 directive `%c' encountered"), 'S');
799 GET_NUMBER (number
[0], false);
801 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
803 /* Syntax under M4_SYNTAX_MASKS is handled specially; all
804 other characters are additive. */
805 if ((m4_set_syntax (M4SYNTAX
, syntax
,
806 (m4_syntax_code (syntax
) & M4_SYNTAX_MASKS
807 ? '=' : '+'), string
[0], number
[0]) < 0)
810 m4_error (context
, 0, 0, NULL
,
811 _("undefined syntax code %c"), syntax
);
816 /* Trace a macro name. */
819 /* 't' operator is not supported in format version 1. */
820 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
821 ill-formed frozen file, version 2 directive `%c' encountered"), 't');
825 GET_NUMBER (number
[0], false);
827 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
830 m4_set_symbol_name_traced (M4SYMTAB
, string
[0], number
[0], true);
837 operation
= character
;
840 /* Get string lengths. */
842 if (operation
== 'D' && character
== '-')
844 /* Accept a negative diversion number. */
846 GET_NUMBER (number
[0], true);
847 number
[0] = -number
[0];
850 GET_NUMBER (number
[0], false);
853 GET_NUMBER (number
[1], false);
856 /* Get string contents. */
857 if (operation
!= 'D')
859 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
868 GET_STRING (file
, string
[1], allocated
[1], number
[1], true);
871 /* Act according to operation letter. */
877 /* Change comment strings. */
879 m4_set_comment (M4SYNTAX
, string
[0], number
[0], string
[1],
885 /* Select a diversion and add a string to it. */
887 m4_make_diversion (context
, number
[0]);
889 m4_output_text (context
, string
[1], number
[1]);
894 /* Change quote strings. */
896 m4_set_quotes (M4SYNTAX
, string
[0], number
[0], string
[1],
911 /* Get string lengths. */
913 GET_NUMBER (number
[0], false);
916 GET_NUMBER (number
[1], false);
918 if (character
== ',')
922 /* 'T' operator accepts an optional third argument for
923 format versions 2 or later. */
925 GET_NUMBER (number
[2], false);
929 /* 3 argument 'T' operations are invalid for format
931 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
932 ill-formed frozen file, version 2 directive `%c' encountered"), 'T');
940 /* Get string contents. */
941 GET_STRING (file
, string
[0], allocated
[0], number
[0], false);
947 GET_STRING (file
, string
[1], allocated
[1], number
[1], true);
948 if (version
> 1 && number
[2])
953 GET_STRING (file
, string
[2], allocated
[2], number
[2], true);
956 /* Enter a macro having an expansion text as a definition. */
958 m4_symbol_value
*token
;
959 m4_module
*module
= NULL
;
961 token
= (m4_symbol_value
*) xzalloc (sizeof *token
);
964 if (strlen (string
[2]) < number
[2])
965 m4_error (context
, EXIT_FAILURE
, 0, NULL
, _("\
966 ill-formed frozen file, invalid module %s encountered"),
967 quotearg_style_mem (locale_quoting_style
,
968 string
[2], number
[2]));
969 module
= m4__module_find (string
[2]);
972 m4_set_symbol_value_text (token
, xmemdup0 (string
[1], number
[1]),
974 VALUE_MODULE (token
) = module
;
975 VALUE_MAX_ARGS (token
) = -1;
977 m4_symbol_pushdef (M4SYMTAB
, string
[0], number
[0], token
);
988 if (close_stream (file
) != 0)
989 m4_error (context
, EXIT_FAILURE
, errno
, NULL
,
990 _("unable to read frozen state"));
991 m4_set_current_file (context
, NULL
);
992 m4_set_current_line (context
, 0);
998 #undef CHECK_ALLOCATION