Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include <inttypes.h>
  2. #include <stdio.h>
  3.  
  4. #include <parserutils/charset/utf8.h>
  5. #include <parserutils/input/inputstream.h>
  6.  
  7. #include <libcss/libcss.h>
  8.  
  9. #include "charset/detect.h"
  10. #include "utils/utils.h"
  11.  
  12. #include "lex/lex.h"
  13.  
  14. #include "testutils.h"
  15.  
  16. #define ITERATIONS (1)
  17. #define DUMP_TOKENS (0)
  18.  
  19.  
  20. static void *myrealloc(void *data, size_t len, void *pw)
  21. {
  22.         UNUSED(pw);
  23.  
  24.         return realloc(data, len);
  25. }
  26.  
  27. static void printToken(const css_token *token)
  28. {
  29. #if !DUMP_TOKENS
  30.         UNUSED(token);
  31. #else
  32.         printf("[%d, %d] : ", token->line, token->col);
  33.  
  34.         switch (token->type) {
  35.         case CSS_TOKEN_IDENT:
  36.                 printf("IDENT(%.*s)",
  37.                                 (int) token->data.len, token->data.data);
  38.                 break;
  39.         case CSS_TOKEN_ATKEYWORD:
  40.                 printf("ATKEYWORD(%.*s)",
  41.                                 (int) token->data.len, token->data.data);
  42.                 break;
  43.         case CSS_TOKEN_STRING:
  44.                 printf("STRING(%.*s)",
  45.                                 (int) token->data.len, token->data.data);
  46.                 break;
  47.         case CSS_TOKEN_INVALID_STRING:
  48.                 printf("INVALID(%.*s)",
  49.                                 (int) token->data.len, token->data.data);
  50.                 break;
  51.         case CSS_TOKEN_HASH:
  52.                 printf("HASH(%.*s)",
  53.                                 (int) token->data.len, token->data.data);
  54.                 break;
  55.         case CSS_TOKEN_NUMBER:
  56.                 printf("NUMBER(%.*s)",
  57.                                 (int) token->data.len, token->data.data);
  58.                 break;
  59.         case CSS_TOKEN_PERCENTAGE:
  60.                 printf("PERCENTAGE(%.*s)",
  61.                                 (int) token->data.len, token->data.data);
  62.                 break;
  63.         case CSS_TOKEN_DIMENSION:
  64.                 printf("DIMENSION(%.*s)",
  65.                                 (int) token->data.len, token->data.data);
  66.                 break;
  67.         case CSS_TOKEN_URI:
  68.                 printf("URI(%.*s)", (int) token->data.len, token->data.data);
  69.                 break;
  70.         case CSS_TOKEN_UNICODE_RANGE:
  71.                 printf("UNICODE-RANGE(%.*s)",
  72.                                 (int) token->data.len, token->data.data);
  73.                 break;
  74.         case CSS_TOKEN_CDO:
  75.                 printf("CDO");
  76.                 break;
  77.         case CSS_TOKEN_CDC:
  78.                 printf("CDC");
  79.                 break;
  80.         case CSS_TOKEN_S:
  81.                 printf("S");
  82.                 break;
  83.         case CSS_TOKEN_COMMENT:
  84.                 printf("COMMENT(%.*s)", (int) token->data.len, token->data.data);
  85.                 break;
  86.         case CSS_TOKEN_FUNCTION:
  87.                 printf("FUNCTION(%.*s)",
  88.                                 (int) token->data.len, token->data.data);
  89.                 break;
  90.         case CSS_TOKEN_INCLUDES:
  91.                 printf("INCLUDES");
  92.                 break;
  93.         case CSS_TOKEN_DASHMATCH:
  94.                 printf("DASHMATCH");
  95.                 break;
  96.         case CSS_TOKEN_PREFIXMATCH:
  97.                 printf("PREFIXMATCH");
  98.                 break;
  99.         case CSS_TOKEN_SUFFIXMATCH:
  100.                 printf("SUFFIXMATCH");
  101.                 break;
  102.         case CSS_TOKEN_SUBSTRINGMATCH:
  103.                 printf("SUBSTRINGMATCH");
  104.                 break;
  105.         case CSS_TOKEN_CHAR:
  106.                 printf("CHAR(%.*s)", (int) token->data.len, token->data.data);
  107.                 break;
  108.         case CSS_TOKEN_EOF:
  109.                 printf("EOF");
  110.                 break;
  111.  
  112.         case CSS_TOKEN_LAST_INTERN_LOWER:
  113.         case CSS_TOKEN_LAST_INTERN:
  114.                 break;
  115.         }
  116.  
  117.         printf("\n");
  118. #endif
  119. }
  120.  
  121. int main(int argc, char **argv)
  122. {
  123.         parserutils_inputstream *stream;
  124.         css_lexer *lexer;
  125.         FILE *fp;
  126.         size_t len;
  127. #define CHUNK_SIZE (4096)
  128.         uint8_t buf[CHUNK_SIZE];
  129.         css_token *tok;
  130.         css_error error;
  131.         int i;
  132.  
  133.         if (argc != 2) {
  134.                 printf("Usage: %s <filename>\n", argv[0]);
  135.                 return 1;
  136.         }
  137.  
  138.         for (i = 0; i < ITERATIONS; i++) {
  139.                 assert(parserutils_inputstream_create("UTF-8",
  140.                         CSS_CHARSET_DICTATED,css__charset_extract,
  141.                         (parserutils_alloc) myrealloc, NULL, &stream) ==
  142.                         PARSERUTILS_OK);
  143.  
  144.                 assert(css__lexer_create(stream, myrealloc, NULL, &lexer) ==
  145.                         CSS_OK);
  146.  
  147.                 fp = fopen(argv[1], "rb");
  148.                 if (fp == NULL) {
  149.                         printf("Failed opening %s\n", argv[1]);
  150.                         return 1;
  151.                 }
  152.  
  153.                 fseek(fp, 0, SEEK_END);
  154.                 len = ftell(fp);
  155.                 fseek(fp, 0, SEEK_SET);
  156.  
  157.                 while (len >= CHUNK_SIZE) {
  158.                         size_t read = fread(buf, 1, CHUNK_SIZE, fp);
  159.                         assert(read == CHUNK_SIZE);
  160.  
  161.                         assert(parserutils_inputstream_append(stream,
  162.                                         buf, CHUNK_SIZE) == PARSERUTILS_OK);
  163.  
  164.                         len -= CHUNK_SIZE;
  165.  
  166.                         while ((error = css__lexer_get_token(lexer, &tok)) ==
  167.                                         CSS_OK) {
  168.                                 printToken(tok);
  169.  
  170.                                 if (tok->type == CSS_TOKEN_EOF)
  171.                                         break;
  172.                         }
  173.                 }
  174.  
  175.                 if (len > 0) {
  176.                         size_t read = fread(buf, 1, len, fp);
  177.                         assert(read == len);
  178.  
  179.                         assert(parserutils_inputstream_append(stream,
  180.                                         buf, len) == PARSERUTILS_OK);
  181.  
  182.                         len = 0;
  183.                 }
  184.  
  185.                 fclose(fp);
  186.  
  187.                 assert(parserutils_inputstream_append(stream, NULL, 0) ==
  188.                                 PARSERUTILS_OK);
  189.  
  190.                 while ((error = css__lexer_get_token(lexer, &tok)) == CSS_OK) {
  191.                         printToken(tok);
  192.  
  193.                         if (tok->type == CSS_TOKEN_EOF)
  194.                                 break;
  195.                 }
  196.  
  197.                 css__lexer_destroy(lexer);
  198.  
  199.                 parserutils_inputstream_destroy(stream);
  200.         }
  201.  
  202.         printf("PASS\n");
  203.  
  204.         return 0;
  205. }
  206.  
  207.