Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

# The contents of this file are subject to the Python Software Foundation 

# License Version 2.3 (the License).  You may not copy or use this file, in 

# either source code or executable form, except in compliance with the License. 

# You may obtain a copy of the License at http://www.python.org/license. 

# 

# Software distributed under the License is distributed on an AS IS basis, 

# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License 

# for the specific language governing rights and limitations under the 

# License. 

 

# Written by Petru Paler 

 

# Minor modifications made by Andrew Resch to replace the BTFailure errors with Exceptions 

 

 

def decode_int(x, f): 

    f += 1 

    newf = x.index('e', f) 

    n = int(x[f:newf]) 

21    if x[f] == '-': 

        if x[f + 1] == '0': 

            raise ValueError 

24    elif x[f] == '0' and newf != f + 1: 

        raise ValueError 

    return (n, newf + 1) 

 

 

def decode_string(x, f): 

    colon = x.index(':', f) 

    n = int(x[f:colon]) 

32    if x[f] == '0' and colon != f + 1: 

        raise ValueError 

    colon += 1 

    return (x[colon:colon + n], colon + n) 

 

 

def decode_list(x, f): 

    r, f = [], f + 1 

    while x[f] != 'e': 

        v, f = decode_func[x[f]](x, f) 

        r.append(v) 

    return (r, f + 1) 

 

 

def decode_dict(x, f): 

    r, f = {}, f + 1 

    while x[f] != 'e': 

        k, f = decode_string(x, f) 

        r[k], f = decode_func[x[f]](x, f) 

    return (r, f + 1) 

 

decode_func = {} 

decode_func['l'] = decode_list 

decode_func['d'] = decode_dict 

decode_func['i'] = decode_int 

decode_func['0'] = decode_string 

decode_func['1'] = decode_string 

decode_func['2'] = decode_string 

decode_func['3'] = decode_string 

decode_func['4'] = decode_string 

decode_func['5'] = decode_string 

decode_func['6'] = decode_string 

decode_func['7'] = decode_string 

decode_func['8'] = decode_string 

decode_func['9'] = decode_string 

 

 

def bdecode(x): 

    try: 

        r, l = decode_func[x[0]](x, 0) 

    except (IndexError, KeyError, ValueError): 

        raise Exception("not a valid bencoded string") 

74    if l != len(x): 

        raise Exception("invalid bencoded value (data after valid prefix)") 

 

    return r 

 

from types import DictType, IntType, ListType, LongType, StringType, TupleType 

 

 

class Bencached(object): 

 

    __slots__ = ['bencoded'] 

 

    def __init__(self, s): 

        self.bencoded = s 

 

 

def encode_bencached(x, r): 

    r.append(x.bencoded) 

 

 

def encode_int(x, r): 

    r.extend(('i', str(x), 'e')) 

 

 

def encode_bool(x, r): 

    if x: 

        encode_int(1, r) 

    else: 

        encode_int(0, r) 

 

 

def encode_string(x, r): 

    r.extend((str(len(x)), ':', x)) 

 

 

def encode_list(x, r): 

    r.append('l') 

    for i in x: 

        encode_func[type(i)](i, r) 

    r.append('e') 

 

 

def encode_dict(x, r): 

    r.append('d') 

    ilist = x.items() 

    ilist.sort() 

    for k, v in ilist: 

        r.extend((str(len(k)), ':', k)) 

        encode_func[type(v)](v, r) 

    r.append('e') 

 

encode_func = {} 

encode_func[Bencached] = encode_bencached 

encode_func[IntType] = encode_int 

encode_func[LongType] = encode_int 

encode_func[StringType] = encode_string 

encode_func[ListType] = encode_list 

encode_func[TupleType] = encode_list 

encode_func[DictType] = encode_dict 

 

try: 

    from types import BooleanType 

    encode_func[BooleanType] = encode_bool 

except ImportError: 

    pass 

 

 

def bencode(x): 

    r = [] 

    encode_func[type(x)](x, r) 

    return ''.join(r)