OLD | NEW |
| (Empty) |
1 import struct | |
2 import sys | |
3 | |
4 def readU32(contents, offset): | |
5 wordBytes = contents[offset:offset + 4] | |
6 return struct.unpack('>I', wordBytes)[0] | |
7 | |
8 def readU16(contents, offset): | |
9 wordBytes = contents[offset:offset + 2] | |
10 return struct.unpack('>H', wordBytes)[0] | |
11 | |
12 def checkChecksum(infile): | |
13 contents = infile.read() | |
14 if len(contents) % 4: | |
15 print 'File length is not a multiple of 4' | |
16 | |
17 sum = 0 | |
18 for offset in range(0, len(contents), 4): | |
19 sum += readU32(contents, offset) | |
20 while sum >= 2**32: | |
21 sum -= 2**32 | |
22 print 'Sum of whole file: %x' % sum | |
23 | |
24 numTables = readU16(contents, 4) | |
25 | |
26 for offset in range(12, 12 + numTables * 16, 16): | |
27 tag = contents[offset:offset + 4] | |
28 chksum = readU32(contents, offset + 4) | |
29 toffset = readU32(contents, offset + 8) | |
30 tlength = readU32(contents, offset + 12) | |
31 | |
32 sum = 0 | |
33 for offset2 in range(toffset, toffset + tlength, 4): | |
34 sum += readU32(contents, offset2) | |
35 while sum >= 2**32: | |
36 sum -= 2**32 | |
37 if sum != chksum: | |
38 print 'Bad chksum: %s' % tag | |
39 | |
40 if __name__ == '__main__': | |
41 if len(sys.argv) != 2: | |
42 print 'Usage: %s <ttf filename>' % sys.argv[0] | |
43 else: | |
44 checkChecksum(file(sys.argv[1], 'r')) | |
OLD | NEW |