1 1.60 rillig /* $NetBSD: fmt_decl.c,v 1.60 2023/06/25 19:19:42 rillig Exp $ */ 2 1.1 rillig 3 1.19 rillig /* 4 1.19 rillig * Tests for declarations of global variables, external functions, and local 5 1.19 rillig * variables. 6 1.19 rillig * 7 1.19 rillig * See also: 8 1.19 rillig * opt_di.c 9 1.19 rillig */ 10 1.19 rillig 11 1.1 rillig /* See FreeBSD r303570 */ 12 1.1 rillig 13 1.19 rillig /* 14 1.19 rillig * A type definition usually declares a single type, so there is no need to 15 1.19 rillig * align the newly declared type name with the other variables. 16 1.19 rillig */ 17 1.35 rillig //indent input 18 1.30 rillig typedef void ( * function_ptr ) ( int * ) ; 19 1.35 rillig //indent end 20 1.1 rillig 21 1.35 rillig //indent run 22 1.30 rillig typedef void (*function_ptr)(int *); 23 1.35 rillig //indent end 24 1.1 rillig 25 1.1 rillig 26 1.19 rillig /* 27 1.19 rillig * In variable declarations, the names of the first declarators are indented 28 1.19 rillig * by the amount given in '-di', which defaults to 16. 29 1.19 rillig */ 30 1.35 rillig //indent input 31 1.19 rillig extern void ( * function_pointer ) ( int * ) ; 32 1.19 rillig extern void * pointer; 33 1.35 rillig //indent end 34 1.19 rillig 35 1.35 rillig //indent run 36 1.19 rillig /* $ XXX: Why is the token 'function_pointer' not aligned with 'pointer'? */ 37 1.19 rillig extern void (*function_pointer)(int *); 38 1.19 rillig extern void *pointer; 39 1.35 rillig //indent end 40 1.19 rillig 41 1.19 rillig 42 1.35 rillig //indent input 43 1.1 rillig static const struct 44 1.1 rillig { 45 1.1 rillig double x; 46 1.1 rillig double y, z; 47 1.1 rillig } n[m + 1] = 48 1.1 rillig { 49 1.1 rillig { 50 1.1 rillig .0, 51 1.1 rillig .9, 52 1.1 rillig 5 53 1.1 rillig } 54 1.1 rillig }; 55 1.35 rillig //indent end 56 1.1 rillig 57 1.35 rillig //indent run 58 1.37 rillig static const struct 59 1.37 rillig { 60 1.1 rillig double x; 61 1.1 rillig double y, z; 62 1.1 rillig } n[m + 1] = 63 1.1 rillig { 64 1.1 rillig { 65 1.1 rillig .0, 66 1.1 rillig .9, 67 1.1 rillig 5 68 1.1 rillig } 69 1.1 rillig }; 70 1.35 rillig //indent end 71 1.1 rillig 72 1.1 rillig 73 1.35 rillig //indent input 74 1.1 rillig typedef struct Complex 75 1.1 rillig { 76 1.1 rillig double x; 77 1.1 rillig double y; 78 1.1 rillig } Complex; 79 1.35 rillig //indent end 80 1.1 rillig 81 1.35 rillig //indent run 82 1.37 rillig typedef struct Complex 83 1.37 rillig { 84 1.1 rillig double x; 85 1.1 rillig double y; 86 1.58 rillig } Complex; 87 1.35 rillig //indent end 88 1.1 rillig 89 1.1 rillig 90 1.8 rillig /* 91 1.38 rillig * Ensure that function definitions are reasonably indented. Before 92 1.38 rillig * 2023-05-11, tokens were repeatedly read, and the line numbers were wrong. 93 1.8 rillig */ 94 1.35 rillig //indent input 95 1.1 rillig void 96 1.1 rillig t1 (char *a, int b, 97 1.1 rillig void (*fn)(void)) 98 1.1 rillig {} 99 1.35 rillig //indent end 100 1.1 rillig 101 1.35 rillig //indent run 102 1.1 rillig void 103 1.1 rillig t1(char *a, int b, 104 1.1 rillig void (*fn)(void)) 105 1.1 rillig { 106 1.1 rillig } 107 1.35 rillig //indent end 108 1.1 rillig 109 1.1 rillig 110 1.19 rillig /* See opt_bc.c. */ 111 1.35 rillig //indent input 112 1.1 rillig void t2 (char *x, int y) 113 1.1 rillig { 114 1.1 rillig int a, 115 1.1 rillig b, 116 1.1 rillig c; 117 1.1 rillig int 118 1.1 rillig *d, 119 1.1 rillig *e, 120 1.1 rillig *f; 121 1.1 rillig int (*g)(), 122 1.1 rillig (*h)(), 123 1.1 rillig (*i)(); 124 1.1 rillig int j, 125 1.1 rillig k, 126 1.1 rillig l; 127 1.1 rillig int m 128 1.1 rillig ,n 129 1.1 rillig ,o 130 1.1 rillig ; 131 1.43 rillig int chars[ /* push the comma beyond column 74 ...... */ ], x; 132 1.1 rillig } 133 1.35 rillig //indent end 134 1.1 rillig 135 1.35 rillig //indent run 136 1.1 rillig void 137 1.1 rillig t2(char *x, int y) 138 1.1 rillig { 139 1.1 rillig int a, b, c; 140 1.1 rillig int 141 1.1 rillig *d, *e, *f; 142 1.1 rillig int (*g)(), (*h)(), (*i)(); 143 1.1 rillig int j, k, l; 144 1.1 rillig int m 145 1.1 rillig ,n 146 1.1 rillig ,o 147 1.1 rillig ; 148 1.43 rillig int chars[/* push the comma beyond column 74 ...... */], 149 1.1 rillig x; 150 1.1 rillig } 151 1.35 rillig //indent end 152 1.1 rillig 153 1.1 rillig 154 1.35 rillig //indent input 155 1.1 rillig const int int_minimum_size = 156 1.51 rillig // $ FIXME: Missing indentation. 157 1.1 rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF; 158 1.35 rillig //indent end 159 1.1 rillig 160 1.35 rillig //indent run-equals-input 161 1.1 rillig 162 1.1 rillig 163 1.25 rillig /* 164 1.25 rillig * Ensure that the usual GCC-style function attributes are formatted in a 165 1.25 rillig * sensible way. 166 1.25 rillig */ 167 1.35 rillig //indent input 168 1.39 rillig void single_param(int) __attribute__((__noreturn__)) ; 169 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2))) ; 170 1.35 rillig //indent end 171 1.25 rillig 172 1.35 rillig //indent run -di0 173 1.39 rillig void single_param(int) __attribute__((__noreturn__)); 174 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2))); 175 1.35 rillig //indent end 176 1.25 rillig 177 1.35 rillig //indent run 178 1.39 rillig void single_param(int) __attribute__((__noreturn__)); 179 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2))); 180 1.35 rillig //indent end 181 1.25 rillig 182 1.25 rillig 183 1.35 rillig //indent input 184 1.1 rillig static 185 1.1 rillig _attribute_printf(1, 2) 186 1.1 rillig void 187 1.1 rillig print_error(const char *fmt,...) 188 1.1 rillig { 189 1.1 rillig } 190 1.35 rillig //indent end 191 1.1 rillig 192 1.35 rillig //indent run 193 1.1 rillig static 194 1.1 rillig _attribute_printf(1, 2) 195 1.1 rillig void 196 1.1 rillig print_error(const char *fmt, ...) 197 1.1 rillig { 198 1.2 rillig } 199 1.35 rillig //indent end 200 1.2 rillig 201 1.2 rillig 202 1.35 rillig //indent input 203 1.2 rillig static _attribute_printf(1, 2) 204 1.2 rillig void 205 1.2 rillig print_error(const char *fmt,...) 206 1.2 rillig { 207 1.2 rillig } 208 1.35 rillig //indent end 209 1.1 rillig 210 1.35 rillig //indent run 211 1.2 rillig static _attribute_printf(1, 2) 212 1.2 rillig void 213 1.2 rillig print_error(const char *fmt, ...) 214 1.2 rillig { 215 1.2 rillig } 216 1.35 rillig //indent end 217 1.2 rillig 218 1.2 rillig 219 1.35 rillig //indent input 220 1.2 rillig static void _attribute_printf(1, 2) 221 1.2 rillig print_error(const char *fmt,...) 222 1.2 rillig { 223 1.2 rillig } 224 1.35 rillig //indent end 225 1.2 rillig 226 1.35 rillig //indent run 227 1.2 rillig static void 228 1.2 rillig _attribute_printf(1, 2) 229 1.2 rillig print_error(const char *fmt, ...) 230 1.2 rillig { 231 1.1 rillig } 232 1.35 rillig //indent end 233 1.1 rillig 234 1.1 rillig 235 1.3 rillig /* See FreeBSD r309380 */ 236 1.35 rillig //indent input 237 1.1 rillig static LIST_HEAD(, alq) ald_active; 238 1.19 rillig static int ald_shutting_down = 0; 239 1.1 rillig struct thread *ald_thread; 240 1.35 rillig //indent end 241 1.1 rillig 242 1.35 rillig //indent run 243 1.1 rillig static LIST_HEAD(, alq) ald_active; 244 1.19 rillig static int ald_shutting_down = 0; 245 1.1 rillig struct thread *ald_thread; 246 1.35 rillig //indent end 247 1.1 rillig 248 1.1 rillig 249 1.35 rillig //indent input 250 1.1 rillig static int 251 1.2 rillig old_style_definition(a, b, c) 252 1.2 rillig struct thread *a; 253 1.2 rillig int b; 254 1.2 rillig double ***c; 255 1.1 rillig { 256 1.1 rillig 257 1.1 rillig } 258 1.35 rillig //indent end 259 1.1 rillig 260 1.35 rillig //indent run 261 1.1 rillig static int 262 1.2 rillig old_style_definition(a, b, c) 263 1.2 rillig struct thread *a; 264 1.2 rillig int b; 265 1.2 rillig double ***c; 266 1.1 rillig { 267 1.1 rillig 268 1.1 rillig } 269 1.35 rillig //indent end 270 1.1 rillig 271 1.1 rillig 272 1.1 rillig /* 273 1.1 rillig * Demonstrate how variable declarations are broken into several lines when 274 1.1 rillig * the line length limit is set quite low. 275 1.1 rillig */ 276 1.35 rillig //indent input 277 1.7 rillig struct s a,b; 278 1.1 rillig struct s0 a,b; 279 1.1 rillig struct s01 a,b; 280 1.1 rillig struct s012 a,b; 281 1.1 rillig struct s0123 a,b; 282 1.1 rillig struct s01234 a,b; 283 1.1 rillig struct s012345 a,b; 284 1.1 rillig struct s0123456 a,b; 285 1.1 rillig struct s01234567 a,b; 286 1.1 rillig struct s012345678 a,b; 287 1.1 rillig struct s0123456789 a,b; 288 1.1 rillig struct s01234567890 a,b; 289 1.1 rillig struct s012345678901 a,b; 290 1.1 rillig struct s0123456789012 a,b; 291 1.1 rillig struct s01234567890123 a,b; 292 1.35 rillig //indent end 293 1.1 rillig 294 1.35 rillig //indent run -l20 -di0 295 1.7 rillig struct s a, b; 296 1.7 rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */ 297 1.1 rillig struct s0 a, 298 1.56 rillig b; 299 1.1 rillig struct s01 a, 300 1.56 rillig b; 301 1.1 rillig struct s012 a, 302 1.56 rillig b; 303 1.1 rillig struct s0123 a, 304 1.56 rillig b; 305 1.1 rillig struct s01234 a, 306 1.56 rillig b; 307 1.1 rillig struct s012345 a, 308 1.56 rillig b; 309 1.1 rillig struct s0123456 a, 310 1.56 rillig b; 311 1.1 rillig struct s01234567 a, 312 1.56 rillig b; 313 1.1 rillig struct s012345678 a, 314 1.56 rillig b; 315 1.1 rillig struct s0123456789 a, 316 1.56 rillig b; 317 1.1 rillig struct s01234567890 a, 318 1.56 rillig b; 319 1.1 rillig struct s012345678901 a, 320 1.56 rillig b; 321 1.1 rillig struct s0123456789012 a, 322 1.56 rillig b; 323 1.1 rillig struct s01234567890123 a, 324 1.56 rillig b; 325 1.35 rillig //indent end 326 1.2 rillig 327 1.2 rillig 328 1.35 rillig //indent input 329 1.2 rillig char * x(void) 330 1.2 rillig { 331 1.2 rillig type identifier; 332 1.2 rillig type *pointer; 333 1.2 rillig unused * value; 334 1.2 rillig (void)unused * value; 335 1.2 rillig 336 1.2 rillig dmax = (double)3 * 10.0; 337 1.2 rillig dmin = (double)dmax * 10.0; 338 1.2 rillig davg = (double)dmax * dmin; 339 1.2 rillig 340 1.2 rillig return NULL; 341 1.2 rillig } 342 1.35 rillig //indent end 343 1.2 rillig 344 1.35 rillig //indent run 345 1.2 rillig char * 346 1.2 rillig x(void) 347 1.2 rillig { 348 1.2 rillig type identifier; 349 1.2 rillig type *pointer; 350 1.2 rillig unused *value; 351 1.2 rillig (void)unused * value; 352 1.2 rillig 353 1.2 rillig dmax = (double)3 * 10.0; 354 1.2 rillig dmin = (double)dmax * 10.0; 355 1.2 rillig davg = (double)dmax * dmin; 356 1.2 rillig 357 1.2 rillig return NULL; 358 1.2 rillig } 359 1.35 rillig //indent end 360 1.2 rillig 361 1.21 rillig 362 1.35 rillig //indent input 363 1.2 rillig int * 364 1.2 rillig y(void) { 365 1.2 rillig 366 1.2 rillig } 367 1.2 rillig 368 1.2 rillig int 369 1.2 rillig z(void) { 370 1.2 rillig 371 1.2 rillig } 372 1.35 rillig //indent end 373 1.2 rillig 374 1.35 rillig //indent run 375 1.2 rillig int * 376 1.2 rillig y(void) 377 1.2 rillig { 378 1.2 rillig 379 1.2 rillig } 380 1.2 rillig 381 1.2 rillig int 382 1.2 rillig z(void) 383 1.2 rillig { 384 1.2 rillig 385 1.2 rillig } 386 1.35 rillig //indent end 387 1.2 rillig 388 1.2 rillig 389 1.35 rillig //indent input 390 1.2 rillig int x; 391 1.2 rillig int *y; 392 1.2 rillig int * * * * z; 393 1.35 rillig //indent end 394 1.2 rillig 395 1.35 rillig //indent run 396 1.2 rillig int x; 397 1.2 rillig int *y; 398 1.2 rillig int ****z; 399 1.35 rillig //indent end 400 1.4 rillig 401 1.4 rillig 402 1.35 rillig //indent input 403 1.4 rillig int main(void) { 404 1.4 rillig char (*f1)() = NULL; 405 1.4 rillig char *(*f1)() = NULL; 406 1.4 rillig char *(*f2)(); 407 1.4 rillig } 408 1.35 rillig //indent end 409 1.4 rillig 410 1.6 rillig /* 411 1.6 rillig * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second 412 1.6 rillig * and third variable declaration in column 1. This bug has been introduced 413 1.6 rillig * to NetBSD when FreeBSD indent was imported in 2019. 414 1.6 rillig */ 415 1.35 rillig //indent run -ldi0 416 1.4 rillig int 417 1.4 rillig main(void) 418 1.4 rillig { 419 1.4 rillig char (*f1)() = NULL; 420 1.6 rillig char *(*f1)() = NULL; 421 1.6 rillig char *(*f2)(); 422 1.4 rillig } 423 1.35 rillig //indent end 424 1.5 rillig 425 1.35 rillig //indent run 426 1.5 rillig int 427 1.5 rillig main(void) 428 1.5 rillig { 429 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */ 430 1.5 rillig char (*f1)() = NULL; 431 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */ 432 1.6 rillig char *(* f1)() = NULL; 433 1.5 rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */ 434 1.6 rillig char *(* f2)(); 435 1.5 rillig } 436 1.35 rillig //indent end 437 1.10 rillig 438 1.10 rillig 439 1.10 rillig /* 440 1.10 rillig * In some ancient time long before ISO C90, variable declarations with 441 1.10 rillig * initializer could be written without '='. The C Programming Language from 442 1.10 rillig * 1978 doesn't mention this form anymore. 443 1.18 rillig * 444 1.18 rillig * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a 445 1.18 rillig * unary operator. 446 1.10 rillig */ 447 1.35 rillig //indent input 448 1.10 rillig int a - 1; 449 1.10 rillig { 450 1.10 rillig int a - 1; 451 1.10 rillig } 452 1.35 rillig //indent end 453 1.10 rillig 454 1.35 rillig //indent run -di0 455 1.11 rillig int a - 1; 456 1.10 rillig { 457 1.11 rillig int a - 1; 458 1.10 rillig } 459 1.35 rillig //indent end 460 1.14 rillig 461 1.14 rillig 462 1.14 rillig /* 463 1.20 rillig * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation 464 1.18 rillig * of the '*' depended on the function name, which did not make sense. For 465 1.18 rillig * function names that matched [A-Za-z]+, the '*' was placed correctly, for 466 1.18 rillig * all other function names (containing [$0-9_]) the '*' was right-aligned on 467 1.20 rillig * the declaration indentation, which defaults to 16. 468 1.14 rillig */ 469 1.35 rillig //indent input 470 1.14 rillig int * 471 1.14 rillig f2(void) 472 1.14 rillig { 473 1.14 rillig } 474 1.14 rillig 475 1.14 rillig int * 476 1.14 rillig yy(void) 477 1.14 rillig { 478 1.14 rillig } 479 1.14 rillig 480 1.14 rillig int * 481 1.18 rillig int_create(void) 482 1.14 rillig { 483 1.14 rillig } 484 1.35 rillig //indent end 485 1.15 rillig 486 1.35 rillig //indent run-equals-input 487 1.18 rillig 488 1.15 rillig 489 1.15 rillig /* 490 1.15 rillig * Since 2019-04-04, the space between the '){' is missing. 491 1.15 rillig */ 492 1.35 rillig //indent input 493 1.15 rillig int * 494 1.15 rillig function_name_____20________30________40________50 495 1.15 rillig (void) 496 1.15 rillig {} 497 1.35 rillig //indent end 498 1.15 rillig 499 1.38 rillig /* 500 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without 501 1.38 rillig * any space in between. 502 1.38 rillig */ 503 1.35 rillig //indent run 504 1.15 rillig int *function_name_____20________30________40________50 505 1.37 rillig (void) 506 1.37 rillig { 507 1.15 rillig } 508 1.35 rillig //indent end 509 1.15 rillig 510 1.15 rillig 511 1.15 rillig /* 512 1.17 rillig * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function 513 1.17 rillig * names were preserved while others were silently discarded. 514 1.15 rillig */ 515 1.35 rillig //indent input 516 1.15 rillig int * 517 1.15 rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 518 1.15 rillig (void) 519 1.15 rillig {} 520 1.35 rillig //indent end 521 1.15 rillig 522 1.38 rillig /* 523 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without 524 1.38 rillig * any space in between. 525 1.38 rillig */ 526 1.35 rillig //indent run 527 1.16 rillig int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 528 1.37 rillig (void) 529 1.37 rillig { 530 1.15 rillig } 531 1.35 rillig //indent end 532 1.22 rillig 533 1.22 rillig 534 1.22 rillig /* 535 1.22 rillig * Before 1990, when C90 standardized function prototypes, a function 536 1.22 rillig * declaration or definition did not contain a '*' that may have looked 537 1.22 rillig * similar to the binary operator '*' because it was surrounded by two 538 1.22 rillig * identifiers. 539 1.22 rillig * 540 1.26 rillig * As of 2021-11-21, indent interpreted the '*' in the function declaration in 541 1.26 rillig * line 1 as a binary operator, even though the '*' was followed by a ',' 542 1.26 rillig * directly. This was not visible in the output though since indent never 543 1.26 rillig * outputs a space before a comma. 544 1.22 rillig * 545 1.26 rillig * In the function declaration in line 2 and the function definition in line 546 1.26 rillig * 5, indent interpreted the '*' as a binary operator as well and accordingly 547 1.26 rillig * placed spaces around the '*'. On a very low syntactical analysis level, 548 1.26 rillig * this may have made sense since the '*' was surrounded by words, but still 549 1.26 rillig * the '*' is part of a declaration, where a binary operator does not make 550 1.26 rillig * sense. 551 1.26 rillig * 552 1.26 rillig * Essentially, as of 2021, indent had missed the last 31 years of advances in 553 1.26 rillig * the C programming language, in particular the invention of function 554 1.26 rillig * prototypes. Instead, the workaround had been to require all type names to 555 1.26 rillig * be specified via the options '-ta' and '-T'. This put the burden on the 556 1.26 rillig * user instead of the implementer. 557 1.26 rillig * 558 1.26 rillig * Fixed in lexi.c 1.156 from 2021-11-25. 559 1.22 rillig */ 560 1.35 rillig //indent input 561 1.22 rillig void buffer_add(buffer *, char); 562 1.22 rillig void buffer_add(buffer *buf, char ch); 563 1.22 rillig 564 1.22 rillig void 565 1.22 rillig buffer_add(buffer *buf, char ch) 566 1.22 rillig { 567 1.22 rillig *buf->e++ = ch; 568 1.22 rillig } 569 1.35 rillig //indent end 570 1.22 rillig 571 1.50 rillig //indent run 572 1.50 rillig void buffer_add(buffer *, char); 573 1.50 rillig // $ FIXME: There should be no space after the '*'. 574 1.50 rillig void buffer_add(buffer * buf, char ch); 575 1.50 rillig 576 1.50 rillig void 577 1.50 rillig buffer_add(buffer *buf, char ch) 578 1.50 rillig { 579 1.50 rillig *buf->e++ = ch; 580 1.50 rillig } 581 1.50 rillig //indent end 582 1.23 rillig 583 1.23 rillig 584 1.23 rillig /* 585 1.38 rillig * Before lexi.c 1.153 from 2021-11-25, indent did not recognize 'Token' as a 586 1.38 rillig * type name and then messed up the positioning of the '{'. 587 1.23 rillig */ 588 1.35 rillig //indent input 589 1.23 rillig static Token 590 1.23 rillig ToToken(bool cond) 591 1.23 rillig { 592 1.23 rillig } 593 1.35 rillig //indent end 594 1.23 rillig 595 1.35 rillig //indent run-equals-input -TToken 596 1.34 rillig 597 1.24 rillig /* Since lexi.c 1.153 from 2021-11-25. */ 598 1.35 rillig //indent run-equals-input 599 1.23 rillig 600 1.23 rillig 601 1.23 rillig /* 602 1.46 rillig * Before indent.c 1.309 from 2023-05-23, indent easily got confused by unknown 603 1.46 rillig * type names in struct declarations, as a ';' did not finish a declaration. 604 1.23 rillig */ 605 1.35 rillig //indent input 606 1.23 rillig typedef struct OpenDirs { 607 1.23 rillig CachedDirList list; 608 1.23 rillig HashTable /* of CachedDirListNode */ table; 609 1.58 rillig } OpenDirs; 610 1.35 rillig //indent end 611 1.23 rillig 612 1.46 rillig //indent run-equals-input -THashTable 613 1.23 rillig 614 1.46 rillig //indent run-equals-input 615 1.23 rillig 616 1.23 rillig 617 1.23 rillig /* 618 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown 619 1.46 rillig * type names, even in declarations that are syntactically unambiguous. 620 1.23 rillig */ 621 1.35 rillig //indent input 622 1.23 rillig static CachedDir *dot = NULL; 623 1.35 rillig //indent end 624 1.23 rillig 625 1.35 rillig //indent run-equals-input -TCachedDir 626 1.34 rillig 627 1.35 rillig //indent run-equals-input 628 1.23 rillig 629 1.23 rillig 630 1.23 rillig /* 631 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown 632 1.46 rillig * type names in declarations. 633 1.23 rillig */ 634 1.35 rillig //indent input 635 1.23 rillig static CachedDir * 636 1.23 rillig CachedDir_New(const char *name) 637 1.23 rillig { 638 1.23 rillig } 639 1.35 rillig //indent end 640 1.23 rillig 641 1.35 rillig //indent run-equals-input 642 1.23 rillig 643 1.23 rillig 644 1.23 rillig /* 645 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown 646 1.26 rillig * type names in declarations and generated 'CachedDir * dir' with an extra 647 1.26 rillig * space. 648 1.23 rillig */ 649 1.35 rillig //indent input 650 1.23 rillig static CachedDir * 651 1.23 rillig CachedDir_Ref(CachedDir *dir) 652 1.23 rillig { 653 1.23 rillig } 654 1.35 rillig //indent end 655 1.23 rillig 656 1.35 rillig //indent run-equals-input 657 1.23 rillig 658 1.23 rillig 659 1.23 rillig /* 660 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown 661 1.26 rillig * type names in declarations and generated 'HashEntry * he' with an extra 662 1.26 rillig * space. 663 1.26 rillig * 664 1.26 rillig * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end 665 1.26 rillig * of the line. 666 1.23 rillig */ 667 1.35 rillig //indent input 668 1.23 rillig static bool 669 1.23 rillig HashEntry_KeyEquals(const HashEntry *he, Substring key) 670 1.23 rillig { 671 1.23 rillig } 672 1.35 rillig //indent end 673 1.23 rillig 674 1.35 rillig //indent run-equals-input 675 1.23 rillig 676 1.23 rillig 677 1.23 rillig /* 678 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*' 679 1.26 rillig * are in a declaration, instead it interpreted the first '*' as a binary 680 1.26 rillig * operator, therefore generating 'CachedDir * *var' with an extra space. 681 1.23 rillig */ 682 1.35 rillig //indent input 683 1.23 rillig static void 684 1.23 rillig CachedDir_Assign(CachedDir **var, CachedDir *dir) 685 1.23 rillig { 686 1.23 rillig } 687 1.35 rillig //indent end 688 1.23 rillig 689 1.46 rillig //indent run-equals-input -TCachedDir 690 1.46 rillig 691 1.35 rillig //indent run-equals-input 692 1.34 rillig 693 1.23 rillig 694 1.23 rillig /* 695 1.24 rillig * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the 696 1.46 rillig * first one were indented as if they were statement continuations. This was 697 1.46 rillig * caused by the token 'Shell' being identified as a word, not as a type name. 698 1.23 rillig */ 699 1.35 rillig //indent input 700 1.24 rillig static Shell shells[] = { 701 1.23 rillig { 702 1.23 rillig first, 703 1.23 rillig second, 704 1.23 rillig }, 705 1.23 rillig }; 706 1.35 rillig //indent end 707 1.23 rillig 708 1.35 rillig //indent run-equals-input 709 1.23 rillig 710 1.23 rillig 711 1.23 rillig /* 712 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function 713 1.27 rillig * attribute macros that followed the function declaration. Its primitive 714 1.27 rillig * heuristic between deciding between a function declaration and a function 715 1.27 rillig * definition only looked for ')' immediately followed by ',' or ';'. This was 716 1.27 rillig * sufficient for well-formatted code before 1990. With the addition of 717 1.27 rillig * function prototypes and GCC attributes, the situation became more 718 1.27 rillig * complicated, and it took indent 31 years to adapt to this new reality. 719 1.23 rillig */ 720 1.35 rillig //indent input 721 1.23 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD; 722 1.23 rillig static void JobRestartJobs(void); 723 1.35 rillig //indent end 724 1.23 rillig 725 1.35 rillig //indent run 726 1.39 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD; 727 1.27 rillig static void JobRestartJobs(void); 728 1.35 rillig //indent end 729 1.23 rillig 730 1.23 rillig 731 1.23 rillig /* 732 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the 733 1.27 rillig * tokens ')' and ';' in the function body. It wrongly regarded them as 734 1.27 rillig * finishing a function declaration. 735 1.23 rillig */ 736 1.35 rillig //indent input 737 1.23 rillig MAKE_INLINE const char * 738 1.23 rillig GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); } 739 1.35 rillig //indent end 740 1.23 rillig 741 1.26 rillig /* 742 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an 743 1.26 rillig * extra space. 744 1.27 rillig * 745 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function 746 1.27 rillig * name in line 1, together with the '{'. 747 1.26 rillig */ 748 1.35 rillig //indent run 749 1.27 rillig MAKE_INLINE const char * 750 1.27 rillig GNode_VarTarget(GNode *gn) 751 1.27 rillig { 752 1.23 rillig return GNode_ValueDirect(gn, TARGET); 753 1.23 rillig } 754 1.35 rillig //indent end 755 1.23 rillig 756 1.35 rillig //indent run-equals-prev-output -TGNode 757 1.25 rillig 758 1.25 rillig 759 1.25 rillig /* 760 1.25 rillig * Ensure that '*' in declarations is interpreted (or at least formatted) as 761 1.25 rillig * a 'pointer to' type derivation, not as a binary or unary operator. 762 1.25 rillig */ 763 1.35 rillig //indent input 764 1.25 rillig number *var = a * b; 765 1.25 rillig 766 1.25 rillig void 767 1.25 rillig function(void) 768 1.25 rillig { 769 1.25 rillig number *var = a * b; 770 1.25 rillig } 771 1.35 rillig //indent end 772 1.25 rillig 773 1.35 rillig //indent run-equals-input -di0 774 1.28 rillig 775 1.28 rillig 776 1.28 rillig /* 777 1.28 rillig * In declarations, most occurrences of '*' are pointer type derivations. 778 1.29 rillig * There are a few exceptions though. Some of these are hard to detect 779 1.29 rillig * without knowing which identifiers are type names. 780 1.28 rillig */ 781 1.35 rillig //indent input 782 1.28 rillig char str[expr * expr]; 783 1.28 rillig char str[expr**ptr]; 784 1.28 rillig char str[*ptr**ptr]; 785 1.28 rillig char str[sizeof(expr * expr)]; 786 1.28 rillig char str[sizeof(int) * expr]; 787 1.28 rillig char str[sizeof(*ptr)]; 788 1.28 rillig char str[sizeof(type**)]; 789 1.28 rillig char str[sizeof(**ptr)]; 790 1.35 rillig //indent end 791 1.28 rillig 792 1.35 rillig //indent run -di0 793 1.29 rillig char str[expr * expr]; 794 1.29 rillig char str[expr * *ptr]; 795 1.29 rillig char str[*ptr * *ptr]; 796 1.29 rillig char str[sizeof(expr * expr)]; 797 1.29 rillig char str[sizeof(int) * expr]; 798 1.28 rillig char str[sizeof(*ptr)]; 799 1.50 rillig char str[sizeof(type **)]; 800 1.28 rillig char str[sizeof(**ptr)]; 801 1.35 rillig //indent end 802 1.31 rillig 803 1.31 rillig 804 1.31 rillig /* 805 1.32 rillig * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered 806 1.32 rillig * a declaration or a definition depended on the preceding struct, in 807 1.32 rillig * particular the length of the 'pn' line. This didn't make sense at all and 808 1.32 rillig * was due to an out-of-bounds memory access. 809 1.31 rillig * 810 1.31 rillig * Seen amongst others in args.c 1.72, function add_typedefs_from_file. 811 1.32 rillig * Fixed in lexi.c 1.165 from 2021-11-27. 812 1.31 rillig */ 813 1.35 rillig //indent input 814 1.31 rillig struct { 815 1.31 rillig } v = { 816 1.31 rillig pn("ta"), 817 1.31 rillig }; 818 1.31 rillig 819 1.31 rillig static void 820 1.31 rillig a(char *fe) 821 1.31 rillig { 822 1.31 rillig } 823 1.31 rillig 824 1.31 rillig struct { 825 1.31 rillig } v = { 826 1.31 rillig pn("t"), 827 1.31 rillig }; 828 1.31 rillig 829 1.31 rillig static void 830 1.31 rillig a(char *fe) 831 1.31 rillig { 832 1.31 rillig } 833 1.35 rillig //indent end 834 1.31 rillig 835 1.35 rillig //indent run -di0 836 1.31 rillig struct { 837 1.31 rillig } v = { 838 1.31 rillig pn("ta"), 839 1.31 rillig }; 840 1.31 rillig 841 1.31 rillig static void 842 1.32 rillig a(char *fe) 843 1.32 rillig { 844 1.31 rillig } 845 1.31 rillig 846 1.31 rillig struct { 847 1.31 rillig } v = { 848 1.31 rillig pn("t"), 849 1.31 rillig }; 850 1.31 rillig 851 1.31 rillig static void 852 1.31 rillig a(char *fe) 853 1.31 rillig { 854 1.31 rillig } 855 1.35 rillig //indent end 856 1.36 rillig 857 1.36 rillig 858 1.36 rillig /* 859 1.36 rillig * Before NetBSD indent.c 1.178 from 2021-10-29, indent removed the blank 860 1.36 rillig * before the '=', in the second and third of these function pointer 861 1.36 rillig * declarations. This was because indent interpreted the prototype parameters 862 1.36 rillig * 'int' and 'int, int' as type casts, which doesn't make sense at all. Fixing 863 1.36 rillig * this properly requires large style changes since indent is based on simple 864 1.36 rillig * heuristics all over. This didn't change in indent.c 1.178; instead, the 865 1.36 rillig * rule for inserting a blank before a binary operator was changed to always 866 1.36 rillig * insert a blank, except at the beginning of a line. 867 1.36 rillig */ 868 1.36 rillig //indent input 869 1.36 rillig char *(*fn)() = NULL; 870 1.36 rillig char *(*fn)(int) = NULL; 871 1.36 rillig char *(*fn)(int, int) = NULL; 872 1.36 rillig //indent end 873 1.36 rillig 874 1.36 rillig /* XXX: The parameter '(int)' is wrongly interpreted as a type cast. */ 875 1.36 rillig /* XXX: The parameter '(int, int)' is wrongly interpreted as a type cast. */ 876 1.36 rillig //indent run-equals-input -di0 877 1.40 rillig 878 1.40 rillig 879 1.40 rillig /* 880 1.41 rillig * Depending on whether there was a line break in the function header, the 881 1.41 rillig * spaces around the '||' operator were erroneously removed. 882 1.40 rillig */ 883 1.40 rillig //indent input 884 1.40 rillig bool is_identifier_start(char ch) 885 1.40 rillig { 886 1.40 rillig return ch_isalpha(ch) || ch == '_'; 887 1.40 rillig } 888 1.40 rillig 889 1.40 rillig bool 890 1.40 rillig is_identifier_start(char ch) 891 1.40 rillig { 892 1.40 rillig return ch_isalpha(ch) || ch == '_'; 893 1.40 rillig } 894 1.40 rillig //indent end 895 1.40 rillig 896 1.40 rillig //indent run 897 1.40 rillig bool 898 1.40 rillig is_identifier_start(char ch) 899 1.40 rillig { 900 1.40 rillig return ch_isalpha(ch) || ch == '_'; 901 1.40 rillig } 902 1.40 rillig 903 1.40 rillig bool 904 1.40 rillig is_identifier_start(char ch) 905 1.40 rillig { 906 1.41 rillig return ch_isalpha(ch) || ch == '_'; 907 1.40 rillig } 908 1.40 rillig //indent end 909 1.42 rillig 910 1.42 rillig 911 1.42 rillig //indent input 912 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t); 913 1.42 rillig 914 1.42 rillig static inline bool 915 1.42 rillig ch_isalnum(char ch) 916 1.42 rillig { 917 1.42 rillig return isalnum((unsigned char)ch) != 0; 918 1.42 rillig } 919 1.42 rillig 920 1.42 rillig static inline bool 921 1.42 rillig ch_isalpha(char ch) 922 1.42 rillig { 923 1.42 rillig return isalpha((unsigned char)ch) != 0; 924 1.42 rillig } 925 1.42 rillig //indent end 926 1.42 rillig 927 1.42 rillig //indent run -i4 -di0 928 1.42 rillig // $ FIXME: 'buffer' is classified as 'word'. 929 1.42 rillig // $ 930 1.42 rillig // $ FIXME: 'size_t' is classified as 'word'. 931 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t); 932 1.42 rillig 933 1.42 rillig static inline bool 934 1.42 rillig ch_isalnum(char ch) 935 1.42 rillig { 936 1.42 rillig return isalnum((unsigned char)ch) != 0; 937 1.42 rillig } 938 1.42 rillig 939 1.42 rillig static inline bool 940 1.42 rillig ch_isalpha(char ch) 941 1.42 rillig { 942 1.42 rillig return isalpha((unsigned char)ch) != 0; 943 1.42 rillig } 944 1.42 rillig //indent end 945 1.42 rillig 946 1.42 rillig //indent run-equals-input -i4 -di0 947 1.44 rillig 948 1.44 rillig 949 1.44 rillig //indent input 950 1.44 rillig void __printflike(1, 2) 951 1.44 rillig debug_printf(const char *fmt, ...) 952 1.44 rillig { 953 1.44 rillig } 954 1.44 rillig //indent end 955 1.44 rillig 956 1.44 rillig //indent run 957 1.44 rillig void 958 1.44 rillig // $ FIXME: No line break here. 959 1.44 rillig __printflike(1, 2) 960 1.44 rillig debug_printf(const char *fmt, ...) 961 1.44 rillig { 962 1.44 rillig } 963 1.44 rillig //indent end 964 1.44 rillig 965 1.44 rillig 966 1.60 rillig /* 967 1.60 rillig * When a name is defined both as a function and as a macro, the name in the 968 1.60 rillig * function definition must be enclosed in parentheses, to prevent the macro 969 1.60 rillig * from being expanded. It is also possible to undefine the macro, but that is 970 1.60 rillig * often not done in practice. 971 1.60 rillig */ 972 1.44 rillig //indent input 973 1.44 rillig void 974 1.44 rillig (error_at)(int msgid, const pos_t *pos, ...) 975 1.44 rillig { 976 1.44 rillig } 977 1.44 rillig //indent end 978 1.44 rillig 979 1.60 rillig //indent run-equals-input 980 1.49 rillig 981 1.49 rillig 982 1.49 rillig //indent input 983 1.49 rillig struct a { 984 1.49 rillig struct b { 985 1.49 rillig struct c { 986 1.49 rillig struct d1 { 987 1.49 rillig int e; 988 1.49 rillig } d1; 989 1.49 rillig struct d2 { 990 1.49 rillig int e; 991 1.49 rillig } d2; 992 1.49 rillig } c; 993 1.49 rillig } b; 994 1.49 rillig }; 995 1.49 rillig //indent end 996 1.49 rillig 997 1.49 rillig //indent run-equals-input -di0 998 1.51 rillig 999 1.51 rillig 1000 1.51 rillig //indent input 1001 1.51 rillig static FILE *ArchFindMember(const char *, const char *, 1002 1.51 rillig struct ar_hdr *, const char *); 1003 1.51 rillig 1004 1.51 rillig bool 1005 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...)) 1006 1.51 rillig { 1007 1.51 rillig } 1008 1.51 rillig 1009 1.51 rillig static void MAKE_ATTR_PRINTFLIKE(5, 0) 1010 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn, 1011 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap) 1012 1.51 rillig { 1013 1.51 rillig } 1014 1.51 rillig 1015 1.51 rillig typedef struct { 1016 1.51 rillig const char *m_name; 1017 1.51 rillig } mod_t; 1018 1.51 rillig //indent end 1019 1.51 rillig 1020 1.51 rillig //indent run -fbs -di0 -psl 1021 1.52 rillig // $ Must be detected as a function declaration, not a definition. 1022 1.52 rillig static FILE *ArchFindMember(const char *, const char *, 1023 1.52 rillig struct ar_hdr *, const char *); 1024 1.51 rillig 1025 1.51 rillig bool 1026 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...)) 1027 1.51 rillig { 1028 1.51 rillig } 1029 1.51 rillig 1030 1.51 rillig static void 1031 1.51 rillig MAKE_ATTR_PRINTFLIKE(5, 0) 1032 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn, 1033 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap) 1034 1.51 rillig { 1035 1.51 rillig } 1036 1.51 rillig 1037 1.51 rillig typedef struct { 1038 1.51 rillig const char *m_name; 1039 1.58 rillig } mod_t; 1040 1.51 rillig //indent end 1041 1.53 rillig 1042 1.53 rillig 1043 1.53 rillig //indent input 1044 1.53 rillig int a[] = {1, 2}, 1045 1.53 rillig b[] = {1, 2}; 1046 1.53 rillig { 1047 1.53 rillig int a[] = {1, 2}, 1048 1.53 rillig b[] = {1, 2}; 1049 1.53 rillig } 1050 1.53 rillig //indent end 1051 1.53 rillig 1052 1.53 rillig //indent run -di0 1053 1.53 rillig int a[] = {1, 2}, 1054 1.53 rillig // $ FIXME: Missing indentation. 1055 1.53 rillig b[] = {1, 2}; 1056 1.53 rillig { 1057 1.53 rillig int a[] = {1, 2}, 1058 1.53 rillig // $ FIXME: Missing indentation. 1059 1.53 rillig b[] = {1, 2}; 1060 1.53 rillig } 1061 1.53 rillig //indent end 1062 1.54 rillig 1063 1.54 rillig 1064 1.54 rillig /* 1065 1.54 rillig * When a type occurs at the top level, it forces a line break before. 1066 1.54 rillig */ 1067 1.54 rillig //indent input 1068 1.54 rillig __attribute__((__dead__)) void die(void) {} 1069 1.54 rillig //indent end 1070 1.54 rillig 1071 1.54 rillig //indent run 1072 1.54 rillig __attribute__((__dead__)) 1073 1.54 rillig void 1074 1.54 rillig die(void) 1075 1.54 rillig { 1076 1.54 rillig } 1077 1.54 rillig //indent end 1078 1.55 rillig 1079 1.55 rillig 1080 1.55 rillig /* 1081 1.55 rillig * In very rare cases, the type of a declarator might include literal tab 1082 1.55 rillig * characters. This tab might affect the indentation of the declarator, but 1083 1.55 rillig * only if it occurs before the declarator, and that is hard to achieve. 1084 1.55 rillig */ 1085 1.55 rillig //indent input 1086 1.55 rillig int arr[sizeof " "]; 1087 1.55 rillig //indent end 1088 1.55 rillig 1089 1.55 rillig //indent run-equals-input 1090 1.55 rillig 1091 1.55 rillig 1092 1.55 rillig /* 1093 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends 1094 1.55 rillig * the brace level of the initializer expression. 1095 1.55 rillig */ 1096 1.55 rillig //indent input 1097 1.55 rillig int multi_line[1][1][1] = { 1098 1.55 rillig { 1099 1.55 rillig { 1100 1.55 rillig 1 1101 1.55 rillig }, 1102 1.55 rillig }, 1103 1.55 rillig }; 1104 1.55 rillig int single_line[2][1][1] = {{{1},},{{2}}}; 1105 1.55 rillig //indent end 1106 1.55 rillig 1107 1.55 rillig //indent run -di0 1108 1.55 rillig int multi_line[1][1][1] = { 1109 1.55 rillig { 1110 1.55 rillig { 1111 1.55 rillig 1 1112 1.55 rillig }, 1113 1.55 rillig }, 1114 1.55 rillig }; 1115 1.55 rillig int single_line[2][1][1] = {{{1},}, {{2}}}; 1116 1.55 rillig //indent end 1117 1.55 rillig 1118 1.55 rillig 1119 1.55 rillig /* 1120 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends 1121 1.55 rillig * the brace level of the initializer expression. 1122 1.55 rillig */ 1123 1.55 rillig //indent input 1124 1.55 rillig { 1125 1.55 rillig int multi_line = { 1126 1.55 rillig { 1127 1.55 rillig { 1128 1.55 rillig b 1129 1.55 rillig }, 1130 1.55 rillig }, 1131 1.55 rillig }; 1132 1.55 rillig int single_line = {{{b},},{}}; 1133 1.55 rillig } 1134 1.55 rillig //indent end 1135 1.55 rillig 1136 1.55 rillig //indent run -di0 1137 1.55 rillig { 1138 1.55 rillig int multi_line = { 1139 1.55 rillig { 1140 1.55 rillig { 1141 1.55 rillig b 1142 1.55 rillig }, 1143 1.55 rillig }, 1144 1.55 rillig }; 1145 1.55 rillig int single_line = {{{b},}, {}}; 1146 1.55 rillig } 1147 1.55 rillig //indent end 1148 1.55 rillig 1149 1.55 rillig 1150 1.55 rillig /* 1151 1.55 rillig * In initializers, multi-line expressions don't have their second line 1152 1.55 rillig * indented, even though they should. 1153 1.55 rillig */ 1154 1.55 rillig //indent input 1155 1.55 rillig { 1156 1.55 rillig multi_line = (int[]){ 1157 1.55 rillig {1 1158 1.55 rillig +1}, 1159 1.55 rillig {1 1160 1.55 rillig +1}, 1161 1.55 rillig {1 1162 1.55 rillig +1}, 1163 1.55 rillig }; 1164 1.55 rillig } 1165 1.55 rillig //indent end 1166 1.55 rillig 1167 1.55 rillig //indent run 1168 1.55 rillig { 1169 1.55 rillig multi_line = (int[]){ 1170 1.55 rillig {1 1171 1.55 rillig + 1}, 1172 1.55 rillig {1 1173 1.55 rillig + 1}, 1174 1.55 rillig {1 1175 1.55 rillig + 1}, 1176 1.55 rillig }; 1177 1.55 rillig } 1178 1.55 rillig //indent end 1179 1.57 rillig 1180 1.57 rillig 1181 1.57 rillig /* 1182 1.57 rillig * 1183 1.57 rillig */ 1184 1.57 rillig //indent input 1185 1.57 rillig int 1186 1.57 rillig old_style(a) 1187 1.57 rillig struct { 1188 1.57 rillig int member; 1189 1.57 rillig } a; 1190 1.57 rillig { 1191 1.57 rillig stmt; 1192 1.57 rillig } 1193 1.57 rillig //indent end 1194 1.57 rillig 1195 1.57 rillig //indent run-equals-input 1196