27
27
extern char * optarg ;
28
28
extern int optind ;
29
29
30
+
30
31
int
31
32
main (int argc , char * * argv )
32
33
{
@@ -88,6 +89,7 @@ main(int argc, char **argv)
88
89
argv += optind ;
89
90
argc -= optind ;
90
91
92
+ /* process arguments */
91
93
do
92
94
{
93
95
if (argc < 1 )
@@ -104,6 +106,7 @@ main(int argc, char **argv)
104
106
105
107
escaped = FALSE;
106
108
109
+ /* process lines */
107
110
while (fgets (in_line , sizeof (in_line ), in_file ) != NULL )
108
111
{
109
112
col_in_tab = 0 ;
@@ -114,9 +117,11 @@ main(int argc, char **argv)
114
117
quote_char = ' ' ;
115
118
escaped = FALSE;
116
119
120
+ /* process line */
117
121
while (* src != NUL )
118
122
{
119
123
col_in_tab ++ ;
124
+ /* Is this a potential space/tab replacement? */
120
125
if (quote_char == ' ' && (* src == ' ' || * src == '\t' ))
121
126
{
122
127
if (* src == '\t' )
@@ -127,29 +132,34 @@ main(int argc, char **argv)
127
132
else
128
133
prv_spaces ++ ;
129
134
135
+ /* Are we at a tab stop? */
130
136
if (col_in_tab == tab_size )
131
137
{
132
138
/*
133
- * Is the next character going to be a tab? Needed to
134
- * do tab replacement in current spot if next char is
135
- * going to be a tab, ignoring min_spaces
139
+ * Is the next character going to be a tab? We do
140
+ * tab replacement in the current spot if the next
141
+ * char is going to be a tab and ignore min_spaces.
136
142
*/
137
143
nxt_spaces = 0 ;
138
144
while (1 )
139
145
{
146
+ /* Have we reached non-whitespace? */
140
147
if (* (src + nxt_spaces + 1 ) == NUL ||
141
148
(* (src + nxt_spaces + 1 ) != ' ' &&
142
149
* (src + nxt_spaces + 1 ) != '\t' ))
143
150
break ;
151
+ /* count spaces */
144
152
if (* (src + nxt_spaces + 1 ) == ' ' )
145
153
++ nxt_spaces ;
154
+ /* Have we found a forward tab? */
146
155
if (* (src + nxt_spaces + 1 ) == '\t' ||
147
156
nxt_spaces == tab_size )
148
157
{
149
158
nxt_spaces = tab_size ;
150
159
break ;
151
160
}
152
161
}
162
+ /* Do tab replacment for spaces? */
153
163
if ((prv_spaces >= min_spaces ||
154
164
nxt_spaces == tab_size ) &&
155
165
del_tabs == FALSE)
@@ -158,40 +168,51 @@ main(int argc, char **argv)
158
168
prv_spaces = 0 ;
159
169
}
160
170
else
171
+ /* output accumulated spaces */
161
172
{
162
173
for (; prv_spaces > 0 ; prv_spaces -- )
163
174
* (dst ++ ) = ' ' ;
164
175
}
165
176
}
166
177
}
178
+ /* Not a potential space/tab replacement */
167
179
else
168
180
{
181
+ /* output accumulated spaces */
169
182
for (; prv_spaces > 0 ; prv_spaces -- )
170
183
* (dst ++ ) = ' ' ;
171
- if (* src == '\t' ) /* only when in quote */
184
+ /* This can only happen in a quote. */
185
+ if (* src == '\t' )
172
186
col_in_tab = 0 ;
187
+ /* visual backspace? */
173
188
if (* src == '\b' )
174
189
col_in_tab -= 2 ;
190
+ /* Do we process quotes? */
175
191
if (escaped == FALSE && protect_quotes == TRUE)
176
192
{
177
193
if (* src == '\\' )
178
194
escaped = TRUE;
195
+ /* Is this a quote character? */
179
196
if (* src == '"' || * src == '\'' )
180
197
{
198
+ /* toggle quote mode */
181
199
if (quote_char == ' ' )
182
200
quote_char = * src ;
183
201
else if (* src == quote_char )
184
202
quote_char = ' ' ;
185
203
}
186
204
}
205
+ /* newlines/CRs do not terminate escapes */
187
206
else if (* src != '\r' && * src != '\n' )
188
207
escaped = FALSE;
189
208
209
+ /* reached newline/CR; clip line? */
190
210
if ((* src == '\r' || * src == '\n' ) &&
191
- quote_char == ' ' &&
192
211
clip_lines == TRUE &&
212
+ quote_char == ' ' &&
193
213
escaped == FALSE)
194
214
{
215
+ /* trim spaces starting from the end */
195
216
while (dst > out_line &&
196
217
(* (dst - 1 ) == ' ' || * (dst - 1 ) == '\t' ))
197
218
dst -- ;
@@ -210,9 +231,11 @@ main(int argc, char **argv)
210
231
dst -- ;
211
232
prv_spaces = 0 ;
212
233
}
234
+ /* output accumulated spaces */
213
235
for (; prv_spaces > 0 ; prv_spaces -- )
214
236
* (dst ++ ) = ' ' ;
215
237
* dst = NUL ;
238
+
216
239
if (fputs (out_line , stdout ) == EOF )
217
240
{
218
241
fprintf (stderr , "Cannot write to output file %s: %s\n" , argv [0 ], strerror (errno ));
0 commit comments