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