// undef __STDC__ #include #include int *L_halloc_arr(int size) {int *a = (int *)malloc(size + sizeof(int)); // allocate byte + space for len return a+sizeof(int); // reserve space for len at index -1 } int *L_init_arr(int *a, int size) {int i; int init=0; int len=(size / sizeof(int)); *(a-1/*(sizeof(int))*/) = len; // store len at index -1 for(i=0;i byte + space for obj id return p; } int *L_init_obj(int *a, int size) {int i; int *p = a; for(i=0;i<=size;i+=sizeof(int)) *p++ = 0; fprintf(stderr, "next free addr after init_arr is %x\n",p); return a; } void L_print(int n) { printf("%d\n",n); } void L_raise(int rc) { fprintf(stderr, "Program terminated with error code %d",rc); exit(rc); } struct string {int length; unsigned char chars[1];}; int stringEqual(struct string *s, struct string *t) {int i; if (s==t) return 1; if (s->length!=t->length) return 0; for(i=0;ilength;i++) if (s->chars[i]!=t->chars[i]) return 0; return 1; } void print(struct string *s) {int i; unsigned char *p=s->chars; for(i=0;ilength;i++,p++) putchar(*p); } void flush() { fflush(stdout); } struct string consts[256]; struct string empty={0,""}; int main() {int i; for(i=0;i<256;i++) {consts[i].length=1; consts[i].chars[0]=i; } mj_main(0 /* static link!? */); return 0; } int ord(struct string *s) { if (s->length==0) return -1; else return s->chars[0]; } struct string *chr(int i) { if (i<0 || i>=256) {fprintf(stderr, "chr(%d) out of range\n",i); exit(1);} return consts+i; } int size(struct string *s) { return s->length; } struct string *substring(struct string *s, int first, int n) { if (first<0 || first+n>s->length) {fprintf(stderr, "substring([%d],%d,%d) out of range\n",s->length,first,n); exit(1);} if (n==1) return consts+s->chars[first]; {struct string *t = (struct string *)malloc(sizeof(int)+n); int i; t->length=n; for(i=0;ichars[i]=s->chars[first+i]; return t; } } struct string *concat(struct string *a, struct string *b) { if (a->length==0) return b; else if (b->length==0) return a; else {int i, n=a->length+b->length; struct string *t = (struct string *)malloc(sizeof(int)+n); t->length=n; for (i=0;ilength;i++) t->chars[i]=a->chars[i]; for(i=0;ilength;i++) t->chars[i+a->length]=b->chars[i]; return t; } } int not(int i) { return !i; } #undef getchar /* struct string *getchar() {int i=getc(stdin); if (i==EOF) return ∅ else return consts+i; } */