aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src/ebrowse.c
diff options
context:
space:
mode:
authorPaul Eggert2013-06-21 13:11:44 -0700
committerPaul Eggert2013-06-21 13:11:44 -0700
commitfbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc (patch)
tree7b1836faca02f39413afec531c2ae467898523f5 /lib-src/ebrowse.c
parentcad5d1cb5af7210154814b60825576d14740158f (diff)
downloademacs-fbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc.tar.gz
emacs-fbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc.zip
Use C99-style flexible array members if available.
This avoids some subtle aliasing issues, which typically aren't a problem with GCC but may be a problem elsewhere. * lib-src/ebrowse.c (struct member, struct alias, struct sym): Use FLEXIBLE_ARRAY_MEMBER. (add_sym, add_member, make_namespace, register_namespace_alias): Use offsetof (struct, flex_array_member), not sizeof (struct), as that ports better to pre-C99 non-GCC. * src/alloc.c (sdata): New typedef, replacing the old struct sdata. It is a struct if GC_CHECK_STRING_BYTES, a union otherwise. In either case, it uses a flexible array member rather than the old struct hack. All uses changed. (SDATA_NBYTES, sweep_strings) [!GC_CHECK_STRING_BYTES]: Adjust to sdata reorganization. * src/alloc.c (VBLOCK_BYTES_MIN, allocate_vectorlike, Fgarbage_collect): Use offsetof (struct, flex_array_member), not sizeof (struct), as that ports better to pre-C99 non-GCC. * src/chartab.c (Fmake_char_table, make_sub_char_table, copy_char_table): Use CHAR_TABLE_STANDARD_SLOTS rather than its definition, as the latter has changed. * src/conf_post.h (FLEXIBLE_ARRAY_MEMBER): Move here from w32.c, and port better to pre-C99 GCC. * src/image.c (struct xpm_cached_color): * src/lisp.h (struct Lisp_Vector, struct Lisp_Bool_Vector) (struct Lisp_Char_Table, struct Lisp_Sub_Char_Table): Use FLEXIBLE_ARRAY_MEMBER. * src/lisp.h (string_bytes) [GC_CHECK_STRING_BYTES]: Move decl to top level so it gets checked against implementation. (CHAR_TABLE_STANDARD_SLOTS): Adjust to struct Lisp_Char_Table change. * src/w32.c (FLEXIBLE_ARRAY_MEMBER): Move to conf_post.h.
Diffstat (limited to 'lib-src/ebrowse.c')
-rw-r--r--lib-src/ebrowse.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/lib-src/ebrowse.c b/lib-src/ebrowse.c
index 3a237daf5f8..81d0cf0a19e 100644
--- a/lib-src/ebrowse.c
+++ b/lib-src/ebrowse.c
@@ -237,7 +237,7 @@ struct member
237 char *def_regexp; /* Regular expression matching definition. */ 237 char *def_regexp; /* Regular expression matching definition. */
238 const char *def_filename; /* File name of definition. */ 238 const char *def_filename; /* File name of definition. */
239 int def_pos; /* Buffer position of definition. */ 239 int def_pos; /* Buffer position of definition. */
240 char name[1]; /* Member name. */ 240 char name[FLEXIBLE_ARRAY_MEMBER]; /* Member name. */
241}; 241};
242 242
243/* Structures of this type are used to connect class structures with 243/* Structures of this type are used to connect class structures with
@@ -256,7 +256,7 @@ struct alias
256 struct alias *next; /* Next in list. */ 256 struct alias *next; /* Next in list. */
257 struct sym *namesp; /* Namespace in which defined. */ 257 struct sym *namesp; /* Namespace in which defined. */
258 struct link *aliasee; /* List of aliased namespaces (A::B::C...). */ 258 struct link *aliasee; /* List of aliased namespaces (A::B::C...). */
259 char name[1]; /* Alias name. */ 259 char name[FLEXIBLE_ARRAY_MEMBER]; /* Alias name. */
260}; 260};
261 261
262/* The structure used to describe a class in the symbol table, 262/* The structure used to describe a class in the symbol table,
@@ -280,7 +280,7 @@ struct sym
280 const char *filename; /* File in which it can be found. */ 280 const char *filename; /* File in which it can be found. */
281 const char *sfilename; /* File in which members can be found. */ 281 const char *sfilename; /* File in which members can be found. */
282 struct sym *namesp; /* Namespace in which defined. . */ 282 struct sym *namesp; /* Namespace in which defined. . */
283 char name[1]; /* Name of the class. */ 283 char name[FLEXIBLE_ARRAY_MEMBER]; /* Name of the class. */
284}; 284};
285 285
286/* Experimental: Print info for `--position-info'. We print 286/* Experimental: Print info for `--position-info'. We print
@@ -567,8 +567,8 @@ add_sym (const char *name, struct sym *nested_in_class)
567 puts (name); 567 puts (name);
568 } 568 }
569 569
570 sym = (struct sym *) xmalloc (sizeof *sym + strlen (name)); 570 sym = xmalloc (offsetof (struct sym, name) + strlen (name) + 1);
571 memset (sym, 0, sizeof *sym); 571 memset (sym, 0, offsetof (struct sym, name));
572 strcpy (sym->name, name); 572 strcpy (sym->name, name);
573 sym->namesp = scope; 573 sym->namesp = scope;
574 sym->next = class_table[h]; 574 sym->next = class_table[h];
@@ -852,7 +852,8 @@ add_global_decl (char *name, char *regexp, int pos, unsigned int hash, int var,
852static struct member * 852static struct member *
853add_member (struct sym *cls, char *name, int var, int sc, unsigned int hash) 853add_member (struct sym *cls, char *name, int var, int sc, unsigned int hash)
854{ 854{
855 struct member *m = (struct member *) xmalloc (sizeof *m + strlen (name)); 855 struct member *m = xmalloc (offsetof (struct member, name)
856 + strlen (name) + 1);
856 struct member **list; 857 struct member **list;
857 struct member *p; 858 struct member *p;
858 struct member *prev; 859 struct member *prev;
@@ -962,8 +963,8 @@ mark_inherited_virtual (void)
962static struct sym * 963static struct sym *
963make_namespace (char *name, struct sym *context) 964make_namespace (char *name, struct sym *context)
964{ 965{
965 struct sym *s = (struct sym *) xmalloc (sizeof *s + strlen (name)); 966 struct sym *s = xmalloc (offsetof (struct sym, name) + strlen (name) + 1);
966 memset (s, 0, sizeof *s); 967 memset (s, 0, offsetof (struct sym, name));
967 strcpy (s->name, name); 968 strcpy (s->name, name);
968 s->next = all_namespaces; 969 s->next = all_namespaces;
969 s->namesp = context; 970 s->namesp = context;
@@ -1046,7 +1047,7 @@ register_namespace_alias (char *new_name, struct link *old_name)
1046 if (streq (new_name, al->name) && (al->namesp == current_namespace)) 1047 if (streq (new_name, al->name) && (al->namesp == current_namespace))
1047 return; 1048 return;
1048 1049
1049 al = (struct alias *) xmalloc (sizeof *al + strlen (new_name)); 1050 al = xmalloc (offsetof (struct alias, name) + strlen (new_name) + 1);
1050 strcpy (al->name, new_name); 1051 strcpy (al->name, new_name);
1051 al->next = namespace_alias_table[h]; 1052 al->next = namespace_alias_table[h];
1052 al->namesp = current_namespace; 1053 al->namesp = current_namespace;