Merge branch 'master' into ast-and-ir

This commit is contained in:
Dale Weiler 2012-04-28 16:45:02 -04:00
commit 206952b920
14 changed files with 152 additions and 158 deletions

3
.gitattributes vendored Normal file
View file

@ -0,0 +1,3 @@
#dissalow trailing whitespace
*.c whitespace=-trailing-space
*.h whitespace=-trailing-space

View file

@ -271,8 +271,6 @@ uint32_t util_crc32(const char *, int, register const short);
#define VECTOR_MAKE(T,N) \ #define VECTOR_MAKE(T,N) \
VECTOR_TYPE(T,N); \ VECTOR_TYPE(T,N); \
VECTOR_CORE(T,N) VECTOR_CORE(T,N)
/* Builds a vector add function pointer for inside structures */
#define VECTOR_IMPL(T,N) int (*N##_add)(T)
//=================================================================== //===================================================================
//=========================== code.c ================================ //=========================== code.c ================================

45
lex.c
View file

@ -48,7 +48,7 @@ void lex_init(const char *file, lex_file **set) {
lex->size = lex->length; /* copy, this is never changed */ lex->size = lex->length; /* copy, this is never changed */
fseek(lex->file, 0, SEEK_SET); fseek(lex->file, 0, SEEK_SET);
lex->last = 0; lex->last = 0;
lex->line = 0; lex->line = 1;
memset(lex->peek, 0, sizeof(lex->peek)); memset(lex->peek, 0, sizeof(lex->peek));
*set = lex; *set = lex;
@ -77,14 +77,25 @@ static inline void lex_clear(lex_file *file) {
* it's own internal state for this. * it's own internal state for this.
*/ */
static int lex_inget(lex_file *file) { static int lex_inget(lex_file *file) {
char get;
file->length --; file->length --;
if (file->last > 0)
return file->peek[--file->last]; if (file->last > 0) {
return fgetc(file->file); if ((get = file->peek[--file->last]) == '\n')
file->line ++;
return get;
}
if ((get = fgetc(file->file)) == '\n')
file->line++;
return get;
} }
static void lex_unget(int ch, lex_file *file) { static void lex_unget(int ch, lex_file *file) {
if (file->last < sizeof(file->peek)) if (file->last < sizeof(file->peek)) {
if (ch == '\n')
file->line --;
file->peek[file->last++] = ch; file->peek[file->last++] = ch;
}
file->length ++; file->length ++;
} }
@ -139,22 +150,10 @@ static int lex_digraph(lex_file *file, int first) {
static int lex_getch(lex_file *file) { static int lex_getch(lex_file *file) {
int ch = lex_inget(file); int ch = lex_inget(file);
if (ch == '?')
static int str = 0;
switch (ch) {
case '?' :
return lex_trigraph(file); return lex_trigraph(file);
case '<' : if (ch == '<' || ch == ':' || ch == '%')
case ':' :
case '%' :
case '"' : str = !str; if (str) { file->line ++; }
return lex_digraph(file, ch); return lex_digraph(file, ch);
case '\n':
if (!str)
file->line++;
}
return ch; return ch;
} }
@ -283,13 +282,7 @@ int lex_token(lex_file *file) {
if (ch > 0 && (ch == '_' || isalpha(ch))) { if (ch > 0 && (ch == '_' || isalpha(ch))) {
lex_clear(file); lex_clear(file);
/* while (ch > 0 && (ch == '_' || isalpha(ch))) {
* Yes this is dirty, but there is no other _sane_ easy
* way to do it, this is what I call defensive programming
* if something breaks, add more defense :-)
*/
while (ch > 0 && ch != ' ' && ch != '(' &&
ch != '\n' && ch != ';' && ch != ')') {
lex_addch(ch, file); lex_addch(ch, file);
ch = lex_getsource(file); ch = lex_getsource(file);
} }