From 809b99f53ccefad6435eeb15ae210284fd2889ec Mon Sep 17 00:00:00 2001
From: Andrea Shepard <andrea@persephoneslair.org>
Date: Tue, 23 May 2017 18:28:22 +0000
Subject: [PATCH] name/description support for GLR backend

---
 src/backends/glr.c | 70 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 69 insertions(+), 1 deletion(-)

diff --git a/src/backends/glr.c b/src/backends/glr.c
index a88090a3..3abe6f55 100644
--- a/src/backends/glr.c
+++ b/src/backends/glr.c
@@ -239,15 +239,83 @@ HParseResult *h_glr_parse(HAllocator* mm__, const HParser* parser, HInputStream*
   return result;
 }
 
+char * h_glr_get_description(HAllocator *mm__,
+                             HParserBackend be, void *param) {
+  const char *format_str = "GLR(%zu) parser backend";
+  /* TODO fix the backend */
+  const char *generic_descr_format_str =
+    "GLR(k) parser backend (actually using the param is broken)";
+  uintptr_t params_int;
+  size_t k, len;
+  char *descr = NULL;
+
+  params_int = (uintptr_t)param;
+  if (params_int > 0) {
+    /* A specific k was given */
+    k = (size_t)params_int;
+    /* Measure how big a buffer we need */
+    len = snprintf(NULL, 0, format_str, k);
+    /* Allocate it and do the real snprintf */
+    descr = h_new(char, len + 1);
+    if (descr) {
+      snprintf(descr, len + 1, format_str, k);
+    }
+  } else {
+    /*
+     * No specific k; TODO actually have a default and fix the backend
+     */
+    len = snprintf(NULL, 0, generic_descr_format_str);
+    /* Allocate and do the real snprintf */
+    descr = h_new(char, len + 1);
+    if (descr) {
+      snprintf(descr, len + 1, generic_descr_format_str);
+    }
+  }
+
+  return descr;
+}
 
+char * h_glr_get_short_name(HAllocator *mm__,
+                            HParserBackend be, void *param) {
+  const char *format_str = "GLR(%zu)", *generic_name = "GLR(k)";
+  uintptr_t params_int;
+  size_t k, len;
+  char *name = NULL;
+
+  params_int = (uintptr_t)param;
+  if (params_int > 0) {
+    /* A specific k was given */
+    k = (size_t)params_int;
+    /* Measure how big a buffer we need */
+    len = snprintf(NULL, 0, format_str, k);
+    /* Allocate it and do the real snprintf */
+    name = h_new(char, len + 1);
+    if (name) {
+      snprintf(name, len + 1, format_str, k);
+    }
+  } else {
+    /* No specific k */
+    len = strlen(generic_name);
+    name = h_new(char, len + 1);
+    strncpy(name, generic_name, len + 1);
+  }
+
+  return name;
+}
 
 HParserBackendVTable h__glr_backend_vtable = {
   .compile = h_glr_compile,
   .parse = h_glr_parse,
   .free = h_glr_free,
 
-  .copy_params = h_copy_numeric_param
+  .copy_params = h_copy_numeric_param,
   /* No free_param needed, since it's not actually allocated */
+
+  /* Name/param resolution functions */
+  .backend_short_name = "glr",
+  .backend_description = "GLR(k) parser backend",
+  .get_description_with_params = h_glr_get_description,
+  .get_short_name_with_params = h_glr_get_short_name
 };
 
 
-- 
GitLab