2727extern char * optarg ;
2828extern int optind ;
2929
30+
3031int
3132main (int argc ,char * * argv )
3233{
@@ -88,6 +89,7 @@ main(int argc, char **argv)
8889argv += optind ;
8990argc -= optind ;
9091
92+ /* process arguments */
9193do
9294{
9395if (argc < 1 )
@@ -104,6 +106,7 @@ main(int argc, char **argv)
104106
105107escaped = FALSE;
106108
109+ /* process lines */
107110while (fgets (in_line ,sizeof (in_line ),in_file )!= NULL )
108111{
109112col_in_tab = 0 ;
@@ -114,9 +117,11 @@ main(int argc, char **argv)
114117quote_char = ' ' ;
115118escaped = FALSE;
116119
120+ /* process line */
117121while (* src != NUL )
118122{
119123col_in_tab ++ ;
124+ /* Is this a potential space/tab replacement? */
120125if (quote_char == ' ' && (* src == ' ' || * src == '\t' ))
121126{
122127if (* src == '\t' )
@@ -127,29 +132,34 @@ main(int argc, char **argv)
127132else
128133prv_spaces ++ ;
129134
135+ /* Are we at a tab stop? */
130136if (col_in_tab == tab_size )
131137{
132138/*
133- * Is the next character going to be a tab?Needed to
134- *do tab replacement in current spot ifnext 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 inthe current spot ifthe next
141+ *char is going to be a tab and ignore min_spaces.
136142 */
137143nxt_spaces = 0 ;
138144while (1 )
139145{
146+ /* Have we reached non-whitespace? */
140147if (* (src + nxt_spaces + 1 )== NUL ||
141148(* (src + nxt_spaces + 1 )!= ' ' &&
142149* (src + nxt_spaces + 1 )!= '\t' ))
143150break ;
151+ /* count spaces */
144152if (* (src + nxt_spaces + 1 )== ' ' )
145153++ nxt_spaces ;
154+ /* Have we found a forward tab? */
146155if (* (src + nxt_spaces + 1 )== '\t' ||
147156nxt_spaces == tab_size )
148157{
149158nxt_spaces = tab_size ;
150159break ;
151160}
152161}
162+ /* Do tab replacment for spaces? */
153163if ((prv_spaces >=min_spaces ||
154164nxt_spaces == tab_size )&&
155165del_tabs == FALSE)
@@ -158,40 +168,51 @@ main(int argc, char **argv)
158168prv_spaces = 0 ;
159169}
160170else
171+ /* output accumulated spaces */
161172{
162173for (;prv_spaces > 0 ;prv_spaces -- )
163174* (dst ++ )= ' ' ;
164175}
165176}
166177}
178+ /* Not a potential space/tab replacement */
167179else
168180{
181+ /* output accumulated spaces */
169182for (;prv_spaces > 0 ;prv_spaces -- )
170183* (dst ++ )= ' ' ;
171- if (* src == '\t' )/* only when in quote */
184+ /* This can only happen in a quote. */
185+ if (* src == '\t' )
172186col_in_tab = 0 ;
187+ /* visual backspace? */
173188if (* src == '\b' )
174189col_in_tab -= 2 ;
190+ /* Do we process quotes? */
175191if (escaped == FALSE&& protect_quotes == TRUE)
176192{
177193if (* src == '\\' )
178194escaped = TRUE;
195+ /* Is this a quote character? */
179196if (* src == '"' || * src == '\'' )
180197{
198+ /* toggle quote mode */
181199if (quote_char == ' ' )
182200quote_char = * src ;
183201else if (* src == quote_char )
184202quote_char = ' ' ;
185203}
186204}
205+ /* newlines/CRs do not terminate escapes */
187206else if (* src != '\r' && * src != '\n' )
188207escaped = FALSE;
189208
209+ /* reached newline/CR; clip line? */
190210if ((* src == '\r' || * src == '\n' )&&
191- quote_char == ' ' &&
192211clip_lines == TRUE&&
212+ quote_char == ' ' &&
193213escaped == FALSE)
194214{
215+ /* trim spaces starting from the end */
195216while (dst > out_line &&
196217 (* (dst - 1 )== ' ' || * (dst - 1 )== '\t' ))
197218dst -- ;
@@ -210,9 +231,11 @@ main(int argc, char **argv)
210231dst -- ;
211232prv_spaces = 0 ;
212233}
234+ /* output accumulated spaces */
213235for (;prv_spaces > 0 ;prv_spaces -- )
214236* (dst ++ )= ' ' ;
215237* dst = NUL ;
238+
216239if (fputs (out_line ,stdout )== EOF )
217240{
218241fprintf (stderr ,"Cannot write to output file %s: %s\n" ,argv [0 ],strerror (errno ));