Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* cmapdump.c -- parse a CMap file and dump it as a c-struct */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. #include "fitz.h"
  7. #include "mupdf.h"
  8.  
  9. #include "../fitz/base_error.c"
  10. #include "../fitz/base_memory.c"
  11. #include "../fitz/base_string.c"
  12. #include "../fitz/stm_buffer.c"
  13. #include "../fitz/stm_open.c"
  14. #include "../fitz/stm_read.c"
  15.  
  16. #include "../pdf/pdf_lex.c"
  17. #include "../pdf/pdf_cmap.c"
  18. #include "../pdf/pdf_cmap_parse.c"
  19.  
  20. static void
  21. clean(char *p)
  22. {
  23.         while (*p)
  24.         {
  25.                 if ((*p == '/') || (*p == '.') || (*p == '\\') || (*p == '-'))
  26.                         *p = '_';
  27.                 p ++;
  28.         }
  29. }
  30.  
  31. int
  32. main(int argc, char **argv)
  33. {
  34.         pdf_cmap *cmap;
  35.         fz_error error;
  36.         fz_stream *fi;
  37.         FILE *fo;
  38.         char name[256];
  39.         char *realname;
  40.         int i, k;
  41.  
  42.         if (argc < 3)
  43.         {
  44.                 fprintf(stderr, "usage: cmapdump output.c lots of cmap files\n");
  45.                 return 1;
  46.         }
  47.  
  48.         fo = fopen(argv[1], "wb");
  49.         if (!fo)
  50.         {
  51.                 fprintf(stderr, "cmapdump: could not open output file '%s'\n", argv[1]);
  52.                 return 1;
  53.         }
  54.  
  55.         fprintf(fo, "/* This is an automatically generated file. Do not edit. */\n");
  56.  
  57.         for (i = 2; i < argc; i++)
  58.         {
  59.                 realname = strrchr(argv[i], '/');
  60.                 if (!realname)
  61.                         realname = strrchr(argv[i], '\\');
  62.                 if (realname)
  63.                         realname ++;
  64.                 else
  65.                         realname = argv[i];
  66.  
  67.                 if (strlen(realname) > (sizeof name - 1))
  68.                 {
  69.                         fprintf(stderr, "cmapdump: file name too long\n");
  70.                         return 1;
  71.                 }
  72.  
  73.                 strcpy(name, realname);
  74.                 clean(name);
  75.  
  76.                 fi = fz_open_file(argv[i]);
  77.                 if (!fi)
  78.                         fz_throw("cmapdump: could not open input file '%s'\n", argv[i]);
  79.  
  80.                 error = pdf_parse_cmap(&cmap, fi);
  81.                 if (error)
  82.                 {
  83.                         fz_catch(error, "cmapdump: could not parse input cmap '%s'\n", argv[i]);
  84.                         return 1;
  85.                 }
  86.  
  87.                 fprintf(fo, "\n/* %s */\n\n", cmap->cmap_name);
  88.  
  89.                 fprintf(fo, "static const pdf_range cmap_%s_ranges[] = {", name);
  90.                 if (cmap->rlen == 0)
  91.                 {
  92.                         fprintf(fo, " {0,%d,0}", PDF_CMAP_RANGE);
  93.                 }
  94.                 for (k = 0; k < cmap->rlen; k++)
  95.                 {
  96.                         if (k % 4 == 0)
  97.                                 fprintf(fo, "\n");
  98.                         fprintf(fo, "{%d,%d,%d},",
  99.                                 cmap->ranges[k].low, cmap->ranges[k].extent_flags, cmap->ranges[k].offset);
  100.                 }
  101.                 fprintf(fo, "\n};\n\n");
  102.  
  103.                 if (cmap->tlen == 0)
  104.                 {
  105.                         fprintf(fo, "static const unsigned short cmap_%s_table[] = { 0 };\n\n", name);
  106.                 }
  107.                 else
  108.                 {
  109.                         fprintf(fo, "static const unsigned short cmap_%s_table[%d] = {",
  110.                                 name, cmap->tlen);
  111.                         for (k = 0; k < cmap->tlen; k++)
  112.                         {
  113.                                 if (k % 12 == 0)
  114.                                         fprintf(fo, "\n");
  115.                                 fprintf(fo, "%d,", cmap->table[k]);
  116.                         }
  117.                         fprintf(fo, "\n};\n\n");
  118.                 }
  119.  
  120.                 fprintf(fo, "static pdf_cmap cmap_%s = {\n", name);
  121.                 fprintf(fo, "\t-1, ");
  122.                 fprintf(fo, "\"%s\", ", cmap->cmap_name);
  123.                 fprintf(fo, "\"%s\", 0, ", cmap->usecmap_name);
  124.                 fprintf(fo, "%d, ", cmap->wmode);
  125.                 fprintf(fo, "%d,\n\t{ ", cmap->codespace_len);
  126.                 if (cmap->codespace_len == 0)
  127.                 {
  128.                         fprintf(fo, "{0,0,0},");
  129.                 }
  130.                 for (k = 0; k < cmap->codespace_len; k++)
  131.                 {
  132.                         fprintf(fo, "{%d,%d,%d},",
  133.                                 cmap->codespace[k].n, cmap->codespace[k].low, cmap->codespace[k].high);
  134.                 }
  135.                 fprintf(fo, " },\n");
  136.  
  137.                 fprintf(fo, "\t%d, %d, (pdf_range*) cmap_%s_ranges,\n",
  138.                         cmap->rlen, cmap->rlen, name);
  139.  
  140.                 fprintf(fo, "\t%d, %d, (unsigned short*) cmap_%s_table,\n",
  141.                         cmap->tlen, cmap->tlen, name);
  142.  
  143.                 fprintf(fo, "};\n");
  144.  
  145.                 printf("\t{\"%s\",&cmap_%s},\n", cmap->cmap_name, name);
  146.  
  147.                 fz_close(fi);
  148.         }
  149.  
  150.         if (fclose(fo))
  151.         {
  152.                 fprintf(stderr, "cmapdump: could not close output file '%s'\n", argv[1]);
  153.                 return 1;
  154.         }
  155.  
  156.         return 0;
  157. }
  158.