Mercurial > hg
annotate mercurial/pure/base85.py @ 31493:7e9c7d1d65cb
dispatch: extract maybe-use-repr formatting to helper function
I think this makes the code much clearer. I had to think for a bit to
unpack the old-school `condition and if-true or if-false` dance, and
formatting argument lists here shouldn't be performance critical.
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 19 Mar 2017 00:21:26 -0400 |
parents | 9007f697e8ef |
children | 01b4d88ccb24 |
rev | line source |
---|---|
7701 | 1 # base85.py: pure python base85 codec |
2 # | |
3 # Copyright (C) 2009 Brendan Cully <brendan@kublai.com> | |
4 # | |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7881
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
7701 | 7 |
27334
9007f697e8ef
base85: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16598
diff
changeset
|
8 from __future__ import absolute_import |
9007f697e8ef
base85: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16598
diff
changeset
|
9 |
7701 | 10 import struct |
11 | |
12 _b85chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ | |
13 "abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~" | |
7835
2505e9f84153
Optimization of pure.base85.b85encode
Mads Kiilerich <mads@kiilerich.com>
parents:
7701
diff
changeset
|
14 _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars] |
7701 | 15 _b85dec = {} |
16 | |
17 def _mkb85dec(): | |
8632
9e055cfdd620
replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
18 for i, c in enumerate(_b85chars): |
9e055cfdd620
replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
19 _b85dec[c] = i |
7701 | 20 |
21 def b85encode(text, pad=False): | |
22 """encode text in base85 format""" | |
23 l = len(text) | |
24 r = l % 4 | |
25 if r: | |
26 text += '\0' * (4 - r) | |
27 longs = len(text) >> 2 | |
28 words = struct.unpack('>%dL' % (longs), text) | |
29 | |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8632
diff
changeset
|
30 out = ''.join(_b85chars[(word // 52200625) % 85] + |
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8632
diff
changeset
|
31 _b85chars2[(word // 7225) % 7225] + |
7835
2505e9f84153
Optimization of pure.base85.b85encode
Mads Kiilerich <mads@kiilerich.com>
parents:
7701
diff
changeset
|
32 _b85chars2[word % 7225] |
2505e9f84153
Optimization of pure.base85.b85encode
Mads Kiilerich <mads@kiilerich.com>
parents:
7701
diff
changeset
|
33 for word in words) |
7701 | 34 |
35 if pad: | |
36 return out | |
37 | |
38 # Trim padding | |
39 olen = l % 4 | |
40 if olen: | |
41 olen += 1 | |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8632
diff
changeset
|
42 olen += l // 4 * 5 |
7701 | 43 return out[:olen] |
44 | |
45 def b85decode(text): | |
46 """decode base85-encoded text""" | |
47 if not _b85dec: | |
48 _mkb85dec() | |
49 | |
50 l = len(text) | |
51 out = [] | |
52 for i in range(0, len(text), 5): | |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
53 chunk = text[i:i + 5] |
7701 | 54 acc = 0 |
8632
9e055cfdd620
replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
55 for j, c in enumerate(chunk): |
7701 | 56 try: |
8632
9e055cfdd620
replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
57 acc = acc * 85 + _b85dec[c] |
7701 | 58 except KeyError: |
16598
20a9d823f242
pure/base85: align exception type/msg on base85.c
Patrick Mezard <patrick@mezard.eu>
parents:
10282
diff
changeset
|
59 raise ValueError('bad base85 character at position %d' |
20a9d823f242
pure/base85: align exception type/msg on base85.c
Patrick Mezard <patrick@mezard.eu>
parents:
10282
diff
changeset
|
60 % (i + j)) |
7701 | 61 if acc > 4294967295: |
16598
20a9d823f242
pure/base85: align exception type/msg on base85.c
Patrick Mezard <patrick@mezard.eu>
parents:
10282
diff
changeset
|
62 raise ValueError('Base85 overflow in hunk starting at byte %d' % i) |
7701 | 63 out.append(acc) |
64 | |
65 # Pad final chunk if necessary | |
66 cl = l % 5 | |
67 if cl: | |
68 acc *= 85 ** (5 - cl) | |
69 if cl > 1: | |
70 acc += 0xffffff >> (cl - 2) * 8 | |
71 out[-1] = acc | |
72 | |
73 out = struct.pack('>%dL' % (len(out)), *out) | |
74 if cl: | |
75 out = out[:-(5 - cl)] | |
76 | |
77 return out |