1 1.6 rillig /* $NetBSD: lsym_comma.c,v 1.6 2023/05/13 06:52:48 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.5 rillig //indent input 155 1.3 rillig int arr[] = {1, 2, 3}; 156 1.3 rillig int arr[] = { 157 1.3 rillig 1, 158 1.3 rillig 2, 159 1.3 rillig 3, /* there may be a trailing comma */ 160 1.3 rillig }; 161 1.5 rillig //indent end 162 1.3 rillig 163 1.5 rillig //indent run-equals-input -di0 164 1.3 rillig 165 1.3 rillig 166 1.3 rillig /* 167 1.3 rillig * If a ',' starts a line, indent doesn't put a space before it. This style is 168 1.3 rillig * uncommon and looks unbalanced since the '1' is not aligned to the other 169 1.3 rillig * numbers. 170 1.3 rillig */ 171 1.5 rillig //indent input 172 1.3 rillig int arr[] = { 173 1.3 rillig 1 174 1.3 rillig ,2 175 1.3 rillig ,3 176 1.3 rillig }; 177 1.5 rillig //indent end 178 1.3 rillig 179 1.5 rillig //indent run-equals-input -di0 180