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
|
# -*- coding: utf-8 -*-
"""
# Simple password manager
# Copyright (c) 2011-2024 Michael Büsch <m@bues.ch>
# Licensed under the GNU/GPL version 2 or later.
"""
__all__ = [
"EscapeError",
"escapeCmd",
"unescapeCmd",
]
class EscapeError(Exception):
pass
def escapeCmd(s):
# Commandline escape
if s is None:
return "\\-"
if not s:
return "\\~"
subst = {
'\t' : '\\t',
'\n' : '\\n',
'\\' : '\\\\',
' ' : '\\ ',
}
ret = []
for c in s:
try:
c = subst[c]
except (KeyError) as e:
if c.isspace():
c = '\\x%02X' % ord(c)
ret.append(c)
return "".join(ret)
def unescapeCmd(s):
# Commandline unescape
if s == '\\-':
return None
if s == '\\~':
return ""
slashSubst = {
't' : '\t',
'n' : '\n',
'\\' : '\\',
}
ret = []
i = 0
while i < len(s):
if s[i] == '\\':
try:
if s[i + 1] == 'x':
ret.append(chr(int(s[i + 2 : i + 4], 16)))
i += 3
elif s[i + 1] == ' ':
ret.append(' ')
i += 1
else:
ret.append(slashSubst[s[i + 1]])
i += 1
except (IndexError, ValueError, KeyError):
raise EscapeError("Invalid backslash escape sequence "
"at character %d" % i)
else:
ret.append(s[i])
i += 1
return "".join(ret)
|