comments updated
[henge/apc.git] / src / scanner.c
index abf472e..0b733c8 100644 (file)
 /* Internal */
 #include "parser.tab.h"
 /* Public */
-int   scanner_init(void);
 void  scanner_quit(void);
-int   scanner_scanpath(char const*);
 int   scanner_scandir(DIR*);
-yypstate* apc_pstate;
-yycstate* apc_cstate;
 /* Private */
+static
+int   scanner_scandir_r(DIR*);
+extern //lexer.rl
+int   lexer_init(void);
+extern //lexer.rl
+void  lexer_quit(void);
 extern //lexer.rl
 int   lexer_lexfile(uint8_t*);
 extern //lexer.rl
@@ -38,52 +40,23 @@ int   lexer_lexdir(uint8_t*);
 extern //lexer.rl
 void  lexer_closedir(void);
 
-/* Init
-   Establishes yy states
-*/
-int scanner_init
-( void )
-{ if (apc_pstate != NULL || apc_cstate != NULL)
-    scanner_quit();
-  apc_pstate = yypstate_new();
-  apc_cstate = yycstate_new();
-  return (apc_pstate == NULL || apc_cstate == NULL);
-}
-
-/* Quit
-   Free initialized memory
-*/
-void scanner_quit
-( void )
-{ yypstate_delete(apc_pstate);
-  yycstate_delete(apc_cstate);
-  apc_pstate = NULL;
-  apc_cstate = NULL;
-}
-
-/* Scan the provided path
-   Changes working directory to the provided pathname and, if successful, sends
-   a directory stream of the provided path to scanner_scandir
-*/
-int scanner_scanpath
-( char const* pathname )
-{ DIR* dirp;
-  errno = 0;
-  if ((dirp = opendir(pathname)) == NULL || errno)
-    { fprintf(stderr, "Path %s could not be accessed\n", pathname);
-      return -1;
-    }
-  if (chdir(pathname))
-    return -1;
-  return scanner_scandir(dirp);
-}
-
 /* Scan directory stream
    Recursively scans the provided directory, sending CLOPEN and CLCLOSE tokens
    to the parser when entering new directories (classes)
 */
 int scanner_scandir
 ( DIR* dirp )
+{ int scandir_status;
+  if (lexer_init())
+    return -1;
+  scandir_status = scanner_scandir_r(dirp);
+  lexer_quit();
+  return scandir_status;
+}
+
+static
+int scanner_scandir_r
+( DIR* dirp )
 { DIR* cdirp;
   struct dirent* direntp;
  scan_next_dirent:
@@ -96,24 +69,20 @@ int scanner_scandir
        goto scan_next_dirent;
       switch (direntp->d_type)
        { case DT_REG:
-            printf("lexfile %s\n",direntp->d_name);
            lexer_lexfile((uint8_t*)direntp->d_name);
            goto scan_next_dirent;
          case DT_DIR:
            lexer_lexdir((uint8_t*)direntp->d_name);  //lex the dirname
-           printf("lexdir %s\n",direntp->d_name);
            if (chdir(direntp->d_name))    //change to the specified dir
              goto libfail;
            errno = 0;
            if ((cdirp = opendir(".")) == NULL || errno) //open it
              goto libfail;
-           printf("Scanner entered [%s]\n",direntp->d_name);
-           if(scanner_scandir(cdirp))    //scan the directory
+           if(scanner_scandir_r(cdirp))  //scan the directory
              goto libfail;
            if (chdir(".."))              //return to the parent dir
              goto libfail;
             lexer_closedir();            //push "Close Directory" token
-           printf("Scanner returned\n");
            goto scan_next_dirent;        //continue scan
           case DT_UNKNOWN:
            warnx("unknown file %s: ignoring", direntp->d_name);