1 /* $NetBSD: opt_badp.c,v 1.16 2023/06/27 04:41:23 rillig Exp $ */ 2 3 /* 4 * Tests for the options '-badp' and '-nbadp'. 5 * 6 * The option '-badp' forces a blank line between the first set of declarations 7 * in a function and the next comment or statement. It produces a blank line 8 * even if there are no declarations. 9 */ 10 11 12 /* An empty function body does not need a blank line. */ 13 //indent input 14 void 15 empty(void) 16 { 17 } 18 //indent end 19 20 //indent run-equals-input -badp 21 22 //indent run-equals-input -nbadp 23 24 25 /* If an empty function body already has a blank line, it is kept. */ 26 //indent input 27 void 28 blank(void) 29 { 30 31 } 32 //indent end 33 34 //indent run-equals-input -badp 35 36 //indent run-equals-input -nbadp 37 38 39 /* 40 * If a function body has only declarations (doesn't occur in practice), it 41 * does not need an empty line. 42 */ 43 //indent input 44 void 45 declaration(void) 46 { 47 int decl; 48 } 49 //indent end 50 51 //indent run-equals-input -badp 52 53 //indent run-equals-input -nbadp 54 55 56 /* 57 * A function body without declarations gets an empty line above the first 58 * statement. 59 */ 60 //indent input 61 void 62 statement(void) 63 { 64 stmt(); 65 } 66 //indent end 67 68 //indent run -badp 69 void 70 statement(void) 71 { 72 73 stmt(); 74 } 75 //indent end 76 77 //indent run-equals-input -nbadp 78 79 80 /* 81 * A function body with a declaration and a statement gets a blank line between 82 * those. 83 */ 84 //indent input 85 void 86 declaration_statement(void) 87 { 88 int decl; 89 stmt(); 90 } 91 //indent end 92 93 //indent run -badp 94 void 95 declaration_statement(void) 96 { 97 int decl; 98 99 stmt(); 100 } 101 //indent end 102 103 //indent run-equals-input -nbadp 104 105 106 /* If there already is a blank line in the right place, it is kept. */ 107 //indent input 108 static void 109 declaration_blank_statement(void) 110 { 111 int decl; 112 113 stmt(); 114 } 115 //indent end 116 117 //indent run-equals-input -badp 118 119 //indent run-equals-input -nbadp 120 121 122 /* Additional blank lines are kept. To remove them, see the '-sob' option. */ 123 //indent input 124 static void 125 declaration_blank_blank_statement(void) 126 { 127 int decl; 128 129 130 131 stmt(); 132 } 133 //indent end 134 135 //indent run-equals-input -badp 136 137 //indent run-equals-input -nbadp 138 139 140 /* 141 * The blank line is only inserted at the top of a function body, not in nested 142 * block statements. 143 */ 144 //indent input 145 static void 146 nested(void) 147 { 148 { 149 int decl; 150 stmt(); 151 } 152 } 153 //indent end 154 155 //indent run -badp 156 static void 157 nested(void) 158 { 159 160 { 161 int decl; 162 stmt(); 163 } 164 } 165 //indent end 166 167 //indent run-equals-input -nbadp 168 169 170 /* 171 * A struct declaration or an initializer are not function bodies, so don't 172 * add a blank line after them. 173 */ 174 //indent input 175 struct { 176 int member[2]; 177 } s = { 178 { 179 0, 180 0, 181 } 182 }; 183 //indent end 184 185 //indent run-equals-input -di0 -badp 186 187 //indent run-equals-input -di0 -nbadp 188 189 190 /* Single-line function definitions must be handled correctly as well. */ 191 //indent input 192 void f(void) { int decl; stmt; } 193 //indent end 194 195 //indent run -badp 196 void 197 f(void) 198 { 199 int decl; 200 201 stmt; 202 } 203 //indent end 204 205 //indent run -nfbs -badp 206 void 207 f(void) { 208 int decl; 209 210 stmt; 211 } 212 //indent end 213 214 215 /* The '}' of an initializer does not end a block. */ 216 //indent input 217 void 218 f(void) 219 { 220 int decl1[2][2] = { 221 {1, 2}, 222 {3, 4}, 223 }; 224 int decl2 = 5; 225 stmt; 226 } 227 //indent end 228 229 //indent run -di0 -badp 230 void 231 f(void) 232 { 233 int decl1[2][2] = { 234 {1, 2}, 235 {3, 4}, 236 }; 237 int decl2 = 5; 238 239 stmt; 240 } 241 //indent end 242 243 244 /* 245 * Due to its limited lookahead, indent cannot know whether the comment is 246 * followed by a declaration or a statement, so it assumes that the comment is 247 * part of the declaration block. 248 */ 249 //indent input 250 void f(void) { 251 int decl1; 252 /* comment */ 253 int decl2; 254 stmt; 255 } 256 //indent end 257 258 //indent run -badp 259 void 260 f(void) 261 { 262 int decl1; 263 /* comment */ 264 int decl2; 265 266 stmt; 267 } 268 //indent end 269 270 271 /* Combining -bad and -badp only adds a single blank line. */ 272 //indent input 273 void f(void) { int decl; stmt1; stmt2; } 274 //indent end 275 276 //indent run -bad -badp 277 void 278 f(void) 279 { 280 int decl; 281 282 stmt1; 283 stmt2; 284 } 285 //indent end 286