summaryrefslogtreecommitdiff
path: root/herculesversion/packetversion.py
blob: 279aea29fa618c069f05a8e9f5ef6f9ff9398f1e (plain) (blame)
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()