1/* Ltrace Test : parameters.c.
2   Objectives  : Verify that Ltrace can handle all the different
3   parameter types
4
5   This file was written by Steve Fink <sphink@gmail.com>. */
6
7#include <stdio.h>
8#include <unistd.h>
9#include <sys/syscall.h>
10#include <sys/stat.h>
11#include <errno.h>
12#include <string.h>
13#include <stdlib.h>
14
15void func_intptr(int *i);
16void func_intptr_ret(int *i);
17int func_strlen(char*);
18void func_strfixed(char*);
19void func_ppp(int***);
20void func_stringp(char**);
21void func_short(short, short);
22void func_ushort(unsigned short, unsigned short);
23float func_float(float, float);
24double func_double(double, double);
25void func_arrayi(int*, int);
26void func_arrayf(float*, int);
27void func_struct(void*);
28
29typedef enum {
30  RED,
31  GREEN,
32  BLUE,
33  CHARTREUSE,
34  PETUNIA
35} color_t;
36void func_enum(color_t);
37void func_typedef(color_t);
38
39void func_work(char *x);
40void func_call(char *x, char *y, void (*cb)(char *));
41
42void
43call_func_work (char *x)
44{
45	func_work(x);
46}
47
48int
49main ()
50{
51  int x = 17;
52  int *xP, **xPP;
53  char buf[200];
54  char *s;
55  int *ai;
56  float *af;
57
58  func_intptr(&x);
59
60  func_intptr_ret(&x);
61
62  func_string("zero\0xxxxxxxxxxxxxx");
63  func_strlen(buf);
64
65  extern int func_arg0(char *);
66  func_arg0(buf);
67
68  printf("%s\n", buf);
69
70  func_strfixed(buf);
71  printf("%s\n", buf);
72
73  x = 80;
74  xP = &x;
75  xPP = &xP;
76  func_ppp(&xPP);
77
78  s = (char*) malloc(100);
79  strcpy(s, "Dude");
80  func_stringp(&s);
81
82  func_enum(BLUE);
83
84  func_short(-8, -9);
85  func_ushort(33, 34);
86  float f = func_float(3.4, -3.4);
87  double d = func_double(3.4, -3.4);
88
89  func_typedef(BLUE);
90
91  ai = (int*) calloc(sizeof(int), 8);
92  for (x = 0; x < 8; x++)
93    ai[x] = 10 + x;
94  func_arrayi(ai, 8);
95  func_arrayi(ai, 2);
96
97  af = (float*) calloc(sizeof(float), 8);
98  for (x = 0; x < 8; x++)
99    af[x] = 10.1 + x;
100  func_arrayf(af, 8);
101  func_arrayf(af, 2);
102
103  {
104    struct {
105      int simple;
106      int alen;
107      int slen;
108      struct { int a; int b; }* array;
109      struct { int a; int b; } seq[3];
110      char* str;
111    } x;
112
113    x.simple = 89;
114
115    x.alen = 2;
116    x.array = malloc(800);
117    x.array[0].a = 1;
118    x.array[0].b = 10;
119    x.array[1].a = 3;
120    x.array[1].b = 30;
121
122    x.seq[0].a = 4;
123    x.seq[0].b = 40;
124    x.seq[1].a = 5;
125    x.seq[1].b = 50;
126    x.seq[2].a = 6;
127    x.seq[2].b = 60;
128
129    x.slen = 3;
130    x.str = "123junk";
131
132    func_struct(&x);
133  }
134
135  {
136    char x[10] = {};
137    char y[10] = {};
138    func_call(x, y, call_func_work);
139  }
140
141  struct S2 {
142    float f;
143    char a;
144    char b;
145  };
146  struct S3 {
147    char a[6];
148    float f;
149  };
150  struct S2 func_struct_2(int, struct S3 s3, double d);
151  func_struct_2(17, (struct S3){ "ABCDE", 0.25 }, 0.5);
152
153  struct S4 {
154    long a;
155    long b;
156    long c;
157    long d;
158  };
159  struct S4 func_struct_large(struct S4 a, struct S4 b);
160  func_struct_large((struct S4){ 1, 2, 3, 4 }, (struct S4){ 5, 6, 7, 8 });
161
162  struct S5 {
163    char a;
164    char b;
165    long c;
166    long d;
167  };
168  struct S5 func_struct_large2(struct S5 a, struct S5 b);
169  func_struct_large2((struct S5){ '0', '1', 3, 4 }, (struct S5){ '2', '3', 7, 8 });
170
171  struct S6 {
172    long a;
173    long b;
174    char c;
175    char d;
176  };
177  struct S6 func_struct_large3(struct S6 a, struct S6 b);
178  func_struct_large3((struct S6){ 3, 4, '0', '1' }, (struct S6){ 7, 8 ,'2', '3' });
179
180  void func_many_args(int a, int b, long c, double d, char e, int f, float g,
181		      char h, int i, double j, int k, double l, char m, int n,
182		      short o, int p, char q, float r, float s, double t,
183		      long u, float v, float w, float x, float y);
184  func_many_args(1, 2, 3, 4.0, '5', 6, 7.0,
185		 '8', 9, 10.0, 11, 12.0, 'A', 14,
186		 15, 16, 'B', 18.0, 19.0, 20.0,
187		 21, 22.0, 23.0, 24.0, 25.0);
188
189  void func_printf(char *format, ...);
190  func_printf("sotnuh %d %ld %g %c\n", 5, 6L, 1.5, 'X');
191  func_printf("sotnuh1 %d %ld %hd\n", 5, 6L, (short)7);
192  func_printf("sotnuh2 %s %10s %10s\n", "a string", "a trimmed string", "short");
193  func_printf("many_args"
194	 "%d %d %ld %g %c %d %g "
195	 "%c %d %g %d %g %c %d "
196	 "%hd %d %c %g %g %g "
197	 "%ld %g %g %g %g",
198	 1, 2, 3L, 4.0, '5', 6, 7.0,
199	 '8', 9, 10.0, 11, 12.0, 'A', 14,
200	 (short)15, 16, 'B', 18.0, 19.0, 20.0,
201	 21L, 22.0, 23.0, 24.0, 25.0);
202
203  func_printf("sotnuh3 %*s\n", 4, "a trimmed string");
204
205  void func_sprintf(char *str, char *format, ...);
206  func_sprintf(NULL, "test %d %d %d %d\n", 1, 2, 3, 4);
207
208  void func_lens(int, long, short, long);
209  func_lens(22, 23, 24, 25);
210
211  int func_bool(int a, int b);
212  func_bool(1, 10);
213  func_bool(2, 0);
214
215  void func_hide(int a, int b, int c, int d, int e, int f, int g, int h);
216  func_hide(1, 2, 3, 4, 5, 6, 7, 8);
217
218  struct func_hide_struct {
219	  int a; int b; int c; int d; int e; int f; int g; int h;
220  };
221  void func_hide_struct(struct func_hide_struct hs);
222  func_hide_struct((struct func_hide_struct){1, 2, 3, 4, 5, 6, 7, 8});
223
224  enum ab { A, B };
225  long *func_short_enums(short abs[]);
226  func_short_enums((short[]){ A, B, A, A });
227
228  long func_negative_enum(short a, unsigned short b, int c, unsigned d,
229                         long e, unsigned long f);
230  func_negative_enum(-1, -1, -1, -1, -1, -1);
231
232  void func_charp_string(char *p);
233  func_charp_string("null-terminated string");
234
235  struct struct_empty {};
236  struct struct_empty func_struct_empty(struct struct_empty e);
237  func_struct_empty((struct struct_empty) {});
238
239  struct struct_size1 { char a; };
240  struct struct_size1 func_struct_size1(struct struct_size1 e);
241  func_struct_size1((struct struct_size1){ '5' });
242
243  struct struct_size2 { short a; };
244  struct struct_size2 func_struct_size2(struct struct_size2 e);
245  func_struct_size2((struct struct_size2){ 5 });
246
247  struct struct_size4 { int a; };
248  struct struct_size4 func_struct_size4(struct struct_size4 e);
249  func_struct_size4((struct struct_size4){ 5 });
250
251  struct struct_size8 { int a; int b; };
252  struct struct_size8 func_struct_size8(struct struct_size8 e);
253  func_struct_size8((struct struct_size8){ 5, 6 });
254
255  return 0;
256}
257