Ejemplo n.º 1
0
int picolCallProc(picolInterp *i, int argc, char **argv)
{
    if(i->level>MAXRECURSION)
        return picolErr(i,"too many nested evaluations (infinite loop?)");
    picolCmd *c = picolGetCmd(i,argv[0]);
    if(!c)
        return PICOL_ERR;
    void *pd = c->privdata;
    if(!pd)
        return PICOL_ERR;
    char **x=pd;
    char *alist=x[0], *body=x[1];
    char buf[MAXSTR];
    picolCallFrame *cf = mycalloc(1,sizeof(*cf));
    int a = 0, done = 0, errcode = PICOL_ERR;
#ifndef __arm__
    if(!cf) {printf("could not allocate callframe\n"); exit(1);}
#else
    extern void print1(char *str);
    if(!cf) {dbg_send_str3("could not allocate callframe", 1); return PICOL_ERR;}
#endif
    cf->parent   = i->callframe;
    i->callframe = cf;
    i->level++;
    char *p = mystrdup(alist);
    while(1) {
        char *start = p;
        while(*p != ' ' && *p != '\0') p++;
        if (*p != '\0' && p == start) { p++; continue; }
        if (p == start) break;
        if (*p == '\0') done=1; else *p = '\0';
        if(EQ(start,"args") && done) {
            dbg_send_hex2("eq", p - alist);
            picolSetVar(i,start,picolList1(buf,argc-a-1,argv+a+1));
            a = argc-1;
            break;
        }
        if (++a > argc-1)
            break;
        picolSetVar(i,start,argv[a]);
        p++;
        if (done) break;
    }
    if (a == argc-1)
        errcode = picolEval(i,body);
    else
        errcode = picolErr1(i,"wrong # args for '%s'",argv[0]);
    if (errcode == PICOL_RETURN)
        errcode = PICOL_OK;
    i->callframe = cf->parent;
    myfree(cf);
    i->level--;
    return errcode;
}
Ejemplo n.º 2
0
uint16_t pcl_load(picolInterp *i, uint32_t addr)
{
    uint8_t *ptr = (uint8_t*)addr;
    dbg_send_hex2("pcl_load.addr", (uint32_t)ptr);
    int32_t fsz = (int32_t)flash_fsz1();
    uint32_t len = 0;
    uint16_t rc = PICOL_OK;
    char buf[MAXSTR];
    if(!fsz)
        return rc;
    while(1)
    {
        dbg_send_int2("pcl_load.fsz", fsz);
        while((ptr[0] == 0x0A) && (fsz > 0))
        {
            ptr++;
            fsz--;
        }
        len = pcl_get_chunksz(ptr, fsz);
        dbg_send_int2("pcl_load.len", len);
        if(len == 0)
            break;
        if(len >= sizeof(buf))
        {
            dbg_send_int2("chunk too big", len);
            dbg_send_int2("fsz", fsz);
            dbg_send_int2("ptr", (int32_t)(ptr - addr));
            break;
        }
        mymemcpy(buf, ptr, len);
        buf[len] = 0;
        dbg_send_str3(buf, 1);
        //pcl_exec(buf);
        dbg_send_str3(buf, 1);
        rc = picolEval(i, buf);
        dbg_send_int2("pcl_load_eval_result", rc);
        if(rc != PICOL_OK)
        {
            dbg_send_str3("pcl_load error", 1);
            dbg_send_str3(i->result, 1);
            break;
        }
        ptr += len + 1;
        fsz -= len + 1;
        if(fsz <= 0)
            break;
    }
    dbg_send_int2("pcl_load.fsz", fsz);
    return rc;
}