/* $Id: ident.c,v 1.13 2003/09/28 09:03:00 jmuelmen Exp $ */ #include #include #include #include #include #include "shell.h" #define N_IDENT 1000 /* This holds all the identifiers */ static ident_t *idents[N_IDENT]; static int n_ident = 0; static int _saved_pos; int ident_add (ident_t *i) { if (n_ident == N_IDENT) { fprintf(stderr, "Bad bad bad! Out of space for identifiers.\n"); exit(1); } idents[n_ident++] = i; return 0; } ident_t *ident_get (const char *name) { return idents[ident_index(name)]; } ident_t *ident_get_idx (int i) { if (i >= n_ident) return NULL; return idents[i]; } int ident_index (const char *name) { int i = 0; for (; i < n_ident; ++i) if (!strncmp(idents[i]->name, name, IDENT_NAME_LEN)) return i; /* identifier exists */ if (ident_create(name)) /* identifier doesn't exist; create it. */ return n_ident - 1; return -1; } ident_t *ident_create (const char *name) { ident_t *i; if (n_ident == N_IDENT) return NULL; i = malloc(sizeof(ident_t)); i->type = var; value_init(&i->cont.val); i->cont.val.returned = 1; i->is_declared = 0; strncpy(i->name, name, IDENT_NAME_LEN); ident_add(i); return i; } void ident_destroy (ident_t *id) { value_destroy(&id->cont.val); free(id); } void ident_dump () { int i = 0; char time[100]; printf("Identifier table:\n"); printf("Name\tType\tDeclared?\tType\tValue\n"); for (; i < 80; ++i) printf("-"); printf("\n"); for (i = 0; i < n_ident; ++i) { printf("%s\t%s\t%s", idents[i]->name, idents[i]->type == var ? "var" : "func", idents[i]->is_declared ? "yes" : "no"); if (idents[i]->type == var) printf(" (%p)", &idents[i]->cont.val); switch (idents[i]->cont.val.val_type) { case val_int: printf("\t%s\t%d", "int", idents[i]->cont.val.value.v_int); break; case val_float: printf("\t%s\t%e", "float", idents[i]->cont.val.value.v_float); break; case val_string: printf("\t%s\t%s", "string", idents[i]->cont.val.value.v_string); break; case val_time: ctime_r(&idents[i]->cont.val.value.v_time, time); *strstr(time, "\n") = 0; printf("\t%s\t%s", "time", time); break; } printf("\n"); } } void ident_save_pos () { _saved_pos = n_ident; } void ident_clear_after_pos () { int i; for (i = _saved_pos; i < n_ident; ++i) ident_destroy(idents[i]); n_ident = _saved_pos; }