edge_cases.c revision 1.4 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