1*e0cc7465Sguenther /* $OpenBSD: io.c,v 1.14 2015/09/27 17:00:46 guenther Exp $ */
21258a77dSderaadt
3df930be7Sderaadt /*
4df930be7Sderaadt * Copyright (c) 1985 Sun Microsystems, Inc.
52a0991d2Spjanzen * Copyright (c) 1980, 1993 The Regents of the University of California.
6df930be7Sderaadt * Copyright (c) 1976 Board of Trustees of the University of Illinois.
7df930be7Sderaadt * All rights reserved.
8df930be7Sderaadt *
9df930be7Sderaadt * Redistribution and use in source and binary forms, with or without
10df930be7Sderaadt * modification, are permitted provided that the following conditions
11df930be7Sderaadt * are met:
12df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright
13df930be7Sderaadt * notice, this list of conditions and the following disclaimer.
14df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
15df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the
16df930be7Sderaadt * documentation and/or other materials provided with the distribution.
17f75387cbSmillert * 3. Neither the name of the University nor the names of its contributors
18df930be7Sderaadt * may be used to endorse or promote products derived from this software
19df930be7Sderaadt * without specific prior written permission.
20df930be7Sderaadt *
21df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31df930be7Sderaadt * SUCH DAMAGE.
32df930be7Sderaadt */
33df930be7Sderaadt
34df930be7Sderaadt #include <stdio.h>
35df930be7Sderaadt #include <ctype.h>
36df930be7Sderaadt #include <stdlib.h>
37df930be7Sderaadt #include <string.h>
38e7beb4a7Smillert #include <stdarg.h>
39f614d3c6Smickey #include <err.h>
40df930be7Sderaadt #include "indent_globs.h"
41df930be7Sderaadt
42df930be7Sderaadt
43df930be7Sderaadt int comment_open;
442a0991d2Spjanzen static int paren_target;
45df930be7Sderaadt
46f614d3c6Smickey void
dump_line(void)4776f50813Sderaadt dump_line(void)
48df930be7Sderaadt { /* dump_line is the routine that actually
49df930be7Sderaadt * effects the printing of the new source. It
50df930be7Sderaadt * prints the label section, followed by the
51df930be7Sderaadt * code section with the appropriate nesting
52df930be7Sderaadt * level, followed by any comments */
532a0991d2Spjanzen int cur_col, target_col;
542a0991d2Spjanzen static int not_first_line;
55df930be7Sderaadt
56df930be7Sderaadt if (ps.procname[0]) {
57df930be7Sderaadt if (troff) {
58df930be7Sderaadt if (comment_open) {
59df930be7Sderaadt comment_open = 0;
60df930be7Sderaadt fprintf(output, ".*/\n");
61df930be7Sderaadt }
62df930be7Sderaadt fprintf(output, ".Pr \"%s\"\n", ps.procname);
63df930be7Sderaadt }
64df930be7Sderaadt ps.ind_level = 0;
65df930be7Sderaadt ps.procname[0] = 0;
66df930be7Sderaadt }
67df930be7Sderaadt if (s_code == e_code && s_lab == e_lab && s_com == e_com) {
68df930be7Sderaadt if (suppress_blanklines > 0)
69df930be7Sderaadt suppress_blanklines--;
70df930be7Sderaadt else {
71df930be7Sderaadt ps.bl_line = true;
72df930be7Sderaadt n_real_blanklines++;
73df930be7Sderaadt }
74df930be7Sderaadt }
75df930be7Sderaadt else if (!inhibit_formatting) {
76df930be7Sderaadt suppress_blanklines = 0;
77df930be7Sderaadt ps.bl_line = false;
782a0991d2Spjanzen if (prefix_blankline_requested && not_first_line) {
79df930be7Sderaadt if (swallow_optional_blanklines) {
80df930be7Sderaadt if (n_real_blanklines == 1)
81df930be7Sderaadt n_real_blanklines = 0;
822a0991d2Spjanzen } else {
83df930be7Sderaadt if (n_real_blanklines == 0)
84df930be7Sderaadt n_real_blanklines = 1;
85df930be7Sderaadt }
862a0991d2Spjanzen }
87df930be7Sderaadt while (--n_real_blanklines >= 0)
88df930be7Sderaadt putc('\n', output);
89df930be7Sderaadt n_real_blanklines = 0;
90df930be7Sderaadt if (ps.ind_level == 0)
91df930be7Sderaadt ps.ind_stmt = 0; /* this is a class A kludge. dont do
92df930be7Sderaadt * additional statement indentation if we are
93df930be7Sderaadt * at bracket level 0 */
94df930be7Sderaadt
95df930be7Sderaadt if (e_lab != s_lab || e_code != s_code)
96df930be7Sderaadt ++code_lines; /* keep count of lines with code */
97df930be7Sderaadt
98df930be7Sderaadt
99df930be7Sderaadt if (e_lab != s_lab) { /* print lab, if any */
100df930be7Sderaadt if (comment_open) {
101df930be7Sderaadt comment_open = 0;
102df930be7Sderaadt fprintf(output, ".*/\n");
103df930be7Sderaadt }
104df930be7Sderaadt while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
105df930be7Sderaadt e_lab--;
106df930be7Sderaadt cur_col = pad_output(1, compute_label_target());
107df930be7Sderaadt if (s_lab[0] == '#' && (strncmp(s_lab, "#else", 5) == 0
108df930be7Sderaadt || strncmp(s_lab, "#endif", 6) == 0)) {
1092a0991d2Spjanzen char *s = s_lab;
1102a0991d2Spjanzen if (e_lab[-1] == '\n')
1112a0991d2Spjanzen e_lab--;
1122a0991d2Spjanzen do
1132a0991d2Spjanzen putc(*s++, output);
114df930be7Sderaadt while (s < e_lab && 'a' <= *s && *s<='z');
115df930be7Sderaadt while ((*s == ' ' || *s == '\t') && s < e_lab)
116df930be7Sderaadt s++;
117df930be7Sderaadt if (s < e_lab)
118df930be7Sderaadt fprintf(output, s[0]=='/' && s[1]=='*' ? "\t%.*s" : "\t/* %.*s */",
1192a0991d2Spjanzen (int)(e_lab - s), s);
120df930be7Sderaadt }
1212a0991d2Spjanzen else fprintf(output, "%.*s", (int)(e_lab - s_lab), s_lab);
122df930be7Sderaadt cur_col = count_spaces(cur_col, s_lab);
123df930be7Sderaadt }
124df930be7Sderaadt else
125df930be7Sderaadt cur_col = 1; /* there is no label section */
126df930be7Sderaadt
127df930be7Sderaadt ps.pcase = false;
128df930be7Sderaadt
129df930be7Sderaadt if (s_code != e_code) { /* print code section, if any */
1302a0991d2Spjanzen char *p;
131df930be7Sderaadt
132df930be7Sderaadt if (comment_open) {
133df930be7Sderaadt comment_open = 0;
134df930be7Sderaadt fprintf(output, ".*/\n");
135df930be7Sderaadt }
136df930be7Sderaadt target_col = compute_code_target();
137df930be7Sderaadt {
1382a0991d2Spjanzen int i;
139df930be7Sderaadt
140df930be7Sderaadt for (i = 0; i < ps.p_l_follow; i++)
141df930be7Sderaadt if (ps.paren_indents[i] >= 0)
142df930be7Sderaadt ps.paren_indents[i] = -(ps.paren_indents[i] + target_col);
143df930be7Sderaadt }
144df930be7Sderaadt cur_col = pad_output(cur_col, target_col);
145df930be7Sderaadt for (p = s_code; p < e_code; p++)
146df930be7Sderaadt if (*p == (char) 0200)
147df930be7Sderaadt fprintf(output, "%d", target_col * 7);
148df930be7Sderaadt else
149df930be7Sderaadt putc(*p, output);
150df930be7Sderaadt cur_col = count_spaces(cur_col, s_code);
151df930be7Sderaadt }
1522a0991d2Spjanzen if (s_com != e_com) {
153df930be7Sderaadt if (troff) {
154df930be7Sderaadt int all_here = 0;
1552a0991d2Spjanzen char *p;
156df930be7Sderaadt
157df930be7Sderaadt if (e_com[-1] == '/' && e_com[-2] == '*')
158df930be7Sderaadt e_com -= 2, all_here++;
159df930be7Sderaadt while (e_com > s_com && e_com[-1] == ' ')
160df930be7Sderaadt e_com--;
161df930be7Sderaadt *e_com = 0;
162df930be7Sderaadt p = s_com;
163df930be7Sderaadt while (*p == ' ')
164df930be7Sderaadt p++;
165df930be7Sderaadt if (p[0] == '/' && p[1] == '*')
166df930be7Sderaadt p += 2, all_here++;
167df930be7Sderaadt else if (p[0] == '*')
168df930be7Sderaadt p += p[1] == '/' ? 2 : 1;
169df930be7Sderaadt while (*p == ' ')
170df930be7Sderaadt p++;
171df930be7Sderaadt if (*p == 0)
172df930be7Sderaadt goto inhibit_newline;
173df930be7Sderaadt if (comment_open < 2 && ps.box_com) {
174df930be7Sderaadt comment_open = 0;
175df930be7Sderaadt fprintf(output, ".*/\n");
176df930be7Sderaadt }
177df930be7Sderaadt if (comment_open == 0) {
178df930be7Sderaadt if ('a' <= *p && *p <= 'z')
179df930be7Sderaadt *p = *p + 'A' - 'a';
180df930be7Sderaadt if (e_com - p < 50 && all_here == 2) {
1812a0991d2Spjanzen char *follow = p;
182df930be7Sderaadt fprintf(output, "\n.nr C! \\w\1");
183df930be7Sderaadt while (follow < e_com) {
184df930be7Sderaadt switch (*follow) {
185df930be7Sderaadt case '\n':
186df930be7Sderaadt putc(' ', output);
187df930be7Sderaadt case 1:
188df930be7Sderaadt break;
189df930be7Sderaadt case '\\':
190df930be7Sderaadt putc('\\', output);
191df930be7Sderaadt default:
192df930be7Sderaadt putc(*follow, output);
193df930be7Sderaadt }
194df930be7Sderaadt follow++;
195df930be7Sderaadt }
196df930be7Sderaadt putc(1, output);
197df930be7Sderaadt }
198df930be7Sderaadt fprintf(output, "\n./* %dp %d %dp\n",
199df930be7Sderaadt ps.com_col * 7,
200df930be7Sderaadt (s_code != e_code || s_lab != e_lab) - ps.box_com,
201df930be7Sderaadt target_col * 7);
202df930be7Sderaadt }
203df930be7Sderaadt comment_open = 1 + ps.box_com;
204df930be7Sderaadt while (*p) {
205df930be7Sderaadt if (*p == BACKSLASH)
206df930be7Sderaadt putc(BACKSLASH, output);
207df930be7Sderaadt putc(*p++, output);
208df930be7Sderaadt }
2092a0991d2Spjanzen } else { /* print comment, if any */
2102a0991d2Spjanzen int target = ps.com_col;
2112a0991d2Spjanzen char *com_st = s_com;
212df930be7Sderaadt
213df930be7Sderaadt target += ps.comment_delta;
214df930be7Sderaadt while (*com_st == '\t')
215df930be7Sderaadt com_st++, target += 8; /* ? */
216df930be7Sderaadt while (target <= 0)
217df930be7Sderaadt if (*com_st == ' ')
218df930be7Sderaadt target++, com_st++;
219df930be7Sderaadt else if (*com_st == '\t')
220df930be7Sderaadt target = ((target - 1) & ~7) + 9, com_st++;
221df930be7Sderaadt else
222df930be7Sderaadt target = 1;
223df930be7Sderaadt if (cur_col > target) { /* if comment cant fit on this line,
224df930be7Sderaadt * put it on next line */
225df930be7Sderaadt putc('\n', output);
226df930be7Sderaadt cur_col = 1;
227df930be7Sderaadt ++ps.out_lines;
228df930be7Sderaadt }
2296cd4fad2Sderaadt while (e_com > com_st && isspace((unsigned char)e_com[-1]))
230df930be7Sderaadt e_com--;
231df930be7Sderaadt cur_col = pad_output(cur_col, target);
232df930be7Sderaadt if (!ps.box_com) {
2332a0991d2Spjanzen if (star_comment_cont && (com_st[1] != '*' || e_com <= com_st + 1)) {
234df930be7Sderaadt if (com_st[1] == ' ' && com_st[0] == ' ' && e_com > com_st + 1)
235df930be7Sderaadt com_st[1] = '*';
236df930be7Sderaadt else
237df930be7Sderaadt fwrite(" * ", com_st[0] == '\t' ? 2 : com_st[0] == '*' ? 1 : 3, 1, output);
238df930be7Sderaadt }
2392a0991d2Spjanzen }
240df930be7Sderaadt fwrite(com_st, e_com - com_st, 1, output);
241df930be7Sderaadt ps.comment_delta = ps.n_comment_delta;
242df930be7Sderaadt cur_col = count_spaces(cur_col, com_st);
243df930be7Sderaadt ++ps.com_lines; /* count lines with comments */
244df930be7Sderaadt }
2452a0991d2Spjanzen }
246df930be7Sderaadt if (ps.use_ff)
247df930be7Sderaadt putc('\014', output);
248df930be7Sderaadt else
249df930be7Sderaadt putc('\n', output);
250df930be7Sderaadt inhibit_newline:
251df930be7Sderaadt ++ps.out_lines;
252df930be7Sderaadt if (ps.just_saw_decl == 1 && blanklines_after_declarations) {
253df930be7Sderaadt prefix_blankline_requested = 1;
254df930be7Sderaadt ps.just_saw_decl = 0;
255df930be7Sderaadt }
256df930be7Sderaadt else
257df930be7Sderaadt prefix_blankline_requested = postfix_blankline_requested;
258df930be7Sderaadt postfix_blankline_requested = 0;
259df930be7Sderaadt }
260df930be7Sderaadt ps.decl_on_line = ps.in_decl; /* if we are in the middle of a
261df930be7Sderaadt * declaration, remember that fact for
262df930be7Sderaadt * proper comment indentation */
263df930be7Sderaadt ps.ind_stmt = ps.in_stmt & ~ps.in_decl; /* next line should be
264df930be7Sderaadt * indented if we have not
265df930be7Sderaadt * completed this stmt and if
266df930be7Sderaadt * we are not in the middle of
267df930be7Sderaadt * a declaration */
268df930be7Sderaadt ps.use_ff = false;
269df930be7Sderaadt ps.dumped_decl_indent = 0;
270df930be7Sderaadt *(e_lab = s_lab) = '\0'; /* reset buffers */
271df930be7Sderaadt *(e_code = s_code) = '\0';
272df930be7Sderaadt *(e_com = s_com) = '\0';
273df930be7Sderaadt ps.ind_level = ps.i_l_follow;
274df930be7Sderaadt ps.paren_level = ps.p_l_follow;
275df930be7Sderaadt paren_target = -ps.paren_indents[ps.paren_level - 1];
276df930be7Sderaadt not_first_line = 1;
277df930be7Sderaadt return;
278df930be7Sderaadt }
279df930be7Sderaadt
280f614d3c6Smickey int
compute_code_target(void)28176f50813Sderaadt compute_code_target(void)
282df930be7Sderaadt {
2832a0991d2Spjanzen int target_col;
284df930be7Sderaadt
2852a0991d2Spjanzen target_col = ps.ind_size * ps.ind_level + 1;
286df930be7Sderaadt if (ps.paren_level)
287df930be7Sderaadt if (!lineup_to_parens)
288df930be7Sderaadt target_col += continuation_indent * ps.paren_level;
289df930be7Sderaadt else {
2902a0991d2Spjanzen int w;
2912a0991d2Spjanzen int t = paren_target;
292df930be7Sderaadt
293df930be7Sderaadt if ((w = count_spaces(t, s_code) - max_col) > 0
294df930be7Sderaadt && count_spaces(target_col, s_code) <= max_col) {
295df930be7Sderaadt t -= w + 1;
296df930be7Sderaadt if (t > target_col)
297df930be7Sderaadt target_col = t;
298df930be7Sderaadt }
299df930be7Sderaadt else
300df930be7Sderaadt target_col = t;
301df930be7Sderaadt }
302df930be7Sderaadt else if (ps.ind_stmt)
303df930be7Sderaadt target_col += continuation_indent;
304df930be7Sderaadt return target_col;
305df930be7Sderaadt }
306df930be7Sderaadt
307f614d3c6Smickey int
compute_label_target(void)30876f50813Sderaadt compute_label_target(void)
309df930be7Sderaadt {
310df930be7Sderaadt return
311df930be7Sderaadt ps.pcase ? (int) (case_ind * ps.ind_size) + 1
312df930be7Sderaadt : *s_lab == '#' ? 1
313df930be7Sderaadt : ps.ind_size * (ps.ind_level - label_offset) + 1;
314df930be7Sderaadt }
315df930be7Sderaadt
316df930be7Sderaadt
317df930be7Sderaadt /*
318df930be7Sderaadt * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
319df930be7Sderaadt *
320df930be7Sderaadt * All rights reserved
321df930be7Sderaadt *
322df930be7Sderaadt *
323df930be7Sderaadt * NAME: fill_buffer
324df930be7Sderaadt *
325df930be7Sderaadt * FUNCTION: Reads one block of input into input_buffer
326df930be7Sderaadt *
327df930be7Sderaadt * HISTORY: initial coding November 1976 D A Willcox of CAC 1/7/77 A
328df930be7Sderaadt * Willcox of CAC Added check for switch back to partly full input
329df930be7Sderaadt * buffer from temporary buffer
330df930be7Sderaadt *
331df930be7Sderaadt */
332f614d3c6Smickey void
fill_buffer(void)33376f50813Sderaadt fill_buffer(void)
334df930be7Sderaadt { /* this routine reads stuff from the input */
33553d6f732Stedu char *p, *buf2;
3362a0991d2Spjanzen int i;
3372a0991d2Spjanzen FILE *f = input;
338df930be7Sderaadt
339df930be7Sderaadt if (bp_save != 0) { /* there is a partly filled input buffer left */
340df930be7Sderaadt buf_ptr = bp_save; /* dont read anything, just switch buffers */
341df930be7Sderaadt buf_end = be_save;
342df930be7Sderaadt bp_save = be_save = 0;
343df930be7Sderaadt if (buf_ptr < buf_end)
344df930be7Sderaadt return; /* only return if there is really something in
345df930be7Sderaadt * this buffer */
346df930be7Sderaadt }
347df930be7Sderaadt for (p = in_buffer;;) {
348df930be7Sderaadt if (p >= in_buffer_limit) {
3492a0991d2Spjanzen int size = (in_buffer_limit - in_buffer) * 2 + 10;
3502a0991d2Spjanzen int offset = p - in_buffer;
35153d6f732Stedu buf2 = realloc(in_buffer, size);
35253d6f732Stedu if (buf2 == NULL)
353f614d3c6Smickey errx(1, "input line too long");
35453d6f732Stedu in_buffer = buf2;
355df930be7Sderaadt p = in_buffer + offset;
356df930be7Sderaadt in_buffer_limit = in_buffer + size - 2;
357df930be7Sderaadt }
358df930be7Sderaadt if ((i = getc(f)) == EOF) {
359df930be7Sderaadt *p++ = ' ';
360df930be7Sderaadt *p++ = '\n';
361df930be7Sderaadt had_eof = true;
362df930be7Sderaadt break;
363df930be7Sderaadt }
364df930be7Sderaadt *p++ = i;
365df930be7Sderaadt if (i == '\n')
366df930be7Sderaadt break;
367df930be7Sderaadt }
368df930be7Sderaadt buf_ptr = in_buffer;
369df930be7Sderaadt buf_end = p;
37080a2daadSmillert if (p - 3 >= in_buffer && p[-2] == '/' && p[-3] == '*') {
371df930be7Sderaadt if (in_buffer[3] == 'I' && strncmp(in_buffer, "/**INDENT**", 11) == 0)
372df930be7Sderaadt fill_buffer(); /* flush indent error message */
373df930be7Sderaadt else {
374df930be7Sderaadt int com = 0;
375df930be7Sderaadt
376df930be7Sderaadt p = in_buffer;
377df930be7Sderaadt while (*p == ' ' || *p == '\t')
378df930be7Sderaadt p++;
379df930be7Sderaadt if (*p == '/' && p[1] == '*') {
380df930be7Sderaadt p += 2;
381df930be7Sderaadt while (*p == ' ' || *p == '\t')
382df930be7Sderaadt p++;
383df930be7Sderaadt if (p[0] == 'I' && p[1] == 'N' && p[2] == 'D' && p[3] == 'E'
384df930be7Sderaadt && p[4] == 'N' && p[5] == 'T') {
385df930be7Sderaadt p += 6;
386df930be7Sderaadt while (*p == ' ' || *p == '\t')
387df930be7Sderaadt p++;
388df930be7Sderaadt if (*p == '*')
389df930be7Sderaadt com = 1;
3902a0991d2Spjanzen else if (*p == 'O') {
391df930be7Sderaadt if (*++p == 'N')
392df930be7Sderaadt p++, com = 1;
393df930be7Sderaadt else if (*p == 'F' && *++p == 'F')
394df930be7Sderaadt p++, com = 2;
3952a0991d2Spjanzen }
396df930be7Sderaadt while (*p == ' ' || *p == '\t')
397df930be7Sderaadt p++;
398df930be7Sderaadt if (p[0] == '*' && p[1] == '/' && p[2] == '\n' && com) {
399df930be7Sderaadt if (s_com != e_com || s_lab != e_lab || s_code != e_code)
400df930be7Sderaadt dump_line();
401df930be7Sderaadt if (!(inhibit_formatting = com - 1)) {
402df930be7Sderaadt n_real_blanklines = 0;
403df930be7Sderaadt postfix_blankline_requested = 0;
404df930be7Sderaadt prefix_blankline_requested = 0;
405df930be7Sderaadt suppress_blanklines = 1;
406df930be7Sderaadt }
407df930be7Sderaadt }
408df930be7Sderaadt }
409df930be7Sderaadt }
410df930be7Sderaadt }
411df930be7Sderaadt }
412df930be7Sderaadt if (inhibit_formatting) {
413df930be7Sderaadt p = in_buffer;
414df930be7Sderaadt do
415df930be7Sderaadt putc(*p, output);
416df930be7Sderaadt while (*p++ != '\n');
417df930be7Sderaadt }
418df930be7Sderaadt return;
419df930be7Sderaadt }
420df930be7Sderaadt
421df930be7Sderaadt /*
422df930be7Sderaadt * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
423df930be7Sderaadt *
424df930be7Sderaadt * All rights reserved
425df930be7Sderaadt *
426df930be7Sderaadt *
427df930be7Sderaadt * NAME: pad_output
428df930be7Sderaadt *
429df930be7Sderaadt * FUNCTION: Writes tabs and spaces to move the current column up to the desired
430df930be7Sderaadt * position.
431df930be7Sderaadt *
432df930be7Sderaadt * ALGORITHM: Put tabs and/or blanks into pobuf, then write pobuf.
433df930be7Sderaadt *
434df930be7Sderaadt * PARAMETERS: current integer The current column target
43576f50813Sderaadt * target integer The desired column
436df930be7Sderaadt *
437df930be7Sderaadt * RETURNS: Integer value of the new column. (If current >= target, no action is
438df930be7Sderaadt * taken, and current is returned.
439df930be7Sderaadt *
440df930be7Sderaadt * GLOBALS: None
441df930be7Sderaadt *
442df930be7Sderaadt * CALLS: write (sys)
443df930be7Sderaadt *
444df930be7Sderaadt * CALLED BY: dump_line
445df930be7Sderaadt *
446df930be7Sderaadt * HISTORY: initial coding November 1976 D A Willcox of CAC
447df930be7Sderaadt *
448df930be7Sderaadt */
449f614d3c6Smickey int
pad_output(int current,int target)45076f50813Sderaadt pad_output(int current, int target)
451df930be7Sderaadt {
4522a0991d2Spjanzen int curr; /* internal column pointer */
4532a0991d2Spjanzen int tcur;
454df930be7Sderaadt
455df930be7Sderaadt if (troff)
456df930be7Sderaadt fprintf(output, "\\h'|%dp'", (target - 1) * 7);
457df930be7Sderaadt else {
458df930be7Sderaadt if (current >= target)
459df930be7Sderaadt return (current); /* line is already long enough */
460df930be7Sderaadt curr = current;
46183ca9807Sjsg if (use_tabs) {
462df930be7Sderaadt while ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target) {
463df930be7Sderaadt putc('\t', output);
464df930be7Sderaadt curr = tcur;
465df930be7Sderaadt }
46683ca9807Sjsg }
467df930be7Sderaadt while (curr++ < target)
468df930be7Sderaadt putc(' ', output); /* pad with final blanks */
469df930be7Sderaadt }
470df930be7Sderaadt return (target);
471df930be7Sderaadt }
472df930be7Sderaadt
473df930be7Sderaadt /*
474df930be7Sderaadt * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
475df930be7Sderaadt *
476df930be7Sderaadt * All rights reserved
477df930be7Sderaadt *
478df930be7Sderaadt *
479df930be7Sderaadt * NAME: count_spaces
480df930be7Sderaadt *
481df930be7Sderaadt * FUNCTION: Find out where printing of a given string will leave the current
482df930be7Sderaadt * character position on output.
483df930be7Sderaadt *
484df930be7Sderaadt * ALGORITHM: Run thru input string and add appropriate values to current
485df930be7Sderaadt * position.
486df930be7Sderaadt *
487df930be7Sderaadt * RETURNS: Integer value of position after printing "buffer" starting in column
488df930be7Sderaadt * "current".
489df930be7Sderaadt *
490df930be7Sderaadt * HISTORY: initial coding November 1976 D A Willcox of CAC
491df930be7Sderaadt *
492df930be7Sderaadt */
493df930be7Sderaadt int
count_spaces(int current,char * buffer)49476f50813Sderaadt count_spaces(int current, char *buffer)
495df930be7Sderaadt {
4962a0991d2Spjanzen char *buf; /* used to look thru buffer */
4972a0991d2Spjanzen int cur; /* current character counter */
498df930be7Sderaadt
499df930be7Sderaadt cur = current;
500df930be7Sderaadt
501df930be7Sderaadt for (buf = buffer; *buf != '\0'; ++buf) {
502df930be7Sderaadt switch (*buf) {
503df930be7Sderaadt
504df930be7Sderaadt case '\n':
505df930be7Sderaadt case 014: /* form feed */
506df930be7Sderaadt cur = 1;
507df930be7Sderaadt break;
508df930be7Sderaadt
509df930be7Sderaadt case '\t':
510df930be7Sderaadt cur = ((cur - 1) & tabmask) + tabsize + 1;
511df930be7Sderaadt break;
512df930be7Sderaadt
513df930be7Sderaadt case 010: /* backspace */
514df930be7Sderaadt --cur;
515df930be7Sderaadt break;
516df930be7Sderaadt
517df930be7Sderaadt default:
518df930be7Sderaadt ++cur;
519df930be7Sderaadt break;
520df930be7Sderaadt } /* end of switch */
521df930be7Sderaadt } /* end of for loop */
522df930be7Sderaadt return (cur);
523df930be7Sderaadt }
524df930be7Sderaadt
525df930be7Sderaadt int found_err;
5262a0991d2Spjanzen
527f614d3c6Smickey void
diag(int level,const char * msg,...)528*e0cc7465Sguenther diag(int level, const char *msg, ...)
529df930be7Sderaadt {
5302a0991d2Spjanzen va_list ap;
5312a0991d2Spjanzen
532e7beb4a7Smillert va_start(ap, msg);
533df930be7Sderaadt if (level)
534df930be7Sderaadt found_err = 1;
535df930be7Sderaadt if (output == stdout) {
536df930be7Sderaadt fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
5372a0991d2Spjanzen vfprintf(stdout, msg, ap);
538df930be7Sderaadt fprintf(stdout, " */\n");
539df930be7Sderaadt }
540df930be7Sderaadt else {
541df930be7Sderaadt fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no);
5422a0991d2Spjanzen vfprintf(stderr, msg, ap);
543df930be7Sderaadt fprintf(stderr, "\n");
544df930be7Sderaadt }
5452a0991d2Spjanzen va_end(ap);
546df930be7Sderaadt }
547df930be7Sderaadt
548f614d3c6Smickey void
writefdef(struct fstate * f,int nm)54976f50813Sderaadt writefdef(struct fstate *f, int nm)
550df930be7Sderaadt {
551df930be7Sderaadt fprintf(output, ".ds f%c %s\n.nr s%c %d\n",
552df930be7Sderaadt nm, f->font, nm, f->size);
553df930be7Sderaadt }
554df930be7Sderaadt
555df930be7Sderaadt char *
chfont(struct fstate * of,struct fstate * nf,char * s)55676f50813Sderaadt chfont(struct fstate *of, struct fstate *nf, char *s)
557df930be7Sderaadt {
558df930be7Sderaadt if (of->font[0] != nf->font[0]
559df930be7Sderaadt || of->font[1] != nf->font[1]) {
560df930be7Sderaadt *s++ = '\\';
561df930be7Sderaadt *s++ = 'f';
562df930be7Sderaadt if (nf->font[1]) {
563df930be7Sderaadt *s++ = '(';
564df930be7Sderaadt *s++ = nf->font[0];
565df930be7Sderaadt *s++ = nf->font[1];
566df930be7Sderaadt }
567df930be7Sderaadt else
568df930be7Sderaadt *s++ = nf->font[0];
569df930be7Sderaadt }
570df930be7Sderaadt if (nf->size != of->size) {
571df930be7Sderaadt *s++ = '\\';
572df930be7Sderaadt *s++ = 's';
573df930be7Sderaadt if (nf->size < of->size) {
574df930be7Sderaadt *s++ = '-';
575df930be7Sderaadt *s++ = '0' + of->size - nf->size;
576df930be7Sderaadt }
577df930be7Sderaadt else {
578df930be7Sderaadt *s++ = '+';
579df930be7Sderaadt *s++ = '0' + nf->size - of->size;
580df930be7Sderaadt }
581df930be7Sderaadt }
582df930be7Sderaadt return s;
583df930be7Sderaadt }
584df930be7Sderaadt
585f614d3c6Smickey void
parsefont(struct fstate * f,char * s0)58676f50813Sderaadt parsefont(struct fstate *f, char *s0)
587df930be7Sderaadt {
5882a0991d2Spjanzen char *s = s0;
589df930be7Sderaadt int sizedelta = 0;
590df930be7Sderaadt bzero(f, sizeof *f);
591df930be7Sderaadt while (*s) {
5926cd4fad2Sderaadt if (isdigit((unsigned char)*s))
593df930be7Sderaadt f->size = f->size * 10 + *s - '0';
5946cd4fad2Sderaadt else if (isupper((unsigned char)*s))
595df930be7Sderaadt if (f->font[0])
596df930be7Sderaadt f->font[1] = *s;
597df930be7Sderaadt else
598df930be7Sderaadt f->font[0] = *s;
599df930be7Sderaadt else if (*s == 'c')
600df930be7Sderaadt f->allcaps = 1;
601df930be7Sderaadt else if (*s == '+')
602df930be7Sderaadt sizedelta++;
603df930be7Sderaadt else if (*s == '-')
604df930be7Sderaadt sizedelta--;
605d031d7c7Smickey else
606d031d7c7Smickey errx(1, "bad font specification: %s", s0);
607df930be7Sderaadt s++;
608df930be7Sderaadt }
609df930be7Sderaadt if (f->font[0] == 0)
610df930be7Sderaadt f->font[0] = 'R';
611df930be7Sderaadt if (bodyf.size == 0)
612df930be7Sderaadt bodyf.size = 11;
613df930be7Sderaadt if (f->size == 0)
614df930be7Sderaadt f->size = bodyf.size + sizedelta;
615df930be7Sderaadt else if (sizedelta > 0)
616df930be7Sderaadt f->size += bodyf.size;
617df930be7Sderaadt else
618df930be7Sderaadt f->size = bodyf.size - f->size;
619df930be7Sderaadt }
620