Mercurial > hg > CbC > CbC_gcc
diff gcc/scan.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/scan.c Fri Jul 17 14:47:48 2009 +0900 @@ -0,0 +1,241 @@ +/* Utility functions for scan-decls and fix-header programs. + Copyright (C) 1993, 1994, 1998, 2002, 2003, 2007, 2008 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + +#include "bconfig.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "scan.h" + +int lineno = 1; +int source_lineno = 1; +sstring source_filename; + +void +make_sstring_space (sstring *str, int count) +{ + int cur_pos = str->ptr - str->base; + int cur_size = str->limit - str->base; + int new_size = cur_pos + count + 100; + + if (new_size <= cur_size) + return; + + str->base = (char *) xrealloc (str->base, new_size); + str->ptr = str->base + cur_size; + str->limit = str->base + new_size; +} + +void +sstring_append (sstring *dst, sstring *src) +{ + char *d, *s; + int count = SSTRING_LENGTH (src); + + MAKE_SSTRING_SPACE (dst, count + 1); + d = dst->ptr; + s = src->base; + while (--count >= 0) *d++ = *s++; + dst->ptr = d; + *d = 0; +} + +int +scan_ident (FILE *fp, sstring *s, int c) +{ + s->ptr = s->base; + if (ISIDST (c)) + { + for (;;) + { + SSTRING_PUT (s, c); + c = getc (fp); + if (c == EOF || ! ISIDNUM (c)) + break; + } + } + MAKE_SSTRING_SPACE (s, 1); + *s->ptr = 0; + return c; +} + +int +scan_string (FILE *fp, sstring *s, int init) +{ + int c; + + for (;;) + { + c = getc (fp); + if (c == EOF || c == '\n') + break; + if (c == init) + { + c = getc (fp); + break; + } + if (c == '\\') + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n') + continue; + } + SSTRING_PUT (s, c); + } + MAKE_SSTRING_SPACE (s, 1); + *s->ptr = 0; + return c; +} + +/* Skip horizontal white spaces (spaces, tabs, and C-style comments). */ + +int +skip_spaces (FILE *fp, int c) +{ + for (;;) + { + if (c == ' ' || c == '\t') + c = getc (fp); + else if (c == '/') + { + c = getc (fp); + if (c != '*') + { + ungetc (c, fp); + return '/'; + } + c = getc (fp); + for (;;) + { + if (c == EOF) + return EOF; + else if (c != '*') + { + if (c == '\n') + source_lineno++, lineno++; + c = getc (fp); + } + else if ((c = getc (fp)) == '/') + return getc (fp); + } + } + else + break; + } + return c; +} + +int +read_upto (FILE *fp, sstring *str, int delim) +{ + int ch; + + for (;;) + { + ch = getc (fp); + if (ch == EOF || ch == delim) + break; + SSTRING_PUT (str, ch); + } + MAKE_SSTRING_SPACE (str, 1); + *str->ptr = 0; + return ch; +} + +int +get_token (FILE *fp, sstring *s) +{ + int c; + + s->ptr = s->base; + retry: + c = ' '; + c = skip_spaces (fp, c); + if (c == '\n') + { + source_lineno++; + lineno++; + goto retry; + } + if (c == '#') + { + c = get_token (fp, s); + if (c == INT_TOKEN) + { + source_lineno = atoi (s->base) - 1; /* '\n' will add 1 */ + get_token (fp, &source_filename); + } + for (;;) + { + c = getc (fp); + if (c == EOF) + return EOF; + if (c == '\n') + { + source_lineno++; + lineno++; + goto retry; + } + } + } + if (c == EOF) + return EOF; + if (ISDIGIT (c)) + { + do + { + SSTRING_PUT (s, c); + c = getc (fp); + } while (c != EOF && ISDIGIT (c)); + ungetc (c, fp); + c = INT_TOKEN; + goto done; + } + if (ISIDST (c)) + { + c = scan_ident (fp, s, c); + ungetc (c, fp); + return IDENTIFIER_TOKEN; + } + if (c == '\'' || c == '"') + { + c = scan_string (fp, s, c); + ungetc (c, fp); + return c == '\'' ? CHAR_TOKEN : STRING_TOKEN; + } + SSTRING_PUT (s, c); + done: + MAKE_SSTRING_SPACE (s, 1); + *s->ptr = 0; + return c; +} + +unsigned int +hashstr (const char *str, unsigned int len) +{ + unsigned int n = len; + unsigned int r = 0; + const unsigned char *s = (const unsigned char *) str; + + do + r = r * 67 + (*s++ - 113); + while (--n); + return r + len; +}