scanner_scanpixels prototype
[henge/webcc.git] / src / apc / scanner.c
index c669b10..a999c7b 100644 (file)
 #include <stdlib.h> //exit
 #include <unistd.h> //chdir
 #include <dirent.h> //opendir
 #include <stdlib.h> //exit
 #include <unistd.h> //chdir
 #include <dirent.h> //opendir
-
+/* Libs */
+#include <png.h>
+/* Internal */
 #include "parser.tab.h"
 /* Public */
 #include "parser.tab.h"
 /* Public */
-int  scanner_init(void);
-void scanner_quit(void);
-int  scanner(void);
+int   scanner_init(void);
+void  scanner_quit(void);
+int   scanner(void);
+int   scanner_scanpixels(int*,int);
 /* Private */
 #ifndef DL_STACKSIZE
 #define DL_STACKSIZE     64
 /* 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.
 
    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
@@ -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 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;
 ()
 { 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;
@@ -134,8 +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
   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
-      printf("Lexdir %s\n",direntp->d_name);
-      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;
@@ -145,23 +145,27 @@ int scanner
       DL_PUSH(opendir(CWDSTR));
       if (DL_CURDIR() == NULL)            //open the cwd
        goto libfail;
       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 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
       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)
@@ -173,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.
 */
    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
@@ -209,3 +213,19 @@ int dredge_current_depth
   return DPS_LEN();
 }
 
   return DPS_LEN();
 }
 
+
+/* 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;
+}