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(). | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  