int redis_list::rpush(const char* key, const char* first_value, ...) { std::vector<const char*> values; values.push_back(first_value); va_list ap; va_start(ap, first_value); const char* value; while ((value = va_arg(ap, const char*)) != NULL) values.push_back(value); va_end(ap); return rpush(key, values); }
uforth_stat exec(CELL wd_idx, char toplevelprim,uint8_t last_exec_rdix) { while(1) { if (wd_idx == 0) { uforth_abort_request(ABORT_ILLEGAL); uforth_abort(); /* bad instruction */ return E_NOT_A_WORD; } cmd = uforth_dict[wd_idx++]; switch (cmd) { case 0: uforth_abort_request(ABORT_ILLEGAL); uforth_abort(); /* bad instruction */ return E_NOT_A_WORD; case ABORT: uforth_abort_request(ABORT_WORD); break; case IMMEDIATE: make_immediate(); break; case IRAM_FETCH: r1 = dpop(); dpush(((DCELL*)uforth_iram)[r1]); break; case URAM_BASE_ADDR: dpush((RAM_START_IDX + (sizeof(struct uforth_iram))) + curtask_idx); break; case SKIP_IF_ZERO: r1 = dpop(); r2 = dpop(); if (r2 == 0) wd_idx += r1; break; case DROP: dpop(); break; case JMP: wd_idx = dpop(); break; case JMP_IF_ZERO: r1 = dpop(); r2 = dpop(); if (r2 == 0) wd_idx = r1; break; case HERE: dpush(dict_here()); break; case INCR_HERE: dict_incr_here(1); break; case LIT: dpush(uforth_dict[wd_idx++]); break; case DLIT: dpush((((uint32_t)uforth_dict[wd_idx])<<16) | (uint16_t)uforth_dict[wd_idx+1]); wd_idx+=2; break; case LESS_THAN: r1 = dpop(); r2 = dpop(); dpush(r2 < r1); break; case ABS: r1 = dpop(); dpush(abs32(r1)); break; case ADD: r1 = dpop(); r2 = dtop(); dtop() = r1+r2; break; case SUB: r1 = dpop(); r2 = dtop(); dtop() = r2-r1; break; case AND: r1 = dpop(); r2 = dtop(); dtop() = r1&r2; break; case LSHIFT: r1 = dpop(); r2 = dtop(); dtop() = r2<<r1; break; case RSHIFT: r1 = dpop(); r2 = dtop(); dtop() = r2>>r1; break; case OR: r1 = dpop(); r2 = dtop(); dtop() = r1|r2; break; case XOR: r1 = dpop(); r2 = dtop(); dtop() = r1^r2; break; case INVERT: dtop() = ~dtop(); break; case MULT: r1 = dpop(); r2 = dtop(); dtop() = r1*r2; break; case DIV : r1 = dpop(); r2 = dtop(); dtop() = r2/r1; break; case SWAP: r1 = dpop(); r2 = dpop(); dpush(r1); dpush(r2); break; case RPICK: r1 = dpop(); r2 = rpick(r1); dpush(r2); break; case PICK: r1 = dpop(); r2 = dpick(r1); dpush(r2); break; case EQ_ZERO: dtop() = (dtop() == 0); break; case RPUSH: rpush(dpop()); break; case RPOP: dpush(rpop()); break; case FETCH: r1 = dpop(); if (r1 >= RAM_START_IDX) { dpush(uforth_ram[r1-RAM_START_IDX]); } else { dpush(uforth_dict[r1]); } break; case STORE: r1 = dpop(); r2 = dpop(); if (r1 >= RAM_START_IDX) { uforth_ram[r1-RAM_START_IDX] = r2; } else { dict_write(r1,r2); } break; case EXEC: r1 = dpop(); rpush(wd_idx); wd_idx = r1; break; case EXIT: if (uforth_uram->ridx > last_exec_rdix) return OK; wd_idx = rpop(); break; case CNEXT: b = next_char(); dpush(b); break; case STR_STORE: r1 = dpop(); r2 = uforth_ram[(r1-RAM_START_IDX)]; str1 =(char*)&uforth_ram[(r1-RAM_START_IDX)+1]; str1+=r2; b = dpop(); *str1 = b; uforth_ram[(r1-RAM_START_IDX)]++; break; case NEXT: str2 = PAD_STR; str1 = uforth_next_word(); memcpy(str2,str1, uforth_iram->currwordlen); PAD_STRLEN = uforth_iram->currwordlen; /* length */ dpush(PAD_ADDR+RAM_START_IDX); break; case COMMA_STRING: if (uforth_iram->compiling > 0) { dict_append(LIT); dict_append(dict_here()+4); /* address of counted string */ dict_append(LIT); rpush(dict_here()); /* address holding adress */ dict_incr_here(1); /* place holder for jump address */ dict_append(JMP); } rpush(dict_here()); dict_incr_here(1); /* place holder for count*/ r1 = 0; b = next_char(); /* eat space */ while (b != 0 && b!= '"') { r2 = 0; b = next_char(); if (b == 0 || b == '"') break; r2 |= BYTEPACK_FIRST(b); ++r1; b = next_char(); if (b != 0 && b != '"') { ++r1; r2 |= BYTEPACK_SECOND(b); } dict_append(r2); } dict_write(rpop(),r1); if (uforth_iram->compiling > 0) { dict_write(rpop(),dict_here()); /* jump over string */ } break; case CALLC: r1 = c_handle(); if (r1 != OK) return (uforth_stat)r1; break; case VAR_ALLOT: dpush(VAR_ALLOT_1()); break; case DEF: uforth_iram->compiling = 1; case _CREATE: dict_start_def(); uforth_next_word(); make_word(uforth_iram->currword,uforth_iram->currwordlen); if (cmd == _CREATE) { dict_end_def(); } else { defining_word = dict_here(); } break; case COMMA: dict_append(dpop()); break; case DCOMMA: r1 = dpop(); dict_append((uint32_t)r1>>16); dict_append(r1); break; case PARSE_NUM: r1 = dpop(); str1=uforth_count_str((CELL)r1,(CELL*)&r1); str1[r1] = '\0'; dpush(parse_num(str1,uforth_uram->base)); break; case PARSE_FNUM: r1 = dpop(); str1=uforth_count_str((CELL)r1,(CELL*)&r1); str1[r1] = '.'; str1[r1+1] = '\0'; dpush(parse_num(str1,uforth_uram->base)); break; case FIND: case FIND_ADDR: r1 = dpop(); str1=uforth_count_str((CELL)r1,(CELL*)&r1); r1 = find_word(str1, r1, &r2, 0, &b); if (r1 > 0) { if (b) r1 = uforth_dict[r1]; } if (cmd == FIND) { dpush(r1); } else { dpush(r2); } break; case POSTPONE: str1 = uforth_next_word(); r1 = find_word(str1, uforth_iram->currwordlen, 0, 0, &b); if (r1 == 0) { uforth_abort_request(ABORT_NAW); uforth_abort(); return E_NOT_A_WORD; } if (b) { dict_append(uforth_dict[r1]); } else { dict_append(r1); } break; case MOVE: r1 = dpop(); /* count */ rpush(r1); r1 = dpop(); /* dest */ r2 = dpop(); /* source */ if (r1 < RAM_START_IDX) { (void)rpop(); uforth_abort_request(ABORT_ILLEGAL); uforth_abort(); /* can't cmove into dictionary */ return E_ABORT; } str1 =(char*)&uforth_ram[(r1-RAM_START_IDX)]; if (r2 > RAM_START_IDX) { str2 =(char*)&uforth_ram[(r2-RAM_START_IDX)]; } else { str2 = (char*)&uforth_dict[r2]; } memcpy(str1, str2, rpop()); break; case MAKE_TASK: r1 = dpop(); r2 = dpop(); r3 = dpop(); r4 = dpop(); uforth_make_task(r1-RAM_START_IDX, r2, r3, r4); dpush(r1-RAM_START_IDX); break; case SELECT_TASK: uforth_select_task(dpop()); break; default: /* Execute user word by calling until we reach primitives */ rpush(wd_idx); wd_idx = uforth_dict[wd_idx-1]; /* wd_idx-1 is current word */ break; } if (uforth_aborting()) { uforth_abort(); return E_ABORT; } if (toplevelprim) return OK; } /* while(1) */ }
_load() { BLK FETCH TOR IN FETCH TOR ZERO IN STORE BSLASHSCR STAR BLK STORE rpush(0); if(!setjmp(*--jsp)) dointerpret(); RFROM IN STORE RFROM BLK STORE }
void do_enter(void) { rpush(ip); ip = work->next; }