X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Flexer.c;fp=src%2Fapc%2Flexer.c;h=f11c6a21d1736743b9059aa0e9fa110c1e353654;hp=940ee8163968151c90e9ec508e81ba722265ad3b;hb=0f505368fa8abbc2e9ab0296b9a5e6bd4869345f;hpb=df52756177b6e4fd9465cbb1b17a35eb48bb67c9 diff --git a/src/apc/lexer.c b/src/apc/lexer.c index 940ee81..f11c6a2 100644 --- a/src/apc/lexer.c +++ b/src/apc/lexer.c @@ -14,12 +14,22 @@ /* Standard */ #include #include +#include #include /* Posix */ #include +#include +#include +#include +#include +#include #include #include //realpath, NAME_MAX, PATH_MAX #include +/* Redefinitions of NAME_MAX and PATH_MAX */ +//#define NAME_MAX NAME_MAX/4 +//#define PATH_MAX PATH_MAX/4 + /* Local */ #include "parser.tab.h" #ifndef DE_STACKSIZE @@ -28,16 +38,21 @@ #ifndef TK_STACKSIZE #define TK_STACKSIZE 1024 #endif +#ifndef MAX_SETNAME_LEN //max setname length +#define MAX_SETNAME_LEN 32 +#endif + /* Public */ int lexer_init(void); int lexer(void); -int lexer_lexfile(const char*); +int lexer_lexfile(const uint8_t*); void lexer_pushtok(int, YYSTYPE); -char const* lexer_get_current_filepath(void); +uint8_t const* lexer_get_current_filepath(void); +int lexer_lexfilename(uint8_t*); struct dirent* lexer_direntpa[DE_STACKSIZE],** lexer_direntpp,** lexer_direntpb; /* Private */ -extern //lexer_lex.rl -int lexer_lex(const char*); +extern //lexer_fsm.rl +int lexer_lexstring(uint8_t*, int); extern //scanner.c int scanner_init(void); extern //scanner.c @@ -47,7 +62,7 @@ int dredge_current_depth(void); extern //bison YYSTYPE yylval; static -char const* current_filename; +uint8_t const* current_filename; static struct tok { YYSTYPE lval; //token val @@ -91,7 +106,6 @@ int lexer_init () { TK_INIT(); DE_INIT(); - current_filename = NULL; return scanner_init(); } @@ -113,10 +127,12 @@ int lexer } while (0) () { struct tok token; - start: - while (DE_LEN() > 0) //lex any directory entries in our stack - if (lexer_lexfile(DE_POP()->d_name) == 0) - FAIL("Lexer failed to tokenize [%s]\n",(*DE_STACKB)->d_name); + start: + while (DE_LEN() > 0)//lex any directory entries in our stack + { + if (lexer_lexfile(DE_POP()->d_name) == 0) + FAIL("Lexer failed to tokenize [%s]\n",(*DE_STACKB)->d_name); + } if (TK_EMPTY) //if there are no tokens, { TK_INIT(); //initialize the token stack back to 0 switch (scanner()) @@ -156,37 +172,133 @@ void lexer_pushtok */ int lexer_lexfile #define HIDDEN_WARNING "%s is hidden and will not be parsed!\n", filename -( const char *filename +( const uint8_t *filename ) -{ static char fname[NAME_MAX]; - char *last_period = NULL, *iter; +{ static uint8_t fname[NAME_MAX]; + uint8_t *last_period = NULL, *iter; - if (*filename == '.') + if (*filename == '.') { fprintf (stderr, HIDDEN_WARNING); return 0; } /* Copy the filename and remove its suffix */ - strncpy(fname,filename,NAME_MAX); + u8_strncpy(fname,filename,NAME_MAX); last_period = NULL; for (iter = fname; *iter; iter++) //find the last '.' char - if (*iter == '.') + if (*iter == '.') last_period = iter; if (last_period) //if we found one, - *last_period = '\0'; //truncate the string there + *last_period = 0; //truncate the string there /* Register the current_filename */ current_filename = filename; - return lexer_lex(fname); + return lexer_lexfilename(fname); } -char const* lexer_get_current_filepath +uint8_t const* lexer_get_current_filepath () -{ static char current_path[PATH_MAX]; - static char const* last_filename; +{ static uint8_t current_path[PATH_MAX]; + static uint8_t const* last_filename; if ((!last_filename || last_filename != current_filename) && - (realpath(current_filename, current_path) != current_path)) + (realpath(current_filename, current_path) != (char*) current_path)) { perror("realpath: "); return NULL; } return (const char*)current_path; } + +/* Scan filename and push the its tokens + onto the stack */ +int lexer_lexfilename +(uint8_t* str) +{ + int ntok, i, cmp, len, set_len, height, width; + char map_key[] = "_m_"; + static uint8_t set_name[MAX_SETNAME_LEN] = {0}; + uint8_t *first, *map_begin; + + printf("Starting lexerfilename on %s\n", str); + + + if(*str == 0) + printf("Lexfilename:: str is NULL so fail\n"); + printf("setname is %s\n", set_name); + + /* If last file was a mapfile, then its 5th to last token should + be a MOPEN. If this is the case, then we only pass MOPEN, height, + weight and name of the current file. */ + if( (TK_STACKX - 5)->tok_t == MOPEN ) + { printf("The last file was a mapfile\n"); + if( (map_begin = strstr(map_key, str)) ) //if the current file is a mapfile + { printf("The current file is a variant of the last mapfile\n"); + printf("Start lexing mapfile %s\n", str); + ntok += lexer_lexstring(map_begin, strlen(map_begin)); + } + printf("Current file is not a variant of the last mapfile\n"); + } + else //last file was not a mapfile + { printf("Last file was not a mapfile\n"); + + first = (uint8_t*) u8_strchr(str, '_'); //find the first '_' to find where str set_name ends + + if(set_name[0] != 0) //if there is a set_name from last str + { printf("There is a set_name (%s) present\n", set_name); + set_len = first - str; + + if(u8_strncmp(str, set_name, set_len) == 0) //check if it matches the current set_name + { str = str + set_len + 1; //if so, remove it from str + printf("str set_name matched last set_name, set str to %s\n", str); + } + else //update set_name to be str set_name + { u8_cpy(set_name, str, set_len); + set_name[set_len] = 0; + + } + } + else //set set_name + { u8_cpy(set_name, str, first-str); + } + /* Call lexer_lexstring to tokenize the string */ + printf("calling lexstring to tokenize str (%s) of len %d\n", str, u8_strlen(str)); + ntok += lexer_lexstring(str, u8_strlen(str)); + } + + /*TODO: if regfile, store full path for later */ + + printf("Ending lexer_lex on %s, %d tokens were lexed\n", str, ntok); + return ntok; +} + +/* int lexer_lexmapfile */ +/* #define INC_X() */ +/* (int height, int width) */ +/* { */ +/* int x, y; */ + +/* /\* Give scanner_scanpixels a buffer and a len. Iterate through */ +/* buf with buf[n]. If n == 0, do nothing. if n has a value, push x, */ +/* push y, push (z = n << 24), push (ref_id = n >> 8) *\/ */ +/* //scanner_scanpixels() */ + +/* for(i = 0; i < len; i++) */ +/* if(buf[i] == 0) */ +/* if(x == width) */ +/* x = 0; */ +/* else */ + + + + +/* } */ +/* fname_bytes = (uint8_t*)(DE_POP()->d_name); */ + /* printf("d_name is %s\n", fname_bytes); */ + /* for (fnp = filename, i = 0; i < NAME_MAX; i += unit_size, fnp++) */ + /* { unit_size = u8_mblen(fname_bytes + i, min(4, NAME_MAX - i)); */ + /* if (u8_mbtouc(fnp, fname_bytes + i, unit_size) == -1) //add ucs4 char to the filename */ + /* FAIL("Lexer failed to convert ^%s to unicode\n", (fname_bytes + i)); */ + /* if (*fnp == 0) //added a terminating char */ + /* break; */ + /* } */ + /* if(u8_mbtouc(filename, DE_POP()->d_name, NAME_MAX) == -1) */ + /* FAIL("Lexer failed to convert d_name into uint8_t\n"); */ + /* ulc_fprintf(stdout, "filename is %11U\n c", filename); */