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 <libcss/libcss.h>
  5. #include "stylesheet.h"
  6.  
  7. #define ITERATIONS (1)
  8. #define DUMP_CSS (1)
  9.  
  10. #if DUMP_CSS
  11. #include "dump.h"
  12. #endif
  13.  
  14. #include "testutils.h"
  15.  
  16. static void *myrealloc(void *ptr, size_t len, void *pw)
  17. {
  18.         UNUSED(pw);
  19.  
  20.         return realloc(ptr, len);
  21. }
  22.  
  23. static css_error resolve_url(void *pw,
  24.                 const char *base, lwc_string *rel, lwc_string **abs)
  25. {
  26.         UNUSED(pw);
  27.         UNUSED(base);
  28.  
  29.         /* About as useless as possible */
  30.         *abs = lwc_string_ref(rel);
  31.  
  32.         return CSS_OK;
  33. }
  34.  
  35. int main(int argc, char **argv)
  36. {
  37.         css_stylesheet_params params;
  38.         css_stylesheet *sheet;
  39.         FILE *fp;
  40.         size_t len, origlen;
  41. #define CHUNK_SIZE (4096)
  42.         uint8_t buf[CHUNK_SIZE];
  43.         css_error error;
  44.         int count;
  45.  
  46.         if (argc != 2) {
  47.                 printf("Usage: %s <filename>\n", argv[0]);
  48.                 return 1;
  49.         }
  50.  
  51.         params.params_version = CSS_STYLESHEET_PARAMS_VERSION_1;
  52.         params.level = CSS_LEVEL_21;
  53.         params.charset = "UTF-8";
  54.         params.url = argv[1];
  55.         params.title = NULL;
  56.         params.allow_quirks = false;
  57.         params.inline_style = false;
  58.         params.resolve = resolve_url;
  59.         params.resolve_pw = NULL;
  60.         params.import = NULL;
  61.         params.import_pw = NULL;
  62.         params.color = NULL;
  63.         params.color_pw = NULL;
  64.         params.font = NULL;
  65.         params.font_pw = NULL;
  66.  
  67.         for (count = 0; count < ITERATIONS; count++) {
  68.  
  69.                 assert(css_stylesheet_create(&params, myrealloc, NULL,
  70.                                 &sheet) == CSS_OK);
  71.  
  72.                 fp = fopen(argv[1], "rb");
  73.                 if (fp == NULL) {
  74.                         printf("Failed opening %s\n", argv[1]);
  75.                         return 1;
  76.                 }
  77.  
  78.                 fseek(fp, 0, SEEK_END);
  79.                 origlen = len = ftell(fp);
  80.                 fseek(fp, 0, SEEK_SET);
  81.  
  82.                 while (len >= CHUNK_SIZE) {
  83.                         size_t read = fread(buf, 1, CHUNK_SIZE, fp);
  84.                         assert(read == CHUNK_SIZE);
  85.  
  86.                         error = css_stylesheet_append_data(sheet, buf,
  87.                                         CHUNK_SIZE);
  88.                         assert(error == CSS_OK || error == CSS_NEEDDATA);
  89.  
  90.                         len -= CHUNK_SIZE;
  91.                 }
  92.  
  93.                 if (len > 0) {
  94.                         size_t read = fread(buf, 1, len, fp);
  95.                         assert(read == len);
  96.  
  97.                         error = css_stylesheet_append_data(sheet, buf, len);
  98.                         assert(error == CSS_OK || error == CSS_NEEDDATA);
  99.  
  100.                         len = 0;
  101.                 }
  102.  
  103.                 fclose(fp);
  104.  
  105.                 error = css_stylesheet_data_done(sheet);
  106.                 assert(error == CSS_OK || error == CSS_IMPORTS_PENDING);
  107.  
  108.                 while (error == CSS_IMPORTS_PENDING) {
  109.                         lwc_string *url;
  110.                         uint64_t media;
  111.  
  112.                         error = css_stylesheet_next_pending_import(sheet,
  113.                                         &url, &media);
  114.                         assert(error == CSS_OK || error == CSS_INVALID);
  115.  
  116.                         if (error == CSS_OK) {
  117.                                 css_stylesheet *import;
  118.                                 char *buf = alloca(lwc_string_length(url) + 1);
  119.  
  120.                                 memcpy(buf, lwc_string_data(url),
  121.                                                 lwc_string_length(url));
  122.                                 buf[lwc_string_length(url)] = '\0';
  123.  
  124.                                 params.url = buf;
  125.  
  126.                                 assert(css_stylesheet_create(&params,
  127.                                         myrealloc, NULL, &import) == CSS_OK);
  128.  
  129.                                 assert(css_stylesheet_data_done(import) ==
  130.                                         CSS_OK);
  131.  
  132.                                 assert(css_stylesheet_register_import(sheet,
  133.                                         import) == CSS_OK);
  134.  
  135.                                 css_stylesheet_destroy(import);
  136.  
  137.                                 error = CSS_IMPORTS_PENDING;
  138.                         }
  139.                 }
  140.  
  141. #if DUMP_CSS
  142.                 {
  143. #ifndef max
  144. #define max(a,b) ((a) > (b) ? (a) : (b))
  145. #endif
  146.                         char *out;
  147.                         size_t outsize = max(16384, origlen * 8);
  148.                         size_t outlen = outsize;
  149.                         size_t written;
  150.                         out = malloc(outsize);
  151.                         assert(out != NULL);
  152.                         dump_sheet(sheet, out, &outlen);
  153.                         written = fwrite(out, 1, outsize - outlen, stdout);
  154.                         assert(written == outsize - outlen);
  155.                         free(out);
  156.                 }
  157. #endif
  158.  
  159.                 css_stylesheet_destroy(sheet);
  160.         }
  161.  
  162.         printf("PASS\n");
  163.        
  164.         return 0;
  165. }
  166.  
  167.