partial implementation of edit
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 31 Jan 2023 16:14:02 +0000 (17:14 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 31 Jan 2023 16:14:02 +0000 (17:14 +0100)
calc.c
parser.c
parser.h

diff --git a/calc.c b/calc.c
index d5b02468f9dd2b66bc6f9ca906094d22e0d5841d..042bda76fa8c65c04f8d6b8ab889194357a3714f 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -224,6 +224,9 @@ int main (int argc, char *argv[])
                 if (!element->hidden) {
                     print (answer);
                 }
+                if (element->func == Prog) {
+                    save_string (element->ops[0]->value, line[i]);
+                }
                 delelement (element);
                 ret = 0;
             }
index 4f50a0e8b7703571cb52b6a0bddb32aabc16b290..b3f370d0c059f6715fdf0b7141027809ec643f3e 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -774,6 +774,9 @@ void prog (int id, int nbmems, element_t *root)
             if ((programs + n)->root) {
                 delelement ((programs + n)->root);
             }
+            if ((programs + n)->string) {
+                free ((programs + n)->string);
+            }
         }
     }
 
@@ -850,7 +853,54 @@ void list ()
 }
 
 void edit (int id)
-{ }
+{
+    int i, n = -1;
+
+    if (programs) {
+
+        /* look for program */
+        for (i = 0; i < nb_programs; i++) {
+            if ((programs + i)->id == id) {
+                n = i;
+                break;
+            }
+        }
+    }
+    if (n == -1) {
+        VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
+        return;
+    }
+
+    /* set string program */
+    //rl_insert_text ((programs + n)->string);
+    VERBOSE (INFO, fprintf (stdout, "edit: %s\n", (programs + n)->string));
+}
+
+void save_string (int id, char *string)
+{
+    int i, n = -1;
+
+    if (programs) {
+
+        /* look for program */
+        for (i = 0; i < nb_programs; i++) {
+            if ((programs + i)->id == id) {
+                n = i;
+                break;
+            }
+        }
+    }
+    if (n == -1) {
+        VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
+        return;
+    }
+
+    /* save program */
+    if ((programs + n)->string) {
+        free ((programs + n)->string);
+    }
+    (programs + n)->string = strdup (string);
+}
 
 void del (int id)
 {
@@ -878,6 +928,9 @@ void del (int id)
     if ((programs + n)->root) {
         delelement ((programs + n)->root);
     }
+    if ((programs + n)->string) {
+        free ((programs + n)->string);
+    }
 
     /* remove entry */
     workspace_t *tmp = (workspace_t *) callocordie (nb_programs - 1, sizeof (workspace_t));
index 8307c887517586efc48cca1a4c79343d04addc55..9fbde3a13c32d34f15105d85b77c59d1f4cf416d 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -55,6 +55,7 @@ typedef struct _workspace_t {
     double *storage;
     int storage_size;
     element_t *root;
+    char *string;
 } workspace_t;
 
 /* parser function */
@@ -67,6 +68,8 @@ void print_element (element_t *root, int level);
 
 double evaluate_element (element_t *root, char mask);
 
+void save_string (int id, char *string);
+
 /* completion functions */
 
 char **generate_completion_list ();