/* Get the value of an array's element. breg: base register; ireg: index register; dreg: destination register. */ void ir(avm* vm, int breg, int ireg, int dreg) { ctable* table; long toff; if (!istable(&vm->regs[breg])) { setvmerror(vm, ZEN_VM_INVALID_TABLE); return; } toff = vm->tot.table[vm->regs[breg].entity.ival].offset; table = (ctable*)getdata(vm->hp.heap, toff); IR(vm, table, &vm->regs[ireg], &vm->regs[dreg]); }
void ia(avm* vm, int breg, int ireg, int sreg) { ctable* table; long toff; if (!istable(&vm->regs[breg])) { setvmerror(vm, ZEN_VM_INVALID_TABLE); return; } toff = vm->tot.table[vm->regs[breg].entity.ival].offset; table = (ctable*)getdata(vm->hp.heap, toff); IA(vm, table, vm->regs[breg].entity.ival, &vm->regs[ireg], &vm->regs[sreg]); if (vm->oldheap) { free(vm->oldheap); vm->oldheap = 0; } }
/* * break a collection of markdown input into * blocks of lists, code, html, and text to * be marked up. */ static Paragraph * compile(Line *ptr, int toplevel, MMIOT *f) { ParagraphRoot d = { 0, 0 }; Paragraph *p = 0; Line *r; int para = toplevel; int blocks = 0; int hdr_type, list_type, list_class, indent; ptr = consume(ptr, ¶); while ( ptr ) { if ( iscode(ptr) ) { p = Pp(&d, ptr, CODE); if ( f->flags & MKD_1_COMPAT) { /* HORRIBLE STANDARDS KLUDGE: the first line of every block * has trailing whitespace trimmed off. */ ___mkd_tidy(&p->text->text); } ptr = codeblock(p); } #if WITH_FENCED_CODE else if ( iscodefence(ptr,3) && (p=fencedcodeblock(&d, &ptr)) ) /* yay, it's already done */ ; #endif else if ( ishr(ptr) ) { p = Pp(&d, 0, HR); r = ptr; ptr = ptr->next; ___mkd_freeLine(r); } else if (( list_class = islist(ptr, &indent, f->flags, &list_type) )) { if ( list_class == DL ) { p = Pp(&d, ptr, DL); ptr = definition_block(p, indent, f, list_type); } else { p = Pp(&d, ptr, list_type); ptr = enumerated_block(p, indent, f, list_class); } } else if ( isquote(ptr) ) { p = Pp(&d, ptr, QUOTE); ptr = quoteblock(p, f->flags); p->down = compile(p->text, 1, f); p->text = 0; } else if ( ishdr(ptr, &hdr_type) ) { p = Pp(&d, ptr, HDR); ptr = headerblock(p, hdr_type); } else if ( istable(ptr) && !(f->flags & (MKD_STRICT|MKD_NOTABLES)) ) { p = Pp(&d, ptr, TABLE); ptr = tableblock(p); } else { p = Pp(&d, ptr, MARKUP); ptr = textblock(p, toplevel, f->flags); } if ( (para||toplevel) && !p->align ) p->align = PARA; blocks++; para = toplevel || (blocks > 1); ptr = consume(ptr, ¶); if ( para && !p->align ) p->align = PARA; } return T(d); }