X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fscanner.c;h=a999c7b9e40d6a3cff1b0079c4dac142d5852f1e;hp=86c096ee765119fe820b6cab654a557636d32e54;hb=89094ec20ef408709bf9f211c2f5a75814e363da;hpb=97a435e4c7260df6d76612228010e278c612cf56 diff --git a/src/apc/scanner.c b/src/apc/scanner.c index 86c096e..a999c7b 100644 --- a/src/apc/scanner.c +++ b/src/apc/scanner.c @@ -19,12 +19,15 @@ #include //exit #include //chdir #include //opendir - +/* Libs */ +#include +/* Internal */ #include "parser.tab.h" /* Public */ int scanner_init(void); void scanner_quit(void); int scanner(void); +int scanner_scanpixels(int*,int); /* Private */ #ifndef DL_STACKSIZE #define DL_STACKSIZE 64 @@ -110,8 +113,7 @@ void scanner_quit array, while placing all subdirectory entries in the current depth's child directory stack to be scanned later. - Returns the number of elements added to the lexer's file array, or -1 on - error + Returns the number of tokens generated on success, -1 on error. */ int scanner #define $($)#$ //stringifier @@ -121,12 +123,11 @@ int scanner #define ERR_DEPTH "Fatal: Maximum directory depth of " $(DL_STACKSIZE) \ " exceeded during directory scan\n" #define ERR_DL "Fatal: Directory List Stack Corruption %x\n", DL_LEN() -#define TOK_CLOPEN 0x55, 1 //TODO -#define TOK_CLCLOSE 0x56, 1 //TODO () { struct dirent* direntp; struct DIR* DIRp; - parse: + int ntok = 0; + scan: if (DL_CD_LEN() >= DL_CD_STACKSIZE)//fail if maxchildren exceeded { fprintf(stderr, ERR_CHILD); goto fail; @@ -134,7 +135,7 @@ int scanner if (DL_CD_LEN() > 0) //There are entities to process { if ((direntp = DL_CD_POP()) == NULL)//If the dirent is null, the library goto libfail; //function in dirent has failed - lexer_lex(direntp->d_name); //lex the directory name + ntok += lexer_lex(direntp->d_name); //lex the directory name if (DL_LEN() >= DL_STACKSIZE) //fail if maxdepth exceeded { fprintf(stderr, ERR_DEPTH); goto fail; @@ -144,23 +145,27 @@ int scanner DL_PUSH(opendir(CWDSTR)); if (DL_CURDIR() == NULL) //open the cwd goto libfail; - lexer_pushtok(TOK_CLOPEN); //Push "Open Directory" token + lexer_pushtok(CLOPEN, 0); //Push "Open Directory" token + ntok++; return dredge_current_depth(); //Filter and sort the current depth } else if (DL_LEN() >= 0) //Any dirs left? (Including root) { if (closedir(DL_POP())) //close the directory we just left goto libfail; if (DL_LEN() == -1) //If we just popped root, - return 0; //we're done - lexer_pushtok(TOK_CLCLOSE); //Else push "Close Directory" token, + goto done; //we're done + lexer_pushtok(CLCLOSE, 0); //Else push "Close Directory" token, + ntok++; if (!chdir("..")) //move up a directory and - goto parse; //start over + goto scan; //start over } fprintf(stderr, ERR_DL); libfail: perror("parsedir"); fail: - exit(EXIT_FAILURE); + return -1; + done: + return ntok; } /* Directory Entity Sort and Filter (Dredge) @@ -172,7 +177,7 @@ int scanner Returns -1 if 'readdir' encounters an error, otherwise returns the number of directory entries sent to the external 'lexer_direntpa' array. */ -typedef +typedef //so we can typecast dirent's 'alphasort()' to take const void*s int (*qcomp)(const void*, const void*); static inline int dredge_current_depth @@ -209,3 +214,18 @@ int dredge_current_depth } +/* Scan Pixels + Scans up to 'len' pixels from the current file into 'buf'. + Returns the number of pixels scanned from the file, or -1 on error. +*/ +int scanner_scanpixels +( int* buf, + int x +) +{ int pixels = 0; + //Open the current file if not yet open + //Identify file type + //Verify file contents and header + //Read pixels into buffer + return pixels; +}