|
|
1.1 root 1: static char sccsid[] = "@(#)io.c 4.1 (Berkeley) 10/21/82";
2:
3: /*
4:
5: Copyright (C) 1976
6: by the
7: Board of Trustees
8: of the
9: University of Illinois
10:
11: All rights reserved
12:
13:
14: FILE NAME:
15: io.c
16:
17: PURPOSE:
18: Contains routines to handle i/o related stuff for indent.
19:
20: GLOBALS:
21: None
22:
23: FUNCTIONS:
24: dump_line
25: fill_buffer
26: pad_output
27: count_spaces
28: eqin
29: cmp
30:
31: */
32: /*
33:
34: Copyright (C) 1976
35: by the
36: Board of Trustees
37: of the
38: University of Illinois
39:
40: All rights reserved
41:
42:
43: NAME:
44: dump_line
45:
46: FUNCTION:
47: Does the actual printing of the stored up line
48:
49: ALGORITHM:
50: For each of the label, code, and comment sections which are used on
51: this line:
52:
53: 1) Use pad_output to get the section aligned properly.
54: 2) write the section
55:
56: The indentation level used for the code is set by ind_level. After
57: printing, ind_level is set to i_l_follow.
58:
59: An extra level of indentation is added if ind_stmt is 1. After
60: printing, ind_stmt is set to 1 iff the line just printed has an
61: unterminated, non-declaration statement.
62:
63: PARAMETERS:
64: None
65:
66: RETURNS:
67: Nothing
68:
69: GLOBALS:
70: labbuf
71: s_lab
72: e_lab = Reset to s_lab
73:
74: codebuf
75: s_code
76: e_code = Reset to s_code
77:
78: combuf
79: s_com
80: e_com = Reset to s_com
81:
82: bl_line = Set to true iff the line was blank
83: case_ind
84: code_lines = Count lines with code
85: com_col
86: com_lines = Keep track of lines with comments
87: decl_on_line = Set to in_decl after line is printed
88: i_l_follow
89: in_decl
90: in_stmt
91: ind_level = Set to i_l_follow at completion
92: ind_size
93: ind_stmt = Set to in_stmt at completion if not in declaration
94: out_lines = Count output lines
95: p_l_follow
96: paren_level = Set to p_l_follow at completion
97: pcase
98: use_ff = Reset to false
99:
100: CALLS:
101: pad_output
102: printf (lib)
103: write (lib)
104:
105: CALLED BY:
106: main
107: pr_comment
108:
109: HISTORY:
110: initial coding November 1976 D A Willcox of CAC
111:
112: */
113: #include "indent_globs.h";
114:
115:
116:
117: int ff = 014; /* used to write a form feed */
118:
119:
120: dump_line () { /* dump_line is the routine that actually
121: effects the printing of the new source.
122: It prints the label section, followed by
123: the code section with the appropriate
124: nesting level, followed by any comments
125: */
126: register int cur_col,
127: temp_col,
128: target_col;
129:
130: bl_line = true; /* if we don't find otherwise, assume a
131: blank line */
132:
133: if (ind_level == 0)
134: ind_stmt = 0; /* this is a class A kludge. don't do
135: additional statement indentation if we
136: are at bracket level 0 */
137:
138: if (e_lab != s_lab || e_code != s_code)
139: ++code_lines; /* keep count of lines with code */
140:
141: if (e_lab != s_lab) { /* print lab, if any */
142: if (pcase) /* if the label is really a case, we must
143: indent */
144: cur_col = pad_output (1, case_ind * ind_size + 1);
145: else {
146: if (*s_lab == '#') /* check for #define, etc */
147: cur_col = 1;
148: else
149: cur_col = pad_output (1, ind_size * (ind_level - label_offset) + 1);
150: }
151:
152: write (output, s_lab, e_lab - s_lab);
153: cur_col = count_spaces (cur_col, s_lab);
154: /* count_spaces gives number of characters, considering tabs */
155: bl_line = false; /* line not blank after all */
156: }
157: else
158: cur_col = 1; /* there is no label section */
159:
160: pcase = false;
161:
162: if (s_code != e_code) { /* print code section, if any */
163: target_col = ind_size * (ind_level + paren_level + ind_stmt) + 1;
164:
165: cur_col = pad_output (cur_col, target_col);
166: /* pad_output writes enough tabs and spaces to get the current char
167: position up to target_col */
168: write (output, s_code, e_code - s_code);
169: cur_col = count_spaces (cur_col, s_code);
170: bl_line = false; /* line not blank */
171: }
172:
173: if ((cur_col - 1) > max_col && output!=1)/* check for line too long */
174: printf ("%d: Code has %d chars, max is %d\n", line_no, (cur_col - 1), max_col);
175:
176: if (s_com != e_com) { /* print comment, if any */
177: if (cur_col > com_col && count_spaces (cur_col, s_com) >= max_col) {
178: /* if comment can't fit on this line, put it on next line */
179: write (output, "\n", 1);
180: cur_col = 1;
181: ++out_lines;
182: }
183: cur_col = pad_output (cur_col, com_col);
184: write (output, s_com, e_com - s_com);
185:
186: cur_col = count_spaces (cur_col, s_com);
187: if ((cur_col - 1) > max_col && output!=1)/* check for too long comment */
188: printf ("%d: Comment goes to column %d. Max is %d\n",
189: line_no, (cur_col - 1), max_col);
190:
191: bl_line = false;
192: ++com_lines; /* count lines with comments */
193: }
194:
195: if (use_ff)
196: write (output, &ff, 1);/* end the output with a ff */
197: else
198: write (output, "\n", 1); /* or a newline */
199: use_ff = false;
200: *(e_lab = s_lab) = '\0'; /* reset buffers */
201: *(e_code = s_code) = '\0';
202: *(e_com = s_com) = '\0';
203:
204: ind_level = i_l_follow;
205: paren_level = p_l_follow;
206: ++out_lines;
207: decl_on_line = in_decl; /* if we are in the middle of a
208: declaration, remember that fact for
209: proper comment indentation */
210: ind_stmt = in_stmt & ~in_decl;
211: /* next line should be indented if we have not completed this stmt and if
212: we are not in the middle of a declaration */
213:
214: return;
215: };
216: /*
217:
218: Copyright (C) 1976
219: by the
220: Board of Trustees
221: of the
222: University of Illinois
223:
224: All rights reserved
225:
226:
227: NAME:
228: fill_buffer
229:
230: FUNCTION:
231: Reads one block of input into input_buffer
232:
233: ALGORITHM:
234: Trivial
235:
236: PARAMETERS:
237: None
238:
239: RETURNS:
240: Nothing
241:
242: GLOBALS:
243: in_buffer =
244: buf_end = Set to 1 past last character read in
245: buf_ptr = Set to start of buffer
246: be_save = Set to zero if it was non-zero
247: bp_save = Set to zero
248:
249: CALLS:
250: read (lib)
251:
252: CALLED BY:
253: lexi
254: main
255: pr_comment
256:
257: HISTORY:
258: initial coding November 1976 D A Willcox of CAC
259: 1/7/77 D A Willcox of CAC Added check for switch back to
260: partly full input buffer from
261: temporary buffer
262:
263: */
264: int fill_buffer () { /* this routine reads stuff from the input */
265: int count;
266: register int i;
267:
268: if (bp_save != 0) { /* there is a partly filled input buffer
269: left */
270: buf_ptr = bp_save; /* don't read anything, just switch buffers
271: */
272: buf_end = be_save;
273: bp_save = be_save = 0;
274: if (buf_ptr < buf_end)
275: return; /* only return if there is really something
276: in this buffer */
277: }
278:
279: count = read (input, in_buffer, inp_bufs);
280:
281: buf_end = in_buffer + count;
282: buf_ptr = in_buffer;
283:
284: if (count == 0) { /* count of zero means eof */
285: had_eof = true;
286: *buf_end++ = ' ';
287: *buf_end++ = '\n'; /* insert extra newline. it will
288: eventually get indent to stop */
289: }
290:
291: return;
292: };
293: /*
294:
295: Copyright (C) 1976
296: by the
297: Board of Trustees
298: of the
299: University of Illinois
300:
301: All rights reserved
302:
303:
304: NAME:
305: pad_output
306:
307: FUNCTION:
308: Writes tabs and spaces to move the current column up to the
309: desired position.
310:
311: ALGORITHM:
312: Put tabs and/or blanks into pobuf, then write pobuf.
313:
314: PARAMETERS:
315: current integer The current column
316: target integer The desired column
317:
318: RETURNS:
319: Integer value of the new column. (If current >= target,
320: no action is taken, and current is returned.
321:
322: GLOBALS:
323: None
324:
325: CALLS:
326: write (sys)
327:
328: CALLED BY:
329: dump_line
330:
331: HISTORY:
332: initial coding November 1976 D A Willcox of CAC
333:
334: */
335: int pad_output (current, target)/* writes tabs and blanks (if necessary) to
336: get the current output position up to
337: the target column */
338: int current; /* the current column value */
339: int target; /* position we want it at */
340: {
341: register int curr; /* internal column pointer */
342: register char *p; /* pointer into buffer of characters to be written */
343: char pobuf[256]; /* pad characters are stored here before writing */
344: register int tcur;
345:
346: if (current >= target)
347: return (current); /* line is already long enough */
348:
349: curr = current;
350: p = pobuf;
351: while (curr < target) {
352: if ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target){
353: *p++ = '\t'; /* put a tab into buffer */
354: curr = tcur;
355: }
356: else {
357: while (curr++ < target)
358: *p++ = ' '; /* pad with final blanks */
359: }
360: }
361:
362: write (output, pobuf, p - pobuf); /* write the characters we saved */
363: return (target);
364: };
365: /*
366:
367: Copyright (C) 1976
368: by the
369: Board of Trustees
370: of the
371: University of Illinois
372:
373: All rights reserved
374:
375:
376: NAME:
377: count_spaces
378:
379: FUNCTION:
380: Find out where printing of a given string will leave the current
381: character position on output.
382:
383: ALGORITHM:
384: Run thru input string and add appropriate values to current position.
385:
386: PARAMETERS:
387: current integer The current line character position
388: buffer ptr to character Pointer to input string
389:
390: RETURNS:
391: Integer value of position after printing "buffer" starting in
392: column "current".
393:
394: GLOBALS:
395: None
396:
397: CALLS:
398: None
399:
400: CALLED BY:
401: pr_comment
402:
403: HISTORY:
404: initial coding November 1976 D A Willcox of CAC
405:
406: */
407: int count_spaces (current, buffer)
408: /* this routine figures out where the
409: character position will be after
410: printing the text in buffer starting at
411: column "current" */
412: int current;
413: char *buffer;
414: {
415: register char *buf; /* used to look thru buffer */
416: register int cur; /* current character counter */
417:
418: cur = current;
419:
420: for (buf = buffer; *buf != '\0'; ++buf) {
421: switch (*buf) {
422:
423: case '\n':
424: case 014: /* form feed */
425: cur = 1;
426: break;
427:
428: case '\t':
429: cur = ((cur - 1) & tabmask) + tabsize + 1;
430: break;
431:
432: case '': /* this is a backspace */
433: --cur;
434: break;
435:
436: default:
437: ++cur;
438: break;
439: } /* end of switch */
440: } /* end of for loop */
441:
442: return (cur);
443: };
444: /*
445:
446: Copyright (C) 1976
447: by the
448: Board of Trustees
449: of the
450: University of Illinois
451:
452: All rights reserved
453:
454:
455: NAME:
456: eqin
457:
458: FUNCTION:
459: Returns true if the first arg matches the beginning of the second arg.
460:
461: ALGORITHM:
462: Trivial
463:
464: PARAMETERS:
465: str1 pointer to character
466: str2 pointer to character
467:
468: RETURNS:
469: 1 if first string matches start of second string
470: 0 otherwise
471:
472: GLOBALS:
473: None
474:
475: CALLS:
476: None
477:
478: CALLED BY:
479: lexi
480: main
481:
482: HISTORY:
483: initial coding November 1976 by D A Willcox of CAC
484:
485: */
486: eqin (str1, str2)
487: char *str1;
488: char *str2;
489: {
490: register char *s1; /* local pointer into first string */
491: register char *s2; /* local pointer into second string */
492:
493: s1 = str1;
494: s2 = str2;
495: while (*s1) { /* compare no further than end of first
496: string */
497: if (*s2 == 0) /* check that second string isn't too short
498: */
499: return (false);
500: if (*s1++ != *s2++)
501: return (false);
502: }
503:
504: return (true);
505: }
506: /*
507: Copyright (C) 1976
508: by the
509: Board of Trustees
510: of the
511: University of Illinois
512:
513: All rights reserved
514:
515: NAME:
516: cmp
517:
518: FUNCTION:
519: Compares two strings
520:
521: ALGORITHM:
522: Trivial
523:
524: PARAMETERS:
525: a Pointer to char First string to compare
526: b Pointer to char Second string to compare
527:
528: RETURNS:
529: -1 if a < b
530: 0 if a = b
531: 1 if a > b
532:
533: GLOBALS:
534: None
535:
536: CALLS:
537: None
538:
539: CALLED BY:
540: main
541:
542: HISTORY:
543: 1/7/77 D A Willcox of CAC Initial Coding
544: */
545: int cmp (a, b)
546: char *a;
547: char *b;
548: {
549: register char *ta,
550: *tb;
551:
552: ta = a;
553: tb = b;
554:
555: while (*ta) {
556: if (*ta > *tb)
557: return (1);
558: if (*ta < *tb)
559: return (-1);
560: ++ta;
561: ++tb;
562: }
563: if (*tb)
564: return (1);
565: else
566: return (0);
567: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.