Doxygen Source Code Documentation
niceprintf.c File Reference
#include "defs.h"#include "names.h"#include "output.h"#include "stdarg.h"Go to the source code of this file.
Defines | |
| #define | TOO_LONG_INDENT (2 * tab_size) |
| #define | MAX_INDENT 44 |
| #define | MIN_INDENT 22 |
| #define | SPRINTF(x, a, b, c, d, e, f, g) vsprintf(x,a,ap) |
| #define | max_line_len c_output_line_length |
| #define | isident(x) (Tr[x] & 1) |
| #define | isntident(x) (!Tr[x]) |
Functions | |
| void ind_printf | Argdcl ((int, FILE *, char *, va_list)) |
| void | write_indent (FILE *fp, int use_indent, int extra_indent, char *start, char *end) |
| void | margin_printf (FILE *fp, char *fmt,...) |
| void | nice_printf (FILE *fp, char *fmt,...) |
| void | np_init (Void) |
| char * | adjust_pointer_in_string (register char *pointer) |
| void | fwd_strcpy (register char *t, register char *s) |
| void | ind_printf (int use_indent, FILE *fp, char *a, va_list ap) |
Variables | |
| int | last_was_newline = 0 |
| int | sharp_line = 0 |
| int | indent = 0 |
| int | in_comment = 0 |
| int | in_define = 0 |
| int | gflag1 |
| char | filename [] |
| char * | output_buf |
| char * | next_slot |
| char * | string_start |
| char * | word_start = NULL |
| int | cursor_pos = 0 |
| int | In_string = 0 |
Define Documentation
|
|
Definition at line 214 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 215 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 32 of file niceprintf.c. Referenced by ind_printf(), and write_indent(). |
|
|
Definition at line 138 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 33 of file niceprintf.c. Referenced by ind_printf(), and write_indent(). |
|
|
Definition at line 117 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 31 of file niceprintf.c. Referenced by ind_printf(). |
Function Documentation
|
|
Definition at line 169 of file niceprintf.c. References output_buf, and string_start. Referenced by ind_printf().
00171 {
00172 register char *s, *s1, *se, *s0;
00173
00174 /* arrange not to break \002 */
00175 s1 = string_start ? string_start : output_buf;
00176 for(s = s1; s < pointer; s++) {
00177 s0 = s1;
00178 s1 = s;
00179 if (*s == '\\') {
00180 se = s++ + 4;
00181 if (se > pointer)
00182 break;
00183 if (*s < '0' || *s > '7')
00184 continue;
00185 while(++s < se)
00186 if (*s < '0' || *s > '7')
00187 break;
00188 --s;
00189 }
00190 }
00191 return s0 - 1;
00192 }
|
|
|
|
|
||||||||||||
|
Definition at line 203 of file niceprintf.c. Referenced by ind_printf().
00205 { while(*t++ = *s++); }
|
|
||||||||||||||||||||
|
Definition at line 225 of file niceprintf.c. References a, adjust_pointer_in_string(), c, cursor_pos, fatalstr(), FILEP, fwd_strcpy(), gflag1, in_define, In_string, ind, indent, isident, isntident, last_was_newline, MAX_INDENT, max_line_len, MIN_INDENT, next_slot, output_buf, sharp_line, SPRINTF, string_start, TOO_LONG_INDENT, tr_tab, word_start, and write_indent(). Referenced by margin_printf(), and nice_printf().
00227 {
00228 extern int max_line_len;
00229 extern FILEP c_file;
00230 extern char tr_tab[]; /* in output.c */
00231 register char *Tr = tr_tab;
00232 int ch, inc, ind;
00233 static int extra_indent, last_indent, set_cursor = 1;
00234
00235 cursor_pos += indent - last_indent;
00236 last_indent = indent;
00237 SPRINTF (next_slot, a, b, c, d, e, f, g);
00238
00239 if (fp != c_file) {
00240 fprintf (fp,"%s", next_slot);
00241 return;
00242 } /* if fp != c_file */
00243
00244 do {
00245 char *pointer;
00246
00247 /* The for loop will parse one output line */
00248
00249 if (set_cursor) {
00250 ind = indent <= MAX_INDENT
00251 ? indent
00252 : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT);
00253 cursor_pos = ind + extra_indent;
00254 set_cursor = 0;
00255 }
00256 if (in_comment)
00257 for (pointer = next_slot; *pointer && *pointer != '\n' &&
00258 cursor_pos <= max_line_len; pointer++)
00259 cursor_pos++;
00260 else
00261 for (pointer = next_slot; *pointer && *pointer != '\n' &&
00262 cursor_pos <= max_line_len; pointer++) {
00263
00264 /* Update state variables here */
00265
00266 if (In_string) {
00267 switch(*pointer) {
00268 case '\\':
00269 if (++cursor_pos > max_line_len) {
00270 cursor_pos -= 2;
00271 --pointer;
00272 goto overflow;
00273 }
00274 ++pointer;
00275 break;
00276 case '"':
00277 In_string = 0;
00278 word_start = 0;
00279 }
00280 }
00281 else switch (*pointer) {
00282 case '"':
00283 if (cursor_pos + 5 > max_line_len) {
00284 word_start = 0;
00285 --pointer;
00286 goto overflow;
00287 }
00288 In_string = 1;
00289 string_start = word_start = pointer;
00290 break;
00291 case '\'':
00292 if (pointer[1] == '\\')
00293 if ((ch = pointer[2]) >= '0' && ch <= '7')
00294 for(inc = 3; pointer[inc] != '\''
00295 && ++inc < 5;);
00296 else
00297 inc = 3;
00298 else
00299 inc = 2;
00300 /*debug*/ if (pointer[inc] != '\'')
00301 /*debug*/ fatalstr("Bad character constant %.10s",
00302 pointer);
00303 if ((cursor_pos += inc) > max_line_len) {
00304 cursor_pos -= inc;
00305 word_start = 0;
00306 --pointer;
00307 goto overflow;
00308 }
00309 word_start = pointer;
00310 pointer += inc;
00311 break;
00312 case '\t':
00313 cursor_pos = 8 * ((cursor_pos + 8) / 8) - 1;
00314 break;
00315 default: {
00316
00317 /* HACK Assumes that all characters in an atomic C token will be written
00318 at the same time. Must check for tokens first, since '-' is considered
00319 part of an identifier; checking isident first would mean breaking up "->" */
00320
00321 if (word_start) {
00322 if (isntident(*(unsigned char *)pointer))
00323 word_start = NULL;
00324 }
00325 else if (isident(*(unsigned char *)pointer))
00326 word_start = pointer;
00327 break;
00328 } /* default */
00329 } /* switch */
00330 cursor_pos++;
00331 } /* for pointer = next_slot */
00332 overflow:
00333 if (*pointer == '\0') {
00334
00335 /* The output line is not complete, so break out and don't output
00336 anything. The current line fragment will be stored in the buffer */
00337
00338 next_slot = pointer;
00339 break;
00340 } else {
00341 char last_char;
00342 int in_string0 = In_string;
00343
00344 /* If the line was too long, move pointer back to the character before
00345 the current word. This allows line breaking on word boundaries. Make
00346 sure that 80 character comment lines get broken up somehow. We assume
00347 that any non-string 80 character identifier must be in a comment.
00348 */
00349
00350 if (*pointer == '\n')
00351 in_define = 0;
00352 else if (word_start && word_start > output_buf)
00353 if (In_string)
00354 if (string_start && pointer - string_start < 5)
00355 pointer = string_start - 1;
00356 else {
00357 pointer = adjust_pointer_in_string(pointer);
00358 string_start = 0;
00359 }
00360 else if (word_start == string_start
00361 && pointer - string_start >= 5) {
00362 pointer = adjust_pointer_in_string(next_slot);
00363 In_string = 1;
00364 string_start = 0;
00365 }
00366 else
00367 pointer = word_start - 1;
00368 else if (cursor_pos > max_line_len) {
00369 #ifndef ANSI_Libraries
00370 extern char *strchr();
00371 #endif
00372 if (In_string) {
00373 pointer = adjust_pointer_in_string(pointer);
00374 if (string_start && pointer > string_start)
00375 string_start = 0;
00376 }
00377 else if (strchr("&*+-/<=>|", *pointer)
00378 && strchr("!%&*+-/<=>^|", pointer[-1])) {
00379 pointer -= 2;
00380 if (strchr("<>", *pointer)) /* <<=, >>= */
00381 pointer--;
00382 }
00383 else {
00384 if (word_start)
00385 while(isident(*(unsigned char *)pointer))
00386 pointer++;
00387 pointer--;
00388 }
00389 }
00390 last_char = *pointer;
00391 write_indent(fp, use_indent, extra_indent, output_buf, pointer);
00392 next_slot = output_buf;
00393 if (In_string && !string_start && Ansi == 1 && last_char != '\n')
00394 *next_slot++ = '"';
00395 fwd_strcpy(next_slot, pointer + 1);
00396
00397 /* insert a line break */
00398
00399 if (last_char == '\n') {
00400 if (In_string)
00401 last_was_newline = 0;
00402 else {
00403 last_was_newline = 1;
00404 extra_indent = 0;
00405 sharp_line = gflag1;
00406 }
00407 }
00408 else {
00409 extra_indent = TOO_LONG_INDENT;
00410 if (In_string && !string_start) {
00411 if (Ansi == 1) {
00412 fprintf(fp, gflag1 ? "\"\\\n" : "\"\n");
00413 use_indent = 1;
00414 last_was_newline = 1;
00415 }
00416 else {
00417 fprintf(fp, "\\\n");
00418 last_was_newline = 0;
00419 }
00420 In_string = in_string0;
00421 }
00422 else {
00423 if (in_define/* | gflag1*/)
00424 putc('\\', fp);
00425 putc ('\n', fp);
00426 last_was_newline = 1;
00427 }
00428 } /* if *pointer != '\n' */
00429
00430 if (In_string && Ansi != 1 && !string_start)
00431 cursor_pos = 0;
00432 else
00433 set_cursor = 1;
00434
00435 string_start = word_start = NULL;
00436
00437 } /* else */
00438
00439 } while (*next_slot);
00440
00441 } /* ind_printf */
|
|
||||||||||||||||
|
Definition at line 120 of file niceprintf.c. References ind_printf(). Referenced by do_p1_comment(), do_p1_label(), wr_globals(), wr_one_init(), and write_char_init().
00121 {
00122 va_list ap;
00123 va_start(ap,fmt);
00124 ind_printf(0, fp, fmt, ap);
00125 va_end(ap);
00126 }
|
|
||||||||||||||||
|
|
Definition at line 158 of file niceprintf.c. References Alloc, MAX_OUTPUT_SIZE, next_slot, and output_buf. Referenced by fileinit().
00159 {
00160 next_slot = output_buf = Alloc(MAX_OUTPUT_SIZE);
00161 memset(output_buf, 0, MAX_OUTPUT_SIZE);
00162 }
|
|
||||||||||||||||||||||||
|
Definition at line 53 of file niceprintf.c. References filename, in_define, ind, indent, last_was_newline, MAX_INDENT, MIN_INDENT, and sharp_line. Referenced by ind_printf().
00055 {
00056 int ind, tab;
00057
00058 if (sharp_line) {
00059 fprintf(fp, "#line %ld \"%s\"\n", lineno, filename);
00060 sharp_line = 0;
00061 }
00062 if (in_define == 1) {
00063 in_define = 2;
00064 use_indent = 0;
00065 }
00066 if (last_was_newline && use_indent) {
00067 if (*start == '\n') do {
00068 putc('\n', fp);
00069 if (++start > end)
00070 return;
00071 }
00072 while(*start == '\n');
00073
00074 ind = indent <= MAX_INDENT
00075 ? indent
00076 : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT);
00077
00078 tab = ind + extra_indent;
00079
00080 while (tab > 7) {
00081 putc ('\t', fp);
00082 tab -= 8;
00083 } /* while */
00084
00085 while (tab-- > 0)
00086 putc (' ', fp);
00087 } /* if last_was_newline */
00088
00089 while (start <= end)
00090 putc (*start++, fp);
00091 } /* write_indent */
|
Variable Documentation
|
|
Definition at line 154 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 40 of file niceprintf.c. Referenced by write_indent(). |
|
|
Definition at line 39 of file niceprintf.c. Referenced by do_format(), do_p1_comment(), ind_printf(), and start_formatting(). |
|
|
Definition at line 37 of file niceprintf.c. Referenced by do_p1_comment(). |
|
|
Definition at line 38 of file niceprintf.c. Referenced by def_start(), ind_printf(), and write_indent(). |
|
|
Definition at line 155 of file niceprintf.c. Referenced by ind_printf(). |
|
|
Definition at line 36 of file niceprintf.c. Referenced by ind_printf(), and write_indent(). |
|
|
Definition at line 34 of file niceprintf.c. Referenced by ind_printf(), and write_indent(). |
|
|
Definition at line 150 of file niceprintf.c. Referenced by ind_printf(), and np_init(). |
|
|
Definition at line 149 of file niceprintf.c. Referenced by adjust_pointer_in_string(), ind_printf(), and np_init(). |
|
|
Definition at line 35 of file niceprintf.c. Referenced by do_format(), do_p1_comment(), ind_printf(), start_formatting(), and write_indent(). |
|
|
Definition at line 151 of file niceprintf.c. Referenced by adjust_pointer_in_string(), and ind_printf(). |
|
|
Definition at line 153 of file niceprintf.c. Referenced by ind_printf(). |