summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2026-05-22 18:11:09 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2026-05-23 19:18:53 -0700
commit1bee33c1c801adf5e3deeba7328b811b80c55f70 (patch)
tree10c75db9822ac5e07645a21f0dfc97c178e255e9
parentece22174e52debbd96f2129c16bb539f48e9b849 (diff)
sfnt_parse_languages does not need USE_SAFE_ALLOCA
* src/sfntfont.c (sfnt_parse_languages): Simplify so that no local array is needed.
-rw-r--r--src/sfntfont.c41
1 files changed, 9 insertions, 32 deletions
diff --git a/src/sfntfont.c b/src/sfntfont.c
index 4f49f03d744..858c5449ac7 100644
--- a/src/sfntfont.c
+++ b/src/sfntfont.c
@@ -581,20 +581,18 @@ static void
sfnt_parse_languages (struct sfnt_meta_table *meta,
struct sfnt_font_desc *desc)
{
- char *data, *metadata, *tag;
+ char *data;
struct sfnt_meta_data_map map;
- char *saveptr;
/* Look up the ``design languages'' metadata. This is a comma (and
possibly space) separated list of scripts that the font was
designed for. Here is an example of one such tag:
- zh-Hans,Jpan,Kore
+ zh-Hans,Japn,Kore
for a font that covers Simplified Chinese, along with Japanese
and Korean text. */
- saveptr = NULL;
data = sfnt_find_metadata (meta, SFNT_META_DATA_TAG_DLNG,
&map);
@@ -608,34 +606,13 @@ sfnt_parse_languages (struct sfnt_meta_table *meta,
return;
}
- USE_SAFE_ALLOCA;
-
- /* Now copy metadata and add a trailing NULL byte. */
-
- if (map.data_length >= SIZE_MAX)
- memory_full_up ();
-
- metadata = SAFE_ALLOCA ((size_t) map.data_length + 1);
- memcpy (metadata, data, map.data_length);
- metadata[map.data_length] = '\0';
-
- /* Loop through each script-language tag. Note that there may be
- extra leading spaces. */
- while ((tag = strtok_r (metadata, ",", &saveptr)))
- {
- metadata = NULL;
-
- if (strstr (tag, "Hans") || strstr (tag, "Hant"))
- desc->languages = Fcons (Qzh, desc->languages);
-
- if (strstr (tag, "Japn"))
- desc->languages = Fcons (Qja, desc->languages);
-
- if (strstr (tag, "Kore"))
- desc->languages = Fcons (Qko, desc->languages);
- }
-
- SAFE_FREE ();
+ if (memmem (data, map.data_length, "Hans", 4)
+ || memmem (data, map.data_length, "Hant", 4))
+ desc->languages = Fcons (Qzh, desc->languages);
+ if (memmem (data, map.data_length, "Japn", 4))
+ desc->languages = Fcons (Qja, desc->languages);
+ if (memmem (data, map.data_length, "Kore", 4))
+ desc->languages = Fcons (Qko, desc->languages);
}
/* Return the font registry corresponding to the encoding subtable