Пример #1
0
//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");
	}
}
Пример #2
0
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);
}
Пример #3
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;
}
Пример #4
0
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;
}