~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Lib/lib2to3/pgen2/literals.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved.
 
2
# Licensed to PSF under a Contributor Agreement.
 
3
 
 
4
"""Safely evaluate Python string literals without using eval()."""
 
5
 
 
6
import re
 
7
 
 
8
simple_escapes = {"a": "\a",
 
9
                  "b": "\b",
 
10
                  "f": "\f",
 
11
                  "n": "\n",
 
12
                  "r": "\r",
 
13
                  "t": "\t",
 
14
                  "v": "\v",
 
15
                  "'": "'",
 
16
                  '"': '"',
 
17
                  "\\": "\\"}
 
18
 
 
19
def escape(m):
 
20
    all, tail = m.group(0, 1)
 
21
    assert all.startswith("\\")
 
22
    esc = simple_escapes.get(tail)
 
23
    if esc is not None:
 
24
        return esc
 
25
    if tail.startswith("x"):
 
26
        hexes = tail[1:]
 
27
        if len(hexes) < 2:
 
28
            raise ValueError("invalid hex string escape ('\\%s')" % tail)
 
29
        try:
 
30
            i = int(hexes, 16)
 
31
        except ValueError:
 
32
            raise ValueError("invalid hex string escape ('\\%s')" % tail)
 
33
    else:
 
34
        try:
 
35
            i = int(tail, 8)
 
36
        except ValueError:
 
37
            raise ValueError("invalid octal string escape ('\\%s')" % tail)
 
38
    return chr(i)
 
39
 
 
40
def evalString(s):
 
41
    assert s.startswith("'") or s.startswith('"'), repr(s[:1])
 
42
    q = s[0]
 
43
    if s[:3] == q*3:
 
44
        q = q*3
 
45
    assert s.endswith(q), repr(s[-len(q):])
 
46
    assert len(s) >= 2*len(q)
 
47
    s = s[len(q):-len(q)]
 
48
    return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s)
 
49
 
 
50
def test():
 
51
    for i in range(256):
 
52
        c = chr(i)
 
53
        s = repr(c)
 
54
        e = evalString(s)
 
55
        if e != c:
 
56
            print(i, c, s, e)
 
57
 
 
58
 
 
59
if __name__ == "__main__":
 
60
    test()