int tableSet(PTable t,const pchar Name,const pchar Value) { PTablePage p=t->pFirst,q; int idx0,idx=0,res=0; p=tableFind(p,&idx,Name); if(p) { q=p;idx0=idx; while((p=tableFind(p,&idx,Name))) { if(t->iFlags&TABLE_FLAG_ALLOCNAME)xfree(p->Values[idx].szName); if(t->iFlags&TABLE_FLAG_ALLOCVALUE)xfree(p->Values[idx].szValue); if(idx!=p->iCount-1)memmove(&p->Values[idx],&p->Values[idx+1],sizeof(SAttr)*(p->iCount-idx-1)); p->iCount--; t->iCount--; res++; } if(res)t->iHoles++; if(t->iFlags&TABLE_FLAG_ALLOCVALUE)xfree(q->Values[idx].szValue); if(xstrlen(q->Values[idx0].szValue)>=xstrlen(Value)) xstrcpy(q->Values[idx0].szValue,Value); else q->Values[idx0].szValue=xstrdup(t->pPool,Value); return t->iCount; }else return tableAdd(t,Name,Value); }
void looking (_node** tree, char** grid, char* string, stack* stack, table* allWords) { int f = searchDictionary(tree,string); int i; if (f != -1) { if (f) tableAdd(allWords,string); stackPrint(stack); neighbors* n = getNeighbors (stackTop(stack)); for (i = 0; i < neighSize(n); ++i) { position* newPos = neighGet(n,i); if (!stackFind(stack,newPos)) { stackPush(stack,newPos); char newString[strlen(string)+1]; strcpy(newString,string); strcat(newString,&(grid[newPos->x][newPos->y])); looking(tree,grid,newString,stack,allWords); } } } }
static int xmlParseTag(void* Pool,PXMLNode x,PXMLNode* p,pchar src,int i) { int st,j,q; for(;;) { i=xmlSkipSpace(src,i);CHK; if(src[i]=='/') { if(src[i+1]!='>')return 0; x->eType=xmlEmpty; return i+2; } if(src[i]=='>') { *p=x; return i+1; } st=i; i=xmlGetWordEnd(src,i);CHK; if(src[i]!='=')return 0; if(src[i+1]!='"' && src[i+1]!='\'')return 0; q=src[i+1]; src[i]=0; i+=2; j=i; i=xmlSkipTill(src,i,(xchar)q); if(i==-1) { src[j-2]='='; return 0; } if(x->tAttrs==NULL)x->tAttrs=tableNew(Pool,TABLE_FLAG_ALLOCNAME); tableAdd(x->tAttrs,src+st,xmlSubst(xstrndup(Pool,src+j,i-j))); src[j-2]='='; i++; } // return i; }
int main_imanager_req(){ int i, j; int index; void *buf; unsigned int offset; unsigned int users_count; unsigned int src_node; unsigned int seq_number; unsigned int node_id; struct sm_header *find; char *sm_name; if(g_group.coordinator.main_id == g_group.node_id) return 1; //max 33 mutex buf = mem_malloc(MAIN_IMAIN_SIZE); ((struct request_header*)buf)->msg_type = MSG_IMAIN_MANAGER; sendRecv(g_group.coordinator.main_id, buf, sizeof(struct request_header), buf, MSG_IMAIN_MANAGER); if(g_group.sm_table == NULL){ g_group.sm_table = hashTableCreate(SM_HASH_SIZE); } src_node = ((struct imain_reply*)buf)->req.src_node; seq_number = ((struct imain_reply*)buf)->req.src_seq_number; offset = sizeof(struct imain_reply); //copy share memory data for(i=0; i<((struct imain_reply*)buf)->sm_num; i++){ //mutex name sm_name = malloc(((struct main_sm_info*)(buf+offset))->name_len); memcpy(sm_name, buf+offset+sizeof(struct main_sm_info), ((struct main_sm_info*)(buf+offset))->name_len); sm_name[((struct main_sm_info*)(buf+offset))->name_len] = 0; printf("%s", sm_name); //search mutex find = hashTableSearch(g_group.sm_table, ((struct main_sm_info*)(buf+offset))->hash_id, sm_name); if(find == NULL){ //create new find = createSM(((struct main_sm_info*)(buf+offset))->hash_id, sm_name, ((struct main_sm_info*)(buf+offset))->home_node, ((struct main_sm_info*)(buf+offset))->size); hashTableInsert(g_group.sm_table, (struct hashheader*)find); } //copy find->count = ((struct main_sm_info*)(buf+offset))->count; //copy queue info users_count = ((struct main_sm_info*)(buf+offset))->users_count; offset += sizeof(struct main_sm_info)+strlen(sm_name); if(find->users == NULL) find->users = tableCreate(MAX_NODE_NUM, sizeof(unsigned int)); for(j=0; j< users_count; j++){ node_id = *((unsigned int*)(buf+offset)); if(searchNode(find->users, src_node)==-1){ index = tableGetEmpty(find->users); if(index == -1) return -1; tableAdd(find->users, (void*)&src_node, index); } offset += sizeof(unsigned int); } } g_group.coordinator.main_id = g_group.node_id; ((struct request_header*)buf)->msg_type = MSG_IMAIN_READY; ((struct request_header*)buf)->seq_number = seq_number; sendTo(src_node ,buf, sizeof(struct request_header)); mem_free(buf); return 1; }