+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();
+}
+