~ubuntu-branches/debian/sid/upx-ucl/sid

« back to all changes in this revision

Viewing changes to src/stub/scripts/bin2h.py

  • Committer: Bazaar Package Importer
  • Author(s): Robert Luberda
  • Date: 2009-09-20 21:34:57 UTC
  • mfrom: (1.2.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20090920213457-x95n0rq823lx12sw
Tags: 3.03-3
* Upload to unstable.
* Standards-Version: 3.8.3 (no changes).
* Build with debhelper v7.
* rules: call dh_prep instead of `dh_clean -k'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
#
6
6
#  This file is part of the UPX executable compressor.
7
7
#
8
 
#  Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
 
8
#  Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer
9
9
#  All Rights Reserved.
10
10
#
11
11
#  UPX and the UCL library are free software; you can redistribute them
24
24
#  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
25
#
26
26
#  Markus F.X.J. Oberhumer              Laszlo Molnar
27
 
#  <mfx@users.sourceforge.net>          <ml1050@users.sourceforge.net>
 
27
#  <markus@oberhumer.com>               <ml1050@users.sourceforge.net>
28
28
#
29
29
 
30
30
 
49
49
    w("""\n\
50
50
   This file is part of the UPX executable compressor.
51
51
 
52
 
   Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
53
 
   Copyright (C) 1996-2007 Laszlo Molnar
54
 
   Copyright (C) 2000-2007 John F. Reiser
 
52
   Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer
 
53
   Copyright (C) 1996-2008 Laszlo Molnar
 
54
   Copyright (C) 2000-2008 John F. Reiser
55
55
   All Rights Reserved.
56
56
 
57
57
   UPX and the UCL library are free software; you can redistribute them
70
70
   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
71
71
 
72
72
   Markus F.X.J. Oberhumer              Laszlo Molnar
73
 
   <mfx@users.sourceforge.net>          <ml1050@users.sourceforge.net>
 
73
   <markus@oberhumer.com>               <ml1050@users.sourceforge.net>
 
74
 
 
75
   John F. Reiser
 
76
   <jreiser@users.sourceforge.net>
74
77
 */\n\n\n""")
75
78
 
76
79
 
78
81
# // write data
79
82
# ************************************************************************/
80
83
 
 
84
class DataWriter:
 
85
    def __init__(self, w):
 
86
        self.w = w
 
87
        self.pos = None
 
88
 
 
89
    def w_bol(self, pos):
 
90
        self.w("/* 0x%04x */ " % (pos))
 
91
        self.pos = pos
 
92
    def w_eol(self, fill=""):
 
93
        if self.pos is not None:
 
94
            self.w(fill.rstrip() + "\n")
 
95
 
 
96
 
 
97
class DataWriter_c(DataWriter):
 
98
    def w_data(self, data):
 
99
        w, n = self.w, len(data)
 
100
        for i in range(n):
 
101
            if i & 15 == 0:
 
102
                self.w_eol()
 
103
                self.w_bol(i)
 
104
            w("%3d" % ord(data[i]))
 
105
            if i != n - 1: w(",")
 
106
        self.w_eol()
 
107
 
 
108
 
 
109
class DataWriter_gas(DataWriter):
 
110
    def w_data(self, data):
 
111
        w, n = self.w, len(data)
 
112
        for i in range(n):
 
113
            if i & 15 == 0:
 
114
                self.w_eol()
 
115
                self.w_bol(i)
 
116
                w(".byte ")
 
117
            else:
 
118
                w(",")
 
119
            w("%3d" % ord(data[i]))
 
120
        self.w_eol()
 
121
 
 
122
 
 
123
class _DataWriter_gas_u32(DataWriter):
 
124
    def w_data(self, data):
 
125
        w, n = self.w, len(data)
 
126
        assert n % 4 == 0, n
 
127
        for i in range(0, n, 4):
 
128
            if i & 15 == 0:
 
129
                self.w_eol()
 
130
                self.w_bol(i)
 
131
                w(".int ")
 
132
            else:
 
133
                w(",")
 
134
            v = struct.unpack(self.DECODE, data[i:i+4])
 
135
            assert len(v) == 1, v
 
136
            w("0x%08x" % (v[0] & 0xffffffffL))
 
137
        self.w_eol()
 
138
 
 
139
class DataWriter_gas_be32(_DataWriter_gas_u32):
 
140
    DECODE = ">i"
 
141
class DataWriter_gas_le32(_DataWriter_gas_u32):
 
142
    DECODE = "<i"
 
143
 
 
144
 
 
145
class DataWriter_nasm(DataWriter):
 
146
    def w_bol(self, pos):
 
147
        self.pos = pos
 
148
    def w_eol(self, fill=""):
 
149
        if self.pos is not None:
 
150
            self.w(fill)
 
151
            self.w("   ; 0x%04x\n" % (self.pos))
 
152
 
 
153
    def w_data(self, data):
 
154
        w, n = self.w, len(data)
 
155
        for i in range(n):
 
156
            if i & 15 == 0:
 
157
                self.w_eol()
 
158
                self.w_bol(i)
 
159
                w("db ")
 
160
            else:
 
161
                w(",")
 
162
            w("%3d" % ord(data[i]))
 
163
        nn = ((n + 15) & ~15) - n
 
164
        self.w_eol(" " * 4 * nn)
 
165
 
 
166
 
 
167
# /***********************************************************************
 
168
# // write stub
 
169
# ************************************************************************/
 
170
 
81
171
def w_checksum_c(w, s, data):
82
172
    w("#define %s_SIZE    %d\n"     % (s, len(data)))
83
173
    w("#define %s_ADLER32 0x%08x\n" % (s, 0xffffffffL & zlib.adler32(data)))
85
175
    w("\n")
86
176
 
87
177
 
88
 
def w_data_c(w, data):
89
 
    def w_eol(w, i):
90
 
        if i > 0:
91
 
            w("   /* 0x%4x */" % (i - 16))
92
 
            w("\n")
93
 
 
94
 
    n = len(data)
95
 
    for i in range(n):
96
 
        if i % 16 == 0:
97
 
            w_eol(w, i)
98
 
        w("%3d" % ord(data[i]))
99
 
        w(", " [i == n - 1])
100
 
    i = n
101
 
    while i % 16 != 0:
102
 
        w("    ")
103
 
        i += 1
104
 
    w_eol(w, i)
105
 
 
106
 
 
107
 
def w_data_gas(w, data):
108
 
    def w_eol(w, i):
109
 
        if i > 0:
110
 
            w("   /* 0x%04x */" % (i - 16))
111
 
            w("\n")
112
 
 
113
 
    n = len(data)
114
 
    for i in range(n):
115
 
        if i % 16 == 0:
116
 
            w_eol(w, i)
117
 
            w(".byte ")
118
 
        else:
119
 
            w(",")
120
 
        w("%3d" % ord(data[i]))
121
 
    i = n
122
 
    while i % 16 != 0:
123
 
        w("    ")
124
 
        i += 1
125
 
    w_eol(w, i)
126
 
 
127
 
 
128
 
def w_data_nasm(w, data):
129
 
    def w_eol(w, i):
130
 
        if i > 0:
131
 
            w("   ; 0x%04x" % (i - 16))
132
 
            w("\n")
133
 
 
134
 
    n = len(data)
135
 
    for i in range(n):
136
 
        if i % 16 == 0:
137
 
            w_eol(w, i)
138
 
            w("db ")
139
 
        else:
140
 
            w(",")
141
 
        w("%3d" % ord(data[i]))
142
 
    i = n
143
 
    while i % 16 != 0:
144
 
        w("    ")
145
 
        i += 1
146
 
    w_eol(w, i)
147
 
 
148
 
 
149
 
# /***********************************************************************
150
 
# // write stub
151
 
# ************************************************************************/
152
 
 
153
178
def write_stub(w, odata, method_index, methods):
154
179
    method = methods[method_index]
155
180
    if len(methods) > 1:
165
190
            w_checksum_c(w, opts.ident.upper(), odata)
166
191
            w("unsigned char %s[%d] = {\n" % (opts.ident, len(odata)))
167
192
    if opts.mode == "c":
168
 
        w_data_c(w, odata)
 
193
        DataWriter_c(w).w_data(odata)
169
194
    elif opts.mode == "gas":
170
 
        w_data_gas(w, odata)
 
195
        DataWriter_gas(w).w_data(odata)
 
196
    elif opts.mode == "gas-be32":
 
197
        DataWriter_gas_be32(w).w_data(odata)
 
198
    elif opts.mode == "gas-le32":
 
199
        DataWriter_gas_le32(w).w_data(odata)
171
200
    elif opts.mode == "nasm":
172
 
        w_data_nasm(w, odata)
 
201
        DataWriter_nasm(w).w_data(odata)
173
202
    else:
174
 
        assert 0, opts.mode
 
203
        assert 0, ("invalid mode", opts.mode)
175
204
    if opts.ident:
176
205
        if opts.mode == "c":
177
206
            w("};\n")