//executes a command with arguments. static void runcmd(char* cmd) { for(stringfunc* f = procs; f->string; f++) { if (!compareCmds(cmd, f->string)) { f->func(getFirstArg(cmd)); return; } } if (*cmd) { writeString("unknown command "); writeString(cmd); writeString("\r\n"); } }
void getAllArgs(char cmdArgs[][ARG_CHARLEN],char *pch) { int i = 0; do { pch = getFirstArg(cmdArgs[i], pch); printf("cmdArgs %d:%s\n", i, cmdArgs[i]); if(i == ARG_NUM) { printf("Args are too much,the max num is %d.\n",ARG_NUM); break; } i++; }while(*pch != 0); }
int add2rootWL2(char **pch) { //MLFn pFn; //EMLFnType fnType; int i,ret; char tmpcmd[ARG_CHARLEN]; //struct list_head *rootfun = (struct list_head *)malloc(sizeof(struct list_head)); //INIT_LIST_HEAD(rootfun); //MLFnNode_tp pMLFN; void *tmp; NEXT_BLOCK: //printf("(\n"); g_spaces = 1; // *pch = getFirstArg(tmpcmd, *pch); // if(!strcmp(tmpcmd,")")) // goto END; // //暂不支持树枝返回值为函数名,假定第一字符串是函数名 // pFn = getFnByName(tmpcmd, &fnType); // pMLFN = (MLFnNode_tp)malloc(sizeof(MLFnNode_t)); // pMLFN->fn = pFn; // pMLFN->type = fnType; // pMLFN->arg = malloc(fnType*sizeof(void*)); // ///pMLFN->argFlag = argFlag; // pMLFN->argFlag = 0;//0b1; //printf("fnType=%d\n",fnType); //for(i = 0; i <= fnType /*&& *pch!=0*/;) while(getFirstArg(tmpcmd, *pch))//还有未处理的字符 { //printf("i=%d\n",i); *pch = getFirstArg(tmpcmd, *pch); if(!strcmp(tmpcmd,"("))//下一层 { space(g_spaces);printf("(\n"); g_spaces++; tmp = add2branchWL(pch);//add2rootWL(pch);//pMLFN->arg[i] = add2branchWL(*pch,rootfun); ret = MLEngineRun(tmp);//*(int *)(pMLFN->arg[i]) = MLEngineRun(tmp); space(g_spaces);printf("=%d\n",ret); continue; } else if(!strcmp(tmpcmd,"`("))//下一层 {///引用 space(g_spaces);printf("`(\n"); g_spaces++; tmp = add2branchWL(pch); space(g_spaces);printf("引用为%p\n",tmp); continue; } else if((!strcmp(tmpcmd,"`,(")) || (!strcmp(tmpcmd,",`(")) )//下一层 {///执行引用 space(g_spaces);printf("`,(\n"); g_spaces++; tmp = add2branchWL(pch); ret = MLEngineRun(tmp);//*(int *)(pMLFN->arg[i]) = MLEngineRun(tmp); space(g_spaces);printf("=%d\n", ret); continue; } else if(!strcmp(tmpcmd,",("))//下一层 {///执行 space(g_spaces);printf(",(\n"); g_spaces++; tmp = add2branchWL(pch); ret = MLEngineRun(tmp);//*(int *)(pMLFN->arg[i]) = MLEngineRun(tmp); space(g_spaces);printf("=%d\n",ret); continue; } else if(!strcmp(tmpcmd,")"))//当前函数pFn的右括号 { g_spaces--; continue;//一棵树处理完成 } else if(0 == *tmpcmd) { g_spaces--; break; } else { printf("Error code (%s)\n", tmpcmd); } } return ret; }
void* add2rootWL(char **pch) { MLFn pFn; EMLFnType fnType; int i; char tmpcmd[ARG_CHARLEN]; struct list_head *rootfun = (struct list_head *)malloc(sizeof(struct list_head)); INIT_LIST_HEAD(rootfun); MLFnNode_tp pMLFN; void *tmp; NEXT_BLOCK: printf("(\n"); g_spaces = 1; *pch = getFirstArg(tmpcmd, *pch); if(!strcmp(tmpcmd,")")) goto END; //暂不支持树枝返回值为函数名,假定第一字符串是函数名 pFn = getFnByName(tmpcmd, &fnType); pMLFN = (MLFnNode_tp)malloc(sizeof(MLFnNode_t)); pMLFN->fn = pFn; pMLFN->type = fnType; pMLFN->arg = malloc(fnType*sizeof(void*)); ///pMLFN->argFlag = argFlag; pMLFN->argFlag = 0;//0b1; //printf("fnType=%d\n",fnType); for(i = 0; i <= fnType /*&& *pch!=0*/;) { //printf("i=%d\n",i); *pch = getFirstArg(tmpcmd, *pch); if(!strcmp(tmpcmd,"("))//下一层 { space(g_spaces);printf("(\n"); pMLFN->argFlag |= 0b10 << i; g_spaces++; pMLFN->arg[i] = add2branchWL(pch);//add2rootWL(pch);//pMLFN->arg[i] = add2branchWL(*pch,rootfun); i++; continue; } else if(!strcmp(tmpcmd,"`("))//下一层 {///引用 space(g_spaces);printf("`(\n"); pMLFN->argFlag &= ((~0b10) << i);///pMLFN->argFlag |= 0b10 << i; g_spaces++; pMLFN->arg[i] = add2branchWL(pch); space(g_spaces);printf("引用为%p\n",pMLFN->arg[i]); //MLEngineRun(pMLFN->arg[i]); //printf("引用 TEST finished\n",pMLFN->arg[i]); i++; continue; } else if((!strcmp(tmpcmd,"`,(")) || (!strcmp(tmpcmd,",`(")) )//下一层 {///执行引用 space(g_spaces);printf("`,(\n"); pMLFN->argFlag &= ((~0b10) << i);///pMLFN->argFlag |= 0b10 << i; g_spaces++; tmp = add2branchWL(pch); //pMLFN->arg[i] = (int*)malloc(sizeof(int)); pMLFN->arg[i] = MLEngineRun(tmp);//*(int *)(pMLFN->arg[i]) = MLEngineRun(tmp); space(g_spaces);printf("=%d\n",*((int*)(pMLFN->arg[i]))); i++; continue; } else if(!strcmp(tmpcmd,",("))//下一层 {///执行 space(g_spaces);printf(",(\n"); pMLFN->argFlag |= 0b10 << i; g_spaces++; tmp = add2branchWL(pch); //pMLFN->arg[i] = (int*)malloc(sizeof(int)); pMLFN->arg[i] = MLEngineRun(tmp);//*(int *)(pMLFN->arg[i]) = MLEngineRun(tmp); space(g_spaces);printf("=%d\n",*((int*)(pMLFN->arg[i]))); i++; continue; } else if(!strcmp(tmpcmd,")"))//当前函数pFn的右括号 { g_spaces--; space(g_spaces);printf(")\n"); do { pMLFN->arg[i] = 0; i++; }while(i < fnType); goto ADD_FUN;//break;//跳出For循环 } else if(0 == *tmpcmd) { g_spaces--; goto END;//break; } else if((tmpcmd[0] >= '0')&&(tmpcmd[0] <= '9')) { pMLFN->arg[i] = (int*)malloc(sizeof(int)); *(int *)(pMLFN->arg[i]) = strtol(tmpcmd, 0, 0);//*(int *)(pMLFN->arg[i]) = atoi(tmpcmd); space(g_spaces);printf("%p %d\n",pMLFN->arg[i], *(int*)pMLFN->arg[i]); i++; continue; } else {//当作字符串 pMLFN->arg[i] = (int*)malloc(strlen(tmpcmd)); strcpy(pMLFN->arg[i], tmpcmd); space(g_spaces);printf("%p %s\n",pMLFN->arg[i], (char*)pMLFN->arg[i]); i++; continue; } } ADD_FUN: list_add_tail(&(pMLFN->list),rootfun); //* if (*pch != 0) { *pch = getFirstArg(tmpcmd, *pch); if( (!strcmp(tmpcmd,"(")) || (!strcmp(tmpcmd,",(")) || (!strcmp(tmpcmd,"`,(")) || (!strcmp(tmpcmd,",`(")) ) { goto NEXT_BLOCK; } if (*pch == 0) if (g_debug_on) { space(g_spaces);printf("<cmd end>"); } } //*/ //MLEngineRun(rootfun); END: //free(rootfun); return rootfun; }