move all code relative to readline into separate file (2)
[calc.git] / readline.c
index 4b234f40862d2f9aea2c21695e967d87e2fabde2..280e5f012232c62eaffc7081ceda1730b3ce1de1 100644 (file)
@@ -5,8 +5,9 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#include "alloc.h"
 #include "debug.h"
-#include "parser.h"
+#include "element.h"
 
 #include "readline.h"
 
@@ -138,3 +139,64 @@ void clean_read_line (char *buffer)
         free (buffer);
     }
 }
+
+/* generate completion list */
+
+char **generate_completion_list ()
+{
+    int i, j, l = 0;
+    char **list = (char **) callocordie (NB_OPERATORS + NB_FUNCTIONS + NB_CONSTANTS + NB_SYMBOLS + 1, sizeof (char *));
+
+    for (i = 0; i < NB_OPERATORS; i++) {
+        list[l] = strdup ((operators + i)->keyword);
+        for (j = 0; j < (int)strlen (list[l]); j++) {
+            if (list[i][j] == '\t') {
+                list[i][j] = '\0';
+            }
+        }
+        if (list[l] != NULL) {
+            l++;
+        }
+    }
+
+    for (i = 0; i < NB_FUNCTIONS; i++) {
+        list[l] = strdup ((functions + i)->keyword);
+        if (list[l] != NULL) {
+            l++;
+        }
+    }
+
+    for (i = 0; i < NB_CONSTANTS; i++) {
+        list[l] = strdup ((constants + i)->keyword);
+        if (list[l] != NULL) {
+            l++;
+        }
+    }
+
+    for (i = 0; i < NB_SYMBOLS; i++) {
+        list[l] = strdup (symbols[i]);
+        if (list[l] != NULL) {
+            l++;
+        }
+    }
+
+    return (list);
+}
+
+/* free completion list */
+
+void free_completion_list (char **list)
+{
+    int i;
+
+    if (list) {
+        for (i = 0; i < NB_OPERATORS + NB_FUNCTIONS + NB_CONSTANTS + NB_SYMBOLS + 1; i++) {
+            if (list[i] != NULL) {
+                free (list[i]);
+            }
+        }
+        free (list);
+    }
+}
+
+/* vim: set ts=4 sw=4 et: */