diff options
-rw-r--r-- | evaluator.c | 70 | ||||
-rw-r--r-- | lcd4linux.c | 13 | ||||
-rw-r--r-- | plugin_cfg.c | 7 |
3 files changed, 67 insertions, 23 deletions
diff --git a/evaluator.c b/evaluator.c index b07926c..a4e373a 100644 --- a/evaluator.c +++ b/evaluator.c @@ -1,4 +1,4 @@ -/* $Id: evaluator.c,v 1.23 2005/01/18 06:30:23 reinelt Exp $ +/* $Id: evaluator.c,v 1.24 2005/03/30 04:57:50 reinelt Exp $ * * expression evaluation * @@ -23,6 +23,9 @@ * * * $Log: evaluator.c,v $ + * Revision 1.24 2005/03/30 04:57:50 reinelt + * Evaluator speedup: use bsearch for finding functions and variables + * * Revision 1.23 2005/01/18 06:30:23 reinelt * added (C) to all copyright statements * @@ -441,16 +444,30 @@ char* R2S (RESULT *result) } -static VARIABLE *FindVariable (const char *name) + +/* bsearch compare function for variables */ +static int LookupVariable (const void *a, const void *b) { - int i; + char *key = (char*)a; + VARIABLE *var = (VARIABLE*)b; - for (i=0; i<nVariable; i++) { - if (strcmp(name, Variable[i].name)==0) { - return &Variable[i]; - } - } - return NULL; + return strcmp(key, var->name); +} + + +/* qsort compare function for variables */ +static int SortVariable (const void *a, const void *b) +{ + VARIABLE *va=(VARIABLE*)a; + VARIABLE *vb=(VARIABLE*)b; + + return strcmp(va->name, vb->name); +} + + +static VARIABLE *FindVariable (const char *name) +{ + return bsearch(name, Variable, nVariable, sizeof(VARIABLE), LookupVariable); } @@ -461,7 +478,7 @@ int SetVariable (const char *name, RESULT *value) V = FindVariable(name); if (V != NULL) { FreeResult (V->value); - V->value = value; + V->value = DupResult(value); return 1; } @@ -470,6 +487,8 @@ int SetVariable (const char *name, RESULT *value) Variable[nVariable-1].name = strdup(name); Variable[nVariable-1].value = DupResult(value); + qsort(Variable, nVariable, sizeof(VARIABLE), SortVariable); + return 0; } @@ -510,16 +529,29 @@ void DeleteVariables(void) } -static FUNCTION* FindFunction (const char *name) +/* bsearch compare function for functions */ +static int LookupFunction (const void *a, const void *b) { - int i; + char *n = (char*)a; + FUNCTION *f = (FUNCTION*)b; - for (i=0; i<nFunction; i++) { - if (strcmp(name, Function[i].name)==0) { - return &Function[i]; - } - } - return NULL; + return strcmp(n, f->name); +} + + +/* qsort compare function for functions */ +static int SortFunction (const void *a, const void *b) +{ + FUNCTION *fa=(FUNCTION*)a; + FUNCTION *fb=(FUNCTION*)b; + + return strcmp(fa->name, fb->name); +} + + +static FUNCTION* FindFunction (const char *name) +{ + return bsearch(name, Function, nFunction, sizeof(FUNCTION), LookupFunction); } @@ -530,6 +562,8 @@ int AddFunction (const char *name, const int argc, void (*func)()) Function[nFunction-1].name = strdup(name); Function[nFunction-1].argc = argc; Function[nFunction-1].func = func; + + qsort(Function, nFunction, sizeof(FUNCTION), SortFunction); return 0; } diff --git a/lcd4linux.c b/lcd4linux.c index d4885b1..65e4a66 100644 --- a/lcd4linux.c +++ b/lcd4linux.c @@ -1,4 +1,4 @@ -/* $Id: lcd4linux.c,v 1.76 2005/01/18 06:30:23 reinelt Exp $ +/* $Id: lcd4linux.c,v 1.77 2005/03/30 04:57:50 reinelt Exp $ * * LCD4Linux * @@ -23,6 +23,9 @@ * * * $Log: lcd4linux.c,v $ + * Revision 1.77 2005/03/30 04:57:50 reinelt + * Evaluator speedup: use bsearch for finding functions and variables + * * Revision 1.76 2005/01/18 06:30:23 reinelt * added (C) to all copyright statements * @@ -417,10 +420,14 @@ static void interactive_mode (void) if (strlen(line)>0) { if (Compile(line, &tree)!=-1) { Eval (tree, &result); - if (result.type==R_NUMBER) { + if (result.type == R_NUMBER) { printf ("%g\n", R2N(&result)); - } else if (result.type==R_STRING) { + } else if (result.type == R_STRING) { printf ("'%s'\n", R2S(&result)); + } else if (result.type == (R_NUMBER|R_STRING)) { + printf ("'%s' (%g)\n", R2S(&result), R2N(&result)); + } else { + printf ("internal error: unknown result type %d\n", result.type); } DelResult (&result); } diff --git a/plugin_cfg.c b/plugin_cfg.c index 8518eaa..2996045 100644 --- a/plugin_cfg.c +++ b/plugin_cfg.c @@ -1,4 +1,4 @@ -/* $Id: plugin_cfg.c,v 1.12 2005/01/18 06:30:23 reinelt Exp $ +/* $Id: plugin_cfg.c,v 1.13 2005/03/30 04:57:50 reinelt Exp $ * * plugin for config file access * @@ -23,6 +23,9 @@ * * * $Log: plugin_cfg.c,v $ + * Revision 1.13 2005/03/30 04:57:50 reinelt + * Evaluator speedup: use bsearch for finding functions and variables + * * Revision 1.12 2005/01/18 06:30:23 reinelt * added (C) to all copyright statements * @@ -128,8 +131,8 @@ static void load_variables (void) if (expression!=NULL && *expression!='\0') { tree = NULL; if (Compile(expression, &tree) == 0 && Eval(tree, &result)==0) { - debug ("Variable %s = '%s' (%f)", l, R2S(&result), R2N(&result)); SetVariable (l, &result); + debug ("Variable %s = '%s' (%g)", l, R2S(&result), R2N(&result)); DelResult (&result); } else { error ("error evaluating variable '%s' from %s", list, cfg_source()); |