1/*
2  Copyright (c) 1990-2002 Info-ZIP.  All rights reserved.
3
4  See the accompanying file LICENSE, version 2000-Apr-09 or later
5  (the contents of which are also included in unzip.h) for terms of use.
6  If, for some reason, all these files are missing, the Info-ZIP license
7  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
8*/
9/* Write out a fragment of assembly source giving offsets in "Uz_Globs"
10 * and "struct huft":
11 */
12
13#define UNZIP_INTERNAL
14#include "unzip.h"
15#include "crypt.h"
16
17#ifndef REENTRANT
18  Uz_Globs G;
19#endif
20
21static int asm_setflag(const char *flagname);
22static int ccp_setflag(const char *flagname);
23
24static int asm_setflag(const char *flagname)
25{
26    static const char asm_flagdef[] = "%-15s EQU     1\n";
27    return printf(asm_flagdef, flagname);
28}
29static int ccp_setflag(const char *flagname)
30{
31    static const char ccp_flagdef[] = "#ifndef %s\n#  define %s\n#endif\n";
32    return printf(ccp_flagdef, flagname, flagname);
33}
34
35int main(argc, argv)
36    int argc;
37    char **argv;
38{
39#ifdef REENTRANT
40    Uz_Globs *pG = NULL;
41#endif
42    struct huft *t = NULL;
43    static const char asm_offsdef[] = "%-15s EQU     %lu\n";
44    static const char ccp_offsdef[] = "#define %-15s %lu\n";
45
46    const char *out_format;
47    int (*set_flag)(const char *flagname);
48    int ccp_select = 0;
49
50    if (argc > 1 && argv[1] != NULL && !strcmp(argv[1], "-ccp"))
51      ccp_select = 1;
52
53    if (ccp_select) {
54        out_format = ccp_offsdef;
55        set_flag = ccp_setflag;
56    } else {
57        out_format = asm_offsdef;
58        set_flag = asm_setflag;
59    }
60
61    printf(out_format, "h_e", (ulg)&t->e - (ulg)t);
62    printf(out_format, "h_b", (ulg)&t->b - (ulg)t);
63    printf(out_format, "h_v_n", (ulg)&t->v.n - (ulg)t);
64    printf(out_format, "h_v_t", (ulg)&t->v.t - (ulg)t);
65    printf(out_format, "SIZEOF_huft", (ulg)sizeof(struct huft));
66
67    printf(out_format, "bb", (ulg)&G.bb - (ulg)&G);
68    printf(out_format, "bk", (ulg)&G.bk - (ulg)&G);
69    printf(out_format, "wp", (ulg)&G.wp - (ulg)&G);
70#ifdef FUNZIP
71    printf(out_format, "in", (ulg)&G.in - (ulg)&G);
72#else
73    printf(out_format, "incnt", (ulg)&G.incnt - (ulg)&G);
74    printf(out_format, "inptr", (ulg)&G.inptr - (ulg)&G);
75    printf(out_format, "csize", (ulg)&G.csize - (ulg)&G);
76    printf(out_format, "mem_mode", (ulg)&G.mem_mode - (ulg)&G);
77#endif
78    printf(out_format, "redirslide", (ulg)&redirSlide - (ulg)&G);
79    printf(out_format, "SIZEOF_slide", (ulg)sizeof(redirSlide));
80#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
81    printf(out_format, "_wsize", (ulg)&G._wsize - (ulg)&G);
82#endif /* DLL && !NO_SLIDE_REDIR */
83    printf(out_format, "CRYPT", (ulg)CRYPT);
84#ifdef FUNZIP
85    (*set_flag)("FUNZIP");
86#endif
87#ifdef SFX
88    (*set_flag)("SFX");
89#endif
90#ifdef REENTRANT
91    (*set_flag)("REENTRANT");
92#endif
93#ifdef DLL
94    (*set_flag)("DLL");
95# ifdef NO_SLIDE_REDIR
96    (*set_flag)("NO_SLIDE_REDIR");
97# endif
98#endif
99#ifdef USE_DEFLATE64
100    (*set_flag)("USE_DEFLATE64");
101#endif
102
103    return 0;
104}
105