From f650bc134e5e1db71498bd4504a98331a99993d2 Mon Sep 17 00:00:00 2001 From: reinelt Date: Wed, 30 Mar 2005 04:57:50 +0000 Subject: [lcd4linux @ 2005-03-30 04:57:50 by reinelt] Evaluator speedup: use bsearch for finding functions and variables git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@521 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- evaluator.c | 70 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 18 deletions(-) (limited to 'evaluator.c') 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; iname); +} + + +/* 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; iname); +} + + +/* 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; } -- cgit v1.2.3