Mercurial > audlegacy-plugins
diff src/paranormal-ng/libcalc/dict.c @ 2078:1fa3c8cd366a
paranormal-ng: a GL visualiser. lots to do, most stuff won't work, but hey, this will do cool stuff too soon
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Mon, 15 Oct 2007 06:20:13 -0500 |
parents | |
children | f1b6f1b2cdb3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/paranormal-ng/libcalc/dict.c Mon Oct 15 06:20:13 2007 -0500 @@ -0,0 +1,128 @@ +/* dict.c -- symbol dictionary structures + * + * Copyright (C) 2001 Janusz Gregorczyk <jgregor@kki.net.pl> + * + * This file is part of xvs. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define V_SPACE_INIT 8 +#define V_SPACE_INCR 8 + +#include <glib.h> +#include <string.h> + +#include "dict.h" + +static int global_dict_initialized = 0; +static symbol_dict_t global_dict; + +static void more_variables (symbol_dict_t *dict) { + var_t *new_var; + + dict->v_space += V_SPACE_INCR; + + new_var = g_new(var_t, dict->v_space + 1); + memcpy (new_var, dict->variables, dict->v_count * sizeof(var_t)); + g_free (dict->variables); + + dict->variables = new_var; +} + +static int dict_define_variable (symbol_dict_t *dict, const char *name) { + var_t *var; + + if (dict->v_count >= dict->v_space) + more_variables (dict); + + var = &dict->variables[dict->v_count]; + + var->value = 0.0; + var->name = g_strdup (name); + + return dict->v_count++; +} + +symbol_dict_t *dict_new (void) { + symbol_dict_t *dict; + + if (global_dict_initialized != 1) { + int i; + + global_dict.v_count = 0; + global_dict.v_space = V_SPACE_INIT; + global_dict.variables = (var_t *) g_new(var_t, global_dict.v_space + 1); + global_dict_initialized = 1; + + for (i = 0; i < 100; i++) { + gchar tmpbuf[40]; + g_snprintf(tmpbuf, 40, "global_reg%d", i); + dict_define_variable(&global_dict, tmpbuf); + } + } + + dict = g_new(symbol_dict_t, 1); + + /* Allocate space for variables. */ + dict->v_count = 0; + dict->v_space = V_SPACE_INIT; + dict->variables = (var_t *) g_new (var_t, dict->v_space + 1); + + return dict; +} + +void dict_free (symbol_dict_t *dict) { + int i; + + if (!dict) + return; + + /* Free memory used by variables. */ + for (i = 0; i < dict->v_count; i++) + g_free (dict->variables[i].name); + g_free (dict->variables); + + g_free (dict); +} + +int dict_lookup (symbol_dict_t *dict, const char *name) { + int i; + + for (i = 0; i < global_dict.v_count; i++) { + if (strcmp (global_dict.variables[i].name, name) == 0) + return -i; + } + + for (i = 0; i < dict->v_count; i++) { + if (strcmp (dict->variables[i].name, name) == 0) + return i; + } + + /* Not defined -- define a new variable. */ + return dict_define_variable (dict, name); +} + +double *dict_variable (symbol_dict_t *dict, const char *var_name) { + int id = dict_lookup (dict, var_name); + + /* global variables are presented as negative offset. negating + * a negative number results in a positive offset. --nenolod + */ + if (id < 0) + return &global_dict.variables[-id].value; + + return &dict->variables[id].value; +}