1 typedef long unsigned int size_t;
2 extern void abort (void);
3 extern char *strcpy (char *, const char *);
4 extern int strcmp (const char *, const char *);
5 typedef __builtin_va_list va_list;
6 static const char null[] = "(null)";
g(char * s,const char * format,va_list ap)7 int g (char *s, const char *format, va_list ap)
8 {
9 const char *f;
10 const char *string;
11 char spec;
12 static const void *step0_jumps[] = {
13 &&do_precision,
14 &&do_form_integer,
15 &&do_form_string,
16 };
17 f = format;
18 if (*f == '\0')
19 goto all_done;
20 do
21 {
22 spec = (*++f);
23 goto *(step0_jumps[2]);
24
25 /* begin switch table. */
26 do_precision:
27 ++f;
28 __builtin_va_arg (ap, int);
29 spec = *f;
30 goto *(step0_jumps[2]);
31
32 do_form_integer:
33 __builtin_va_arg (ap, unsigned long int);
34 goto end;
35
36 do_form_string:
37 string = __builtin_va_arg (ap, const char *);
38 strcpy (s, string);
39
40 /* End of switch table. */
41 end:
42 ++f;
43 }
44 while (*f != '\0');
45
46 all_done:
47 return 0;
48 }
49
50 void
f(char * s,const char * f,...)51 f (char *s, const char *f, ...)
52 {
53 va_list ap;
54 __builtin_va_start (ap, f);
55 g (s, f, ap);
56 __builtin_va_end (ap);
57 }
58
59 int
main(void)60 main (void)
61 {
62 char buf[10];
63 f (buf, "%s", "asdf", 0);
64 if (strcmp (buf, "asdf"))
65 abort ();
66 return 0;
67 }
68
69