% txt2zlib.w

% Copyright 2010 Taco Hoekwater <taco@@luatex.org>
% Copyright 2010 Hartmut Henkel <hartmut@@luatex.org>

% 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 <http://www.gnu.org/licenses/>.

% $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<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<zlib.h>

#define INBUFINITLEN 10
#define LINELEN 16

char header[] =
   "   Copyright 2010 Taco Hoekwater <taco@@luatex.org>\n"
   "   Copyright 2010 Hartmut Henkel <hartmut@@luatex.org>\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 <http://www.gnu.org/licenses/>.";

#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;
}