]> git.sur5r.net Git - cc65/blob - test/ref/varargs.c
Merge pull request #249 from polluks/master
[cc65] / test / ref / varargs.c
1 /*
2   !!DESCRIPTION!! varargs test\r
3   !!ORIGIN!!\r
4   !!LICENCE!!     public domain\r
5 */\r
6 \r
7 #include <stdlib.h>\r
8 #include <stdio.h>\r
9 #include <stdarg.h>\r
10 \r
11 void chk0(char *format,...);\r
12 void chk1(int fd,char *format,...);\r
13 \r
14 #if 0\r
15 // old workaround for broken varargs\r
16 \r
17 void chk0(char *format,...){\r
18     __asm__ ("pha");    // save argument size\r
19     {\r
20 //va_list ap;\r
21 char *ap;\r
22 char *_format;\r
23 static char string[0x100];\r
24 \r
25 //    va_start(ap,format);\r
26     __asm__ ("pla");       // restore argument size\r
27     __asm__ ("ldx #$00");  // clear hibyte of AX\r
28     ap=__AX__;\r
29     ap+=(char*)&format;\r
30     // get value of format\r
31     ap-=2;\r
32     _format=*((char**)ap);\r
33 \r
34 //    vsprintf(string,format,ap);\r
35     vsprintf(&string[0],_format,ap);\r
36     printf("format:%s,string:%s\n",_format,string);\r
37 //    va_end(ap);\r
38 \r
39     }\r
40 }\r
41 \r
42 void chk1(int fd,char *format,...){\r
43     __asm__ ("pha");    // save argument size\r
44     {\r
45 //va_list ap;\r
46 char *ap;\r
47 char *_format;\r
48 int _fd;\r
49 static char string[0x100];\r
50 \r
51 //    va_start(ap,format);\r
52     __asm__ ("pla");       // restore argument size\r
53     __asm__ ("ldx #$00");  // clear hibyte of AX\r
54     ap=__AX__;\r
55     ap+=(char*)&format;\r
56     // get value of fd\r
57     ap-=2;\r
58     _fd=*((int*)ap);\r
59     // get value of format\r
60     ap-=2;\r
61     _format=*((char**)ap);\r
62 \r
63 //    vsprintf(string,format,ap);\r
64     vsprintf(&string[0],_format,ap);\r
65     printf("fd:%d,format:%s,string:%s\n",_fd,_format,string);\r
66 //    va_end(ap);\r
67 \r
68     }\r
69 }\r
70 \r
71 #endif\r
72 \r
73 void chk0(char *format,...){\r
74 va_list ap;\r
75 static char string[0x100];\r
76     va_start(ap,format);\r
77     vsprintf(string,format,ap);\r
78     printf("format:%s,string:%s\n",format,string);\r
79     va_end(ap);\r
80 }\r
81 \r
82 void chk1(int fd,char *format,...){\r
83 va_list ap;\r
84 static char string[0x100];\r
85 \r
86     va_start(ap,format);\r
87 \r
88     vsprintf(string,format,ap);\r
89         printf("fd:%d,format:%s,string:%s\n",fd,format,string);\r
90     va_end(ap);\r
91 }
92
93 int main(int argc,char **argv) {\r
94     printf("varargs test\n");\r
95 \r
96     printf("\nchk0/0:\n");chk0("chk0 %s","arg0");\r
97     printf("\nchk0/1:\n");chk0("chk0 %s %s","arg0","arg1");\r
98     printf("\nchk0/2:\n");chk0("chk0 %s %s %s","arg0","arg1","arg2");\r
99 \r
100     printf("\nchk1/0:\n");chk1(0xfd,"chk1 %s","arg0");\r
101     printf("\nchk1/1:\n");chk1(0xfd,"chk1 %s %s","arg0","arg1");\r
102     printf("\nchk1/2:\n");chk1(0xfd,"chk1 %s %s %s","arg0","arg1","arg2");\r
103 \r
104     return 0;
105 }\r