@b4n for the places this is used, is there a (compile time testable) value of array element you could use as a non-entry so its always arrays and so doesn't mix arrays and pointers, then the GCC warning will catch if anyone does call it with a pointer?
None that I can think of; the non-array values are EMPTY_KEYWORDS
and EMPTY_PROPERTIES
. If ISO C allowed it, the simple fix would be to declare those as empty arrays, and it would naturally work out of the box. But without this, the best other solution I can think of is this:
diff --git a/src/highlighting.c b/src/highlighting.c
index 938e5432c..82013aa7c 100644
--- a/src/highlighting.c
+++ b/src/highlighting.c
@@ -961,9 +961,9 @@ static guint get_lexer_filetype(GeanyFiletype *ft)
case (GEANY_FILETYPES_##LANG_NAME): \
styleset_init_from_mapping(filetype_idx, config, configh, \
highlighting_styles_##LANG_NAME, \
- HL_N_ENTRIES(highlighting_styles_##LANG_NAME), \
+ HL_N_STYLES(highlighting_styles_##LANG_NAME), \
highlighting_keywords_##LANG_NAME, \
- HL_N_ENTRIES(highlighting_keywords_##LANG_NAME)); \
+ HL_N_KEYWORDS(highlighting_keywords_##LANG_NAME)); \
break
/* Called by filetypes_load_config(). */
@@ -1068,11 +1068,11 @@ void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *co
case (GEANY_FILETYPES_##LANG_NAME): \
styleset_from_mapping(sci, ft->id, highlighting_lexer_##LANG_NAME, \
highlighting_styles_##LANG_NAME, \
- HL_N_ENTRIES(highlighting_styles_##LANG_NAME), \
+ HL_N_STYLES(highlighting_styles_##LANG_NAME), \
highlighting_keywords_##LANG_NAME, \
- HL_N_ENTRIES(highlighting_keywords_##LANG_NAME), \
+ HL_N_KEYWORDS(highlighting_keywords_##LANG_NAME), \
highlighting_properties_##LANG_NAME, \
- HL_N_ENTRIES(highlighting_properties_##LANG_NAME)); \
+ HL_N_PROPERTIES(highlighting_properties_##LANG_NAME)); \
break
/** Sets up highlighting and other visual settings.
diff --git a/src/highlightingmappings.h b/src/highlightingmappings.h
index d62b7e24b..36fe2d260 100644
--- a/src/highlightingmappings.h
+++ b/src/highlightingmappings.h
@@ -65,11 +65,14 @@ typedef struct
} HLProperty;
-#define EMPTY_KEYWORDS ((HLKeyword *) NULL)
-#define EMPTY_PROPERTIES ((HLProperty *) NULL)
-
-/* like G_N_ELEMENTS() but supports @array being NULL (for empty entries) */
-#define HL_N_ENTRIES(array) ((array != NULL) ? G_N_ELEMENTS(array) : 0)
+/* ISO C doesn't allow zero-sized arrays, so we special-case those below */
+static const HLKeyword EMPTY_KEYWORDS[] = {{0}};
+static const HLProperty EMPTY_PROPERTIES[] = {{0}};
+
+/* like G_N_ELEMENTS() but supports special values for empty entries */
+#define HL_N_STYLES(ss) G_N_ELEMENTS(ss)
+#define HL_N_KEYWORDS(ks) ((ks) == EMPTY_KEYWORDS ? 0 : G_N_ELEMENTS(ks))
+#define HL_N_PROPERTIES(ps) ((ps) == EMPTY_PROPERTIES ? 0 : G_N_ELEMENTS(ps))
/* Abaqus */
but I'm not really convinced it's actually better. I'm not against it, it's not really bad but it's kind of sad it wastes sizeof(HLKeyword) + sizeof(HLProperty)
(40 bytes here) and introduces 2 new specific macros.
As for getting called with a pointer it's a theoretically good point, but given it's only used on highlightingmappings entries, it should be fairly safe.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or unsubscribe.