mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
1 line
12 KiB
C
1 line
12 KiB
C
#
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
FILE NAME:
|
||
|
||
io.c
|
||
|
||
|
||
|
||
PURPOSE:
|
||
|
||
Contains routines to handle i/o related stuff for indent.
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
None
|
||
|
||
|
||
|
||
FUNCTIONS:
|
||
|
||
dump_line
|
||
|
||
fill_buffer
|
||
|
||
pad_output
|
||
|
||
count_spaces
|
||
|
||
eqin
|
||
|
||
cmp
|
||
|
||
|
||
|
||
*/
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
dump_line
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Does the actual printing of the stored up line
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
For each of the label, code, and comment sections which are used on
|
||
|
||
this line:
|
||
|
||
|
||
|
||
1) Use pad_output to get the section aligned properly.
|
||
|
||
2) write the section
|
||
|
||
|
||
|
||
The indentation level used for the code is set by ind_level. After
|
||
|
||
printing, ind_level is set to i_l_follow.
|
||
|
||
|
||
|
||
An extra level of indentation is added if ind_stmt is 1. After
|
||
|
||
printing, ind_stmt is set to 1 iff the line just printed has an
|
||
|
||
unterminated, non-declaration statement.
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
None
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
Nothing
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
labbuf
|
||
|
||
s_lab
|
||
|
||
e_lab = Reset to s_lab
|
||
|
||
|
||
|
||
codebuf
|
||
|
||
s_code
|
||
|
||
e_code = Reset to s_code
|
||
|
||
|
||
|
||
combuf
|
||
|
||
s_com
|
||
|
||
e_com = Reset to s_com
|
||
|
||
|
||
|
||
bl_line = Set to true iff the line was blank
|
||
|
||
case_ind
|
||
|
||
code_lines = Count lines with code
|
||
|
||
com_col
|
||
|
||
com_lines = Keep track of lines with comments
|
||
|
||
decl_on_line = Set to in_decl after line is printed
|
||
|
||
i_l_follow
|
||
|
||
in_decl
|
||
|
||
in_stmt
|
||
|
||
ind_level = Set to i_l_follow at completion
|
||
|
||
ind_size
|
||
|
||
ind_stmt = Set to in_stmt at completion if not in declaration
|
||
|
||
out_lines = Count output lines
|
||
|
||
p_l_follow
|
||
|
||
paren_level = Set to p_l_follow at completion
|
||
|
||
pcase
|
||
|
||
use_ff = Reset to false
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
pad_output
|
||
|
||
printf (lib)
|
||
|
||
write (lib)
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
main
|
||
|
||
pr_comment
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
initial coding November 1976 D A Willcox of CAC
|
||
|
||
|
||
|
||
*/
|
||
|
||
#include "indntglo.h";
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
int ff = 014; /* used to write a form feed */
|
||
|
||
|
||
|
||
|
||
|
||
dump_line () { /* dump_line is the routine that actually
|
||
|
||
effects the printing of the new source.
|
||
|
||
It prints the label section, followed by
|
||
|
||
the code section with the appropriate
|
||
|
||
nesting level, followed by any comments
|
||
|
||
*/
|
||
|
||
register int cur_col,
|
||
|
||
temp_col,
|
||
|
||
target_col;
|
||
|
||
|
||
|
||
bl_line = true; /* if we don't find otherwise, assume a
|
||
|
||
blank line */
|
||
|
||
|
||
|
||
if (ind_level == 0)
|
||
|
||
ind_stmt = 0; /* this is a class A kludge. don't do
|
||
|
||
additional statement indentation if we
|
||
|
||
are at bracket level 0 */
|
||
|
||
|
||
|
||
if (e_lab != s_lab || e_code != s_code)
|
||
|
||
++code_lines; /* keep count of lines with code */
|
||
|
||
|
||
|
||
if (e_lab != s_lab) { /* print lab, if any */
|
||
|
||
if (pcase) /* if the label is really a case, we must
|
||
|
||
indent */
|
||
|
||
cur_col = pad_output (1, case_ind * ind_size + 1);
|
||
|
||
else {
|
||
|
||
if (*s_lab == '#') /* check for #define, etc */
|
||
|
||
cur_col = 1;
|
||
|
||
else
|
||
|
||
cur_col = pad_output (1, ind_size * (ind_level - label_offset) + 1);
|
||
|
||
}
|
||
|
||
|
||
|
||
write (output, s_lab, (short int) (e_lab - s_lab));
|
||
|
||
cur_col = count_spaces (cur_col, s_lab);
|
||
|
||
/* count_spaces gives number of characters, considering tabs */
|
||
|
||
bl_line = false; /* line not blank after all */
|
||
|
||
}
|
||
|
||
else
|
||
|
||
cur_col = 1; /* there is no label section */
|
||
|
||
|
||
|
||
pcase = false;
|
||
|
||
|
||
|
||
if (s_code != e_code) { /* print code section, if any */
|
||
|
||
target_col = ind_size * (ind_level + paren_level + ind_stmt) + 1;
|
||
|
||
|
||
|
||
cur_col = pad_output (cur_col, target_col);
|
||
|
||
/* pad_output writes enough tabs and spaces to get the current char
|
||
|
||
position up to target_col */
|
||
|
||
write (output, s_code, (short int) (e_code - s_code));
|
||
|
||
cur_col = count_spaces (cur_col, s_code);
|
||
|
||
bl_line = false; /* line not blank */
|
||
|
||
}
|
||
|
||
|
||
|
||
if ((cur_col - 1) > max_col && output!=1)/* check for line too long */
|
||
|
||
printf ("%d: Code has %d chars, max is %d\n", line_no, (cur_col - 1), max_col);
|
||
|
||
|
||
|
||
if (s_com != e_com) { /* print comment, if any */
|
||
|
||
if (cur_col > com_col && count_spaces (cur_col, s_com) >= max_col) {
|
||
|
||
/* if comment can't fit on this line, put it on next line */
|
||
|
||
write (output, "\n", 1);
|
||
|
||
cur_col = 1;
|
||
|
||
++out_lines;
|
||
|
||
}
|
||
|
||
cur_col = pad_output (cur_col, com_col);
|
||
|
||
write (output, s_com, (short int) (e_com - s_com));
|
||
|
||
|
||
|
||
cur_col = count_spaces (cur_col, s_com);
|
||
|
||
if ((cur_col - 1) > max_col && output!=1)/* check for too long comment */
|
||
|
||
printf ("%d: Comment goes to column %d. Max is %d\n",
|
||
|
||
line_no, (cur_col - 1), max_col);
|
||
|
||
|
||
|
||
bl_line = false;
|
||
|
||
++com_lines; /* count lines with comments */
|
||
|
||
}
|
||
|
||
|
||
|
||
if (use_ff)
|
||
|
||
write (output, &ff, 1);/* end the output with a ff */
|
||
|
||
else
|
||
|
||
write (output, "\n", 1); /* or a newline */
|
||
|
||
use_ff = false;
|
||
|
||
*(e_lab = s_lab) = '\0'; /* reset buffers */
|
||
|
||
*(e_code = s_code) = '\0';
|
||
|
||
*(e_com = s_com) = '\0';
|
||
|
||
|
||
|
||
ind_level = i_l_follow;
|
||
|
||
paren_level = p_l_follow;
|
||
|
||
++out_lines;
|
||
|
||
decl_on_line = in_decl; /* if we are in the middle of a
|
||
|
||
declaration, remember that fact for
|
||
|
||
proper comment indentation */
|
||
|
||
ind_stmt = in_stmt & ~in_decl;
|
||
|
||
/* next line should be indented if we have not completed this stmt and if
|
||
|
||
we are not in the middle of a declaration */
|
||
|
||
|
||
|
||
return;
|
||
|
||
};
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
fill_buffer
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Reads one block of input into input_buffer
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
Trivial
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
None
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
Nothing
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
in_buffer =
|
||
|
||
buf_end = Set to 1 past last character read in
|
||
|
||
buf_ptr = Set to start of buffer
|
||
|
||
be_save = Set to zero if it was non-zero
|
||
|
||
bp_save = Set to zero
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
read (lib)
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
lexi
|
||
|
||
main
|
||
|
||
pr_comment
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
initial coding November 1976 D A Willcox of CAC
|
||
|
||
1/7/77 D A Willcox of CAC Added check for switch back to
|
||
|
||
partly full input buffer from
|
||
|
||
temporary buffer
|
||
|
||
|
||
|
||
*/
|
||
|
||
int fill_buffer () { /* this routine reads stuff from the input */
|
||
|
||
int count;
|
||
|
||
register int i;
|
||
|
||
|
||
|
||
if (bp_save != 0) { /* there is a partly filled input buffer
|
||
|
||
left */
|
||
|
||
buf_ptr = bp_save; /* don't read anything, just switch buffers
|
||
|
||
*/
|
||
|
||
buf_end = be_save;
|
||
|
||
bp_save = be_save = 0;
|
||
|
||
if (buf_ptr < buf_end)
|
||
|
||
return; /* only return if there is really something
|
||
|
||
in this buffer */
|
||
|
||
}
|
||
|
||
|
||
|
||
count = read (input, in_buffer, inp_bufs);
|
||
|
||
|
||
|
||
buf_end = in_buffer + count;
|
||
|
||
buf_ptr = in_buffer;
|
||
|
||
|
||
|
||
if (count == 0) { /* count of zero means eof */
|
||
|
||
had_eof = true;
|
||
|
||
*buf_end++ = ' ';
|
||
|
||
*buf_end++ = '\n'; /* insert extra newline. it will
|
||
|
||
eventually get indent to stop */
|
||
|
||
}
|
||
|
||
|
||
|
||
return;
|
||
|
||
};
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
pad_output
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Writes tabs and spaces to move the current column up to the
|
||
|
||
desired position.
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
Put tabs and/or blanks into pobuf, then write pobuf.
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
current integer The current column
|
||
|
||
target integer The desired column
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
Integer value of the new column. (If current >= target,
|
||
|
||
no action is taken, and current is returned.
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
write (sys)
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
dump_line
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
initial coding November 1976 D A Willcox of CAC
|
||
|
||
|
||
|
||
*/
|
||
|
||
int pad_output (current, target)/* writes tabs and blanks (if necessary) to
|
||
|
||
get the current output position up to
|
||
|
||
the target column */
|
||
|
||
int current; /* the current column value */
|
||
|
||
int target; /* position we want it at */
|
||
|
||
{
|
||
|
||
register int curr; /* internal column pointer */
|
||
|
||
register char *p; /* pointer into buffer of characters to be written */
|
||
|
||
char pobuf[256]; /* pad characters are stored here before writing */
|
||
|
||
register int tcur;
|
||
|
||
|
||
|
||
if (current >= target)
|
||
|
||
return (current); /* line is already long enough */
|
||
|
||
|
||
|
||
curr = current;
|
||
|
||
p = pobuf;
|
||
|
||
while (curr < target) {
|
||
|
||
if ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target){
|
||
|
||
*p++ = '\t'; /* put a tab into buffer */
|
||
|
||
curr = tcur;
|
||
|
||
}
|
||
|
||
else {
|
||
|
||
while (curr++ < target)
|
||
|
||
*p++ = ' '; /* pad with final blanks */
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
write (output, pobuf, (short int) (p - pobuf)); /* write the characters we saved */
|
||
|
||
return (target);
|
||
|
||
};
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
count_spaces
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Find out where printing of a given string will leave the current
|
||
|
||
character position on output.
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
Run thru input string and add appropriate values to current position.
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
current integer The current line character position
|
||
|
||
buffer ptr to character Pointer to input string
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
Integer value of position after printing "buffer" starting in
|
||
|
||
column "current".
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
pr_comment
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
initial coding November 1976 D A Willcox of CAC
|
||
|
||
|
||
|
||
*/
|
||
|
||
int count_spaces (current, buffer)
|
||
|
||
/* this routine figures out where the
|
||
|
||
character position will be after
|
||
|
||
printing the text in buffer starting at
|
||
|
||
column "current" */
|
||
|
||
int current;
|
||
|
||
char *buffer;
|
||
|
||
{
|
||
|
||
register char *buf; /* used to look thru buffer */
|
||
|
||
register int cur; /* current character counter */
|
||
|
||
|
||
|
||
cur = current;
|
||
|
||
|
||
|
||
for (buf = buffer; *buf != '\0'; ++buf) {
|
||
|
||
switch (*buf) {
|
||
|
||
|
||
|
||
case '\n':
|
||
|
||
case 014: /* form feed */
|
||
|
||
cur = 1;
|
||
|
||
break;
|
||
|
||
|
||
|
||
case '\t':
|
||
|
||
cur = ((cur - 1) & tabmask) + tabsize + 1;
|
||
|
||
break;
|
||
|
||
|
||
|
||
case '': /* this is a backspace */
|
||
|
||
--cur;
|
||
|
||
break;
|
||
|
||
|
||
|
||
default:
|
||
|
||
++cur;
|
||
|
||
break;
|
||
|
||
} /* end of switch */
|
||
|
||
} /* end of for loop */
|
||
|
||
|
||
|
||
return (cur);
|
||
|
||
};
|
||
|
||
/*
|
||
|
||
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
eqin
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Returns true if the first arg matches the beginning of the second arg.
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
Trivial
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
str1 pointer to character
|
||
|
||
str2 pointer to character
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
1 if first string matches start of second string
|
||
|
||
0 otherwise
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
lexi
|
||
|
||
main
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
initial coding November 1976 by D A Willcox of CAC
|
||
|
||
|
||
|
||
*/
|
||
|
||
eqin (str1, str2)
|
||
|
||
char *str1;
|
||
|
||
char *str2;
|
||
|
||
{
|
||
|
||
register char *s1; /* local pointer into first string */
|
||
|
||
register char *s2; /* local pointer into second string */
|
||
|
||
|
||
|
||
s1 = str1;
|
||
|
||
s2 = str2;
|
||
|
||
while (*s1) { /* compare no further than end of first
|
||
|
||
string */
|
||
|
||
if (*s2 == 0) /* check that second string isn't too short
|
||
|
||
*/
|
||
|
||
return (false);
|
||
|
||
if (*s1++ != *s2++)
|
||
|
||
return (false);
|
||
|
||
}
|
||
|
||
|
||
|
||
return (true);
|
||
|
||
}
|
||
|
||
/*
|
||
|
||
Copyright (C) 1976
|
||
|
||
by the
|
||
|
||
Board of Trustees
|
||
|
||
of the
|
||
|
||
University of Illinois
|
||
|
||
|
||
|
||
All rights reserved
|
||
|
||
|
||
|
||
NAME:
|
||
|
||
cmp
|
||
|
||
|
||
|
||
FUNCTION:
|
||
|
||
Compares two strings
|
||
|
||
|
||
|
||
ALGORITHM:
|
||
|
||
Trivial
|
||
|
||
|
||
|
||
PARAMETERS:
|
||
|
||
a Pointer to char First string to compare
|
||
|
||
b Pointer to char Second string to compare
|
||
|
||
|
||
|
||
RETURNS:
|
||
|
||
-1 if a < b
|
||
|
||
0 if a = b
|
||
|
||
1 if a > b
|
||
|
||
|
||
|
||
GLOBALS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLS:
|
||
|
||
None
|
||
|
||
|
||
|
||
CALLED BY:
|
||
|
||
main
|
||
|
||
|
||
|
||
HISTORY:
|
||
|
||
1/7/77 D A Willcox of CAC Initial Coding
|
||
|
||
*/
|
||
|
||
int cmp (a, b)
|
||
|
||
char *a;
|
||
|
||
char *b;
|
||
|
||
{
|
||
|
||
register char *ta,
|
||
|
||
*tb;
|
||
|
||
|
||
|
||
ta = a;
|
||
|
||
tb = b;
|
||
|
||
|
||
|
||
while (*ta) {
|
||
|
||
if (*ta > *tb)
|
||
|
||
return (1);
|
||
|
||
if (*ta < *tb)
|
||
|
||
return (-1);
|
||
|
||
++ta;
|
||
|
||
++tb;
|
||
|
||
}
|
||
|
||
if (*tb)
|
||
|
||
return (1);
|
||
|
||
else
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
|