123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- #include<stdio.h>
- #include "interpreter.h"
- // --------------var[存储在hash_var节点上]
- var *make_var(){ // make var with base
- var *tmp;
- tmp = malloc(sizeof(var)); // get an address for base var
- tmp->name = ""; // can't get the name for the real var
- tmp->next = NULL;
- tmp->lock = auto_public;
- return tmp;
- }
- void append_var(char *name, GWARF_value value, var *base_var, int lock){ // lock本质为var token
- if(lock == auto_public){
- lock = public; // 使用自动权限
- }
- int break_ = 1; // get var[2] or not[1]
- var *tmp = base_var; // iter var
- while(1){
- if (!strcmp(tmp->name, name)){
- break_ = 2;
- break;
- }
- if (tmp->next == NULL){ // not var name *name
- break_ = 1;
- break;
- }
- tmp = tmp->next; // get the next to iter
- }
- if(break_ == 2){
- if(tmp->lock == lock || tmp->lock == public || (tmp->lock == protect && lock == private)){ // 检查是否具有修改的权限
- tmp->value = value;
- if(lock != auto_public){ // 检查是否可以改变权限
- tmp->lock = lock;
- }
- }
- return;
- }
- var *new_tmp = make_var();
- tmp->next = new_tmp;
- new_tmp->lock = lock;
- new_tmp->name = malloc(sizeof(name));
- strcpy(new_tmp->name, name);
- new_tmp->value = value;
- }
- void free_var(var *base_var){ // free the address
- var *tmp = base_var; // iter var
- while(1){
- if (tmp->next == NULL){ // the last
- free(tmp);
- break;
- }
- var *tmp_2 = tmp;
- tmp = tmp->next;
- free(tmp_2);
- }
- }
- var *get_var(char *name, var *base_var){ // get the address
- var *tmp = base_var; // iter var
- while(1){
- if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
- return tmp;
- }
- if (tmp->next == NULL){ // not var name *name
- return NULL;
- }
- tmp = tmp->next; // get the next to iter
- }
- }
- void del_var(char *name, var *base_var){ // free an address
- var *tmp = base_var, *last_tmp=NULL; // iter var
- while(1){
- if (!strcmp(tmp->name, name)){
- if(last_tmp != NULL){
- last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
- }
- free(tmp);
- return;
- }
- if (tmp->next == NULL){ // not var name *name
- return;
- }
- last_tmp = tmp;
- tmp = tmp->next; // get the next to iter
- }
- }
- // --------------hash_var[存储在var_list节点上]
- hash_var *make_hash_var(){ // 生成并初始化
- hash_var *tmp = NULL;
- tmp = malloc(sizeof(hash_var));
- tmp->hash = malloc((size_t)(sizeof(var) * MAX_SIZE));
-
- for(int i = 0; i < MAX_SIZE; i++){
- tmp->hash[i] = NULL; // 初始化
- }
- return tmp;
- }
- unsigned int time33(char *key){
- unsigned int hash = 5381;
- while(*key){
- hash += (hash << 5 ) + (*key++);
- }
- return (hash & 0x7FFFFFFF) % MAX_SIZE;
- }
- int login_node(char *name, GWARF_value value, hash_var *the_hash_var, int lock){
- unsigned int index = time33(name);
- var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
- if(base_node == NULL){ // 生成基本节点
- the_hash_var->hash[index] = make_var();
- base_node = the_hash_var->hash[index];
- }
- append_var(name, value, base_node, lock);
- return 0;
- }
- var *find_node(char *name, hash_var *the_hash_var){
- if(the_hash_var == NULL){
- return NULL;
- }
- unsigned int index = time33(name);
- var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
- if(base_node == NULL){ // 没有节点
- return NULL;
- }
- return get_var(name, base_node);
- }
- void del_var_node(char *name, hash_var *the_hash_var){ // 删除某个var
- if(the_hash_var == NULL){
- return;
- }
- unsigned int index = time33(name);
- var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
- if(base_node == NULL){ // 没有节点
- return;
- }
- del_var(name, base_node);
- }
- // --------------default_var[存储在var_list节点上]
- // TODO:: default_var也应该删除对应的var
- default_var *make_default_var(){ // make_default_var
- default_var *tmp;
- tmp = malloc(sizeof(default_var)); // get an address for default_var
- tmp->next = NULL;
- return tmp;
- }
- default_var *make_default_var_base(){ // if
- default_var *tmp = make_default_var();
- tmp->name = "";
- tmp->from = 0;
- return tmp;
- }
- void append_default_var_base(char *name ,int from, default_var *base_default_var){ // elif
- default_var *start = base_default_var;
- while(1){
- if (!strcmp(start->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
- return; // 不可以二次设置
- }
- if (start->next == NULL){ // not var name *name
- break;
- }
- start = start->next; // get the next to iter
- }
- default_var *tmp = make_default_var();
- tmp->name = name;
- tmp->from = from;
- start->next = tmp;
- return;
- }
- int get_default(char *name, default_var *base_default_var){ // get the address
- default_var *tmp = base_default_var; // iter var
- if(tmp == NULL){
- return 0;
- }
- while(1){
- if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
- return tmp->from;
- }
- if (tmp->next == NULL){ // not var name *name
- return 0;
- }
- tmp = tmp->next; // get the next to iter
- }
- }
- // --------------var_list[保存default_var和hash_var]
- var_list *make_var_list(){ // make a empty var_list node
- var_list *tmp;
- tmp = malloc(sizeof(var_list)); // get an address for base var
- tmp->next = NULL;
- tmp->hash_var_base = NULL;
- tmp->tag = run_func;
- tmp->default_list = make_default_var_base();
- return tmp;
- }
- var_list *make_var_base(hash_var *global_hash_var){ // make the base for global_var
- var_list *tmp = make_var_list();
- tmp->hash_var_base = global_hash_var;
- return tmp;
- }
- var_list *append_var_list(hash_var *global_hash_var, var_list *var_list_base){ // make var_list[FILO]
- var_list *tmp = make_var_list();
- tmp->hash_var_base = global_hash_var;
- tmp->next = var_list_base;
- return tmp;
- }
- var_list *append_by_var_list(var_list *back_var_list, var_list *var_list_base){ // 拼凑两个var_list
- var_list *start = back_var_list;
- while(1){
- if(start->next == NULL){ // to the last
- break;
- }
- start = start->next;
- }
- start->next = var_list_base;
- return back_var_list;
- }
- var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
- var_list *tmp = var_list_base->next;
- if(tmp==NULL){
- return var_list_base;
- }
- free(var_list_base);
- return tmp;
- }
- int get_var_list_len(var_list *var_base){
- var_list *start = var_base;
- int tmp = 0;
- while(1){
- if(start->next == NULL){
- break;
- }
- start = start->next;
- tmp += 1;
- }
- return tmp;
- }
- var *find_var(var_list *var_base, int from, char *name, int *index){ // index表示层数
- var_list *start = var_base;
- var *return_var;
- from += get_default(name, var_base->default_list);
- for(int i = 0;i < from;i+= 1){
- if(start->next == NULL){
- break;
- }
- start = start->next;
- }
- if(index != NULL){
- *index = from;
- }
- while (1)
- {
- return_var = find_node(name, start->hash_var_base);
- if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
- return NULL;
- }
- else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
- start = start->next;
- if(index != NULL){
- *index += 1;
- }
- continue;
- }
- return return_var; //get var success can or can't next
- }
- }
- void add_var(var_list *var_base,int from, char *name, GWARF_value value, int lock){ // add var by func append_var in var_list[iter to find]
- var_list *start = var_base;
- var *return_var;
- from += get_default(name, var_base->default_list);
- for(int i = 0;i < from;i+= 1){
- if(start->next == NULL){
- break;
- }
- start = start->next;
- }
- login_node(name, value, start->hash_var_base, lock);
- }
- void del_var_var_list(var_list *var_base,int from, char *name){
- var_list *start = var_base;
- var *return_var;
- from += get_default(name, var_base->default_list);
- for(int i = 0;i < from;i+= 1){
- if(start->next == NULL){
- break;
- }
- start = start->next;
- }
- del_var_node(name, start->hash_var_base);
- }
- var_list *copy_var_list(var_list *var_list_base){ // 复制一条var链到另一个内存地址上[base不复制]
- var_list *start = malloc(sizeof(var_list_base)), *tmp;
- memcpy(start, var_list_base, sizeof(var_list_base)); // 复制base节点
- tmp = start; // 记录base节点
- while(1){ // 复制var_list链
- if(var_list_base == NULL){ // 已经匹配到了最后一个
- break;
- }
- var_list *next_tmp = malloc(sizeof(var_list_base));
- memcpy(next_tmp, var_list_base, sizeof(var_list_base)); // 复制到新的地方
- start->next = next_tmp; // 应用新的地方
- start = start->next;
- var_list_base = var_list_base->next;
- }
- return tmp;
- }
|