#include <stdlib.h> //exit
#include <unistd.h> //chdir
#include <dirent.h> //opendir
+
+#include "parser.tab.h"
/* Public */
int scanner_init(void);
int scanner(void);
int dredge_current_depth(void);
extern //lexer.c
struct dirent* lexer_direntpa[];
-extern //main.c
+extern //SRC_DIR/bin/tools/apc.c
const char* cargs['Z'];
struct dirlist
Returns the number of elements added to the lexer's file array.
*/
int scanner
-#define S(S)#S //stringifier
-#define ERR_CHILD "Fatal: Maximum of " S(DL_CD_STACKSIZE) \
+#define $($)#$ //stringifier
+#define ERR_CHILD "Fatal: Maximum of " $(DL_CD_STACKSIZE) \
" child directories exceeded for directory at depth %i\n" \
,DL_LEN()
-#define ERR_DEPTH "Fatal: Maximum directory depth of " S(DL_STACKSIZE) \
+#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, 0 //TODO
#define TOK_CLCLOSE 0x56, 0 //TODO
()
{ struct dirent* direntp;
+ struct DIR* DIRp;
parse:
if (DL_CD_LEN() >= DL_CD_STACKSIZE)//fail if maxchildren exceeded
{ fprintf(stderr, ERR_CHILD);
goto fail;
}
if (DL_CD_LEN() > 0) //There are entities to process at this depth
- { if (direntp = DL_CD_POP()) //If the dirent is null, the library
+ { 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
if (DL_LEN() >= DL_STACKSIZE) //fail if maxdepth exceeded
}
if (chdir(direntp->d_name)) //move into the new directory
goto libfail;
- if (DL_PUSH(opendir(CWDSTR))) //open the cwd
- goto libfail;
+ DL_PUSH(opendir(CWDSTR));
+ if (DL_CURDIR() == NULL) //open the cwd
+ { printf("DL_PUSH(opendir failed.\n");
+ goto libfail;
+ }
lexer_pushtok(TOK_CLOPEN); //Push "Open Directory" token
return dredge_current_depth(); //Filter and sort the current depth
}