asma: formel "umgeformt" und im endeffekt einen befehl "gewonnen" (haha)
[uebersetzerbau-ss10.git] / asma / main.c
index a228147f4133c39147f5a69341ab6fa84e6bce5f..4d5211528404c2d1f5b31330e52fa4bf1ad0b6ef 100644 (file)
@@ -1,33 +1,60 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <mcheck.h>
 
 extern unsigned char *asma(unsigned char *s);
+extern unsigned char *asma_callchecking(unsigned char *s);
 
-unsigned char *asma_ref(unsigned char *s)
+unsigned char *orig_asma(unsigned char *s)
 {
        int i;
        for (i=0; i<16; i++) {
-               unsigned char c = s[i];
-               c += (c >= 'A' && c <= 'Z') ? 'a'-'A' : 0;
+               unsigned char c=s[i];
+               c += (c>='A' && c<='Z') ? 'a'-'A' : 0;
                s[i] = c;
        }
        return s;
 }
 
-int main(int argc, char **argv) {
-       char *input1[]={"asdfABCDEFGHKL54", "foofuuMUHkk", "AbC", "BLA|MUHMKUH|KA"};
+static char ascii(char s) {
+       if(s < 0x20) return '.';
+       if(s > 0x7E) return '.';
+       return s;
+}
+
+static void hexdump(void *d, int len) {
+       unsigned char *data;
+       int i, off;
+       data = (unsigned char*)d;
+       for (off=0; off<len; off += 16) {
+               printf("\t%08x  ",off);
+               for(i=0; i<16; i++)
+                       if((i+off)>=len) printf("   ");
+                       else printf("%02x ",data[off+i]);
+
+               printf(" ");
+               for(i=0; i<16; i++)
+                       if((i+off)>=len) printf(" ");
+                       else printf("%c",ascii(data[off+i]));
+               printf("\n");
+       }
+}
+
+int main2(void)
+{
+       char *input1[]={"asdfABCDEFGHKL54", "foofuuMUHkk", "AbC", "BLA|MUHMKUH|KA", "XZY"};
        char *output1;
        char *output2;
        char *input2;
        char *input3;
        int i, j;
-       int off[] = {2,0,0,0};
+       int off[] = {2,0,0,0,0};
 
-       for(i = 0; i < 4; i++) {
+       for(i = 0; i < 5; i++) {
                input2 = strdup(input1[i]);
                input3 = strdup(input1[i]);
-               output1 = (char *)asma_ref((unsigned char *)(input2 + off[i]));
+               output1 = (char *)orig_asma((unsigned char *)(input2 + off[i]));
                output2 = (char *)asma((unsigned char *)(input3 + off[i]));
 
                output1[16]='\0';
@@ -38,12 +65,6 @@ int main(int argc, char **argv) {
                        j = 0;
                        printf("Testfall falsch; Input war: \"%s\"\n", input1[i]);
                        printf("erwartet:\n\t\"%s\"\ntatsaechliches Ergebnis:\n\t\"%s\"\n", output1, output2);
-#if 0
-                       printf("0x");
-                       for(j = 0; j < 16; j++)
-                               printf("%02X", output2[j]);
-                       printf("\n");
-#endif
                } else {
                        printf("Testfall \"%s\" passt.\n", output1);
                }
@@ -55,3 +76,122 @@ int main(int argc, char **argv) {
        return 0;
 }
 
+void printchar(unsigned char c)
+{
+       if (c<' ' || c>126 || c=='"')
+               printf("\\x%02x",c);
+       else
+               putchar(c);
+}
+
+void printarray(unsigned char* bufstart, int buflength, unsigned char* s)
+{
+       int i;
+       unsigned char *p=s-16;
+       unsigned long pl;
+       unsigned long l=16;
+       if (p<bufstart)
+               p=bufstart;
+       pl=s+l+16-p;
+       if (p+pl>bufstart+buflength)
+               pl=bufstart+buflength-p;
+       printf("%p=",p);
+       for(i=0; ;i++) {
+               if (p+i==s+l)
+                       printf("\"");
+               if (!(i<pl))
+                       break;
+               if(p+i==s)
+                       printf("\"");
+               printchar(p[i]);
+       }
+       printf("\n");
+}
+
+int test(unsigned char* s,unsigned char* t, unsigned char* u,
+               unsigned long sa,unsigned long ta, unsigned long ua)
+{
+       unsigned long l=16;
+       unsigned char utmp[l+16];
+       unsigned char stmp[l+16];
+       unsigned char *r, *orig_r;
+
+       // init
+       int i;
+       int off = sa + ta + ua * 8;
+       for (i=0; i<l+16; i++) {
+               s[i] = i * 14 + off;
+       }
+
+       // check
+       memcpy(stmp, s, l+16);
+       memset(u, 0xff, l);
+       memset(utmp, 0xff, l);
+
+       printf("\nCalling asma(%p) with\n", s+sa);
+       printarray(s+sa, l, s+sa);
+
+       printf("Result:\n");
+       r = asma_callchecking(s+sa);
+
+       printarray(r,l,r);
+
+       orig_r = orig_asma(stmp+sa);
+
+       if(r != s+sa) {
+               printf("[Error] return value wrong. Expected: %p\n", s+sa);
+               return 0;
+       }
+       if(memcmp(stmp+sa, s+sa, 16) != 0) {
+               printf("[Error] returned string wrong. Expected:\n");
+#if 1
+               printarray(utmp+ua, l, utmp+ua);
+#endif
+               printf("=== memcmp ===\n");
+               printf("memcmp(stmp+sa, orig_r, 16): %i\n", memcmp(stmp+sa, orig_r, 16));
+               printf("memcmp(s+sa, r, 16): %i\n", memcmp(s+sa, r, 16));
+               printf("=== input  ===\n");
+
+               printf("ref (s+sa):\n");
+               hexdump(stmp+sa, 16);
+               printf("asma (stmp+sa):\n");
+               hexdump(s+sa, 16);
+
+               printf("=== return ===\n");
+
+               printf("ref (orig_r):\n");
+               hexdump(orig_r, 16);
+               printf("asma (r):\n");
+               hexdump(r, 16);
+               return 0;
+       } else {
+               printf("succeeded\n");
+               return 1;
+       }
+}
+
+int main(int argc, char **argv)
+{
+       int success = 1;
+       int l=16+16+16;
+       int i, j, k;
+
+       unsigned char u[l];
+       unsigned char t[l];
+       unsigned char s[l];
+
+       for(i=0; i<16; i+=3) {
+               for(k=0; k<5; k++) {
+                       printf("==i: %d, k: %d\n", i, k);
+                       success &= test(s, t, u, i, 0, k);
+               }
+       }
+
+       if (!success)
+               fprintf(stdout,"\nTest failed.\n");
+       else
+               fprintf(stdout,"\nTest succeeded.\n");
+
+       return main2();
+}
+