lsym_comma.c revision 1.5 1 1.5 rillig /* $NetBSD: lsym_comma.c,v 1.5 2022/04/24 09:04:12 rillig Exp $ */
2 1.1 rillig
3 1.1 rillig /*
4 1.1 rillig * Tests for the token lsym_comma, which represents a ',' in these contexts:
5 1.1 rillig *
6 1.1 rillig * In an expression, the binary operator ',' evaluates its left operand before
7 1.1 rillig * its right operand, inserting a sequence point.
8 1.1 rillig *
9 1.2 rillig * In a declaration, a ',' separates the declarators.
10 1.2 rillig *
11 1.1 rillig * In a parameter list of a function type, a ',' separates the parameter
12 1.1 rillig * declarations.
13 1.1 rillig *
14 1.1 rillig * In a traditional function definition, a ',' separates the parameter names.
15 1.1 rillig *
16 1.1 rillig * In a prototype function definition, a ',' separates the parameter
17 1.1 rillig * declarations.
18 1.1 rillig *
19 1.1 rillig * In a function call expression, a ',' separates the arguments.
20 1.1 rillig *
21 1.1 rillig * In a macro definition, a ',' separates the parameter names.
22 1.1 rillig *
23 1.1 rillig * In a macro invocation, a ',' separates the arguments.
24 1.3 rillig *
25 1.3 rillig * In an initializer list, a ',' separates the initializer expressions.
26 1.1 rillig */
27 1.1 rillig
28 1.3 rillig /*
29 1.3 rillig * The ',' is a binary operator with very low precedence.
30 1.3 rillig */
31 1.5 rillig //indent input
32 1.3 rillig int
33 1.3 rillig comma_expression(void)
34 1.3 rillig {
35 1.3 rillig return 1, 3;
36 1.3 rillig return a = b, c = d;
37 1.3 rillig }
38 1.5 rillig //indent end
39 1.1 rillig
40 1.5 rillig //indent run-equals-input
41 1.3 rillig
42 1.3 rillig
43 1.3 rillig /*
44 1.3 rillig * In a declaration, a ',' separates the declarators.
45 1.3 rillig */
46 1.5 rillig //indent input
47 1.3 rillig int decl, old_style(), prototype(const char *, double *);
48 1.3 rillig int a, b, c;
49 1.5 rillig //indent end
50 1.3 rillig
51 1.5 rillig //indent run-equals-input -di0
52 1.3 rillig
53 1.3 rillig
54 1.3 rillig /*
55 1.3 rillig * In a parameter list of a function type, a ',' separates the parameter
56 1.3 rillig * declarations.
57 1.3 rillig */
58 1.5 rillig //indent input
59 1.3 rillig double dbl_reduce(double init, const double *s, const double *e, double (*merge)(double, double));
60 1.3 rillig double dbl_reduce(double, const double *, const double *, double (*)(double, double));
61 1.3 rillig void debug_printf(const char *, ...);
62 1.5 rillig //indent end
63 1.3 rillig
64 1.5 rillig //indent run-equals-input -di0
65 1.3 rillig
66 1.3 rillig
67 1.3 rillig /*
68 1.3 rillig * In a traditional function definition, a ',' separates the parameter names.
69 1.3 rillig */
70 1.5 rillig //indent input
71 1.3 rillig double
72 1.3 rillig trad_dbl_reduce(init, s, e, merge)
73 1.3 rillig double init;
74 1.3 rillig double *s, *e;
75 1.3 rillig double (*merge)()
76 1.3 rillig {
77 1.3 rillig double x = init;
78 1.3 rillig while (s < e)
79 1.3 rillig x = merge(x, *s++);
80 1.3 rillig return x;
81 1.3 rillig }
82 1.5 rillig //indent end
83 1.3 rillig
84 1.5 rillig //indent run-equals-input -di0
85 1.3 rillig
86 1.3 rillig
87 1.3 rillig /*
88 1.3 rillig * In a prototype function definition, a ',' separates the parameter
89 1.3 rillig * declarations.
90 1.3 rillig */
91 1.5 rillig //indent input
92 1.3 rillig void
93 1.3 rillig dbl_reduce(double init, const double *s, const double *e, double (*merge)(double, double))
94 1.3 rillig {
95 1.3 rillig double x = init;
96 1.3 rillig while (s < e)
97 1.3 rillig x = merge(x, *s++);
98 1.3 rillig return x;
99 1.3 rillig }
100 1.5 rillig //indent end
101 1.3 rillig
102 1.5 rillig //indent run-equals-input -di0
103 1.3 rillig
104 1.3 rillig
105 1.3 rillig /*
106 1.3 rillig * In a function call expression, a ',' separates the arguments.
107 1.3 rillig */
108 1.5 rillig //indent input
109 1.3 rillig void
110 1.3 rillig function(void)
111 1.3 rillig {
112 1.3 rillig function_call(arg1, arg2);
113 1.3 rillig (*indirect_function_call)(arg1, arg2);
114 1.3 rillig }
115 1.5 rillig //indent end
116 1.3 rillig
117 1.5 rillig //indent run-equals-input -di0
118 1.3 rillig
119 1.3 rillig
120 1.3 rillig /*
121 1.3 rillig * In a macro definition, a ',' separates the parameter names.
122 1.3 rillig */
123 1.5 rillig //indent input
124 1.3 rillig #define no_space(a,b) a ## b
125 1.3 rillig #define normal_space(a, b) a ## b
126 1.3 rillig #define wide_space(a , b) a ## b
127 1.5 rillig //indent end
128 1.3 rillig
129 1.3 rillig /*
130 1.3 rillig * Indent does not touch preprocessor directives, except for the spacing
131 1.3 rillig * between the '#' and the directive.
132 1.3 rillig */
133 1.5 rillig //indent run-equals-input
134 1.3 rillig
135 1.3 rillig
136 1.3 rillig /*
137 1.3 rillig * In a macro invocation, a ',' separates the arguments.
138 1.3 rillig */
139 1.5 rillig //indent input
140 1.3 rillig void
141 1.3 rillig function(void)
142 1.3 rillig {
143 1.3 rillig macro_invocation(arg1, arg2);
144 1.3 rillig empty_arguments(,,,);
145 1.3 rillig }
146 1.5 rillig //indent end
147 1.3 rillig
148 1.5 rillig //indent run-equals-input -di0
149 1.3 rillig
150 1.3 rillig
151 1.3 rillig /*
152 1.3 rillig * In an initializer list, a ',' separates the initializer expressions.
153 1.3 rillig *
154 1.3 rillig * If a ',' starts a line, indent doesn't put a space before it.
155 1.3 rillig */
156 1.5 rillig //indent input
157 1.3 rillig int arr[] = {1, 2, 3};
158 1.3 rillig int arr[] = {
159 1.3 rillig 1,
160 1.3 rillig 2,
161 1.3 rillig 3, /* there may be a trailing comma */
162 1.3 rillig };
163 1.5 rillig //indent end
164 1.3 rillig
165 1.5 rillig //indent run-equals-input -di0
166 1.3 rillig
167 1.3 rillig
168 1.3 rillig /*
169 1.3 rillig * If a ',' starts a line, indent doesn't put a space before it. This style is
170 1.3 rillig * uncommon and looks unbalanced since the '1' is not aligned to the other
171 1.3 rillig * numbers.
172 1.3 rillig */
173 1.5 rillig //indent input
174 1.3 rillig int arr[] = {
175 1.3 rillig 1
176 1.3 rillig ,2
177 1.3 rillig ,3
178 1.3 rillig };
179 1.5 rillig //indent end
180 1.3 rillig
181 1.5 rillig //indent run-equals-input -di0
182