diff options
author | David Malcolm <dmalcolm@redhat.com> | 2013-05-17 19:23:35 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2013-05-17 19:23:35 +0000 |
commit | abecc8c6899a68083e567138e48a87bd027cd858 (patch) | |
tree | 5543cff10a5d02aeeda370b3f9cae182cd79a937 /gcc/gengtype-state.c | |
parent | 816a3f734579dfedd49c5f302911d6a1cca97d33 (diff) | |
download | gcc-abecc8c6899a68083e567138e48a87bd027cd858.tar.gz |
gengtype-state.c: (s_expr_writer): New class, to handle prettifying of output layout of s-expressions.
2013-05-17 David Malcolm <dmalcolm@redhat.com>
* gengtype-state.c: (s_expr_writer): New class, to handle
prettifying of output layout of s-expressions.
(state_writer): New class, to write out gtype.state.
(state_written_type_count): Move this variable into member data of
state_writer.
(s_expr_writer::s_expr_writer): New code: constructor for new class
(state_writer::state_writer(): ditto
(s_expr_writer::write_new_line): New function
(s_expr_writer::write_any_indent): ditto
(s_expr_writer::begin_s_expr): ditto
(s_expr_writer::end_s_expr): ditto
(write_state_fileloc): convert to method of state_writer...
(state_writer:: write_state_fileloc): ...and use methods of
s_expr_writer to write indentation into the gtype.state output file
to visually represent the hierarchical structure of the list
structures
(write_state_fields): ditto, renaming to...
(state_writer::write_state_fields)
(write_state_a_string): ditto, renaming to...
(state_writer::write_state_a_string)
(write_state_string_option): ditto, renaming to...
(state_writer::write_state_string_option)
(write_state_type_option): ditto, renaming to...
(state_writer::write_state_type_option)
(write_state_nested_option): ditto, renaming to...
(state_writer::write_state_nested_option)
(write_state_option): ditto, renaming to...
(state_writer::write_state_option)
(write_state_options): ditto, renaming to...
(state_writer::write_state_options)
(write_state_lang_bitmap): ditto, renaming to...
(state_writer::write_state_lang_bitmap)
(write_state_version): ditto, renaming to...
(state_writer::write_state_version)
(write_state_scalar_type): ditto, renaming to...
(state_writer::write_state_scalar_type)
(write_state_string_type): ditto, renaming to...
(state_writer::write_state_string_type)
(write_state_undefined_type): ditto, renaming to...
(state_writer::write_state_undefined_type)
(write_state_struct_union_type): ditto, renaming to...
(state_writer::write_state_struct_union_type)
(write_state_struct_type): ditto, renaming to...
(state_writer::write_state_struct_type)
(write_state_user_struct_type): ditto, renaming to...
(state_writer::write_state_user_struct_type)
(write_state_lang_struct_type): ditto, renaming to...
(state_writer::write_state_lang_struct_type)
(write_state_param_struct_type): ditto, renaming to...
(state_writer::write_state_param_struct_type)
(write_state_pointer_type): ditto, renaming to...
(state_writer::write_state_pointer_type)
(write_state_array_type): ditto, renaming to...
(state_writer::write_state_array_type)
(write_state_gc_used): ditto, renaming to...
(state_writer::write_state_gc_used)
(write_state_common_type_content): ditto, renaming to...
(state_writer::write_state_common_type_content)
(write_state_type): ditto, renaming to...
(state_writer::write_state_type)
(write_state_pair_list): ditto, renaming to...
(state_writer::write_state_pair_list)
(write_state_pair): ditto, renaming to...
(state_writer::write_state_pair)
(write_state_typedefs): ditto, renaming to...
(state_writer::write_state_typedefs)
(write_state_structures): ditto, renaming to...
(state_writer::write_state_structures)
(write_state_param_structs): ditto, renaming to...
(state_writer::write_state_param_structs)
(write_state_variables): ditto, renaming to...
(state_writer::write_state_variables)
(write_state_srcdir): ditto, renaming to...
(state_writer::write_state_srcdir)
(write_state_files_list): ditto, renaming to...
(state_writer::write_state_files_list)
(write_state_languages): ditto, renaming to...
(state_writer::write_state_languages)
(write_state): create a state_writer instance and use it when
writing out the state file
From-SVN: r199032
Diffstat (limited to 'gcc/gengtype-state.c')
-rw-r--r-- | gcc/gengtype-state.c | 463 |
1 files changed, 323 insertions, 140 deletions
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c index 6092dad4179..c6ecc247a67 100644 --- a/gcc/gengtype-state.c +++ b/gcc/gengtype-state.c @@ -137,9 +137,143 @@ static const char *state_path = NULL; static int state_line = 0; static long state_bol = 0; /* offset of beginning of line */ +/* A class for writing out s-expressions, keeping track of newlines and + nested indentation. */ +class s_expr_writer +{ +public: + s_expr_writer(); + + void write_new_line (); + void write_any_indent (int leading_spaces); + + void begin_s_expr (const char *tag); + void end_s_expr (); + +private: + int indent_amount_; + int had_recent_newline_; +}; // class s_expr_writer + +/* A class for writing out "gtype.state". */ +class state_writer : public s_expr_writer +{ +public: + state_writer(); + +private: + void write_state_fileloc (struct fileloc *floc); + void write_state_fields (pair_p fields); + void write_state_a_string (const char *s); + void write_state_string_option (options_p current); + void write_state_type_option (options_p current); + void write_state_nested_option (options_p current); + void write_state_option (options_p current); + void write_state_options (options_p opt); + void write_state_lang_bitmap (lang_bitmap bitmap); + void write_state_version (const char *version); + void write_state_scalar_type (type_p current); + void write_state_string_type (type_p current); + void write_state_undefined_type (type_p current); + void write_state_struct_union_type (type_p current, const char *kindstr); + void write_state_struct_type (type_p current); + void write_state_user_struct_type (type_p current); + void write_state_union_type (type_p current); + void write_state_lang_struct_type (type_p current); + void write_state_param_struct_type (type_p current); + void write_state_pointer_type (type_p current); + void write_state_array_type (type_p current); + void write_state_gc_used (enum gc_used_enum gus); + void write_state_common_type_content (type_p current); + void write_state_type (type_p current); + void write_state_pair (pair_p current); + int write_state_pair_list (pair_p list); + void write_state_typedefs (void); + void write_state_structures (void); + void write_state_param_structs (void); + void write_state_variables (void); + void write_state_srcdir (void); + void write_state_files_list (void); + void write_state_languages (void); + + friend void write_state (const char *state_path); + +private: + /* Counter of written types. */ + int state_written_type_count; +}; // class state_writer + + +/* class s_expr_writer's trivial constructor. */ +s_expr_writer::s_expr_writer() + : indent_amount_(0), + had_recent_newline_(0) +{ +} + +/* Write a newline to the output file, merging adjacent newlines. */ +void +s_expr_writer::write_new_line (void) +{ + /* Don't add a newline if we've just had one. */ + if (!had_recent_newline_) + { + fprintf (state_file, "\n"); + had_recent_newline_ = 1; + } +} + +/* If we've just had a newline, write the indentation amount, potentially + omitting some spaces. -/* Counter of written types. */ -static int state_written_type_count = 0; + LEADING_SPACES exists to support code that writes strings with leading + spaces (e.g " foo") which might occur within a line, or could be the first + thing on a line. By passing leading_spaces == 1, when such a string is the + first thing on a line, write_any_indent () swallows the successive + leading spaces into the indentation so that the "foo" begins at the expected + column. */ +void +s_expr_writer::write_any_indent (int leading_spaces) +{ + int i; + int amount = indent_amount_ - leading_spaces; + if (had_recent_newline_) + for (i = 0; i < amount; i++) + fprintf (state_file, " "); + had_recent_newline_ = 0; +} + +/* Write the beginning of a new s-expresion e.g. "(!foo " + The writer automatically adds whitespace to show the hierachical + structure of the expressions, so each one starts on a new line, + and any within it will be at an increased indentation level. */ +void +s_expr_writer::begin_s_expr (const char *tag) +{ + write_new_line (); + write_any_indent (0); + fprintf (state_file, "(!%s ", tag); + indent_amount_++; +} + +/* Write out the end of an s-expression: any necssessary indentation, + a closing parenthesis, and a new line. */ +void +s_expr_writer::end_s_expr (void) +{ + indent_amount_--; + write_any_indent (0); + fprintf (state_file, ")"); + write_new_line (); +} + + +/* class state_writer's trivial constructor. */ +state_writer::state_writer() + : s_expr_writer(), + state_written_type_count(0) +{ +} /* Fatal error messages when reading the state. They are extremely @@ -519,22 +653,6 @@ static htab_t state_seen_types; /* Return the length of a linked list made of pairs. */ static int pair_list_length (pair_p list); -/* Write a pair */ -static void write_state_pair (pair_p); - -/* return the number of pairs written. Should match the length given - by pair_list_length. */ -static int write_state_pair_list (pair_p list); - -/* Write a type. When a type is written, its state_number is updated, - to ensure that a "reference" to a seen type is written on next - occurrences. */ -static void write_state_type (type_p); - -/* Write a null-terminatel string using our Lispy lexical conventions, - similar to those of C or MELT. */ -static void write_state_a_string (const char *s); - /* Compute the length of a list of pairs, starting from the first one. */ static int @@ -552,8 +670,8 @@ pair_list_length (pair_p list) state file-s produced by gengtype on the same GCC source tree are very similar and can be reasonably compared with diff, even if the two GCC source trees have different absolute paths. */ -static void -write_state_fileloc (struct fileloc *floc) +void +state_writer::write_state_fileloc (struct fileloc *floc) { if (floc != NULL && floc->line > 0) @@ -565,40 +683,43 @@ write_state_fileloc (struct fileloc *floc) srcrelpath = get_file_srcdir_relative_path (floc->file); if (srcrelpath != NULL) { - fprintf (state_file, "\n(!srcfileloc "); + begin_s_expr ("srcfileloc"); write_state_a_string (srcrelpath); } else { - fprintf (state_file, "\n(!fileloc "); + begin_s_expr ("fileloc"); write_state_a_string (get_input_file_name (floc->file)); } fprintf (state_file, " %d", floc->line); - fprintf (state_file, ")\n"); + end_s_expr (); } else fprintf (state_file, "nil "); } /* Write a list of fields. */ -static void -write_state_fields (pair_p fields) +void +state_writer::write_state_fields (pair_p fields) { int nbfields = pair_list_length (fields); int nbpairs = 0; - fprintf (state_file, "\n(!fields %d ", nbfields); + begin_s_expr ("fields"); + fprintf (state_file, "%d ", nbfields); nbpairs = write_state_pair_list (fields); gcc_assert (nbpairs == nbfields); - fprintf (state_file, ")\n"); + end_s_expr (); } /* Write a null-terminated string in our lexical convention, very similar to the convention of C. */ -static void -write_state_a_string (const char *s) +void +state_writer::write_state_a_string (const char *s) { char c; + write_any_indent (1); + fputs (" \"", state_file); for (; *s != 0; s++) { @@ -643,9 +764,10 @@ write_state_a_string (const char *s) } /* Our option-s have three kinds, each with its writer. */ -static void -write_state_string_option (options_p current) +void +state_writer::write_state_string_option (options_p current) { + write_any_indent (0); fprintf (state_file, "string "); if (current->info.string != NULL) write_state_a_string (current->info.string); @@ -653,34 +775,43 @@ write_state_string_option (options_p current) fprintf (state_file, " nil "); } -static void -write_state_type_option (options_p current) +void +state_writer::write_state_type_option (options_p current) { + write_any_indent (0); fprintf (state_file, "type "); write_state_type (current->info.type); } -static void -write_state_nested_option (options_p current) +void +state_writer::write_state_nested_option (options_p current) { + write_any_indent (0); fprintf (state_file, "nested "); write_state_type (current->info.nested->type); if (current->info.nested->convert_from != NULL) write_state_a_string (current->info.nested->convert_from); else - fprintf (state_file, " nil "); + { + write_any_indent (1); + fprintf (state_file, " nil "); + } if (current->info.nested->convert_to != NULL) write_state_a_string (current->info.nested->convert_to); else - fprintf (state_file, " nil "); + { + write_any_indent (1); + fprintf (state_file, " nil "); + } } -static void -write_state_option (options_p current) +void +state_writer::write_state_option (options_p current) { - fprintf (state_file, "\n(!option "); + begin_s_expr ("option"); + write_any_indent (0); if (current->name != NULL) fprintf (state_file, "%s ", current->name); else @@ -701,53 +832,54 @@ write_state_option (options_p current) fatal ("Option tag unknown"); } - fprintf (state_file, ")\n"); + /* Terminate the "option" s-expression. */ + end_s_expr (); } /* Write a list of GTY options. */ -static void -write_state_options (options_p opt) +void +state_writer::write_state_options (options_p opt) { options_p current; if (opt == NULL) { - fprintf (state_file, "nil "); + write_any_indent (0); + fprintf (state_file, "nil "); return; } - fprintf (state_file, "\n(!options "); + begin_s_expr ("options"); for (current = opt; current != NULL; current = current->next) write_state_option (current); - fprintf (state_file, ")\n"); + end_s_expr (); } /* Write a bitmap representing a set of GCC front-end languages. */ -static void -write_state_lang_bitmap (lang_bitmap bitmap) +void +state_writer::write_state_lang_bitmap (lang_bitmap bitmap) { + write_any_indent (0); fprintf (state_file, "%d ", (int) bitmap); } /* Write version information. */ -static void -write_state_version (const char *version) +void +state_writer::write_state_version (const char *version) { - fprintf (state_file, "\n(!version "); + begin_s_expr ("version"); write_state_a_string (version); - fprintf (state_file, ")\n"); + end_s_expr (); } -/* Common routine to write the common content of all types. */ -static void write_state_common_type_content (type_p current); - /* Write a scalar type. We have only two of these. */ -static void -write_state_scalar_type (type_p current) +void +state_writer::write_state_scalar_type (type_p current) { + write_any_indent (0); if (current == &scalar_nonchar) fprintf (state_file, "scalar_nonchar "); else if (current == &scalar_char) @@ -759,11 +891,12 @@ write_state_scalar_type (type_p current) } /* Write the string type. There is only one such thing! */ -static void -write_state_string_type (type_p current) +void +state_writer::write_state_string_type (type_p current) { if (current == &string_type) { + write_any_indent (0); fprintf (state_file, "string "); write_state_common_type_content (current); } @@ -772,35 +905,44 @@ write_state_string_type (type_p current) } /* Write an undefined type. */ -static void -write_state_undefined_type (type_p current) +void +state_writer::write_state_undefined_type (type_p current) { DBGPRINTF ("undefined type @ %p #%d '%s'", (void *) current, current->state_number, current->u.s.tag); + write_any_indent (0); fprintf (state_file, "undefined "); gcc_assert (current->gc_used == GC_UNUSED); write_state_common_type_content (current); if (current->u.s.tag != NULL) write_state_a_string (current->u.s.tag); else - fprintf (state_file, "nil"); + { + write_any_indent (0); + fprintf (state_file, "nil"); + } write_state_fileloc (type_lineloc (current)); } /* Common code to write structure like types. */ -static void -write_state_struct_union_type (type_p current, const char *kindstr) +void +state_writer::write_state_struct_union_type (type_p current, + const char *kindstr) { DBGPRINTF ("%s type @ %p #%d '%s'", kindstr, (void *) current, current->state_number, current->u.s.tag); + write_any_indent (0); fprintf (state_file, "%s ", kindstr); write_state_common_type_content (current); if (current->u.s.tag != NULL) write_state_a_string (current->u.s.tag); else - fprintf (state_file, "nil"); + { + write_any_indent (0); + fprintf (state_file, "nil"); + } write_state_fileloc (type_lineloc (current)); write_state_fields (current->u.s.fields); @@ -810,32 +952,36 @@ write_state_struct_union_type (type_p current, const char *kindstr) /* Write a GTY struct type. */ -static void -write_state_struct_type (type_p current) +void +state_writer::write_state_struct_type (type_p current) { write_state_struct_union_type (current, "struct"); write_state_type (current->u.s.lang_struct); } /* Write a GTY user-defined struct type. */ -static void -write_state_user_struct_type (type_p current) +void +state_writer::write_state_user_struct_type (type_p current) { DBGPRINTF ("user_struct type @ %p #%d '%s'", (void *) current, current->state_number, current->u.s.tag); + write_any_indent (0); fprintf (state_file, "user_struct "); write_state_common_type_content (current); if (current->u.s.tag != NULL) write_state_a_string (current->u.s.tag); else - fprintf (state_file, "nil"); + { + write_any_indent (0); + fprintf (state_file, "nil"); + } write_state_fileloc (type_lineloc (current)); write_state_fields (current->u.s.fields); } /* write a GTY union type. */ -static void -write_state_union_type (type_p current) +void +state_writer::write_state_union_type (type_p current) { write_state_struct_union_type (current, "union"); write_state_type (current->u.s.lang_struct); @@ -846,8 +992,8 @@ write_state_union_type (type_p current) subfield, which points to a linked list of homonumous types. Change this function with extreme care, see also read_state_lang_struct_type. */ -static void -write_state_lang_struct_type (type_p current) +void +state_writer::write_state_lang_struct_type (type_p current) { int nbhomontype = 0; type_p hty = NULL; @@ -869,18 +1015,20 @@ write_state_lang_struct_type (type_p current) homoname = hty->u.s.tag; gcc_assert (strcmp (homoname, hty->u.s.tag) == 0); } - fprintf (state_file, "(!homotypes %d\n", nbhomontype); + begin_s_expr ("homotypes"); + fprintf (state_file, "%d", nbhomontype); for (hty = current->u.s.lang_struct; hty != NULL; hty = hty->next) write_state_type (hty); - fprintf (state_file, ")\n"); + end_s_expr (); } /* Write a parametrized structure GTY type. */ -static void -write_state_param_struct_type (type_p current) +void +state_writer::write_state_param_struct_type (type_p current) { int i; + write_any_indent (0); fprintf (state_file, "param_struct "); write_state_common_type_content (current); write_state_type (current->u.param_struct.stru); @@ -889,39 +1037,49 @@ write_state_param_struct_type (type_p current) if (current->u.param_struct.param[i] != NULL) write_state_type (current->u.param_struct.param[i]); else - fprintf (state_file, "nil "); + { + write_any_indent (0); + fprintf (state_file, "nil "); + } } write_state_fileloc (¤t->u.param_struct.line); } /* Write a pointer type. */ -static void -write_state_pointer_type (type_p current) +void +state_writer::write_state_pointer_type (type_p current) { + write_any_indent (0); fprintf (state_file, "pointer "); write_state_common_type_content (current); write_state_type (current->u.p); } /* Write an array type. */ -static void -write_state_array_type (type_p current) +void +state_writer::write_state_array_type (type_p current) { + write_any_indent (0); fprintf (state_file, "array "); write_state_common_type_content (current); if (current->u.a.len != NULL) write_state_a_string (current->u.a.len); else - fprintf (state_file, " nil"); + { + write_any_indent (1); + fprintf (state_file, " nil"); + } + write_any_indent (1); fprintf (state_file, " "); write_state_type (current->u.a.p); } /* Write the gc_used information. */ -static void -write_state_gc_used (enum gc_used_enum gus) +void +state_writer::write_state_gc_used (enum gc_used_enum gus) { + write_any_indent (1); switch (gus) { case GC_UNUSED: @@ -943,9 +1101,10 @@ write_state_gc_used (enum gc_used_enum gus) /* Utility routine to write the common content of all types. Notice that the next field is *not* written on purpose. */ -static void -write_state_common_type_content (type_p current) +void +state_writer::write_state_common_type_content (type_p current) { + write_any_indent (0); fprintf (state_file, "%d ", current->state_number); /* We do not write the next type, because list of types are explicitly written. However, lang_struct are special in that @@ -958,19 +1117,23 @@ write_state_common_type_content (type_p current) /* The important and recursive routine writing GTY types as understood by gengtype. Types which have a positive state_number have already been seen and written. */ -static void -write_state_type (type_p current) +void +state_writer::write_state_type (type_p current) { + write_any_indent (0); if (current == NULL) { fprintf (state_file, "nil "); return; } - fprintf (state_file, "\n(!type "); + begin_s_expr ("type"); if (current->state_number > 0) - fprintf (state_file, "already_seen %d", current->state_number); + { + write_any_indent (0); + fprintf (state_file, "already_seen %d", current->state_number); + } else { state_written_type_count++; @@ -1014,21 +1177,23 @@ write_state_type (type_p current) } } - fprintf (state_file, ")\n"); + /* Terminate the "type" s-expression. */ + end_s_expr (); } /* Write a pair. */ -static void -write_state_pair (pair_p current) +void +state_writer::write_state_pair (pair_p current) { if (current == NULL) { + write_any_indent (0); fprintf (state_file, "nil)"); return; } - fprintf (state_file, "\n(!pair "); + begin_s_expr ("pair"); if (current->name != NULL) write_state_a_string (current->name); @@ -1039,12 +1204,13 @@ write_state_pair (pair_p current) write_state_fileloc (&(current->line)); write_state_options (current->opt); - fprintf (state_file, ")"); + /* Terminate the "pair" s-expression. */ + end_s_expr (); } /* Write a pair list and return the number of pairs written. */ -static int -write_state_pair_list (pair_p list) +int +state_writer::write_state_pair_list (pair_p list) { int nbpair = 0; pair_p current; @@ -1064,22 +1230,23 @@ write_state_pair_list (pair_p list) of actually read items. */ /* Write our typedefs. */ -static void -write_state_typedefs (void) +void +state_writer::write_state_typedefs (void) { int nbtypedefs = pair_list_length (typedefs); int nbpairs = 0; - fprintf (state_file, "\n(!typedefs %d\n", nbtypedefs); + begin_s_expr ("typedefs"); + fprintf (state_file, "%d", nbtypedefs); nbpairs = write_state_pair_list (typedefs); gcc_assert (nbpairs == nbtypedefs); - fprintf (state_file, ")\n"); + end_s_expr (); if (verbosity_level >= 2) printf ("%s wrote %d typedefs\n", progname, nbtypedefs); } /* Write our structures. */ -static void -write_state_structures (void) +void +state_writer::write_state_structures (void) { int nbstruct = 0; type_p current; @@ -1087,19 +1254,24 @@ write_state_structures (void) for (current = structures; current != NULL; current = current->next) nbstruct++; - fprintf (state_file, "\n(!structures %d\n", nbstruct); + begin_s_expr ("structures"); + fprintf (state_file, "%d", nbstruct); for (current = structures; current != NULL; current = current->next) - write_state_type (current); + { + write_new_line (); + write_state_type (current); + } - fprintf (state_file, ")\n"); + /* Terminate the "structures" s-expression. */ + end_s_expr (); if (verbosity_level >= 2) printf ("%s wrote %d structures in state\n", progname, nbstruct); } /* Write our param_struct-s. */ -static void -write_state_param_structs (void) +void +state_writer::write_state_param_structs (void) { int nbparamstruct = 0; type_p current; @@ -1107,45 +1279,48 @@ write_state_param_structs (void) for (current = param_structs; current != NULL; current = current->next) nbparamstruct++; - fprintf (state_file, "\n(!param_structs %d\n", nbparamstruct); + begin_s_expr ("param_structs"); + fprintf (state_file, "%d", nbparamstruct); for (current = param_structs; current != NULL; current = current->next) write_state_type (current); - fprintf (state_file, ")\n"); + end_s_expr (); } /* Write our variables. */ -static void -write_state_variables (void) +void +state_writer::write_state_variables (void) { int nbvars = pair_list_length (variables); int nbpairs = 0; - fprintf (state_file, "\n(!variables %d\n", nbvars); + begin_s_expr ("variables"); + fprintf (state_file, "%d", nbvars); nbpairs = write_state_pair_list (variables); gcc_assert (nbpairs == nbvars); - fprintf (state_file, ")\n"); + end_s_expr (); if (verbosity_level >= 2) printf ("%s wrote %d variables.\n", progname, nbvars); } /* Write the source directory. File locations within the source directory have been written specifically. */ -static void -write_state_srcdir (void) +void +state_writer::write_state_srcdir (void) { - fprintf (state_file, "\n(!srcdir "); + begin_s_expr ("srcdir"); write_state_a_string (srcdir); - fprintf (state_file, ")\n"); + end_s_expr (); } /* Count and write the list of our files. */ -static void -write_state_files_list (void) +void +state_writer::write_state_files_list (void) { int i = 0; /* Write the list of files with their lang_bitmap. */ - fprintf (state_file, "\n(!fileslist %d\n", (int) num_gt_files); + begin_s_expr ("fileslist"); + fprintf (state_file, "%d", (int) num_gt_files); for (i = 0; i < (int) num_gt_files; i++) { const char *cursrcrelpath = NULL; @@ -1155,25 +1330,30 @@ write_state_files_list (void) cursrcrelpath = get_file_srcdir_relative_path (curfil); if (cursrcrelpath) { - fprintf (state_file, "(!srcfile %d ", get_lang_bitmap (curfil)); + begin_s_expr ("srcfile"); + fprintf (state_file, "%d ", get_lang_bitmap (curfil)); write_state_a_string (cursrcrelpath); } else { - fprintf (state_file, "(!file %d ", get_lang_bitmap (curfil)); + begin_s_expr ("file"); + fprintf (state_file, "%d ", get_lang_bitmap (curfil)); write_state_a_string (get_input_file_name (curfil)); } - fprintf (state_file, ")\n"); + /* Terminate the inner s-expression (either "srcfile" or "file"). */ + end_s_expr (); } - fprintf (state_file, ")\n"); + /* Terminate the "fileslist" s-expression. */ + end_s_expr (); } /* Write the list of GCC front-end languages. */ -static void -write_state_languages (void) +void +state_writer::write_state_languages (void) { int i = 0; - fprintf (state_file, "\n(!languages %d", (int) num_lang_dirs); + begin_s_expr ("languages"); + fprintf (state_file, "%d", (int) num_lang_dirs); for (i = 0; i < (int) num_lang_dirs; i++) { /* Languages names are identifiers, we expect only letters or @@ -1181,7 +1361,7 @@ write_state_languages (void) valid language name, but cp is valid. */ fprintf (state_file, " %s", lang_dir_names[i]); } - fprintf (state_file, ")\n"); + end_s_expr (); } /* Write the trailer. */ @@ -1234,15 +1414,18 @@ write_state (const char *state_path) fprintf (state_file, ";;; This file should be parsed by the same %s which wrote it.\n", progname); + + state_writer sw; + /* The first non-comment significant line gives the version string. */ - write_state_version (version_string); - write_state_srcdir (); - write_state_languages (); - write_state_files_list (); - write_state_structures (); - write_state_typedefs (); - write_state_param_structs (); - write_state_variables (); + sw.write_state_version (version_string); + sw.write_state_srcdir (); + sw.write_state_languages (); + sw.write_state_files_list (); + sw.write_state_structures (); + sw.write_state_typedefs (); + sw.write_state_param_structs (); + sw.write_state_variables (); write_state_trailer (); statelen = ftell (state_file); if (ferror (state_file)) @@ -1258,7 +1441,7 @@ write_state (const char *state_path) if (verbosity_level >= 1) printf ("%s wrote state file %s of %ld bytes with %d GTY-ed types\n", - progname, state_path, statelen, state_written_type_count); + progname, state_path, statelen, sw.state_written_type_count); } |