% txt2zlib.w % Copyright 2010 Taco Hoekwater % Copyright 2010 Hartmut Henkel % This file is part of LuaTeX. % LuaTeX is free software; you can redistribute it and/or modify it under % the terms of the GNU General Public License as published by the Free % Software Foundation; either version 2 of the License, or (at your % option) any later version. % LuaTeX is distributed in the hope that it will be useful, but WITHOUT % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or % FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public % License for more details. % You should have received a copy of the GNU General Public License along % with LuaTeX; if not, see . % $Id: txt2zlib.w 3937 2010-11-01 21:58:54Z hhenkel $ % $URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.70.1/source/texk/web2c/luatexdir/luascripts/txt2zlib.w $ @ @c #include #include #include #include #define INBUFINITLEN 10 #define LINELEN 16 char header[] = " Copyright 2010 Taco Hoekwater \n" " Copyright 2010 Hartmut Henkel \n" "\n" " This file is part of LuaTeX.\n" "\n" " LuaTeX is free software; you can redistribute it and/or modify it under\n" " the terms of the GNU General Public License as published by the Free\n" " Software Foundation; either version 2 of the License, or (at your\n" " option) any later version.\n" "\n" " LuaTeX is distributed in the hope that it will be useful, but WITHOUT\n" " ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n" " FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public\n" " License for more details.\n" "\n" " You should have received a copy of the GNU General Public License along\n" " with LuaTeX; if not, see ."; #define NAMELEN 100 int main(int argc, char *argv[]) { int i, j, c, err; Byte *inbuf = NULL, *outbuf; FILE *fin, *fout; char ptrname[NAMELEN]; uLong inbuflen, uncomprLen = 0, outbuflen, comprLen; if (argc != 3) { fprintf(stderr, "%s: need exactly two arguments (input file name, output file name).\n", argv[0]); exit(EXIT_FAILURE); } fin = fopen(argv[1], "r"); if (fin == NULL) { fprintf(stderr, "%s: can't open %s for reading.\n", argv[0], argv[1]); exit(EXIT_FAILURE); } fout = fopen(argv[2], "w"); if (fout == NULL) { fprintf(stderr, "%s: can't open %s for writing.\n", argv[0], argv[2]); exit(EXIT_FAILURE); } if ((inbuf = malloc(INBUFINITLEN * sizeof(Byte))) == NULL) exit(EXIT_FAILURE); inbuflen = INBUFINITLEN; while ((c = fgetc(fin)) != EOF) { if (uncomprLen == inbuflen - 1) { inbuflen = (uLong) ((double) inbuflen * 1.5 + 1); if ((inbuf = realloc(inbuf, inbuflen)) == NULL) exit(EXIT_FAILURE); } inbuf[uncomprLen] = (Byte) c; uncomprLen++; } outbuflen = comprLen = (uLong) ((double) uncomprLen * 1.1 + 50); if ((outbuf = malloc(outbuflen * sizeof(Byte))) == NULL) exit(EXIT_FAILURE); err = compress(outbuf, &comprLen, inbuf, uncomprLen); if (err != Z_OK) { fprintf(stderr, "compress error: %d\n", err); exit(EXIT_FAILURE); } fprintf(fout, "/* %s\n\n", argv[2]); fprintf(fout, "%s */\n\n", header); fprintf(fout, "#include \"ptexlib.h\"\n\n"); fprintf(fout, "static const Byte compr[%ld] = {\n", comprLen); for (i = 0, j = 0; (uLong) i < comprLen; i++) { if (j == 0) fprintf(fout, " "); fprintf(fout, "0x%02x", outbuf[i]); if ((uLong) i < comprLen - 1) { fprintf(fout, ","); if (j == LINELEN - 1) { fprintf(fout, "\n"); j = 0; } else { fprintf(fout, " "); j++; } } } fprintf(fout, "\n};\n\n"); strncpy(ptrname, argv[2], NAMELEN - 20); for (i = (int) strlen(ptrname) - 1; i > 0; i--) { if (ptrname[i] == '.') { ptrname[i] = '\0'; break; } } strcat(ptrname, "_zlib_struct_ptr"); fprintf(fout, "static const zlib_struct compr_struct = { %ld, %ld, compr };\n\n", uncomprLen, comprLen); fprintf(fout, "const zlib_struct *%s = &compr_struct;\n", ptrname); fclose(fin); fclose(fout); return EXIT_SUCCESS; }