1 | /**
|
---|
2 | * Copyright (c) 1985 Sun Microsystems, Inc.
|
---|
3 | * Copyright (c) 1980 The Regents of the University of California.
|
---|
4 | * Copyright (c) 1976 Board of Trustees of the University of Illinois.
|
---|
5 | * All rights reserved.
|
---|
6 | *
|
---|
7 | * Redistribution and use in source and binary forms are permitted
|
---|
8 | * provided that the above copyright notice and this paragraph are
|
---|
9 | * duplicated in all such forms and that any documentation,
|
---|
10 | * advertising materials, and other materials related to such
|
---|
11 | * distribution and use acknowledge that the software was developed
|
---|
12 | * by the University of California, Berkeley, the University of Illinois,
|
---|
13 | * Urbana, and Sun Microsystems, Inc. The name of either University
|
---|
14 | * or Sun Microsystems may not be used to endorse or promote products
|
---|
15 | * derived from this software without specific prior written permission.
|
---|
16 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
---|
17 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
---|
18 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
---|
19 | */
|
---|
20 |
|
---|
21 | /* ported to MINIX by: Robert R. Hall <hall@pnet01.cts.com> */
|
---|
22 |
|
---|
23 | #define _POSIX_SOURCE 1
|
---|
24 | #define PUBLIC
|
---|
25 | #define NAME_SIZE _POSIX_NAME_MAX
|
---|
26 |
|
---|
27 | #include <ctype.h>
|
---|
28 | #include <string.h>
|
---|
29 | #include <sys/types.h>
|
---|
30 | #include <fcntl.h>
|
---|
31 | #include <unistd.h>
|
---|
32 | #include <stdlib.h>
|
---|
33 | #include <stdio.h>
|
---|
34 | #include <limits.h>
|
---|
35 | #include "globs.h"
|
---|
36 | #include "codes.h"
|
---|
37 | #include "proto.h"
|
---|
38 |
|
---|
39 | char *in_name = "Standard Input"; /* will always point to
|
---|
40 | name of input file */
|
---|
41 | char *out_name = "Standard Output"; /* will always point to
|
---|
42 | name of output file */
|
---|
43 | char bakfile[60];
|
---|
44 |
|
---|
45 | void main(argc, argv)
|
---|
46 | int argc;
|
---|
47 | char **argv;
|
---|
48 | {
|
---|
49 |
|
---|
50 | extern int found_err; /* flag set in diag() on error */
|
---|
51 | int dec_ind; /* current indentation for
|
---|
52 | declarations */
|
---|
53 | int di_stack[20]; /* a stack of structure
|
---|
54 | indentation levels */
|
---|
55 | int flushed_nl; /* used when buffering up
|
---|
56 | comments to remember that a
|
---|
57 | newline was passed over */
|
---|
58 | int force_nl; /* when true, code must be
|
---|
59 | broken */
|
---|
60 | int hd_type; /* used to store type of stmt
|
---|
61 | for if (...), for (...), etc */
|
---|
62 | register int i; /* local loop counter */
|
---|
63 | int scase; /* set to true when we see a
|
---|
64 | case, so we will know what
|
---|
65 | to do with the following
|
---|
66 | colon */
|
---|
67 | int sp_sw; /* when true, we are in the
|
---|
68 | expressin of if(...),
|
---|
69 | while(...), etc. */
|
---|
70 | int squest; /* when this is positive, we
|
---|
71 | have seen a ? without the
|
---|
72 | matching : in a <c>?<s>:<s>
|
---|
73 | construct */
|
---|
74 | register char *t_ptr; /* used for copying tokens */
|
---|
75 | int type_code; /* the type of token, returned
|
---|
76 | by lexi */
|
---|
77 |
|
---|
78 | int last_else = 0; /* true iff last keyword was an
|
---|
79 | else */
|
---|
80 |
|
---|
81 |
|
---|
82 | /*-----------------------------------------------*\
|
---|
83 | | INITIALIZATION |
|
---|
84 | \*-----------------------------------------------*/
|
---|
85 |
|
---|
86 |
|
---|
87 | ps.p_stack[0] = stmt; /* this is the parser's stack */
|
---|
88 | ps.last_nl = true; /* this is true if the last
|
---|
89 | thing scanned was a newline */
|
---|
90 | ps.last_token = semicolon;
|
---|
91 | combuf = (char *) malloc(bufsize);
|
---|
92 | labbuf = (char *) malloc(bufsize);
|
---|
93 | codebuf = (char *) malloc(bufsize);
|
---|
94 | l_com = combuf + bufsize - 5;
|
---|
95 | l_lab = labbuf + bufsize - 5;
|
---|
96 | l_code = codebuf + bufsize - 5;
|
---|
97 | combuf[0] = codebuf[0] = labbuf[0] = ' '; /* set up code, label,
|
---|
98 | and comment buffers */
|
---|
99 | combuf[1] = codebuf[1] = labbuf[1] = '\0';
|
---|
100 | ps.else_if = 1; /* Default else-if special
|
---|
101 | processing to on */
|
---|
102 | s_lab = e_lab = labbuf + 1;
|
---|
103 | s_code = e_code = codebuf + 1;
|
---|
104 | s_com = e_com = combuf + 1;
|
---|
105 |
|
---|
106 | buf_ptr = buf_end = in_buffer;
|
---|
107 | line_no = 1;
|
---|
108 | had_eof = ps.in_decl = ps.decl_on_line = break_comma = false;
|
---|
109 | sp_sw = force_nl = false;
|
---|
110 | ps.in_or_st = false;
|
---|
111 | ps.bl_line = true;
|
---|
112 | dec_ind = 0;
|
---|
113 | di_stack[ps.dec_nest = 0] = 0;
|
---|
114 | ps.want_blank = ps.in_stmt = ps.ind_stmt = false;
|
---|
115 |
|
---|
116 |
|
---|
117 | scase = ps.pcase = false;
|
---|
118 | squest = 0;
|
---|
119 | sc_end = 0;
|
---|
120 | bp_save = 0;
|
---|
121 | be_save = 0;
|
---|
122 |
|
---|
123 | output = 0;
|
---|
124 |
|
---|
125 |
|
---|
126 |
|
---|
127 | /*--------------------------------------------------*\
|
---|
128 | | COMMAND LINE SCAN |
|
---|
129 | \*--------------------------------------------------*/
|
---|
130 |
|
---|
131 | #ifdef undef
|
---|
132 | max_col = 78; /* -l78 */
|
---|
133 | lineup_to_parens = 1; /* -lp */
|
---|
134 | ps.ljust_decl = 0; /* -ndj */
|
---|
135 | ps.com_ind = 33; /* -c33 */
|
---|
136 | star_comment_cont = 1; /* -sc */
|
---|
137 | ps.ind_size = 8; /* -i8 */
|
---|
138 | verbose = 0;
|
---|
139 | ps.decl_indent = 16; /* -di16 */
|
---|
140 | ps.indent_parameters = 1; /* -ip */
|
---|
141 | ps.decl_com_ind = 0; /* if this is not set to some
|
---|
142 | positive value by an arg, we
|
---|
143 | will set this equal to
|
---|
144 | ps.com_ind */
|
---|
145 | btype_2 = 1; /* -br */
|
---|
146 | cuddle_else = 1; /* -ce */
|
---|
147 | ps.unindent_displace = 0; /* -d0 */
|
---|
148 | ps.case_indent = 0; /* -cli0 */
|
---|
149 | format_col1_comments = 1; /* -fc1 */
|
---|
150 | procnames_start_line = 1; /* -psl */
|
---|
151 | proc_calls_space = 0; /* -npcs */
|
---|
152 | comment_delimiter_on_blankline = 1; /* -cdb */
|
---|
153 | ps.leave_comma = 1; /* -nbc */
|
---|
154 | #endif
|
---|
155 |
|
---|
156 | for (i = 1; i < argc; ++i)
|
---|
157 | if (strcmp(argv[i], "-npro") == 0)
|
---|
158 | break;
|
---|
159 | set_defaults();
|
---|
160 | if (i >= argc)
|
---|
161 | set_profile();
|
---|
162 |
|
---|
163 | for (i = 1; i < argc; ++i)
|
---|
164 | {
|
---|
165 |
|
---|
166 | /* look thru args (if any) for changes to defaults */
|
---|
167 | if (argv[i][0] != '-')
|
---|
168 | { /* no flag on parameter */
|
---|
169 | if (input == 0)
|
---|
170 | { /* we must have the input file */
|
---|
171 | in_name = argv[i]; /* remember name of input file */
|
---|
172 | input = fopen(in_name, "r");
|
---|
173 | if (input == 0)
|
---|
174 | { /* check for open error */
|
---|
175 | fprintf(stderr, "indent: can't open %s\n", argv[i]);
|
---|
176 | exit(1);
|
---|
177 | }
|
---|
178 | continue;
|
---|
179 | } else if (output == 0)
|
---|
180 | { /* we have the output file */
|
---|
181 | out_name = argv[i]; /* remember name of output file */
|
---|
182 | if (strcmp(in_name, out_name) == 0)
|
---|
183 | { /* attempt to overwrite the
|
---|
184 | file */
|
---|
185 | fprintf(stderr, "indent: input and output files must be different\n");
|
---|
186 | exit(1);
|
---|
187 | }
|
---|
188 | output = fopen(out_name, "w");
|
---|
189 | if (output == 0)
|
---|
190 | { /* check for create error */
|
---|
191 | fprintf(stderr, "indent: can't create %s\n", argv[i]);
|
---|
192 | exit(1);
|
---|
193 | }
|
---|
194 | continue;
|
---|
195 | }
|
---|
196 | fprintf(stderr, "indent: unknown parameter: %s\n", argv[i]);
|
---|
197 | exit(1);
|
---|
198 | } else
|
---|
199 | set_option(argv[i]);
|
---|
200 | } /* end of for */
|
---|
201 | if (input == 0)
|
---|
202 | {
|
---|
203 | fprintf(stderr, "indent: usage: indent file [ outfile ] [ options ]\n");
|
---|
204 | exit(1);
|
---|
205 | }
|
---|
206 | if (output == 0)
|
---|
207 | if (troff)
|
---|
208 | output = stdout;
|
---|
209 | else
|
---|
210 | {
|
---|
211 | out_name = in_name;
|
---|
212 | bakcopy();
|
---|
213 | }
|
---|
214 | if (ps.com_ind <= 1)
|
---|
215 | ps.com_ind = 2; /* dont put normal comments
|
---|
216 | before column 2 */
|
---|
217 | if (troff)
|
---|
218 | {
|
---|
219 | if (bodyf.font[0] == 0)
|
---|
220 | parsefont(&bodyf, "R");
|
---|
221 | if (scomf.font[0] == 0)
|
---|
222 | parsefont(&scomf, "I");
|
---|
223 | if (blkcomf.font[0] == 0)
|
---|
224 | blkcomf = scomf, blkcomf.size += 2;
|
---|
225 | if (boxcomf.font[0] == 0)
|
---|
226 | boxcomf = blkcomf;
|
---|
227 | if (stringf.font[0] == 0)
|
---|
228 | parsefont(&stringf, "L");
|
---|
229 | if (keywordf.font[0] == 0)
|
---|
230 | parsefont(&keywordf, "B");
|
---|
231 | writefdef(&bodyf, 'B');
|
---|
232 | writefdef(&scomf, 'C');
|
---|
233 | writefdef(&blkcomf, 'L');
|
---|
234 | writefdef(&boxcomf, 'X');
|
---|
235 | writefdef(&stringf, 'S');
|
---|
236 | writefdef(&keywordf, 'K');
|
---|
237 | }
|
---|
238 | if (bk_max_col <= 0)
|
---|
239 | bk_max_col = max_col;
|
---|
240 | if (ps.decl_com_ind <= 0) /* if not specified by user,
|
---|
241 | set this */
|
---|
242 | ps.decl_com_ind = ps.ljust_decl ? (ps.com_ind <= 10 ? 2 : ps.com_ind - 8) : ps.com_ind;
|
---|
243 | if (continuation_indent == 0)
|
---|
244 | continuation_indent = ps.ind_size;
|
---|
245 | fill_buffer(); /* get first batch of stuff
|
---|
246 | into input buffer */
|
---|
247 |
|
---|
248 | parse(semicolon);
|
---|
249 | {
|
---|
250 | register char *p = buf_ptr;
|
---|
251 | register col = 1;
|
---|
252 |
|
---|
253 | while (1)
|
---|
254 | {
|
---|
255 | if (*p == ' ')
|
---|
256 | col++;
|
---|
257 | else if (*p == '\t')
|
---|
258 | col = ((col - 1) & ~7) + 9;
|
---|
259 | else
|
---|
260 | break;
|
---|
261 | p++;
|
---|
262 | };
|
---|
263 | if (col > ps.ind_size)
|
---|
264 | ps.ind_level = ps.i_l_follow = col / ps.ind_size;
|
---|
265 | }
|
---|
266 | if (troff)
|
---|
267 | {
|
---|
268 | register char *p = in_name, *beg = in_name;
|
---|
269 |
|
---|
270 | while (*p)
|
---|
271 | if (*p++ == '/')
|
---|
272 | beg = p;
|
---|
273 | fprintf(output, ".Fn \"%s\"\n", beg);
|
---|
274 | }
|
---|
275 | /* START OF MAIN LOOP */
|
---|
276 |
|
---|
277 | while (1)
|
---|
278 | { /* this is the main loop. it
|
---|
279 | will go until we reach eof */
|
---|
280 | int is_procname;
|
---|
281 |
|
---|
282 | type_code = lexi(); /* lexi reads one token. The
|
---|
283 | actual characters read are
|
---|
284 | stored in "token". lexi
|
---|
285 | returns a code indicating
|
---|
286 | the type of token */
|
---|
287 | is_procname = ps.procname[0];
|
---|
288 |
|
---|
289 | /* The following code moves everything following an if (), while
|
---|
290 | (), else, etc. up to the start of the following stmt to a
|
---|
291 | buffer. This allows proper handling of both kinds of brace
|
---|
292 | placement. */
|
---|
293 |
|
---|
294 | flushed_nl = false;
|
---|
295 | while (ps.search_brace)
|
---|
296 | { /* if we scanned an if(),
|
---|
297 | while(), etc., we might need
|
---|
298 | to copy stuff into a buffer
|
---|
299 | we must loop, copying stuff
|
---|
300 | into save_com, until we find
|
---|
301 | the start of the stmt which
|
---|
302 | follows the if, or whatever */
|
---|
303 | switch (type_code)
|
---|
304 | {
|
---|
305 | case newline:
|
---|
306 | ++line_no;
|
---|
307 | flushed_nl = true;
|
---|
308 | case form_feed:
|
---|
309 | break; /* form feeds and newlines
|
---|
310 | found here will be ignored */
|
---|
311 |
|
---|
312 | case lbrace: /* this is a brace that starts
|
---|
313 | the compound stmt */
|
---|
314 | if (sc_end == 0)
|
---|
315 | { /* ignore buffering if a
|
---|
316 | comment wasnt stored up */
|
---|
317 | ps.search_brace = false;
|
---|
318 | goto check_type;
|
---|
319 | }
|
---|
320 | if (btype_2)
|
---|
321 | {
|
---|
322 | save_com[0] = '{'; /* we either want to put the
|
---|
323 | brace right after the if */
|
---|
324 | goto sw_buffer; /* go to common code to get out
|
---|
325 | of this loop */
|
---|
326 | }
|
---|
327 | /*
|
---|
328 | * Something is buffered up in save_com, and -bl processing is in effect.
|
---|
329 | * Add the brace after the comment so it will come out on the next line.
|
---|
330 | */
|
---|
331 | flushed_nl = 0; /* comment can start on the same line */
|
---|
332 | *sc_end++ = '\n'; /* break line after comment */
|
---|
333 | *sc_end++ = '{';
|
---|
334 | goto sw_buffer;
|
---|
335 |
|
---|
336 | case comment: /* we have a comment, so we
|
---|
337 | must copy it into the buffer */
|
---|
338 | if (!flushed_nl || sc_end != 0)
|
---|
339 | {
|
---|
340 | if (sc_end == 0)
|
---|
341 | { /* if this is the first
|
---|
342 | comment, we must set up the
|
---|
343 | buffer */
|
---|
344 | save_com[0] = save_com[1] = ' ';
|
---|
345 | sc_end = &(save_com[2]);
|
---|
346 | } else
|
---|
347 | {
|
---|
348 | *sc_end++ = '\n'; /* add newline between comments */
|
---|
349 | *sc_end++ = ' ';
|
---|
350 | --line_no;
|
---|
351 | }
|
---|
352 | *sc_end++ = '/'; /* copy in start of comment */
|
---|
353 | *sc_end++ = '*';
|
---|
354 |
|
---|
355 | for (;;)
|
---|
356 | { /* loop until we get to the end
|
---|
357 | of the comment */
|
---|
358 | *sc_end = *buf_ptr++;
|
---|
359 | if (buf_ptr >= buf_end)
|
---|
360 | fill_buffer();
|
---|
361 |
|
---|
362 | if (*sc_end++ == '*' && *buf_ptr == '/')
|
---|
363 | break; /* we are at end of comment */
|
---|
364 |
|
---|
365 | if (sc_end >= &(save_com[sc_size]))
|
---|
366 | { /* check for temp buffer
|
---|
367 | overflow */
|
---|
368 | diag(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever.");
|
---|
369 | fflush(output);
|
---|
370 | exit(1);
|
---|
371 | }
|
---|
372 | }
|
---|
373 | *sc_end++ = '/'; /* add ending slash */
|
---|
374 | if (++buf_ptr >= buf_end)/* get past / in buffer */
|
---|
375 | fill_buffer();
|
---|
376 | break;
|
---|
377 | }
|
---|
378 | default: /* it is the start of a normal
|
---|
379 | statment */
|
---|
380 | if (flushed_nl) /* if we flushed a newline,
|
---|
381 | make sure it is put back */
|
---|
382 | force_nl = true;
|
---|
383 | if ((type_code == sp_paren && *token == 'i'
|
---|
384 | && last_else && ps.else_if)
|
---|
385 | || (type_code == sp_nparen && *token == 'e'
|
---|
386 | && e_code != s_code && e_code[-1] == '}'))
|
---|
387 | force_nl = false;
|
---|
388 |
|
---|
389 | if (sc_end == 0)
|
---|
390 | { /* ignore buffering if comment
|
---|
391 | wasnt saved up */
|
---|
392 | ps.search_brace = false;
|
---|
393 | goto check_type;
|
---|
394 | }
|
---|
395 | if (force_nl)
|
---|
396 | { /* if we should insert a nl
|
---|
397 | here, put it into the buffer */
|
---|
398 | force_nl = false;
|
---|
399 | --line_no; /* this will be re-increased
|
---|
400 | when the nl is read from the
|
---|
401 | buffer */
|
---|
402 | *sc_end++ = '\n';
|
---|
403 | *sc_end++ = ' ';
|
---|
404 | if (verbose && !flushed_nl) /* print error msg if
|
---|
405 | the line was not
|
---|
406 | already broken */
|
---|
407 | diag(0, "Line broken");
|
---|
408 | flushed_nl = false;
|
---|
409 | }
|
---|
410 | for (t_ptr = token; *t_ptr; ++t_ptr)
|
---|
411 | *sc_end++ = *t_ptr; /* copy token into temp buffer */
|
---|
412 | ps.procname[0] = 0;
|
---|
413 |
|
---|
414 | sw_buffer:
|
---|
415 | ps.search_brace = false; /* stop looking for start of
|
---|
416 | stmt */
|
---|
417 | bp_save = buf_ptr; /* save current input buffer */
|
---|
418 | be_save = buf_end;
|
---|
419 | buf_ptr = save_com; /* fix so that subsequent calls
|
---|
420 | to lexi will take tokens out
|
---|
421 | of save_com */
|
---|
422 | *sc_end++ = ' '; /* add trailing blank, just in
|
---|
423 | case */
|
---|
424 | buf_end = sc_end;
|
---|
425 | sc_end = 0;
|
---|
426 | break;
|
---|
427 | } /* end of switch */
|
---|
428 | if (type_code != 0) /* we must make this check,
|
---|
429 | just in case there was an
|
---|
430 | unexpected EOF */
|
---|
431 | type_code = lexi(); /* read another token */
|
---|
432 | /* if (ps.search_brace) ps.procname[0] = 0; */
|
---|
433 | if ((is_procname = ps.procname[0]) && flushed_nl
|
---|
434 | && !proc_str_line && ps.in_decl
|
---|
435 | && type_code == ident)
|
---|
436 | flushed_nl = 0;
|
---|
437 | } /* end of while (search_brace) */
|
---|
438 | last_else = 0;
|
---|
439 | check_type:
|
---|
440 | if (type_code == 0)
|
---|
441 | { /* we got eof */
|
---|
442 | if (s_lab != e_lab || s_code != e_code
|
---|
443 | || s_com != e_com) /* must dump end of line */
|
---|
444 | dump_line();
|
---|
445 | if (ps.tos > 1) /* check for balanced braces */
|
---|
446 | diag(1, "Stuff missing from end of file.");
|
---|
447 |
|
---|
448 | if (verbose)
|
---|
449 | {
|
---|
450 | printf("There were %d output lines and %d comments\n",
|
---|
451 | ps.out_lines, ps.out_coms);
|
---|
452 | printf("(Lines with comments)/(Lines with code): %6d\n",
|
---|
453 | ps.com_lines / code_lines);
|
---|
454 | }
|
---|
455 | fflush(output);
|
---|
456 | exit(found_err);
|
---|
457 | }
|
---|
458 | if (
|
---|
459 | (type_code != comment) &&
|
---|
460 | (type_code != newline) &&
|
---|
461 | (type_code != preesc) &&
|
---|
462 | (type_code != form_feed))
|
---|
463 | {
|
---|
464 | if (force_nl &&
|
---|
465 | (type_code != semicolon) &&
|
---|
466 | (type_code != lbrace || !btype_2))
|
---|
467 | {
|
---|
468 | /* we should force a broken line here */
|
---|
469 | if (verbose && !flushed_nl)
|
---|
470 | diag(0, "Line broken");
|
---|
471 | flushed_nl = false;
|
---|
472 | dump_line();
|
---|
473 | ps.want_blank = false; /* dont insert blank at line
|
---|
474 | start */
|
---|
475 | force_nl = false;
|
---|
476 | }
|
---|
477 | ps.in_stmt = true; /* turn on flag which causes an
|
---|
478 | extra level of indentation.
|
---|
479 | this is turned off by a ; or
|
---|
480 | '}' */
|
---|
481 | if (s_com != e_com)
|
---|
482 | { /* the turkey has embedded a
|
---|
483 | comment in a line. fix it */
|
---|
484 | *e_code++ = ' ';
|
---|
485 | for (t_ptr = s_com; *t_ptr; ++t_ptr)
|
---|
486 | {
|
---|
487 | if (e_code >= l_code)
|
---|
488 | {
|
---|
489 | register nsize = l_code - s_code + 400;
|
---|
490 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
491 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
492 | l_code = codebuf + nsize - 5;
|
---|
493 | s_code = codebuf + 1;
|
---|
494 | }
|
---|
495 | *e_code++ = *t_ptr;
|
---|
496 | }
|
---|
497 | *e_code++ = ' ';
|
---|
498 | *e_code = '\0'; /* null terminate code sect */
|
---|
499 | ps.want_blank = false;
|
---|
500 | e_com = s_com;
|
---|
501 | }
|
---|
502 | } else if (type_code != comment) /* preserve force_nl thru a
|
---|
503 | comment */
|
---|
504 | force_nl = false; /* cancel forced newline after
|
---|
505 | newline, form feed, etc */
|
---|
506 |
|
---|
507 |
|
---|
508 |
|
---|
509 | /*-----------------------------------------------------*\
|
---|
510 | | do switch on type of token scanned |
|
---|
511 | \*-----------------------------------------------------*/
|
---|
512 | if (e_code >= l_code)
|
---|
513 | {
|
---|
514 | register nsize = l_code - s_code + 400;
|
---|
515 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
516 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
517 | l_code = codebuf + nsize - 5;
|
---|
518 | s_code = codebuf + 1;
|
---|
519 | }
|
---|
520 | switch (type_code)
|
---|
521 | { /* now, decide what to do with
|
---|
522 | the token */
|
---|
523 |
|
---|
524 | case form_feed: /* found a form feed in line */
|
---|
525 | ps.use_ff = true; /* a form feed is treated much
|
---|
526 | like a newline */
|
---|
527 | dump_line();
|
---|
528 | ps.want_blank = false;
|
---|
529 | break;
|
---|
530 |
|
---|
531 | case newline:
|
---|
532 | if (ps.last_token != comma || ps.p_l_follow > 0
|
---|
533 | || !ps.leave_comma || ps.block_init || !break_comma || s_com != e_com)
|
---|
534 | {
|
---|
535 | dump_line();
|
---|
536 | ps.want_blank = false;
|
---|
537 | }
|
---|
538 | ++line_no; /* keep track of input line
|
---|
539 | number */
|
---|
540 | break;
|
---|
541 |
|
---|
542 | case lparen: /* got a '(' or '[' */
|
---|
543 | ++ps.p_l_follow; /* count parens to make Healy
|
---|
544 | happy */
|
---|
545 | if (ps.want_blank && *token != '[' &&
|
---|
546 | (ps.last_token != ident || proc_calls_space
|
---|
547 | || (ps.its_a_keyword && (!ps.sizeof_keyword || Bill_Shannon))))
|
---|
548 | *e_code++ = ' ';
|
---|
549 | if (ps.in_decl && !ps.block_init)
|
---|
550 | if (troff && !ps.dumped_decl_indent && !is_procname && ps.last_token == decl)
|
---|
551 | {
|
---|
552 | ps.dumped_decl_indent = 1;
|
---|
553 | sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
|
---|
554 | e_code += strlen(e_code);
|
---|
555 | } else
|
---|
556 | {
|
---|
557 | while ((e_code - s_code) < dec_ind)
|
---|
558 | {
|
---|
559 | if (e_code >= l_code)
|
---|
560 | {
|
---|
561 | register nsize = l_code - s_code + 400;
|
---|
562 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
563 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
564 | l_code = codebuf + nsize - 5;
|
---|
565 | s_code = codebuf + 1;
|
---|
566 | }
|
---|
567 | *e_code++ = ' ';
|
---|
568 | }
|
---|
569 | *e_code++ = token[0];
|
---|
570 | }
|
---|
571 | else
|
---|
572 | *e_code++ = token[0];
|
---|
573 | ps.paren_indents[ps.p_l_follow - 1] = e_code - s_code;
|
---|
574 | if (sp_sw && ps.p_l_follow == 1 && ex_expr_indent
|
---|
575 | && ps.paren_indents[0] < 2 * ps.ind_size)
|
---|
576 | ps.paren_indents[0] = 2 * ps.ind_size;
|
---|
577 | ps.want_blank = false;
|
---|
578 | if (ps.in_or_st && *token == '(' && ps.tos <= 2)
|
---|
579 | {
|
---|
580 | /* this is a kluge to make sure that declarations will be
|
---|
581 | aligned right if proc decl has an explicit type on it,
|
---|
582 | i.e. "int a(x) {..." */
|
---|
583 | parse(semicolon); /* I said this was a kluge... */
|
---|
584 | ps.in_or_st = false; /* turn off flag for structure
|
---|
585 | decl or initialization */
|
---|
586 | }
|
---|
587 | if (ps.sizeof_keyword)
|
---|
588 | ps.sizeof_mask |= 1 << ps.p_l_follow;
|
---|
589 | break;
|
---|
590 |
|
---|
591 | case rparen: /* got a ')' or ']' */
|
---|
592 | if (ps.cast_mask & (1 << ps.p_l_follow) & ~ps.sizeof_mask)
|
---|
593 | {
|
---|
594 | ps.last_u_d = true;
|
---|
595 | ps.cast_mask &= (1 << ps.p_l_follow) - 1;
|
---|
596 | }
|
---|
597 | ps.sizeof_mask &= (1 << ps.p_l_follow) - 1;
|
---|
598 | if (--ps.p_l_follow < 0)
|
---|
599 | {
|
---|
600 | ps.p_l_follow = 0;
|
---|
601 | diag(0, "Extra %c", *token);
|
---|
602 | }
|
---|
603 | if (e_code == s_code) /* if the paren starts the line */
|
---|
604 | ps.paren_level = ps.p_l_follow; /* then indent it */
|
---|
605 |
|
---|
606 | *e_code++ = token[0];
|
---|
607 | ps.want_blank = true;
|
---|
608 |
|
---|
609 | if (sp_sw && (ps.p_l_follow == 0))
|
---|
610 | { /* check for end of if (...),
|
---|
611 | or some such */
|
---|
612 | sp_sw = false;
|
---|
613 | force_nl = true; /* must force newline after if */
|
---|
614 | ps.last_u_d = true; /* inform lexi that a following
|
---|
615 | operator is unary */
|
---|
616 | ps.in_stmt = false; /* dont use stmt continuation
|
---|
617 | indentation */
|
---|
618 |
|
---|
619 | parse(hd_type); /* let parser worry about if,
|
---|
620 | or whatever */
|
---|
621 | }
|
---|
622 | ps.search_brace = btype_2; /* this should insure that
|
---|
623 | constructs such as
|
---|
624 | main(){...} and int[]{...}
|
---|
625 | have their braces put in the
|
---|
626 | right place */
|
---|
627 | break;
|
---|
628 |
|
---|
629 | case unary_op: /* this could be any unary
|
---|
630 | operation */
|
---|
631 | if (ps.want_blank)
|
---|
632 | *e_code++ = ' ';
|
---|
633 |
|
---|
634 | if (troff && !ps.dumped_decl_indent && ps.in_decl && !is_procname)
|
---|
635 | {
|
---|
636 | sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
|
---|
637 | ps.dumped_decl_indent = 1;
|
---|
638 | e_code += strlen(e_code);
|
---|
639 | } else
|
---|
640 | {
|
---|
641 | char *res = token;
|
---|
642 |
|
---|
643 | if (ps.in_decl && !ps.block_init)
|
---|
644 | { /* if this is a unary op in a
|
---|
645 | declaration, we should
|
---|
646 | indent this token */
|
---|
647 | for (i = 0; token[i]; ++i); /* find length of token */
|
---|
648 | while ((e_code - s_code) < (dec_ind - i))
|
---|
649 | {
|
---|
650 | if (e_code >= l_code)
|
---|
651 | {
|
---|
652 | register nsize = l_code - s_code + 400;
|
---|
653 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
654 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
655 | l_code = codebuf + nsize - 5;
|
---|
656 | s_code = codebuf + 1;
|
---|
657 | }
|
---|
658 | *e_code++ = ' '; /* pad it */
|
---|
659 | }
|
---|
660 | }
|
---|
661 | if (troff && token[0] == '-' && token[1] == '>')
|
---|
662 | res = "\\(->";
|
---|
663 | for (t_ptr = res; *t_ptr; ++t_ptr)
|
---|
664 | {
|
---|
665 | if (e_code >= l_code)
|
---|
666 | {
|
---|
667 | register nsize = l_code - s_code + 400;
|
---|
668 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
669 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
670 | l_code = codebuf + nsize - 5;
|
---|
671 | s_code = codebuf + 1;
|
---|
672 | }
|
---|
673 | *e_code++ = *t_ptr;
|
---|
674 | }
|
---|
675 | }
|
---|
676 | ps.want_blank = false;
|
---|
677 | break;
|
---|
678 |
|
---|
679 | case binary_op: /* any binary operation */
|
---|
680 | if (ps.want_blank)
|
---|
681 | *e_code++ = ' ';
|
---|
682 | {
|
---|
683 | char *res = token;
|
---|
684 |
|
---|
685 | if (troff)
|
---|
686 | switch (token[0])
|
---|
687 | {
|
---|
688 | case '<':
|
---|
689 | if (token[1] == '=')
|
---|
690 | res = "\\(<=";
|
---|
691 | break;
|
---|
692 | case '>':
|
---|
693 | if (token[1] == '=')
|
---|
694 | res = "\\(>=";
|
---|
695 | break;
|
---|
696 | case '!':
|
---|
697 | if (token[1] == '=')
|
---|
698 | res = "\\(!=";
|
---|
699 | break;
|
---|
700 | case '|':
|
---|
701 | if (token[1] == '|')
|
---|
702 | res = "\\(br\\(br";
|
---|
703 | else if (token[1] == 0)
|
---|
704 | res = "\\(br";
|
---|
705 | break;
|
---|
706 | }
|
---|
707 | for (t_ptr = res; *t_ptr; ++t_ptr)
|
---|
708 | {
|
---|
709 | if (e_code >= l_code)
|
---|
710 | {
|
---|
711 | register nsize = l_code - s_code + 400;
|
---|
712 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
713 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
714 | l_code = codebuf + nsize - 5;
|
---|
715 | s_code = codebuf + 1;
|
---|
716 | }
|
---|
717 | *e_code++ = *t_ptr; /* move the operator */
|
---|
718 | }
|
---|
719 | }
|
---|
720 | ps.want_blank = true;
|
---|
721 | break;
|
---|
722 |
|
---|
723 | case postop: /* got a trailing ++ or -- */
|
---|
724 | *e_code++ = token[0];
|
---|
725 | *e_code++ = token[1];
|
---|
726 | ps.want_blank = true;
|
---|
727 | break;
|
---|
728 |
|
---|
729 | case question: /* got a ? */
|
---|
730 | squest++; /* this will be used when a
|
---|
731 | later colon appears so we
|
---|
732 | can distinguish the
|
---|
733 | <c>?<n>:<n> construct */
|
---|
734 | if (ps.want_blank)
|
---|
735 | *e_code++ = ' ';
|
---|
736 | *e_code++ = '?';
|
---|
737 | ps.want_blank = true;
|
---|
738 | break;
|
---|
739 |
|
---|
740 | case casestmt: /* got word 'case' or 'default' */
|
---|
741 | scase = true; /* so we can process the later
|
---|
742 | colon properly */
|
---|
743 | goto copy_id;
|
---|
744 |
|
---|
745 | case colon: /* got a ':' */
|
---|
746 | if (squest > 0)
|
---|
747 | { /* it is part of the <c>?<n>:
|
---|
748 | <n> construct */
|
---|
749 | --squest;
|
---|
750 | if (ps.want_blank)
|
---|
751 | *e_code++ = ' ';
|
---|
752 | *e_code++ = ':';
|
---|
753 | ps.want_blank = true;
|
---|
754 | break;
|
---|
755 | }
|
---|
756 | if (ps.in_decl)
|
---|
757 | {
|
---|
758 | *e_code++ = ':';
|
---|
759 | ps.want_blank = false;
|
---|
760 | break;
|
---|
761 | }
|
---|
762 | ps.in_stmt = false; /* seeing a label does not
|
---|
763 | imply we are in a stmt */
|
---|
764 | for (t_ptr = s_code; *t_ptr; ++t_ptr)
|
---|
765 | *e_lab++ = *t_ptr; /* turn everything so far into
|
---|
766 | a label */
|
---|
767 | e_code = s_code;
|
---|
768 | *e_lab++ = ':';
|
---|
769 | *e_lab++ = ' ';
|
---|
770 | *e_lab = '\0';
|
---|
771 |
|
---|
772 | force_nl = ps.pcase = scase; /* ps.pcase will be used by
|
---|
773 | dump_line to decide how to
|
---|
774 | indent the label. force_nl
|
---|
775 | will force a case n: to be
|
---|
776 | on a line by itself */
|
---|
777 | scase = false;
|
---|
778 | ps.want_blank = false;
|
---|
779 | break;
|
---|
780 |
|
---|
781 | case semicolon: /* got a ';' */
|
---|
782 | ps.in_or_st = false; /* we are not in an
|
---|
783 | initialization or structure
|
---|
784 | declaration */
|
---|
785 | scase = false; /* these will only need
|
---|
786 | resetting in a error */
|
---|
787 | squest = 0;
|
---|
788 | if (ps.last_token == rparen)
|
---|
789 | ps.in_par_decl = 0;
|
---|
790 | ps.cast_mask = 0;
|
---|
791 | ps.sizeof_mask = 0;
|
---|
792 | ps.block_init = 0;
|
---|
793 | ps.block_init_level = 0;
|
---|
794 | ps.just_saw_decl--;
|
---|
795 |
|
---|
796 | if (ps.in_decl && s_code == e_code && !ps.block_init)
|
---|
797 | while ((e_code - s_code) < (dec_ind - 1))
|
---|
798 | {
|
---|
799 | if (e_code >= l_code)
|
---|
800 | {
|
---|
801 | register nsize = l_code - s_code + 400;
|
---|
802 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
803 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
804 | l_code = codebuf + nsize - 5;
|
---|
805 | s_code = codebuf + 1;
|
---|
806 | }
|
---|
807 | *e_code++ = ' ';
|
---|
808 | }
|
---|
809 |
|
---|
810 | ps.in_decl = (ps.dec_nest > 0);/* if we were in a first level
|
---|
811 | structure declaration, we
|
---|
812 | arent any more */
|
---|
813 |
|
---|
814 | if ((!sp_sw || hd_type != forstmt) && ps.p_l_follow > 0)
|
---|
815 | {
|
---|
816 |
|
---|
817 | /* This should be true iff there were unbalanced parens in
|
---|
818 | the stmt. It is a bit complicated, because the
|
---|
819 | semicolon might be in a for stmt */
|
---|
820 | diag(1, "Unbalanced parens");
|
---|
821 | ps.p_l_follow = 0;
|
---|
822 | if (sp_sw)
|
---|
823 | { /* this is a check for a if,
|
---|
824 | while, etc. with unbalanced
|
---|
825 | parens */
|
---|
826 | sp_sw = false;
|
---|
827 | parse(hd_type); /* dont lose the if, or
|
---|
828 | whatever */
|
---|
829 | }
|
---|
830 | }
|
---|
831 | *e_code++ = ';';
|
---|
832 | ps.want_blank = true;
|
---|
833 | ps.in_stmt = (ps.p_l_follow > 0); /* we are no longer in
|
---|
834 | the middle of a stmt */
|
---|
835 |
|
---|
836 | if (!sp_sw)
|
---|
837 | { /* if not if for (;;) */
|
---|
838 | parse(semicolon); /* let parser know about end of
|
---|
839 | stmt */
|
---|
840 | force_nl = true; /* force newline after a end of
|
---|
841 | stmt */
|
---|
842 | }
|
---|
843 | break;
|
---|
844 |
|
---|
845 | case lbrace: /* got a '{' */
|
---|
846 | ps.in_stmt = false; /* dont indent the {} */
|
---|
847 | if (!ps.block_init)
|
---|
848 | force_nl = true; /* force other stuff on same
|
---|
849 | line as '{' onto new line */
|
---|
850 | else if (ps.block_init_level <= 0)
|
---|
851 | ps.block_init_level = 1;
|
---|
852 | else
|
---|
853 | ps.block_init_level++;
|
---|
854 |
|
---|
855 | if (s_code != e_code && !ps.block_init)
|
---|
856 | {
|
---|
857 | if (!btype_2)
|
---|
858 | {
|
---|
859 | dump_line();
|
---|
860 | ps.want_blank = false;
|
---|
861 | } else if (ps.in_par_decl && !ps.in_or_st)
|
---|
862 | {
|
---|
863 | ps.i_l_follow = 0;
|
---|
864 | dump_line();
|
---|
865 | ps.want_blank = false;
|
---|
866 | }
|
---|
867 | }
|
---|
868 | if (ps.in_par_decl)
|
---|
869 | prefix_blankline_requested = 0;
|
---|
870 |
|
---|
871 | if (ps.p_l_follow > 0)
|
---|
872 | { /* check for preceeding
|
---|
873 | unbalanced parens */
|
---|
874 | diag(1, "Unbalanced parens");
|
---|
875 | ps.p_l_follow = 0;
|
---|
876 | if (sp_sw)
|
---|
877 | { /* check for unclosed if, for,
|
---|
878 | etc. */
|
---|
879 | sp_sw = false;
|
---|
880 | parse(hd_type);
|
---|
881 | ps.ind_level = ps.i_l_follow;
|
---|
882 | }
|
---|
883 | }
|
---|
884 | if (s_code == e_code)
|
---|
885 | ps.ind_stmt = false; /* dont put extra indentation
|
---|
886 | on line with '{' */
|
---|
887 | if (ps.in_decl && ps.in_or_st)
|
---|
888 | { /* this is either a structure
|
---|
889 | declaration or an init */
|
---|
890 | di_stack[ps.dec_nest++] = dec_ind;
|
---|
891 | /* ? dec_ind = 0; */
|
---|
892 | } else
|
---|
893 | {
|
---|
894 | ps.decl_on_line = false; /* we cant be in the middle of
|
---|
895 | a declaration, so dont do
|
---|
896 | special indentation of
|
---|
897 | comments */
|
---|
898 | if (bl_at_proctop
|
---|
899 | && ps.in_par_decl)
|
---|
900 | postfix_blankline_requested = 1;
|
---|
901 | ps.in_par_decl = 0;
|
---|
902 | }
|
---|
903 | dec_ind = 0;
|
---|
904 | parse(lbrace); /* let parser know about this */
|
---|
905 | if (ps.want_blank) /* put a blank before '{' if
|
---|
906 | '{' is not at start of line */
|
---|
907 | *e_code++ = ' ';
|
---|
908 | ps.want_blank = false;
|
---|
909 | *e_code++ = '{';
|
---|
910 | ps.just_saw_decl = 0;
|
---|
911 | break;
|
---|
912 |
|
---|
913 | case rbrace: /* got a '}' */
|
---|
914 | if (ps.p_stack[ps.tos] == decl && !ps.block_init) /* semicolons can be
|
---|
915 | omitted in
|
---|
916 | declarations */
|
---|
917 | parse(semicolon);
|
---|
918 | if (ps.p_l_follow)
|
---|
919 | { /* check for unclosed if, for,
|
---|
920 | else. */
|
---|
921 | diag(1, "Unbalanced parens");
|
---|
922 | ps.p_l_follow = 0;
|
---|
923 | sp_sw = false;
|
---|
924 | }
|
---|
925 | ps.just_saw_decl = 0;
|
---|
926 | ps.block_init_level--;
|
---|
927 | if (s_code != e_code && !ps.block_init)
|
---|
928 | { /* '}' must be first on line */
|
---|
929 | if (verbose)
|
---|
930 | diag(0, "Line broken");
|
---|
931 | dump_line();
|
---|
932 | }
|
---|
933 | *e_code++ = '}';
|
---|
934 | ps.want_blank = true;
|
---|
935 | ps.in_stmt = ps.ind_stmt = false;
|
---|
936 | if (ps.dec_nest > 0)
|
---|
937 | { /* we are in multi-level
|
---|
938 | structure declaration */
|
---|
939 | dec_ind = di_stack[--ps.dec_nest];
|
---|
940 | if (ps.dec_nest == 0 && !ps.in_par_decl)
|
---|
941 | ps.just_saw_decl = 2;
|
---|
942 | ps.in_decl = true;
|
---|
943 | }
|
---|
944 | prefix_blankline_requested = 0;
|
---|
945 | parse(rbrace); /* let parser know about this */
|
---|
946 | ps.search_brace = cuddle_else && ps.p_stack[ps.tos] == ifhead
|
---|
947 | && ps.il[ps.tos] >= ps.ind_level;
|
---|
948 | if (ps.tos <= 1 && bl_a_procs && ps.dec_nest <= 0)
|
---|
949 | postfix_blankline_requested = 1;
|
---|
950 | break;
|
---|
951 |
|
---|
952 | case swstmt: /* got keyword "switch" */
|
---|
953 | sp_sw = true;
|
---|
954 | hd_type = swstmt; /* keep this for when we have
|
---|
955 | seen the expression */
|
---|
956 | goto copy_id; /* go move the token into
|
---|
957 | buffer */
|
---|
958 |
|
---|
959 | case sp_paren: /* token is if, while, for */
|
---|
960 | sp_sw = true; /* the interesting stuff is
|
---|
961 | done after the expression is
|
---|
962 | scanned */
|
---|
963 | hd_type = (*token == 'i' ? ifstmt :
|
---|
964 | (*token == 'w' ? whilestmt : forstmt));
|
---|
965 |
|
---|
966 | /* remember the type of header for later use by parser */
|
---|
967 | goto copy_id; /* copy the token into line */
|
---|
968 |
|
---|
969 | case sp_nparen: /* got else, do */
|
---|
970 | ps.in_stmt = false;
|
---|
971 | if (*token == 'e')
|
---|
972 | {
|
---|
973 | if (e_code != s_code && (!cuddle_else || e_code[-1] != '}'))
|
---|
974 | {
|
---|
975 | if (verbose)
|
---|
976 | diag(0, "Line broken");
|
---|
977 | dump_line(); /* make sure this starts a line */
|
---|
978 | ps.want_blank = false;
|
---|
979 | }
|
---|
980 | force_nl = true; /* also, following stuff must
|
---|
981 | go onto new line */
|
---|
982 | last_else = 1;
|
---|
983 | parse(elselit);
|
---|
984 | } else
|
---|
985 | {
|
---|
986 | if (e_code != s_code)
|
---|
987 | { /* make sure this starts a line */
|
---|
988 | if (verbose)
|
---|
989 | diag(0, "Line broken");
|
---|
990 | dump_line();
|
---|
991 | ps.want_blank = false;
|
---|
992 | }
|
---|
993 | force_nl = true; /* also, following stuff must
|
---|
994 | go onto new line */
|
---|
995 | last_else = 0;
|
---|
996 | parse(dolit);
|
---|
997 | }
|
---|
998 | goto copy_id; /* move the token into line */
|
---|
999 |
|
---|
1000 | case decl: /* we have a declaration type
|
---|
1001 | (int, register, etc.) */
|
---|
1002 | parse(decl); /* let parser worry about
|
---|
1003 | indentation */
|
---|
1004 | if (ps.last_token == rparen && ps.tos <= 1)
|
---|
1005 | {
|
---|
1006 | ps.in_par_decl = 1;
|
---|
1007 | if (s_code != e_code)
|
---|
1008 | {
|
---|
1009 | dump_line();
|
---|
1010 | ps.want_blank = 0;
|
---|
1011 | }
|
---|
1012 | }
|
---|
1013 | if (ps.in_par_decl && ps.indent_parameters && ps.dec_nest == 0)
|
---|
1014 | {
|
---|
1015 | ps.ind_level = ps.i_l_follow = 1;
|
---|
1016 | ps.ind_stmt = 0;
|
---|
1017 | }
|
---|
1018 | ps.in_or_st = true; /* this might be a structure or
|
---|
1019 | initialization declaration */
|
---|
1020 | ps.in_decl = ps.decl_on_line = true;
|
---|
1021 | if ( /* !ps.in_or_st && */ ps.dec_nest <= 0)
|
---|
1022 | ps.just_saw_decl = 2;
|
---|
1023 | prefix_blankline_requested = 0;
|
---|
1024 | for (i = 0; token[i++];); /* get length of token */
|
---|
1025 |
|
---|
1026 | /* dec_ind = e_code - s_code + (ps.decl_indent>i ?
|
---|
1027 | ps.decl_indent : i); */
|
---|
1028 | dec_ind = ps.decl_indent > 0 ? ps.decl_indent : i;
|
---|
1029 | goto copy_id;
|
---|
1030 |
|
---|
1031 | case ident: /* got an identifier or
|
---|
1032 | constant */
|
---|
1033 | if (ps.in_decl)
|
---|
1034 | { /* if we are in a declaration,
|
---|
1035 | we must indent identifier */
|
---|
1036 | if (ps.want_blank)
|
---|
1037 | *e_code++ = ' ';
|
---|
1038 | ps.want_blank = false;
|
---|
1039 | if (is_procname == 0 || !proc_str_line)
|
---|
1040 | {
|
---|
1041 | if (!ps.block_init)
|
---|
1042 | if (troff && !ps.dumped_decl_indent)
|
---|
1043 | {
|
---|
1044 | sprintf(e_code, "\n.De %dp+\200p\n", dec_ind * 7);
|
---|
1045 | ps.dumped_decl_indent = 1;
|
---|
1046 | e_code += strlen(e_code);
|
---|
1047 | } else
|
---|
1048 | while ((e_code - s_code) < dec_ind)
|
---|
1049 | {
|
---|
1050 | if (e_code >= l_code)
|
---|
1051 | {
|
---|
1052 | register nsize = l_code - s_code + 400;
|
---|
1053 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
1054 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
1055 | l_code = codebuf + nsize - 5;
|
---|
1056 | s_code = codebuf + 1;
|
---|
1057 | }
|
---|
1058 | *e_code++ = ' ';
|
---|
1059 | }
|
---|
1060 | } else
|
---|
1061 | {
|
---|
1062 | if (dec_ind && s_code != e_code)
|
---|
1063 | dump_line();
|
---|
1064 | dec_ind = 0;
|
---|
1065 | ps.want_blank = false;
|
---|
1066 | }
|
---|
1067 | } else if (sp_sw && ps.p_l_follow == 0)
|
---|
1068 | {
|
---|
1069 | sp_sw = false;
|
---|
1070 | force_nl = true;
|
---|
1071 | ps.last_u_d = true;
|
---|
1072 | ps.in_stmt = false;
|
---|
1073 | parse(hd_type);
|
---|
1074 | }
|
---|
1075 | copy_id:
|
---|
1076 | if (ps.want_blank)
|
---|
1077 | *e_code++ = ' ';
|
---|
1078 | if (troff && ps.its_a_keyword)
|
---|
1079 | {
|
---|
1080 | e_code = chfont(&bodyf, &keywordf, e_code);
|
---|
1081 | for (t_ptr = token; *t_ptr; ++t_ptr)
|
---|
1082 | {
|
---|
1083 | if (e_code >= l_code)
|
---|
1084 | {
|
---|
1085 | register nsize = l_code - s_code + 400;
|
---|
1086 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
1087 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
1088 | l_code = codebuf + nsize - 5;
|
---|
1089 | s_code = codebuf + 1;
|
---|
1090 | }
|
---|
1091 | *e_code++ = keywordf.allcaps && islower(*t_ptr)
|
---|
1092 | ? toupper(*t_ptr) : *t_ptr;
|
---|
1093 | }
|
---|
1094 | e_code = chfont(&keywordf, &bodyf, e_code);
|
---|
1095 | } else
|
---|
1096 | for (t_ptr = token; *t_ptr; ++t_ptr)
|
---|
1097 | {
|
---|
1098 | if (e_code >= l_code)
|
---|
1099 | {
|
---|
1100 | register nsize = l_code - s_code + 400;
|
---|
1101 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
1102 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
1103 | l_code = codebuf + nsize - 5;
|
---|
1104 | s_code = codebuf + 1;
|
---|
1105 | }
|
---|
1106 | *e_code++ = *t_ptr;
|
---|
1107 | }
|
---|
1108 | ps.want_blank = true;
|
---|
1109 | break;
|
---|
1110 |
|
---|
1111 | case period: /* treat a period kind of like
|
---|
1112 | a binary operation */
|
---|
1113 | *e_code++ = '.'; /* move the period into line */
|
---|
1114 | ps.want_blank = false; /* dont put a blank after a
|
---|
1115 | period */
|
---|
1116 | break;
|
---|
1117 |
|
---|
1118 | case comma:
|
---|
1119 | ps.want_blank = (s_code != e_code); /* only put blank after
|
---|
1120 | comma if comma does
|
---|
1121 | not start the line */
|
---|
1122 | if (ps.in_decl && is_procname == 0 && !ps.block_init)
|
---|
1123 | while ((e_code - s_code) < (dec_ind - 1))
|
---|
1124 | {
|
---|
1125 | if (e_code >= l_code)
|
---|
1126 | {
|
---|
1127 | register nsize = l_code - s_code + 400;
|
---|
1128 | codebuf = (char *) realloc(codebuf, nsize);
|
---|
1129 | e_code = codebuf + (e_code - s_code) + 1;
|
---|
1130 | l_code = codebuf + nsize - 5;
|
---|
1131 | s_code = codebuf + 1;
|
---|
1132 | }
|
---|
1133 | *e_code++ = ' ';
|
---|
1134 | }
|
---|
1135 |
|
---|
1136 | *e_code++ = ',';
|
---|
1137 | if (ps.p_l_follow == 0)
|
---|
1138 | {
|
---|
1139 | if (ps.block_init_level <= 0)
|
---|
1140 | ps.block_init = 0;
|
---|
1141 | if (break_comma && !ps.leave_comma)
|
---|
1142 | force_nl = true;
|
---|
1143 | }
|
---|
1144 | break;
|
---|
1145 |
|
---|
1146 | case preesc: /* got the character '#' */
|
---|
1147 | if ((s_com != e_com) ||
|
---|
1148 | (s_lab != e_lab) ||
|
---|
1149 | (s_code != e_code))
|
---|
1150 | dump_line();
|
---|
1151 | *e_lab++ = '#'; /* move whole line to 'label'
|
---|
1152 | buffer */
|
---|
1153 | {
|
---|
1154 | int in_comment = 0;
|
---|
1155 | int com_start = 0;
|
---|
1156 | char quote = 0;
|
---|
1157 | int com_end = 0;
|
---|
1158 |
|
---|
1159 | while (*buf_ptr != '\n' || in_comment)
|
---|
1160 | {
|
---|
1161 | if (e_lab >= l_lab)
|
---|
1162 | {
|
---|
1163 | register nsize = l_lab - s_lab + 400;
|
---|
1164 | labbuf = (char *) realloc(labbuf, nsize);
|
---|
1165 | e_lab = labbuf + (e_lab - s_lab) + 1;
|
---|
1166 | l_lab = labbuf + nsize - 5;
|
---|
1167 | s_lab = labbuf + 1;
|
---|
1168 | }
|
---|
1169 | *e_lab = *buf_ptr++;
|
---|
1170 | if (buf_ptr >= buf_end)
|
---|
1171 | fill_buffer();
|
---|
1172 | switch (*e_lab++)
|
---|
1173 | {
|
---|
1174 | case BACKSLASH:
|
---|
1175 | if (troff)
|
---|
1176 | *e_lab++ = BACKSLASH;
|
---|
1177 | if (!in_comment)
|
---|
1178 | {
|
---|
1179 | *e_lab++ = *buf_ptr++;
|
---|
1180 | if (buf_ptr >= buf_end)
|
---|
1181 | fill_buffer();
|
---|
1182 | }
|
---|
1183 | break;
|
---|
1184 | case '/':
|
---|
1185 | if (*buf_ptr == '*' && !in_comment && !quote)
|
---|
1186 | {
|
---|
1187 | in_comment = 1;
|
---|
1188 | *e_lab++ = *buf_ptr++;
|
---|
1189 | com_start = e_lab - s_lab - 2;
|
---|
1190 | }
|
---|
1191 | break;
|
---|
1192 | case '"':
|
---|
1193 | if (quote == '"')
|
---|
1194 | quote = 0;
|
---|
1195 | break;
|
---|
1196 | case '\'':
|
---|
1197 | if (quote == '\'')
|
---|
1198 | quote = 0;
|
---|
1199 | break;
|
---|
1200 | case '*':
|
---|
1201 | if (*buf_ptr == '/' && in_comment)
|
---|
1202 | {
|
---|
1203 | in_comment = 0;
|
---|
1204 | *e_lab++ = *buf_ptr++;
|
---|
1205 | com_end = e_lab - s_lab;
|
---|
1206 | }
|
---|
1207 | break;
|
---|
1208 | }
|
---|
1209 | }
|
---|
1210 |
|
---|
1211 | while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
|
---|
1212 | e_lab--;
|
---|
1213 | if (e_lab - s_lab == com_end && bp_save == 0)
|
---|
1214 | { /* comment on preprocessor line */
|
---|
1215 | if (sc_end == 0) /* if this is the first
|
---|
1216 | comment, we must set up the
|
---|
1217 | buffer */
|
---|
1218 | sc_end = &(save_com[0]);
|
---|
1219 | else
|
---|
1220 | {
|
---|
1221 | *sc_end++ = '\n'; /* add newline between comments */
|
---|
1222 | *sc_end++ = ' ';
|
---|
1223 | --line_no;
|
---|
1224 | }
|
---|
1225 | memcpy(sc_end, s_lab + com_start, com_end - com_start);
|
---|
1226 | sc_end += com_end - com_start;
|
---|
1227 | if (sc_end >= &save_com[sc_size])
|
---|
1228 | abort();
|
---|
1229 | e_lab = s_lab + com_start;
|
---|
1230 | while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
|
---|
1231 | e_lab--;
|
---|
1232 | bp_save = buf_ptr; /* save current input buffer */
|
---|
1233 | be_save = buf_end;
|
---|
1234 | buf_ptr = save_com; /* fix so that subsequent calls
|
---|
1235 | to lexi will take tokens out
|
---|
1236 | of save_com */
|
---|
1237 | *sc_end++ = ' '; /* add trailing blank, just in
|
---|
1238 | case */
|
---|
1239 | buf_end = sc_end;
|
---|
1240 | sc_end = 0;
|
---|
1241 | }
|
---|
1242 | *e_lab = '\0'; /* null terminate line */
|
---|
1243 | ps.pcase = false;
|
---|
1244 | }
|
---|
1245 |
|
---|
1246 | if (strncmp(s_lab, "#if", 3) == 0)
|
---|
1247 | {
|
---|
1248 | if (bl_around)
|
---|
1249 | {
|
---|
1250 | register c;
|
---|
1251 | prefix_blankline_requested++;
|
---|
1252 | while ((c = getc(input)) == '\n');
|
---|
1253 | ungetc(c, input);
|
---|
1254 | }
|
---|
1255 | if (ifdef_level < sizeof state_stack / sizeof state_stack[0])
|
---|
1256 | {
|
---|
1257 | match_state[ifdef_level].tos = -1;
|
---|
1258 | state_stack[ifdef_level++] = ps;
|
---|
1259 | } else
|
---|
1260 | diag(1, "#if stack overflow");
|
---|
1261 | } else if (strncmp(s_lab, "#else", 5) == 0)
|
---|
1262 | if (ifdef_level <= 0)
|
---|
1263 | diag(1, "Unmatched #else");
|
---|
1264 | else
|
---|
1265 | {
|
---|
1266 | match_state[ifdef_level - 1] = ps;
|
---|
1267 | ps = state_stack[ifdef_level - 1];
|
---|
1268 | }
|
---|
1269 | else if (strncmp(s_lab, "#endif", 6) == 0)
|
---|
1270 | {
|
---|
1271 | if (ifdef_level <= 0)
|
---|
1272 | diag(1, "Unmatched #endif");
|
---|
1273 | else
|
---|
1274 | {
|
---|
1275 | ifdef_level--;
|
---|
1276 |
|
---|
1277 | #ifdef undef
|
---|
1278 | /* This match needs to be more intelligent before the
|
---|
1279 | message is useful */
|
---|
1280 | if (match_state[ifdef_level].tos >= 0
|
---|
1281 | && bcmp(&ps, &match_state[ifdef_level], sizeof ps))
|
---|
1282 | diag(0, "Syntactically inconsistant #ifdef alternatives.");
|
---|
1283 | #endif
|
---|
1284 | }
|
---|
1285 | if (bl_around)
|
---|
1286 | {
|
---|
1287 | postfix_blankline_requested++;
|
---|
1288 | n_real_blanklines = 0;
|
---|
1289 | }
|
---|
1290 | }
|
---|
1291 | break; /* subsequent processing of the
|
---|
1292 | newline character will cause
|
---|
1293 | the line to be printed */
|
---|
1294 |
|
---|
1295 | case comment: /* we have gotten a / * this is
|
---|
1296 | a biggie */
|
---|
1297 | if (flushed_nl)
|
---|
1298 | { /* we should force a broken
|
---|
1299 | line here */
|
---|
1300 | flushed_nl = false;
|
---|
1301 | dump_line();
|
---|
1302 | ps.want_blank = false; /* dont insert blank at line
|
---|
1303 | start */
|
---|
1304 | force_nl = false;
|
---|
1305 | }
|
---|
1306 | pr_comment();
|
---|
1307 | break;
|
---|
1308 | } /* end of big switch stmt */
|
---|
1309 |
|
---|
1310 | *e_code = '\0'; /* make sure code section is
|
---|
1311 | null terminated */
|
---|
1312 | if (type_code != comment && type_code != newline && type_code != preesc)
|
---|
1313 | ps.last_token = type_code;
|
---|
1314 | } /* end of main while (1) loop */
|
---|
1315 | }
|
---|
1316 |
|
---|
1317 | /*
|
---|
1318 | * copy input file to backup file if in_name is /blah/blah/blah/file, then
|
---|
1319 | * backup file will be ".Bfile" then make the backup file the input and
|
---|
1320 | * original input file the output
|
---|
1321 | */
|
---|
1322 | void bakcopy()
|
---|
1323 | {
|
---|
1324 | int n, bakchn;
|
---|
1325 | char buff[8 * 1024];
|
---|
1326 | register char *p;
|
---|
1327 |
|
---|
1328 | /* construct file name .Bfile */
|
---|
1329 | for (p = in_name; *p; p++); /* skip to end of string */
|
---|
1330 | while (p > in_name && *p != '/') /* find last '/' */
|
---|
1331 | p--;
|
---|
1332 | if (*p == '/')
|
---|
1333 | p++;
|
---|
1334 | sprintf(bakfile, "%s.BAK", p);
|
---|
1335 | if (strlen(p) >= NAME_SIZE) *bakfile ^= 040; /* toggle char */
|
---|
1336 |
|
---|
1337 | /* copy in_name to backup file */
|
---|
1338 | bakchn = creat(bakfile, 0600);
|
---|
1339 | if (bakchn < 0)
|
---|
1340 | {
|
---|
1341 | fprintf(stderr, "indent: can't create backup file \"%s\"\n", bakfile);
|
---|
1342 | exit(1);
|
---|
1343 | }
|
---|
1344 | while (n = read(fileno(input), buff, sizeof buff))
|
---|
1345 | if (write(bakchn, buff, n) != n)
|
---|
1346 | {
|
---|
1347 | fprintf(stderr, "indent: error writing backup file \"%s\"\n",
|
---|
1348 | bakfile);
|
---|
1349 | exit(1);
|
---|
1350 | }
|
---|
1351 | if (n < 0)
|
---|
1352 | {
|
---|
1353 | fprintf(stderr, "indent: error reading input file \"%s\"\n", in_name);
|
---|
1354 | exit(1);
|
---|
1355 | }
|
---|
1356 | close(bakchn);
|
---|
1357 | fclose(input);
|
---|
1358 |
|
---|
1359 | /* re-open backup file as the input file */
|
---|
1360 | input = fopen(bakfile, "r");
|
---|
1361 | if (input == 0)
|
---|
1362 | {
|
---|
1363 | fprintf(stderr, "indent: can't re-open backup file\n");
|
---|
1364 | exit(1);
|
---|
1365 | }
|
---|
1366 | /* now the original input file will be the output */
|
---|
1367 | output = fopen(in_name, "w");
|
---|
1368 | if (output == 0)
|
---|
1369 | {
|
---|
1370 | fprintf(stderr, "indent: can't create %s\n", in_name);
|
---|
1371 | unlink(bakfile);
|
---|
1372 | exit(1);
|
---|
1373 | }
|
---|
1374 | }
|
---|