@define mkzas(len){ @local dispatch, str; str = mkstr(len); @define dispatch(args ...) { @local arg, range, new, beg, end; arg = listref(args, 1); if(arg == "get"){ range = listref(args, 2); beg = rangebeg(range); end = beg+rangelen(range); printf("get %x %x\n", beg, end); return substr(str, beg, end); } if(arg == "put"){ range = listref(args, 2); beg = rangebeg(range); end = beg+rangelen(range); new = listref(args, 3); strput(str, beg, new); printf("put %x %x\n", beg, end); return; } printf("bad argument to dispatch!\n"); } return mkas([ "dispatch" : dispatch ]); } @define main(){ @local dom, ns, as, p; as = mkzas(1024); ns = @names c32le { struct foo { @0x0 int i; @0x4 int *p; @0x8; }; @0x0 int x; @0x4 int y; @0x8 struct foo foo; @0x10 struct foo a[3]; }; dom = mkdom(ns, as); printf("&dom`x -> %t %x\n", &dom`x, &dom`x); printf("&dom`y -> %t %x\n", &dom`y, &dom`y); printf("&dom`foo -> %t %x\n", &dom`foo, &dom`foo); p = &dom`foo; printf("p -> %t %x\n", p, p); printf("&p->i -> %t %x\n", &p->i, &p->i); printf("p->i -> %t %x\n", p->i, p->i); printf("&p->p -> %t %x\n", &p->p, &p->p); printf("p->p -> %t %x\n", p->p, p->p); printf("*p->p -> %t %x\n", *p->p, *p->p); printf("p+1 -> %t %x\n", p+1, p+1); printf("&(p+1)->i -> %t %x\n", &(p+1)->i, &(p+1)->i); printf("(p+1)->i -> %t %x\n", (p+1)->i, (p+1)->i); printf("&(p+1)->p -> %t %x\n", &(p+1)->p, &(p+1)->p); printf("(p+1)->p -> %t %x\n", (p+1)->p, (p+1)->p); printf("*(p+1)->p -> %t %x\n", *(p+1)->p, *(p+1)->p); printf("*** dom`a ***\n"); p = dom`a; printf("p -> %t %x\n", p, p); printf("&p->i -> %t %x\n", &p->i, &p->i); printf("p->i -> %t %x\n", p->i, p->i); printf("&p->p -> %t %x\n", &p->p, &p->p); printf("p->p -> %t %x\n", p->p, p->p); printf("*p->p -> %t %x\n", *p->p, *p->p); printf("*** &dom`a[1] ***\n"); p = &dom`a[1]; printf("p -> %t %x\n", p, p); printf("&p->i -> %t %x\n", &p->i, &p->i); printf("p->i -> %t %x\n", p->i, p->i); printf("&p->p -> %t %x\n", &p->p, &p->p); printf("p->p -> %t %x\n", p->p, p->p); printf("*p->p -> %t %x\n", *p->p, *p->p); } main();