xref: /netbsd-src/tests/usr.bin/indent/lsym_binary_op.c (revision 61c5d6b6d061f79b8dfac16a2fd4b51a7692a89f)
1*61c5d6b6Srillig /* $NetBSD: lsym_binary_op.c,v 1.12 2023/06/14 08:25:15 rillig Exp $ */
29ae26de1Srillig 
39ae26de1Srillig /*
49ae26de1Srillig  * Tests for the token lsym_binary_op, which represents a binary operator in
59ae26de1Srillig  * an expression.  Examples for binary operators are '>>', '=', '+', '&&'.
69ae26de1Srillig  *
79ae26de1Srillig  * Binary operators are surrounded by blanks.
89ae26de1Srillig  *
99ae26de1Srillig  * Some tokens like '+', '*' or '&' can be either binary or unary operators,
109ae26de1Srillig  * with an entirely different meaning.
119ae26de1Srillig  *
129ae26de1Srillig  * The token '*' is not only a binary or a unary operator, it is used in types
139ae26de1Srillig  * as well, to derive a pointer type.
149ae26de1Srillig  *
159ae26de1Srillig  * See also:
169ae26de1Srillig  *	lsym_postfix_op.c	for postfix unary operators
179ae26de1Srillig  *	lsym_unary_op.c		for prefix unary operators
189ae26de1Srillig  *	lsym_colon.c		for ':'
199ae26de1Srillig  *	lsym_question.c		for '?'
209ae26de1Srillig  *	lsym_comma.c		for ','
219ae26de1Srillig  *	C99 6.4.6		"Punctuators"
229ae26de1Srillig  */
239ae26de1Srillig 
2447306038Srillig //indent input
25e1d123daSrillig void
binary_operators(void)26e1d123daSrillig binary_operators(void)
27e1d123daSrillig {
28e1d123daSrillig 	/* In the order of appearance in C11 6.5. */
29e1d123daSrillig 	a = a * a;
30e1d123daSrillig 	a = a / a;
31e1d123daSrillig 	a = a % a;
32e1d123daSrillig 	a = a + a;
33e1d123daSrillig 	a = a - a;
34e1d123daSrillig 	a = a << a;
35e1d123daSrillig 	a = a >> a;
36e1d123daSrillig 	a = a < a;
37e1d123daSrillig 	a = a > a;
38e1d123daSrillig 	a = a <= a;
39e1d123daSrillig 	a = a >= a;
40e1d123daSrillig 	a = a == a;
41e1d123daSrillig 	a = a != a;
42e1d123daSrillig 	a = a & a;
43e1d123daSrillig 	a = a ^ a;
44e1d123daSrillig 	a = a | a;
45e1d123daSrillig 	a = a && a;
46e1d123daSrillig 	a = a || a;
47e1d123daSrillig 	a = a ? a : a;
48e1d123daSrillig 	a = a;
49e1d123daSrillig 	a *= a;
50e1d123daSrillig 	a /= a;
51e1d123daSrillig 	a %= a;
52e1d123daSrillig 	a += a;
53e1d123daSrillig 	a -= a;
54e1d123daSrillig 	a <<= a;
55e1d123daSrillig 	a >>= a;
56e1d123daSrillig 	a &= a;
57e1d123daSrillig 	a ^= a;
58e1d123daSrillig 	a |= a;
59e1d123daSrillig 	a = a, a;
60e1d123daSrillig }
6147306038Srillig //indent end
629ae26de1Srillig 
6347306038Srillig //indent run-equals-input
64db3af198Srillig 
65db3af198Srillig 
66db3af198Srillig /*
67db3af198Srillig  * If a '*' is immediately followed by another '*', they still form separate
68db3af198Srillig  * operators. The first is a binary operator, the second is unary.
69db3af198Srillig  */
7047306038Srillig //indent input
71db3af198Srillig int var = expr**ptr;
7247306038Srillig //indent end
73db3af198Srillig 
7447306038Srillig //indent run -di0
75db3af198Srillig int var = expr * *ptr;
7647306038Srillig //indent end
77b60cb68fSrillig 
78b60cb68fSrillig 
79b60cb68fSrillig /*
80f38db2caSrillig  * Before 2023-06-04, indent allowed for arbitrary repetitions of some operator
81f38db2caSrillig  * characters, followed by an arbitrary amount of '='.  This could be used for
82f38db2caSrillig  * operators like '&&' or '|||==='.
83b60cb68fSrillig  *
84f84beafcSrillig  * Before 2021-03-07 22:11:01, the comment '//' was treated as a binary
85f84beafcSrillig  * operator as well, and so was the comment '/////', leading to unexpected
86f84beafcSrillig  * spacing.
87b60cb68fSrillig  *
88b60cb68fSrillig  * See lexi.c, lexi, "default:".
89b60cb68fSrillig  */
90b60cb68fSrillig //indent input
91b60cb68fSrillig void
long_run_of_operators(void)92b60cb68fSrillig long_run_of_operators(void)
93b60cb68fSrillig {
94b60cb68fSrillig 	if (a &&&&&&& b)
95b60cb68fSrillig 		return;
96b60cb68fSrillig 	if (a |||=== b)
97b60cb68fSrillig 		return;
98b60cb68fSrillig }
99b60cb68fSrillig //indent end
100b60cb68fSrillig 
101f38db2caSrillig //indent run
102f38db2caSrillig void
long_run_of_operators(void)103f38db2caSrillig long_run_of_operators(void)
104f38db2caSrillig {
105f38db2caSrillig 	if (a && && && &b)
106f38db2caSrillig 		return;
107f38db2caSrillig 	if (a || |= == b)
108f38db2caSrillig 		return;
109f38db2caSrillig }
110f38db2caSrillig //indent end
111b60cb68fSrillig 
112b60cb68fSrillig 
113b60cb68fSrillig /*
114b60cb68fSrillig  * Long chains of '+' and '-' must be split into several operators as the
115b60cb68fSrillig  * lexer has to distinguish between '++' and '+' early.  The following
116b60cb68fSrillig  * sequence is thus tokenized as:
117b60cb68fSrillig  *
118b60cb68fSrillig  *	word		"a"
119b60cb68fSrillig  *	postfix_op	"++"
120b60cb68fSrillig  *	binary_op	"++"
121b60cb68fSrillig  *	unary_op	"++"
122b60cb68fSrillig  *	unary_op	"+"
123b60cb68fSrillig  *	word		"b"
124b60cb68fSrillig  *
125b60cb68fSrillig  * See lexi.c, lexi, "case '+':".
126b60cb68fSrillig  */
127b60cb68fSrillig //indent input
128b60cb68fSrillig void
joined_unary_and_binary_operators(void)129b60cb68fSrillig joined_unary_and_binary_operators(void)
130b60cb68fSrillig {
131b60cb68fSrillig 	if (a +++++++ b)
132b60cb68fSrillig 		return;
133b60cb68fSrillig }
134b60cb68fSrillig //indent end
135b60cb68fSrillig 
136b60cb68fSrillig //indent run
137b60cb68fSrillig void
joined_unary_and_binary_operators(void)138b60cb68fSrillig joined_unary_and_binary_operators(void)
139b60cb68fSrillig {
140b60cb68fSrillig 	if (a++ ++ ++ +b)
141b60cb68fSrillig 		return;
142b60cb68fSrillig }
143b60cb68fSrillig //indent end
144b60cb68fSrillig 
145b60cb68fSrillig 
146b60cb68fSrillig /*
147b60cb68fSrillig  * Ensure that the result of the indentation does not depend on whether a
148b60cb68fSrillig  * token from the input starts in column 1 or 9.
149b60cb68fSrillig  *
150*61c5d6b6Srillig  * See process_binary_op.
151b60cb68fSrillig  */
152b60cb68fSrillig //indent input
153b60cb68fSrillig int col_1 //
154b60cb68fSrillig = //
155b60cb68fSrillig 1;
156b60cb68fSrillig 
157b60cb68fSrillig int col_9 //
158b60cb68fSrillig 	= //
159b60cb68fSrillig 	9;
160b60cb68fSrillig //indent end
161b60cb68fSrillig 
162b60cb68fSrillig //indent run
163b60cb68fSrillig int		col_1		//
164b60cb68fSrillig =				//
165b60cb68fSrillig 1;
166b60cb68fSrillig 
167b60cb68fSrillig int		col_9		//
168b60cb68fSrillig =				//
169b60cb68fSrillig 9;
170b60cb68fSrillig //indent end
171ff059387Srillig 
172ff059387Srillig 
173ff059387Srillig /*
174ff059387Srillig  * The ternary conditional operator is not a binary operator, but both its
175ff059387Srillig  * components '?' and ':' follow the same spacing rules.
176ff059387Srillig  */
177ff059387Srillig //indent input
178ff059387Srillig int conditional = condition ? number : number;
179ff059387Srillig //indent end
180ff059387Srillig 
181ff059387Srillig //indent run-equals-input -di0
182e071ed3cSrillig 
183e071ed3cSrillig 
184e071ed3cSrillig // After a ']', a '*' is a binary operator.
185e071ed3cSrillig //indent input
186e071ed3cSrillig int x = arr[3]*y;
187e071ed3cSrillig //indent end
188e071ed3cSrillig 
189e071ed3cSrillig //indent run -di0
190e071ed3cSrillig int x = arr[3] * y;
191e071ed3cSrillig //indent end
192e071ed3cSrillig 
193e071ed3cSrillig 
1946bf97c9eSrillig /*
1956bf97c9eSrillig  * Ensure that after an assignment, a '*=' operator is properly spaced, like
1966bf97c9eSrillig  * any other binary operator.
1976bf97c9eSrillig  */
198e071ed3cSrillig //indent input
199e071ed3cSrillig {
200e071ed3cSrillig 	a = a;
201e071ed3cSrillig 	a *= b *= c;
202e071ed3cSrillig }
203e071ed3cSrillig //indent end
204e071ed3cSrillig 
205e071ed3cSrillig //indent run-equals-input -di0
206