[util] Check all specified shapers are known (#993)
authorKhaled Hosny <khaledhosny@eglug.org>
Thu, 19 Apr 2018 20:41:37 +0000 (23:41 +0300)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 19 Apr 2018 20:41:37 +0000 (22:41 +0200)
A bit brute force and requires all shapers to be known, not just one.

Fixes https://github.com/harfbuzz/harfbuzz/issues/956

util/options.cc

index c625d65..aad843c 100644 (file)
@@ -192,11 +192,29 @@ static gboolean
 parse_shapers (const char *name G_GNUC_UNUSED,
               const char *arg,
               gpointer    data,
-              GError    **error G_GNUC_UNUSED)
+              GError    **error)
 {
   shape_options_t *shape_opts = (shape_options_t *) data;
+  char **shapers = g_strsplit (arg, ",", 0);
+
+  for (char **shaper = shapers; *shaper; shaper++) {
+    bool found = false;
+    for (const char **hb_shaper = hb_shape_list_shapers (); *hb_shaper; hb_shaper++) {
+      if (strcmp (*shaper, *hb_shaper) == 0) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Unknown or unsupported shaper: %s", *shaper);
+      g_strfreev (shapers);
+      return false;
+    }
+  }
+
   g_strfreev (shape_opts->shapers);
-  shape_opts->shapers = g_strsplit (arg, ",", 0);
+  shape_opts->shapers = shapers;
   return true;
 }