From b9c1c40d714a293c6cbee5063b5e00de8ccacbe8 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 26 Jan 2023 18:46:43 +0100 Subject: [PATCH] parial completion feature --- calc.c | 6 ++++++ parser.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- parser.h | 6 ++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/calc.c b/calc.c index d4d2243..f84cf91 100644 --- a/calc.c +++ b/calc.c @@ -30,6 +30,7 @@ char *progname = NULL; int mode = 1; int precision = 6; +char **completion_list = NULL; /* help function */ @@ -106,6 +107,9 @@ int main (int argc, char *argv[]) char format[9] = "=> %..g\n"; format[5] = '0' + precision; + /* completion list*/ + completion_list = generate_completion_list (); + /* read from input stream */ while (1) { @@ -178,6 +182,8 @@ int main (int argc, char *argv[]) } } + free_completion_list (completion_list); + return ret; } diff --git a/parser.c b/parser.c index c023a6e..b4381ac 100644 --- a/parser.c +++ b/parser.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "debug.h" @@ -627,7 +628,9 @@ void help (void) fprintf (stdout, "logical operators:"); fprintf (stdout, " & | !\n"); fprintf (stdout, "mathematic functions:"); - fprintf (stdout, " pow sqrt cos sin tan acos asin atan log exp\n"); + fprintf (stdout, " pow sqrt log exp\n"); + fprintf (stdout, "trigonometric functions:"); + fprintf (stdout, " cos sin tan acos asin atan\n"); fprintf (stdout, "supported functions:"); fprintf (stdout, " abs ceil floor\n"); fprintf (stdout, "storage functions:"); @@ -797,4 +800,49 @@ double evaluate_element (element_t *root, char mask) return 0; } +char **generate_completion_list () +{ + int i, l = 0; + char **list = (char **) calloc (NB_FUNCTIONS + NB_CONSTANTS + 1, sizeof (char *)); + if (list == NULL) { + VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); + exit (1); + } + + for (i = 0; i < NB_FUNCTIONS; i++) { + list[l] = strdup ((functions + i)->keyword); + if (list[l] == NULL) { + VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); + exit (1); + } + l++; + } + + for (i = 0; i < NB_CONSTANTS; i++) { + list[l] = strdup ((constants + i)->keyword); + if (list[l] == NULL) { + VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); + exit (1); + } + l++; + } + + return (list); +} + +void free_completion_list (char **list) +{ + int i; + + if (list) { + for (i = 0; i < NB_FUNCTIONS + NB_CONSTANTS; i++) { + if (list[i] != NULL) { + free (list[i]); + } + } + free (list); + } +} + + /* vim: set ts=4 sw=4 et: */ diff --git a/parser.h b/parser.h index 156a526..b48f6d0 100644 --- a/parser.h +++ b/parser.h @@ -55,6 +55,12 @@ void print_element (element_t *root, int level); double evaluate_element (element_t *root, char mask); +/* completion functions */ + +char **generate_completion_list (); + +void free_completion_list (char **list); + #endif /* __PARSER_H__ */ /* vim: set ts=4 sw=4 et: */ -- 2.30.2