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; }
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; }