arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / asma / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <mcheck.h>
5
6 extern unsigned char *asma(unsigned char *s);
7 extern unsigned char *asma_callchecking(unsigned char *s);
8
9 unsigned char *orig_asma(unsigned char *s)
10 {
11         int i;
12         for (i=0; i<16; i++) {
13                 unsigned char c=s[i];
14                 c += (c>='A' && c<='Z') ? 'a'-'A' : 0;
15                 s[i] = c;
16         }
17         return s;
18 }
19
20 static char ascii(char s) {
21         if(s < 0x20) return '.';
22         if(s > 0x7E) return '.';
23         return s;
24 }
25
26 static void hexdump(void *d, int len) {
27         unsigned char *data;
28         int i, off;
29         data = (unsigned char*)d;
30         for (off=0; off<len; off += 16) {
31                 printf("\t%08x  ",off);
32                 for(i=0; i<16; i++)
33                         if((i+off)>=len) printf("   ");
34                         else printf("%02x ",data[off+i]);
35
36                 printf(" ");
37                 for(i=0; i<16; i++)
38                         if((i+off)>=len) printf(" ");
39                         else printf("%c",ascii(data[off+i]));
40                 printf("\n");
41         }
42 }
43
44 int main2(void)
45 {
46         char *input1[]={"asdfABCDEFGHKL54", "foofuuMUHkk", "AbC", "BLA|MUHMKUH|KA", "XZY"};
47         char *output1;
48         char *output2;
49         char *input2;
50         char *input3;
51         int i, j;
52         int off[] = {2,0,0,0,0};
53
54         for(i = 0; i < 5; i++) {
55                 input2 = strdup(input1[i]);
56                 input3 = strdup(input1[i]);
57                 output1 = (char *)orig_asma((unsigned char *)(input2 + off[i]));
58                 output2 = (char *)asma((unsigned char *)(input3 + off[i]));
59
60                 output1[16]='\0';
61                 output2[16]='\0';
62
63                 printf("\n");
64                 if(memcmp(output1,output2, 16)) {
65                         j = 0;
66                         printf("Testfall falsch; Input war: \"%s\"\n", input1[i]);
67                         printf("erwartet:\n\t\"%s\"\ntatsaechliches Ergebnis:\n\t\"%s\"\n", output1, output2);
68                 } else {
69                         printf("Testfall \"%s\" passt.\n", output1);
70                 }
71
72                 free(input2);
73                 free(input3);
74         }
75
76         return 0;
77 }
78
79 void printchar(unsigned char c)
80 {
81         if (c<' ' || c>126 || c=='"')
82                 printf("\\x%02x",c);
83         else
84                 putchar(c);
85 }
86
87 void printarray(unsigned char* bufstart, int buflength, unsigned char* s)
88 {
89         int i;
90         unsigned char *p=s-16;
91         unsigned long pl;
92         unsigned long l=16;
93         if (p<bufstart)
94                 p=bufstart;
95         pl=s+l+16-p;
96         if (p+pl>bufstart+buflength)
97                 pl=bufstart+buflength-p;
98         printf("%p=",p);
99         for(i=0; ;i++) {
100                 if (p+i==s+l)
101                         printf("\"");
102                 if (!(i<pl))
103                         break;
104                 if(p+i==s)
105                         printf("\"");
106                 printchar(p[i]);
107         }
108         printf("\n");
109 }
110
111 int test(unsigned char* s,unsigned char* t, unsigned char* u,
112                 unsigned long sa,unsigned long ta, unsigned long ua)
113 {
114         unsigned long l=16;
115         unsigned char utmp[l+16];
116         unsigned char stmp[l+16];
117         unsigned char *r, *orig_r;
118
119         // init
120         int i;
121         int off = sa + ta + ua * 8;
122         for (i=0; i<l+16; i++) {
123                 s[i] = i * 14 + off;
124         }
125
126         // check
127         memcpy(stmp, s, l+16);
128         memset(u, 0xff, l);
129         memset(utmp, 0xff, l);
130
131         printf("\nCalling asma(%p) with\n", s+sa);
132         printarray(s+sa, l, s+sa);
133
134         printf("Result:\n");
135         r = asma_callchecking(s+sa);
136
137         printarray(r,l,r);
138
139         orig_r = orig_asma(stmp+sa);
140
141         if(r != s+sa) {
142                 printf("[Error] return value wrong. Expected: %p\n", s+sa);
143                 return 0;
144         }
145         if(memcmp(stmp+sa, s+sa, 16) != 0) {
146                 printf("[Error] returned string wrong. Expected:\n");
147 #if 1
148                 printarray(utmp+ua, l, utmp+ua);
149 #endif
150                 printf("=== memcmp ===\n");
151                 printf("memcmp(stmp+sa, orig_r, 16): %i\n", memcmp(stmp+sa, orig_r, 16));
152                 printf("memcmp(s+sa, r, 16): %i\n", memcmp(s+sa, r, 16));
153                 printf("=== input  ===\n");
154
155                 printf("ref (s+sa):\n");
156                 hexdump(stmp+sa, 16);
157                 printf("asma (stmp+sa):\n");
158                 hexdump(s+sa, 16);
159
160                 printf("=== return ===\n");
161
162                 printf("ref (orig_r):\n");
163                 hexdump(orig_r, 16);
164                 printf("asma (r):\n");
165                 hexdump(r, 16);
166                 return 0;
167         } else {
168                 printf("succeeded\n");
169                 return 1;
170         }
171 }
172
173 int main(int argc, char **argv)
174 {
175         int success = 1;
176         int l=16+16+16;
177         int i, j, k;
178
179         unsigned char u[l];
180         unsigned char t[l];
181         unsigned char s[l];
182
183         for(i=0; i<16; i+=3) {
184                 for(k=0; k<5; k++) {
185                         printf("==i: %d, k: %d\n", i, k);
186                         success &= test(s, t, u, i, 0, k);
187                 }
188         }
189
190         if (!success)
191                 fprintf(stdout,"\nTest failed.\n");
192         else
193                 fprintf(stdout,"\nTest succeeded.\n");
194
195         return main2();
196 }
197