/*
	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;
	}
}
Ejemplo n.º 3
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, &para);

    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, &para);

	if ( para && !p->align )
	    p->align = PARA;

    }
    return T(d);
}