(no_cr_read, extend_location): Move to epilogue,

and put only a forward declaration in the prologue.  This is for
consistency with the other scanner helper functions.
This commit is contained in:
Paul Eggert
2002-12-01 02:37:56 +00:00
parent 6ba5559289
commit 6c30d6413e

View File

@@ -41,95 +41,13 @@ do { \
/* Each time we match a string, move the end cursor to its end. */ /* Each time we match a string, move the end cursor to its end. */
#define STEP LOCATION_STEP (*loc) #define STEP LOCATION_STEP (*loc)
static void extend_location (location_t *, char const *, int);
#define YY_USER_ACTION extend_location (loc, yytext, yyleng); #define YY_USER_ACTION extend_location (loc, yytext, yyleng);
static size_t no_cr_read (FILE *, char *, size_t);
#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
/* Read bytes from FP into buffer BUF of size SIZE. Return the
number of bytes read. Remove '\r' from input, treating \r\n
and isolated \r as \n. */
static size_t
no_cr_read (FILE *fp, char *buf, size_t size)
{
size_t s = fread (buf, 1, size, fp);
if (s)
{
char *w = memchr (buf, '\r', s);
if (w)
{
char const *r = ++w;
char const *lim = buf + s;
for (;;)
{
/* Found an '\r'. Treat it like '\n', but ignore any
'\n' that immediately follows. */
w[-1] = '\n';
if (r == lim)
{
int ch = getc (fp);
if (ch != '\n' && ungetc (ch, fp) != ch)
break;
}
else if (*r == '\n')
r++;
/* Copy until the next '\r'. */
do
{
if (r == lim)
return w - buf;
}
while ((*w++ = *r++) != '\r');
}
return w - buf;
}
}
return s;
}
/* Extend *LOC to account for token TOKEN of size SIZE. */
static void
extend_location (location_t *loc, char const *token, int size)
{
int line = loc->last_line;
int column = loc->last_column;
char const *p0 = token;
char const *p = token;
char const *lim = token + size;
for (p = token; p < lim; p++)
switch (*p)
{
case '\r':
/* \r shouldn't survive no_cr_read. */
abort ();
case '\n':
line++;
column = 1;
p0 = p + 1;
break;
case '\t':
column += mbsnwidth (p0, p - p0, 0);
column += 8 - ((column - 1) & 7);
p0 = p + 1;
break;
}
loc->last_line = line;
loc->last_column = column + mbsnwidth (p0, p - p0, 0);
}
/* STRING_OBSTACK -- Used to store all the characters that we need to /* STRING_OBSTACK -- Used to store all the characters that we need to
keep (to construct ID, STRINGS etc.). Use the following macros to keep (to construct ID, STRINGS etc.). Use the following macros to
use it. use it.
@@ -603,6 +521,89 @@ splice (\\[ \f\t\v]*\n)*
%% %%
/* Extend *LOC to account for token TOKEN of size SIZE. */
static void
extend_location (location_t *loc, char const *token, int size)
{
int line = loc->last_line;
int column = loc->last_column;
char const *p0 = token;
char const *p = token;
char const *lim = token + size;
for (p = token; p < lim; p++)
switch (*p)
{
case '\r':
/* \r shouldn't survive no_cr_read. */
abort ();
case '\n':
line++;
column = 1;
p0 = p + 1;
break;
case '\t':
column += mbsnwidth (p0, p - p0, 0);
column += 8 - ((column - 1) & 7);
p0 = p + 1;
break;
}
loc->last_line = line;
loc->last_column = column + mbsnwidth (p0, p - p0, 0);
}
/* Read bytes from FP into buffer BUF of size SIZE. Return the
number of bytes read. Remove '\r' from input, treating \r\n
and isolated \r as \n. */
static size_t
no_cr_read (FILE *fp, char *buf, size_t size)
{
size_t s = fread (buf, 1, size, fp);
if (s)
{
char *w = memchr (buf, '\r', s);
if (w)
{
char const *r = ++w;
char const *lim = buf + s;
for (;;)
{
/* Found an '\r'. Treat it like '\n', but ignore any
'\n' that immediately follows. */
w[-1] = '\n';
if (r == lim)
{
int ch = getc (fp);
if (ch != '\n' && ungetc (ch, fp) != ch)
break;
}
else if (*r == '\n')
r++;
/* Copy until the next '\r'. */
do
{
if (r == lim)
return w - buf;
}
while ((*w++ = *r++) != '\r');
}
return w - buf;
}
}
return s;
}
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
| TEXT is pointing to a wannabee semantic value (i.e., a `$'). | | TEXT is pointing to a wannabee semantic value (i.e., a `$'). |
| | | |