home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
src
/
preproc
/
pchars.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-12-12
|
4KB
|
158 lines
#include "../preproc/preproc.h"
#include "../preproc/pproto.h"
int *first_char;
int *next_char;
int *last_char;
/*
* fill_cbuf - fill the current character buffer.
*/
void fill_cbuf()
{
register int c1, c2, c3;
register int *s;
register int *l;
int c;
int line;
int changes;
struct char_src *cs;
FILE *f;
cs = src_stack->u.cs;
f = cs->f;
s = cs->char_buf;
l = cs->line_buf;
if (next_char == NULL) {
/*
* Initial filling of buffer.
*/
first_char = cs->char_buf;
last_char = first_char + cs->bufsize - 3;
cs->last_char = last_char;
line = 1;
/*
* Get initial read-ahead.
*/
if ((c2 = getc(f)) != EOF)
c3 = getc(f);
}
else if (*next_char == EOF)
return;
else {
/*
* The calling routine needs at least 2 characters, so there is one
* left in the buffer.
*/
*s++= *next_char;
line = cs->line_buf[next_char - first_char];
*l++ = line;
/*
* Retrieve the 2 read-ahead characters that were saved the last
* time the buffer was filled.
*/
c2 = last_char[1];
c3 = last_char[2];
}
next_char = first_char;
/*
* Fill buffer from input file.
*/
while (s <= last_char) {
c1 = c2;
c2 = c3;
c3 = getc(f);
/*
* The first phase of input translation is done here: trigraph
* translation and the deletion of backslash-newline pairs.
*/
changes = 1;
while (changes) {
changes = 0;
/*
* check for trigraphs
*/
if (c1 == '?' && c2 == '?') {
c = ' ';
switch (c3) {
case '=':
c = '#';
break;
case '(':
c = '[';
break;
case '/':
c = '\\';
break;
case ')':
c = ']';
break;
case '\'':
c = '^';
break;
case '<':
c = '{';
break;
case '!':
c = '|';
break;
case '>':
c = '}';
break;
case '-':
c = '~';
break;
}
/*
* If we found a trigraph, use it and refill the 2-character
* read-ahead.
*/
if (c != ' ') {
c1 = c;
if ((c2 = getc(f)) != EOF)
c3 = getc(f);
changes = 1;
}
}
/*
* delete backslash-newline pairs
*/
if (c1 == '\\' && c2 == '\n') {
++line;
if ((c1 = c3) != EOF)
if ((c2 = getc(f)) != EOF)
c3 = getc(f);
changes = 1;
}
}
if (c1 == EOF) {
/*
* If last character in file is not a new-line, insert one.
*/
if (s == first_char || s[-1] != '\n')
*s++ = '\n';
*s = EOF;
last_char = s;
cs->last_char = last_char;
return;
}
if (c1 == '\n')
++line;
*s++ = c1; /* put character in buffer */
*l++ = line;
}
/*
* Save the 2 character read-ahead in the reserved space at the end
* of the buffer.
*/
last_char[1] = c2;
last_char[2] = c3;
}