int *queue_full(int *queues, int _rear, int _front) { int *new_queues = createQueue(max_size * 2); copy_element(_front+1, max_size, 0, queues, new_queues); copy_element(0, _rear + 1, max_size - (_front + 1), queues, new_queues); front = 2 * max_size - 1; rear = max_size - 2; max_size = max_size * 2; return new_queues; }
void copy_JCLArray(JCLArray* _this, const JCLArray* src) { JILLong i; destroy_JCLArray(_this); _this->grain = src->grain; for( i = 0; i < src->count; i++ ) set_JCLArray(_this, i, copy_element(_this, get_JCLArray(src, i))); }
void test_copy_element(void) { queues[1] = 2; queues[2] = 3; int *new_queues = createQueue(6); copy_element(1, 3, 0, queues, new_queues); TEST_ASSERT_EQUAL(2, new_queues[0]); TEST_ASSERT_EQUAL(3, new_queues[1]); }
// Can also be used to rehash hash_t *HASH_copy(const hash_t *hash){ hash_t *ret = HASH_create(hash->num_elements); ret->version = hash->version; int i; for(i=0;i<hash->elements_size;i++){ hash_element_t *element = hash->elements[i]; while(element!=NULL){ hash_element_t *element_copy = copy_element(element); put2(ret, element->key, element->i, element_copy); element=element->next; } } return ret; }
int main(int argv,char *argc[]){ if(argv<2){ PFS("the parameter error"); exit(-1); } //读取文件 FILE * fp = fopen(argc[1],"r"); if(fp==NULL){ PFS("open the file error"); exit(-2); } int cur_pointer=0; //临时字符的位置游标 int ch=0; //当前读取的字符 char temp[100]; //临时字符存放 int status=0; //状态分四种 0为空白 1为字符 2为数字 3为其他字符 int status__=0; //当status为3时 还细分多字符操作符和单字符操作符 void *elements[1000]; //存放各元素的主字符串指针数组(token值) int i=0; //主字符串指针数组和syn值数组的当前索引(两数组同步) int syn[1000]; //syn值数组 char *keys[9] = {"if","else","do","while","for","int","double","float","short"}; //系统保留关键词数组 while((ch=fgetc(fp)) != '#'){ if(ch==' '){ //状态变化 临时字符串以' \0 '结尾 if((status == 1) ||(status == 2)){ temp[cur_pointer] = '\0'; //结尾后位置归0 将字符串拷贝到主字符串数组作永久保存 cur_pointer = 0; //拷贝字符串 从临时到主 copy_element(elements,i,temp,status,syn,keys); i++; } status=0; continue; //如果是字母 可能是变量名、函数名或保留关键字 } else if((ch>'a' && ch<'z') || (ch>'A' && ch<'Z')){ if(status == 2){ temp[cur_pointer] = '\0'; //位置归0 cur_pointer = 0; //拷贝字符串 从临时到主 copy_element(elements,i,temp,2,syn,keys); i++; } status=1; temp[cur_pointer++] = ch; } else if(ch>'0' && ch<'9'){ if(status == 1){ temp[cur_pointer] = '\0'; cur_pointer = 0; //拷贝字符串 从临时到主 copy_element(elements,i,temp,1,syn,keys); i++; } status = 2; temp[cur_pointer++] = ch; } else { //第三种字符就直接存入主字符串数组 不放入临时字符 if((status == 1) || (status == 2)){ temp[cur_pointer] = '\0'; cur_pointer = 0; //拷贝字符串 从临时到主 copy_element(elements,i,temp,status,syn,keys); i++; } status = 3; switch(ch){ case '<': status__=24; elements[i] = "<"; syn[i] = 24; i++; break; case '>': if(status__==24){ //操作符匹配结束 status__置0 status__ = 0; elements[--i] = "<>"; syn[i] = 19; } else { elements[i] = ">"; syn[i] = 23; status__ = 23; } i++; break; case '=': if(status__ == 22){ status__ = 0; elements[--i] = "=="; syn[i] = 18; } else if(status__ == 23){ status__ = 0; elements[--i] = ">="; syn[i] = 21; }else if(status__ == 24){ status__ = 0; elements[--i] = "<="; syn[i] = 20; } else { status__ = 22; elements[i] = "="; syn[i] = 22; } i++; break; case '+': elements[i] = "+"; syn[i] = 12; break; case '-': elements[i] = "-"; syn[i] = 13; break; case '*': elements[i] = "*"; syn[i] = 14; break; case '/': elements[i] = "/"; syn[i] = 15; break; case '?': elements[i] = "?"; syn[i] = 16; break; case ':': elements[i] = ":"; syn[i] = 17; break; case ';': elements[i] = ";"; syn[i] = 25; break; } } } //test int m=0; for(m=0;m<i;m++){ printf("%s","("); printf("%s",elements[m]); printf("%s",","); printf("%d",syn[m]); printf("%s",")\n"); } }