1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#! /usr/bin/env python
# -*- coding: utf8 -*-
#
# Copyright (C) 2014 Evol Online
# Author: Andrei Karas (4144)
import array
import base64
import gzip
import os
import re
import datetime
import xml
import csv
import ogg.vorbis
import StringIO
import sys
import zlib
import struct
import shutil
from sets import Set
defStart = "#if PACKETVER >= "
defEnd = "#endif"
packetStart = "packet(";
packetRe = re.compile("\tpacket[(](?P<id>([^,]+)),(?P<size>([^,])+),(?P<func>([^,]+))")
def makeDir(path):
if not os.path.exists(path):
os.makedirs(path)
def saveFile(fileName, data):
with open(fileName, "w") as w:
w.write(data)
def parsePacket(line):
m = packetRe.search(line)
if m is not None:
return (m.group("id").lower(), int(m.group("size")), m.group("func"))
return None
def readPackets(path, oldVersion, newVersion):
oldPackets = dict()
newPackets = dict()
with open(path, "r") as f:
searchState = 0
newBlock = False
for line in f:
if searchState == 0: # search for #if PACKETVER
if line.find(defStart) == 0:
ver = line[len(defStart):]
idx = ver.find("//");
if idx > 0:
ver = ver[:idx]
ver = int(ver)
if ver <= newVersion:
if ver > oldVersion:
newBlock = True
else:
newBlock = False
searchState = 1
elif searchState == 1: # read block body
if line.find(packetStart) == 1:
data = parsePacket(line)
if data is not None:
if newBlock == True:
newPackets[data[0]] = data
else:
oldPackets[data[0]] = data
elif line.find(defEnd) == 0:
searchState = 0
return (oldPackets, newPackets)
def findChangedPackets(data):
old = data[0]
new = data[1]
ret = dict()
for line in old.iteritems():
if line[0] in new:
ret[line[0]] = line[1]
return (ret, new)
def showPlan(data):
oldFunc = dict()
newFunc = dict()
for line in data[0].iteritems():
if line[1][2] not in oldFunc:
oldFunc[line[1][2]] = []
oldFunc[line[1][2]].append(line[1])
for line in data[1].iteritems():
if line[1][2] not in newFunc:
newFunc[line[1][2]] = []
newFunc[line[1][2]].append(line[1])
for line in oldFunc:
if line in oldFunc and line in newFunc:
for line2 in oldFunc[line]:
id1 = line2[0]
id2 = newFunc[line][0][0]
if id1 != id2:
print "{0:30} {1:4} -> {2:4}".format(line, id1, id2)
def showHelp():
print "Show difference between packet versions."
print "Usage: {0} old new".format(sys.argv[0])
def main():
if len(sys.argv) != 3:
showHelp();
exit();
data = readPackets("hercules/src/map/packets.h", int(sys.argv[1]), int(sys.argv[2]))
changed = findChangedPackets(data)
showPlan(changed)
main()
|