1 1.4 rillig /* $NetBSD: edge_cases.c,v 1.4 2023/06/17 22:09:24 rillig Exp $ */ 2 1.1 rillig 3 1.1 rillig /* 4 1.1 rillig * Tests for edge cases in the C programming language that indent does not 5 1.1 rillig * support or in which cases indent behaves strangely. 6 1.1 rillig */ 7 1.1 rillig 8 1.1 rillig /* 9 1.1 rillig * Digraphs are replacements for the characters '[', '{' and '#', which are 10 1.2 rillig * missing in some exotic restricted source character sets. They are not used 11 1.2 rillig * in practice, therefore indent doesn't need to support them. 12 1.1 rillig * 13 1.1 rillig * See C99 6.4.6 14 1.1 rillig */ 15 1.1 rillig //indent input 16 1.1 rillig void 17 1.1 rillig digraphs(void) 18 1.1 rillig { 19 1.1 rillig /* same as 'array[subscript]' */ 20 1.1 rillig number = array<:subscript:>; 21 1.1 rillig 22 1.1 rillig /* same as '(int){ initializer }' */ 23 1.1 rillig number = (int)<% initializer %>; 24 1.1 rillig } 25 1.1 rillig //indent end 26 1.1 rillig 27 1.1 rillig //indent run 28 1.1 rillig void 29 1.1 rillig digraphs(void) 30 1.1 rillig { 31 1.1 rillig /* same as 'array[subscript]' */ 32 1.2 rillig // $ Indent interprets everything before the second ':' as a label name, 33 1.3 rillig // $ indenting the "label" 2 levels to the left. 34 1.2 rillig // $ 35 1.2 rillig // $ The space between 'array' and '<' comes from the binary operator '<'. 36 1.3 rillig number = array <:subscript: >; 37 1.1 rillig 38 1.1 rillig /* same as '(int){ initializer }' */ 39 1.2 rillig // $ The opening '<' and '%' are interpreted as unary operators. 40 1.2 rillig // $ The closing '%' and '>' are interpreted as a binary and unary operator. 41 1.1 rillig number = (int)<%initializer % >; 42 1.1 rillig } 43 1.1 rillig //indent end 44 1.1 rillig 45 1.1 rillig /* TODO: test trigraphs, which are as unusual as digraphs */ 46 1.1 rillig /* TODO: test digraphs and trigraphs in string literals, just for fun */ 47 1.4 rillig 48 1.4 rillig 49 1.4 rillig /* 50 1.4 rillig * The keywords 'break', 'continue', 'goto' and 'restrict' are ordinary words, 51 1.4 rillig * they do not force a line break before. 52 1.4 rillig */ 53 1.4 rillig //indent input 54 1.4 rillig { 55 1.4 rillig Whether to break or not to break, that is the question; 56 1.4 rillig 57 1.4 rillig The people goto the shopping mall; 58 1.4 rillig 59 1.4 rillig Begin at the beginning, then continue until you come to the end; 60 1.4 rillig then stop; 61 1.4 rillig 62 1.4 rillig Try to restrict yourself; 63 1.4 rillig } 64 1.4 rillig //indent end 65 1.4 rillig 66 1.4 rillig //indent run-equals-input -di0 67 1.4 rillig 68 1.4 rillig 69 1.4 rillig /* 70 1.4 rillig * Try a bit of Perl code, just for fun, taken from pkgsrc/pkgtools/pkglint4. 71 1.4 rillig * 72 1.4 rillig * It works surprisingly well. 73 1.4 rillig */ 74 1.4 rillig //indent input 75 1.4 rillig package PkgLint::Line; 76 1.4 rillig 77 1.4 rillig use strict; 78 1.4 rillig use warnings; 79 1.4 rillig 80 1.4 rillig BEGIN { 81 1.4 rillig import PkgLint::Util qw( 82 1.4 rillig false true 83 1.4 rillig assert 84 1.4 rillig ); 85 1.4 rillig } 86 1.4 rillig 87 1.4 rillig use enum qw(FNAME LINES TEXT PHYSLINES CHANGED BEFORE AFTER EXTRA); 88 1.4 rillig 89 1.4 rillig sub new($$$$) { 90 1.4 rillig my ($class, $fname, $lines, $text, $physlines) = @_; 91 1.4 rillig my ($self) = ([$fname, $lines, $text, $physlines, false, [], [], {}]); 92 1.4 rillig bless($self, $class); 93 1.4 rillig return $self; 94 1.4 rillig } 95 1.4 rillig 96 1.4 rillig sub fname($) { return shift()->[FNAME]; } 97 1.4 rillig 98 1.4 rillig # querying, getting and setting the extra values. 99 1.4 rillig sub has($$) { 100 1.4 rillig my ($self, $name) = @_; 101 1.4 rillig return exists($self->[EXTRA]->{$name}); 102 1.4 rillig } 103 1.4 rillig //indent end 104 1.4 rillig 105 1.4 rillig //indent run -di0 -nfbs -npsl 106 1.4 rillig // $ Space after '::'. 107 1.4 rillig package PkgLint:: Line; 108 1.4 rillig 109 1.4 rillig use strict; 110 1.4 rillig use warnings; 111 1.4 rillig 112 1.4 rillig BEGIN { 113 1.4 rillig // $ Space after '::'. 114 1.4 rillig import PkgLint:: Util qw( 115 1.4 rillig false true 116 1.4 rillig assert 117 1.4 rillig ); 118 1.4 rillig } 119 1.4 rillig 120 1.4 rillig // $ Space between 'qw' and '('. 121 1.4 rillig use enum qw (FNAME LINES TEXT PHYSLINES CHANGED BEFORE AFTER EXTRA); 122 1.4 rillig 123 1.4 rillig sub new($$$$) { 124 1.4 rillig // $ No space between 'my' and '('. 125 1.4 rillig my($class, $fname, $lines, $text, $physlines) = @_; 126 1.4 rillig my($self) = ([$fname, $lines, $text, $physlines, false, [], [], { 127 1.4 rillig // $ Line break between '{' and '}'. 128 1.4 rillig } 129 1.4 rillig // $ Line break between '}' and ']'. 130 1.4 rillig ]); 131 1.4 rillig bless($self, $class); 132 1.4 rillig return $self; 133 1.4 rillig } 134 1.4 rillig 135 1.4 rillig sub fname($) { 136 1.4 rillig return shift()->[FNAME]; 137 1.4 rillig } 138 1.4 rillig 139 1.4 rillig // $ Preprocessing lines are mostly preserved. 140 1.4 rillig # querying, getting and setting the extra values. 141 1.4 rillig sub has($$) { 142 1.4 rillig my($self, $name) = @_; 143 1.4 rillig return exists($self->[EXTRA]->{ 144 1.4 rillig // $ Line breaks between '{', '$name', '}' and ');'. 145 1.4 rillig $name 146 1.4 rillig } 147 1.4 rillig ); 148 1.4 rillig } 149 1.4 rillig // exit 1 150 1.4 rillig // error: Standard Input:17: Unbalanced parentheses 151 1.4 rillig // warning: Standard Input:17: Extra ']' 152 1.4 rillig // warning: Standard Input:17: Extra ')' 153 1.4 rillig // error: Standard Input:27: Unbalanced parentheses 154 1.4 rillig // warning: Standard Input:27: Extra ')' 155 1.4 rillig //indent end 156 1.4 rillig 157 1.4 rillig 158 1.4 rillig /* 159 1.4 rillig * Try a piece of old-style JavaScript, just for fun, using '==' instead of the 160 1.4 rillig * now recommended '==='. 161 1.4 rillig */ 162 1.4 rillig //indent input 163 1.4 rillig function join(delim, values) 164 1.4 rillig { 165 1.4 rillig if (values.length == 0) 166 1.4 rillig return ''; 167 1.4 rillig if (values.length == 1) 168 1.4 rillig return values[0]; 169 1.4 rillig var result = ''; 170 1.4 rillig for (var i in values) { 171 1.4 rillig result += delim; 172 1.4 rillig result += values[i]; 173 1.4 rillig } 174 1.4 rillig return result.substr(delim.length); 175 1.4 rillig } 176 1.4 rillig //indent end 177 1.4 rillig 178 1.4 rillig //indent run-equals-input -di0 -npsl 179