/* return var struct or NULL if not found */
struct variable*
-get_var_struct(char* name, struct list* hash)
+get_var_struct(char* name, enum var_type type, struct list* hash)
{
int n;
struct variable *p;
n = get_bucket_number(name);
- int nocase = isupper(*name);
LIST_FOREACH(p, hash + n)
- if (!(nocase ? strcasecmp : strcmp)(p->name,name))
+ if (!strcasecmp(p->name, name) && p->type == type)
return p;
return NULL;
}
int
-find_var(char* name, struct list* hash)
+find_var(char* name, enum var_type type, struct list* hash)
{
int n;
struct variable *p;
n = get_bucket_number(name);
- int nocase = isupper(*name);
LIST_FOREACH(p, hash + n)
- if (!(nocase ? strcasecmp : strcmp)(p->name,name))
+ if (!strcasecmp(p->name, name) && p->type == type)
return p->varcode;
p = xmalloc(sizeof(struct variable));
p->name = xstrdup(name);
p->varcode = current_varcode++;
+ p->type = type;
list_add_last(hash+n, &p->car);
return p->varcode;
#include <stdio.h>
#include <string.h>
+#include <ctype.h>
#include "umpf.h"
static struct tree* tree_malloc(int type);
+static enum var_type get_var_type(char* var);
%}
%error-verbose
$$->pt.ass.left = tree_malloc(ST_LEAF);
$$->pt.ass.left->pt.leaf.type = L_VAR;
$$->pt.ass.left->pt.leaf.value = $1;
- $$->pt.ass.left->pt.leaf.n = find_var($1, var_hash);
+ $$->pt.ass.left->pt.leaf.n = find_var($1, get_var_type($1), var_hash);
$$->pt.ass.right = $3;
}
;
$$ = tree_malloc(ST_LEAF);
$$->pt.leaf.type = L_VAR;
$$->pt.leaf.value = $1;
- $$->pt.leaf.n = find_var($1, var_hash);
+ $$->pt.leaf.n = find_var($1, get_var_type($1), var_hash);
}
| CONST {
$$ = tree_malloc(ST_LEAF);
return temp;
}
+enum var_type
+get_var_type(char* var)
+{
+ int upper = 0;
+ int lower = 0;
+
+ if (islower(*var))
+ return VAR_USER;
+
+ while (*var) {
+ if (isupper(*var))
+ upper++;
+ if (islower(*var))
+ lower++;
+ var++;
+ }
+ if (upper && lower)
+ return VAR_HEADER;
+
+ return VAR_INTERN;
+}
+
void
yyerror (char const *s)
{
LIST_FOREACH(p, headers){
- pv = get_var_struct(p->name, hash);
+ pv = get_var_struct(p->name, VAR_HEADER, hash);
if (!pv)
continue;
u = unfold(p->value);
// find new headers
for (i = 0; i < HASHSIZE; i++){
LIST_FOREACH(pv, hash + i){
- if (isupper(pv->name[0]) && pv->modified){
+ if (pv->type == VAR_HEADER && pv->modified){
pv->modified = 0;
p = xmalloc(sizeof(struct hlist));
p->name = xstrdup(pv->name);
p->value = get_var(pv->varcode);
- list_add_last(headers,&p->car);
+ list_add_last(headers, &p->car);
}
}
}
struct variable* pv;
LIST_FOREACH(p, current_headers){
- pv = get_var_struct(p->name, hash);
+ pv = get_var_struct(p->name, VAR_HEADER, hash);
if (!pv)
continue;
u = unfold(p->value);
K_FILTER
};
+enum var_type {
+ VAR_HEADER,
+ VAR_INTERN,
+ VAR_USER
+};
+
struct tree {
enum {
ST_IF,
char* name;
int varcode;
int modified;
+ enum var_type type;
};
struct list input_code;
void init(void);
void compile(struct tree* t, struct list* where);
-int find_var(char* name, struct list* hash);
-struct variable* get_var_struct(char* name, struct list* hash);
+int find_var(char* name, enum var_type type, struct list* hash);
+struct variable* get_var_struct(char* name, enum var_type type, struct list* hash);
int store_const(char* c);
struct list* new_var_hash(void);
int get_bucket_number(char* name);