summaryrefslogtreecommitdiff
path: root/src/console.c
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2016-04-05 14:01:50 +0200
committerPaweł Redman <pawel.redman@gmail.com>2016-04-05 14:01:50 +0200
commitc7acaee6651a84ef9102b29350c37803c8f435a9 (patch)
tree68af0d065a3580c32558feda7dc918e112771238 /src/console.c
parent77a74fcea5c628bb426b5cce1012e4e5504b10f1 (diff)
Console WIP.
Diffstat (limited to 'src/console.c')
-rw-r--r--src/console.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/console.c b/src/console.c
new file mode 100644
index 0000000..13e33f7
--- /dev/null
+++ b/src/console.c
@@ -0,0 +1,137 @@
+#include "console.h"
+#include <readline/readline.h>
+
+typedef struct con_var_s con_var_t;
+struct con_var_s {
+ char *name;
+ char *value;
+ con_var_t *next;
+};
+
+con_var_t *con_vars[256];
+
+size_t con_var_hash(char *text)
+{
+ char *p;
+ size_t rv;
+
+ for (rv = 0, p = text; *p; p++)
+ rv += 119 * ((*p) + 83);
+
+ return rv & 0xFF;
+}
+
+con_var_t *con_var_find(char *name, size_t *ret_hash)
+{
+ size_t hash;
+ con_var_t *var;
+
+ hash = con_var_hash(name);
+
+ if (ret_hash)
+ *ret_hash = hash;
+
+ for (var = con_vars[hash]; var; var = var->next)
+ if (!strcmp(var->name, name))
+ return var;
+
+ return NULL;
+}
+
+con_var_t *con_var_add(char *name)
+{
+ con_var_t *var;
+ size_t hash;
+
+ var = con_var_find(name, &hash);
+ if (var)
+ return var;
+
+ var = malloc(sizeof(con_var_t));
+ assert(var);
+
+ var->next = con_vars[hash];
+ con_vars[hash] = var;
+
+ var->name = strdup(name);
+ assert(var->name);
+
+ var->value = NULL;
+
+ return var;
+}
+
+void con_var_set(char *name, char *value)
+{
+ con_var_t *var;
+
+ var = con_var_add(name);
+
+ free(var->value);
+
+ if (value) {
+ var->value = strdup(value);
+ assert(var->value);
+ } else
+ var->value = NULL;
+}
+
+char *con_var_get(char *name)
+{
+ con_var_t *var;
+
+ var = con_var_find(name, NULL);
+ if (!var)
+ return NULL;
+
+ return var->value;
+}
+
+float con_var_get_float(char *name)
+{
+ char *str;
+
+ str = con_var_get(name);
+ if (!str)
+ return 0.0f;
+
+ return atof(str);
+}
+
+size_t con_var_get_size(char *name)
+{
+ char *str;
+
+ str = con_var_get(name);
+ if (!str)
+ return 0;
+
+ return strtoul(name, NULL, 10);
+}
+
+int con_init(void)
+{
+ con_var_set("kurwa", "chuj");
+ return 0;
+}
+
+
+void con_quit(void)
+{
+}
+
+
+
+int con_thread_f(phy_sim *sim)
+{
+ printf("%f\n", con_var_get_float("kurwa"));
+
+ while (1) {
+ char *line;
+
+ line = readline("(cem) ");
+ printf("line=%s\n", line);
+ }
+
+ return 0;
+}