diff options
| author | reinelt <> | 2005-03-30 04:57:50 +0000 | 
|---|---|---|
| committer | reinelt <> | 2005-03-30 04:57:50 +0000 | 
| commit | 3e6c870d3cefb3b1e61b779566d2f051f1b23083 (patch) | |
| tree | 51ba56fb654e4b61f180d15cc2017183c2e3a4ea | |
| parent | 77d259034099fff8737a1d5af47e8edf8d84efc0 (diff) | |
| download | lcd4linux-3e6c870d3cefb3b1e61b779566d2f051f1b23083.tar.gz | |
[lcd4linux @ 2005-03-30 04:57:50 by reinelt]
Evaluator speedup: use bsearch for finding functions and variables
| -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());  | 
