fmt_decl.c revision 1.8 1 1.8 rillig /* $NetBSD: fmt_decl.c,v 1.8 2021/10/31 10:56:19 rillig Exp $ */
2 1.1 rillig /* $FreeBSD: head/usr.bin/indent/tests/declarations.0 334478 2018-06-01 09:41:15Z pstef $ */
3 1.1 rillig
4 1.1 rillig /* See FreeBSD r303570 */
5 1.1 rillig
6 1.1 rillig #indent input
7 1.1 rillig typedef void (*voidptr) (int *);
8 1.1 rillig #indent end
9 1.1 rillig
10 1.1 rillig #indent run
11 1.1 rillig typedef void (*voidptr)(int *);
12 1.1 rillig #indent end
13 1.1 rillig
14 1.1 rillig
15 1.1 rillig #indent input
16 1.1 rillig static const struct
17 1.1 rillig {
18 1.1 rillig double x;
19 1.1 rillig double y, z;
20 1.1 rillig } n[m + 1] =
21 1.1 rillig {
22 1.1 rillig {
23 1.1 rillig .0,
24 1.1 rillig .9,
25 1.1 rillig 5
26 1.1 rillig }
27 1.1 rillig };
28 1.1 rillig #indent end
29 1.1 rillig
30 1.1 rillig #indent run
31 1.1 rillig static const struct {
32 1.1 rillig double x;
33 1.1 rillig double y, z;
34 1.1 rillig } n[m + 1] =
35 1.1 rillig {
36 1.1 rillig {
37 1.1 rillig .0,
38 1.1 rillig .9,
39 1.1 rillig 5
40 1.1 rillig }
41 1.1 rillig };
42 1.1 rillig #indent end
43 1.1 rillig
44 1.1 rillig
45 1.1 rillig #indent input
46 1.1 rillig typedef struct Complex
47 1.1 rillig {
48 1.1 rillig double x;
49 1.1 rillig double y;
50 1.1 rillig } Complex;
51 1.1 rillig #indent end
52 1.1 rillig
53 1.1 rillig #indent run
54 1.1 rillig typedef struct Complex {
55 1.1 rillig double x;
56 1.1 rillig double y;
57 1.1 rillig } Complex;
58 1.1 rillig #indent end
59 1.1 rillig
60 1.1 rillig
61 1.8 rillig /*
62 1.8 rillig * As of 2021-10-31, indent parses the following function definition as these
63 1.8 rillig * tokens:
64 1.8 rillig *
65 1.8 rillig * line 1: type "void"
66 1.8 rillig * line 1: newline "\n"
67 1.8 rillig * line 2: funcname "t1"
68 1.8 rillig * line 2: newline "\n" repeated, see search_stmt
69 1.8 rillig * line 3: funcname "t1" XXX: wrong line_no
70 1.8 rillig * line 3: lparen_or_lbracket "("
71 1.8 rillig * line 3: ident "char" XXX: should be 'type', intuitively
72 1.8 rillig * line 3: unary_op "*"
73 1.8 rillig * line 3: ident "a"
74 1.8 rillig * line 3: comma ","
75 1.8 rillig * line 3: ident "int" XXX: should be 'type'
76 1.8 rillig * line 3: ident "b"
77 1.8 rillig * line 3: comma ","
78 1.8 rillig * line 3: newline "\n"
79 1.8 rillig * line 4: ident "void" XXX: should be 'type'
80 1.8 rillig * line 4: lparen_or_lbracket "("
81 1.8 rillig * line 4: unary_op "*"
82 1.8 rillig * line 4: ident "fn"
83 1.8 rillig * line 4: rparen_or_rbracket ")"
84 1.8 rillig * line 4: lparen_or_lbracket "("
85 1.8 rillig * line 4: ident "void" XXX: should be 'type'
86 1.8 rillig * line 4: rparen_or_rbracket ")"
87 1.8 rillig * line 4: rparen_or_rbracket ")"
88 1.8 rillig * line 4: newline "\n"
89 1.8 rillig * line 5: lbrace "{"
90 1.8 rillig * line 5: lbrace "{" repeated, see search_stmt
91 1.8 rillig * line 5: newline "\n" FIXME: there is no newline in the source
92 1.8 rillig * line 6: rbrace "}"
93 1.8 rillig * line 6: eof "\n"
94 1.8 rillig */
95 1.1 rillig #indent input
96 1.1 rillig void
97 1.1 rillig t1 (char *a, int b,
98 1.1 rillig void (*fn)(void))
99 1.1 rillig {}
100 1.1 rillig #indent end
101 1.1 rillig
102 1.1 rillig #indent run
103 1.1 rillig void
104 1.1 rillig t1(char *a, int b,
105 1.1 rillig void (*fn)(void))
106 1.1 rillig {
107 1.1 rillig }
108 1.1 rillig #indent end
109 1.1 rillig
110 1.1 rillig
111 1.1 rillig #indent input
112 1.1 rillig void t2 (char *x, int y)
113 1.1 rillig {
114 1.1 rillig int a,
115 1.1 rillig b,
116 1.1 rillig c;
117 1.1 rillig int
118 1.1 rillig *d,
119 1.1 rillig *e,
120 1.1 rillig *f;
121 1.1 rillig int (*g)(),
122 1.1 rillig (*h)(),
123 1.1 rillig (*i)();
124 1.1 rillig int j,
125 1.1 rillig k,
126 1.1 rillig l;
127 1.1 rillig int m
128 1.1 rillig ,n
129 1.1 rillig ,o
130 1.1 rillig ;
131 1.1 rillig int chars[ /* push the comma beyond column 74 .... */ ], x;
132 1.1 rillig }
133 1.1 rillig #indent end
134 1.1 rillig
135 1.1 rillig #indent run
136 1.1 rillig void
137 1.1 rillig t2(char *x, int y)
138 1.1 rillig {
139 1.1 rillig int a, b, c;
140 1.1 rillig int
141 1.1 rillig *d, *e, *f;
142 1.1 rillig int (*g)(), (*h)(), (*i)();
143 1.1 rillig int j, k, l;
144 1.1 rillig int m
145 1.1 rillig ,n
146 1.1 rillig ,o
147 1.1 rillig ;
148 1.1 rillig int chars[ /* push the comma beyond column 74 .... */ ],
149 1.1 rillig x;
150 1.1 rillig }
151 1.1 rillig #indent end
152 1.1 rillig
153 1.1 rillig
154 1.1 rillig #indent input
155 1.1 rillig const int int_minimum_size =
156 1.1 rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
157 1.1 rillig #indent end
158 1.1 rillig
159 1.1 rillig #indent run-equals-input
160 1.1 rillig
161 1.1 rillig
162 1.1 rillig #indent input
163 1.1 rillig int *int_create(void)
164 1.1 rillig {
165 1.1 rillig
166 1.1 rillig }
167 1.1 rillig #indent end
168 1.1 rillig
169 1.1 rillig #indent run
170 1.1 rillig int *
171 1.1 rillig int_create(void)
172 1.1 rillig {
173 1.1 rillig
174 1.1 rillig }
175 1.1 rillig #indent end
176 1.1 rillig
177 1.1 rillig
178 1.1 rillig #indent input
179 1.1 rillig static
180 1.1 rillig _attribute_printf(1, 2)
181 1.1 rillig void
182 1.1 rillig print_error(const char *fmt,...)
183 1.1 rillig {
184 1.1 rillig }
185 1.1 rillig #indent end
186 1.1 rillig
187 1.1 rillig #indent run
188 1.1 rillig static
189 1.1 rillig _attribute_printf(1, 2)
190 1.1 rillig void
191 1.1 rillig print_error(const char *fmt, ...)
192 1.1 rillig {
193 1.2 rillig }
194 1.2 rillig #indent end
195 1.2 rillig
196 1.2 rillig
197 1.2 rillig #indent input
198 1.2 rillig static _attribute_printf(1, 2)
199 1.2 rillig void
200 1.2 rillig print_error(const char *fmt,...)
201 1.2 rillig {
202 1.2 rillig }
203 1.2 rillig #indent end
204 1.1 rillig
205 1.2 rillig #indent run
206 1.2 rillig static _attribute_printf(1, 2)
207 1.2 rillig void
208 1.2 rillig print_error(const char *fmt, ...)
209 1.2 rillig {
210 1.2 rillig }
211 1.2 rillig #indent end
212 1.2 rillig
213 1.2 rillig
214 1.2 rillig #indent input
215 1.2 rillig static void _attribute_printf(1, 2)
216 1.2 rillig print_error(const char *fmt,...)
217 1.2 rillig {
218 1.2 rillig }
219 1.2 rillig #indent end
220 1.2 rillig
221 1.2 rillig #indent run
222 1.2 rillig static void
223 1.2 rillig _attribute_printf(1, 2)
224 1.2 rillig print_error(const char *fmt, ...)
225 1.2 rillig {
226 1.1 rillig }
227 1.1 rillig #indent end
228 1.1 rillig
229 1.1 rillig
230 1.3 rillig /* See FreeBSD r309380 */
231 1.1 rillig #indent input
232 1.1 rillig static LIST_HEAD(, alq) ald_active;
233 1.1 rillig static int ald_shutingdown = 0;
234 1.1 rillig struct thread *ald_thread;
235 1.1 rillig #indent end
236 1.1 rillig
237 1.1 rillig #indent run
238 1.1 rillig static LIST_HEAD(, alq) ald_active;
239 1.1 rillig static int ald_shutingdown = 0;
240 1.1 rillig struct thread *ald_thread;
241 1.1 rillig #indent end
242 1.1 rillig
243 1.1 rillig
244 1.1 rillig #indent input
245 1.1 rillig static int
246 1.2 rillig old_style_definition(a, b, c)
247 1.2 rillig struct thread *a;
248 1.2 rillig int b;
249 1.2 rillig double ***c;
250 1.1 rillig {
251 1.1 rillig
252 1.1 rillig }
253 1.1 rillig #indent end
254 1.1 rillig
255 1.1 rillig #indent run
256 1.1 rillig static int
257 1.2 rillig old_style_definition(a, b, c)
258 1.2 rillig struct thread *a;
259 1.2 rillig int b;
260 1.2 rillig double ***c;
261 1.1 rillig {
262 1.1 rillig
263 1.1 rillig }
264 1.1 rillig #indent end
265 1.1 rillig
266 1.1 rillig
267 1.1 rillig /*
268 1.1 rillig * Demonstrate how variable declarations are broken into several lines when
269 1.1 rillig * the line length limit is set quite low.
270 1.1 rillig */
271 1.1 rillig #indent input
272 1.7 rillig struct s a,b;
273 1.1 rillig struct s0 a,b;
274 1.1 rillig struct s01 a,b;
275 1.1 rillig struct s012 a,b;
276 1.1 rillig struct s0123 a,b;
277 1.1 rillig struct s01234 a,b;
278 1.1 rillig struct s012345 a,b;
279 1.1 rillig struct s0123456 a,b;
280 1.1 rillig struct s01234567 a,b;
281 1.1 rillig struct s012345678 a,b;
282 1.1 rillig struct s0123456789 a,b;
283 1.1 rillig struct s01234567890 a,b;
284 1.1 rillig struct s012345678901 a,b;
285 1.1 rillig struct s0123456789012 a,b;
286 1.1 rillig struct s01234567890123 a,b;
287 1.1 rillig #indent end
288 1.1 rillig
289 1.1 rillig #indent run -l20 -di0
290 1.7 rillig struct s a, b;
291 1.7 rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */
292 1.1 rillig struct s0 a,
293 1.1 rillig b;
294 1.7 rillig /* $ XXX: The indentation of the second line is wrong. The variable names */
295 1.7 rillig /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
296 1.7 rillig /* $ XXX: missing in the calculation for the indentation. */
297 1.1 rillig struct s01 a,
298 1.1 rillig b;
299 1.1 rillig struct s012 a,
300 1.1 rillig b;
301 1.1 rillig struct s0123 a,
302 1.1 rillig b;
303 1.1 rillig struct s01234 a,
304 1.1 rillig b;
305 1.1 rillig struct s012345 a,
306 1.1 rillig b;
307 1.1 rillig struct s0123456 a,
308 1.1 rillig b;
309 1.1 rillig struct s01234567 a,
310 1.1 rillig b;
311 1.1 rillig struct s012345678 a,
312 1.1 rillig b;
313 1.1 rillig struct s0123456789 a,
314 1.1 rillig b;
315 1.1 rillig struct s01234567890 a,
316 1.1 rillig b;
317 1.1 rillig struct s012345678901 a,
318 1.1 rillig b;
319 1.1 rillig struct s0123456789012 a,
320 1.1 rillig b;
321 1.1 rillig struct s01234567890123 a,
322 1.1 rillig b;
323 1.1 rillig #indent end
324 1.2 rillig
325 1.2 rillig
326 1.2 rillig #indent input
327 1.2 rillig char * x(void)
328 1.2 rillig {
329 1.2 rillig type identifier;
330 1.2 rillig type *pointer;
331 1.2 rillig unused * value;
332 1.2 rillig (void)unused * value;
333 1.2 rillig
334 1.2 rillig dmax = (double)3 * 10.0;
335 1.2 rillig dmin = (double)dmax * 10.0;
336 1.2 rillig davg = (double)dmax * dmin;
337 1.2 rillig
338 1.2 rillig return NULL;
339 1.2 rillig }
340 1.2 rillig #indent end
341 1.2 rillig
342 1.2 rillig #indent run
343 1.2 rillig char *
344 1.2 rillig x(void)
345 1.2 rillig {
346 1.2 rillig type identifier;
347 1.2 rillig type *pointer;
348 1.2 rillig unused *value;
349 1.2 rillig (void)unused * value;
350 1.2 rillig
351 1.2 rillig dmax = (double)3 * 10.0;
352 1.2 rillig dmin = (double)dmax * 10.0;
353 1.2 rillig davg = (double)dmax * dmin;
354 1.2 rillig
355 1.2 rillig return NULL;
356 1.2 rillig }
357 1.2 rillig #indent end
358 1.2 rillig
359 1.2 rillig #indent input
360 1.2 rillig int *
361 1.2 rillig y(void) {
362 1.2 rillig
363 1.2 rillig }
364 1.2 rillig
365 1.2 rillig int
366 1.2 rillig z(void) {
367 1.2 rillig
368 1.2 rillig }
369 1.2 rillig #indent end
370 1.2 rillig
371 1.2 rillig #indent run
372 1.2 rillig int *
373 1.2 rillig y(void)
374 1.2 rillig {
375 1.2 rillig
376 1.2 rillig }
377 1.2 rillig
378 1.2 rillig int
379 1.2 rillig z(void)
380 1.2 rillig {
381 1.2 rillig
382 1.2 rillig }
383 1.2 rillig #indent end
384 1.2 rillig
385 1.2 rillig
386 1.2 rillig #indent input
387 1.2 rillig int x;
388 1.2 rillig int *y;
389 1.2 rillig int * * * * z;
390 1.2 rillig #indent end
391 1.2 rillig
392 1.2 rillig #indent run
393 1.2 rillig int x;
394 1.2 rillig int *y;
395 1.2 rillig int ****z;
396 1.2 rillig #indent end
397 1.4 rillig
398 1.4 rillig
399 1.4 rillig #indent input
400 1.4 rillig int main(void) {
401 1.4 rillig char (*f1)() = NULL;
402 1.4 rillig char *(*f1)() = NULL;
403 1.4 rillig char *(*f2)();
404 1.4 rillig }
405 1.4 rillig #indent end
406 1.4 rillig
407 1.6 rillig /*
408 1.6 rillig * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
409 1.6 rillig * and third variable declaration in column 1. This bug has been introduced
410 1.6 rillig * to NetBSD when FreeBSD indent was imported in 2019.
411 1.6 rillig */
412 1.4 rillig #indent run -ldi0
413 1.4 rillig int
414 1.4 rillig main(void)
415 1.4 rillig {
416 1.4 rillig char (*f1)() = NULL;
417 1.6 rillig char *(*f1)() = NULL;
418 1.6 rillig char *(*f2)();
419 1.4 rillig }
420 1.4 rillig #indent end
421 1.5 rillig
422 1.5 rillig #indent run
423 1.5 rillig int
424 1.5 rillig main(void)
425 1.5 rillig {
426 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
427 1.5 rillig char (*f1)() = NULL;
428 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
429 1.6 rillig char *(* f1)() = NULL;
430 1.5 rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
431 1.6 rillig char *(* f2)();
432 1.5 rillig }
433 1.5 rillig #indent end
434