Hide keyboard shortcuts

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

1from . import PbtoolsError 

2from . import WireType 

3 

4class Decoder: 

5 data: bytes 

6 pos: i64 

7 length: i64 

8 

9 func slice(self, length: i64) -> Decoder: 

10 self.pos += length 

11 

12 return Decoder(self.data, self.pos - length, self.pos) 

13 

14 func get(self) -> u8: 

15 if not self.available(): 

16 raise PbtoolsError("Out of data.") 

17 

18 value = self.data[self.pos] 

19 self.pos += 1 

20 

21 return value 

22 

23 func read_varint(self) -> u64: 

24 value: u64 = 0 

25 offset: u64 = 0 

26 byte: u8 = 0x80 

27 

28 while (offset < 64) and ((byte & 0x80) == 0x80): 

29 byte = self.get() 

30 value |= ((u64(byte) & 0x7f) << offset) 

31 offset += 7 

32 

33 if (byte & 0x80) == 0x80: 

34 raise PbtoolsError("Varint overflow.") 

35 

36 return value 

37 

38 func read_varint_check_wire_type(self, 

39 wire_type: WireType, 

40 expected_wire_type: WireType) -> u64: 

41 if wire_type != expected_wire_type: 

42 raise PbtoolsError("Unecpected wire type.") 

43 

44 return self.read_varint() 

45 

46 func read_varint_check_wire_type_varint(self, wire_type: WireType) -> u64: 

47 return self.read_varint_check_wire_type(wire_type, WireType.Varint) 

48 

49 func read_length_delimited(self, wire_type: WireType) -> u64: 

50 return self.read_varint_check_wire_type(wire_type, WireType.LengthDelimited) 

51 

52 func read(self, size: u64) -> bytes: 

53 data = b"" 

54 

55 while size > 0: 

56 data += self.get() 

57 size -= 1 

58 

59 return data 

60 

61 func seek(self, offset: i64): 

62 self.pos += offset 

63 

64 func available(self) -> bool: 

65 return self.pos < self.length 

66 

67 func read_tag(self) -> (i64, WireType): 

68 value = self.read_varint() 

69 field_number = i64(value >> 3) 

70 

71 if field_number == 0: 

72 raise PbtoolsError("Field number is zero.") 

73 

74 return (field_number, WireType(i64(value) & 7)) 

75 

76 func read_int32(self, wire_type: WireType) -> i32: 

77 return i32(self.read_int64(wire_type)) 

78 

79 func read_int64(self, wire_type: WireType) -> i64: 

80 return i64(self.read_varint_check_wire_type_varint(wire_type)) 

81 

82# int32_t read_sint32(self, int wire_type): 

83# raise NotImplementedError() 

84# 

85# int64_t read_sint64(self, int wire_type): 

86# raise NotImplementedError() 

87# 

88# uint32_t read_uint32(self, int wire_type): 

89# raise NotImplementedError() 

90# 

91# uint64_t read_uint64(self, int wire_type): 

92# raise NotImplementedError() 

93# 

94# uint32_t read_fixed32(self, int wire_type): 

95# raise NotImplementedError() 

96# 

97# uint64_t read_fixed64(self, int wire_type): 

98# raise NotImplementedError() 

99# 

100# int32_t read_sfixed32(self, int wire_type): 

101# raise NotImplementedError() 

102# 

103# int64_t read_sfixed64(self, int wire_type): 

104# raise NotImplementedError() 

105# 

106# float read_float(self, int wire_type): 

107# raise NotImplementedError() 

108# 

109# double read_double(self, int wire_type): 

110# raise NotImplementedError() 

111 

112 func read_bool(self, wire_type: WireType) -> bool: 

113 return self.read_int32(wire_type) != 0 

114 

115 func read_enum(self, wire_type: WireType) -> i32: 

116 return self.read_int32(wire_type) 

117 

118 func read_string(self, wire_type: WireType) -> string: 

119 size = self.read_length_delimited(wire_type) 

120 

121 return string(self.read(size)) 

122 

123# void read_bytes(self, int wire_type, struct pbtools_bytes_t *bytes_p): 

124# raise NotImplementedError() 

125# 

126# void pbtools_repeated_info_decode_int32(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

127# raise NotImplementedError() 

128# 

129# void decode_repeated_int32(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int32_t *repeated_p): 

130# raise NotImplementedError() 

131# 

132# void pbtools_repeated_info_decode_int64(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

133# raise NotImplementedError() 

134# 

135# void decode_repeated_int64(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int64_t *repeated_p): 

136# raise NotImplementedError() 

137# 

138# void pbtools_repeated_info_decode_uint32(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

139# raise NotImplementedError() 

140# 

141# void decode_repeated_uint32(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_uint32_t *repeated_p): 

142# raise NotImplementedError() 

143# 

144# void pbtools_repeated_info_decode_uint64(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

145# raise NotImplementedError() 

146# 

147# void decode_repeated_uint64(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_uint64_t *repeated_p): 

148# raise NotImplementedError() 

149# 

150# void pbtools_repeated_info_decode_sint32(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

151# raise NotImplementedError() 

152# 

153# void decode_repeated_sint32(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int32_t *repeated_p): 

154# raise NotImplementedError() 

155# 

156# void pbtools_repeated_info_decode_sint64(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

157# raise NotImplementedError() 

158# 

159# void decode_repeated_sint64(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int64_t *repeated_p): 

160# raise NotImplementedError() 

161# 

162# void pbtools_repeated_info_decode_fixed32(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

163# raise NotImplementedError() 

164# 

165# void decode_repeated_fixed32(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_uint32_t *repeated_p): 

166# raise NotImplementedError() 

167# 

168# void pbtools_repeated_info_decode_fixed64(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

169# raise NotImplementedError() 

170# 

171# void decode_repeated_fixed64(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_uint64_t *repeated_p): 

172# raise NotImplementedError() 

173# 

174# void pbtools_repeated_info_decode_sfixed32(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

175# raise NotImplementedError() 

176# 

177# void decode_repeated_sfixed32(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int32_t *repeated_p): 

178# raise NotImplementedError() 

179# 

180# void pbtools_repeated_info_decode_sfixed64(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

181# raise NotImplementedError() 

182# 

183# void decode_repeated_sfixed64(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_int64_t *repeated_p): 

184# raise NotImplementedError() 

185# 

186# void pbtools_repeated_info_decode_float(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

187# raise NotImplementedError() 

188# 

189# void decode_repeated_float(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_float_t *repeated_p): 

190# raise NotImplementedError() 

191# 

192# void pbtools_repeated_info_decode_double(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

193# raise NotImplementedError() 

194# 

195# void decode_repeated_double(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_double_t *repeated_p): 

196# raise NotImplementedError() 

197# 

198# void pbtools_repeated_info_decode_bool(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

199# raise NotImplementedError() 

200# 

201# void decode_repeated_bool(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_bool_t *repeated_p): 

202# raise NotImplementedError() 

203# 

204# void pbtools_repeated_info_decode_string(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

205# raise NotImplementedError() 

206# 

207# void decode_repeated_string(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_string_t *repeated_p): 

208# raise NotImplementedError() 

209# 

210# void pbtools_repeated_info_decode_bytes(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

211# raise NotImplementedError() 

212# 

213# void decode_repeated_bytes(self, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_bytes_t *repeated_p): 

214# raise NotImplementedError() 

215 

216 func skip_field(self, wire_type: WireType): 

217 match wire_type: 

218 case WireType.Varint: 

219 self.read_varint() 

220 case WireType.Bits64: 

221 self.seek(8) 

222 case WireType.LengthDelimited: 

223 value = self.read_length_delimited(wire_type) 

224 self.seek(i64(value)) 

225 case WireType.Bits32: 

226 self.seek(4) 

227 case _: 

228 raise PbtoolsError("Bad wire type") 

229 

230# void pbtools_bytes_init(struct pbtools_bytes_t *self_p): 

231# raise NotImplementedError() 

232# 

233# void *pbtools_message_new(void *workspace_p, size_t size, size_t message_size, pbtools_message_init_t message_init): 

234# raise NotImplementedError() 

235# 

236# int pbtools_message_encode(struct pbtools_message_base_t *self_p, uint8_t *encoded_p, size_t size, pbtools_message_encode_inner_t message_encode_inner): 

237# raise NotImplementedError() 

238# 

239# int pbtools_message_decode(struct pbtools_message_base_t *self_p, const uint8_t *encoded_p, size_t size, pbtools_message_decode_inner_t message_decode_inner): 

240# raise NotImplementedError() 

241# 

242# void pbtools_encode_repeated_inner(struct pbtools_encoder_t *encoder_p, int field_number, struct pbtools_repeated_message_t *repeated_p, size_t item_size, pbtools_message_encode_inner_t message_encode_inner): 

243# raise NotImplementedError() 

244# 

245# void pbtools_decode_repeated_inner(struct t *decoder_p, struct pbtools_repeated_info_t *repeated_info_p, struct pbtools_repeated_message_t *repeated_p, size_t item_size, pbtools_message_init_t message_init, pbtools_message_decode_inner_t message_decode_inner): 

246# raise NotImplementedError() 

247# 

248# void pbtools_encoder_sub_message_encode(struct pbtools_encoder_t *self_p, int field_number, struct pbtools_message_base_t *message_p, pbtools_message_encode_inner_t encode_inner): 

249# raise NotImplementedError() 

250# 

251# void pbtools_encoder_sub_message_encode_always(struct pbtools_encoder_t *self_p, int field_number, struct pbtools_message_base_t *message_p, pbtools_message_encode_inner_t encode_inner): 

252# raise NotImplementedError() 

253# 

254# void sub_message_decode(self, int wire_type, struct pbtools_message_base_t **message_pp, size_t sub_message_size, pbtools_message_init_t message_init, pbtools_message_decode_inner_t decode_inner): 

255# raise NotImplementedError() 

256# 

257# const char *pbtools_error_code_to_string(int code): 

258# raise NotImplementedError() 

259# 

260# void pbtools_repeated_info_init(struct pbtools_repeated_info_t *self_p, int tag): 

261# raise NotImplementedError() 

262# 

263# void pbtools_repeated_info_decode(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

264# raise NotImplementedError() 

265# 

266# void pbtools_repeated_numeric_scalar_info_decode(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

267# raise NotImplementedError() 

268# 

269# void pbtools_repeated_varint_info_decode(struct pbtools_repeated_info_t *self_p, struct t *decoder_p, int wire_type): 

270# raise NotImplementedError()