scanner returns ntokens instead of placeholder of 1 now
[henge/webcc.git] / src / apc / scanner.c
index 0d51ffe..a60de18 100644 (file)
@@ -110,8 +110,7 @@ void scanner_quit
    array, while placing all subdirectory entries in the current depth's child
    directory stack to be scanned later.
 
    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
 */
 int scanner
 #define $($)#$ //stringifier
@@ -124,7 +123,8 @@ int scanner
 ()
 { struct dirent* direntp;
   struct DIR* DIRp;
 ()
 { 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;
   if (DL_CD_LEN() >= DL_CD_STACKSIZE)//fail if maxchildren exceeded
     { fprintf(stderr, ERR_CHILD);
       goto fail;
@@ -132,7 +132,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
   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;
       if (DL_LEN() >= DL_STACKSIZE)       //fail if maxdepth exceeded
         { fprintf(stderr, ERR_DEPTH);
           goto fail;
@@ -143,22 +143,26 @@ int scanner
       if (DL_CURDIR() == NULL)            //open the cwd
        goto libfail;
       lexer_pushtok(CLOPEN, 0);           //Push "Open Directory" token
       if (DL_CURDIR() == NULL)            //open the cwd
        goto libfail;
       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 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
+        goto done;                        //we're done
       lexer_pushtok(CLCLOSE, 0);          //Else push "Close Directory" token,
       lexer_pushtok(CLCLOSE, 0);          //Else push "Close Directory" token,
+      ntok++;
       if (!chdir(".."))                   //move up a directory and
       if (!chdir(".."))                   //move up a directory and
-        goto parse;                       //start over
+        goto scan;                        //start over
     }
   fprintf(stderr, ERR_DL);
  libfail:
   perror("parsedir");
  fail:
     }
   fprintf(stderr, ERR_DL);
  libfail:
   perror("parsedir");
  fail:
-  exit(EXIT_FAILURE);
+  return -1;
+ done:
+  return ntok;
 }
 
 /* Directory Entity Sort and Filter (Dredge)
 }
 
 /* Directory Entity Sort and Filter (Dredge)
@@ -170,7 +174,7 @@ int scanner
    Returns -1 if 'readdir' encounters an error, otherwise returns the number of
    directory entries sent to the external 'lexer_direntpa' array.
 */
    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
 int (*qcomp)(const void*, const void*);
 static inline
 int dredge_current_depth