Python SEXP IO
This commit is contained in:
parent
37be81af03
commit
4ac49217f4
|
@ -0,0 +1 @@
|
|||
*.pyc
|
|
@ -0,0 +1,76 @@
|
|||
## Copyright 2010, 2011, 2012 Tony Garnock-Jones <tonygarnockjones@gmail.com>.
|
||||
##
|
||||
## This file is part of Hop.
|
||||
##
|
||||
## Hop is free software: you can redistribute it and/or modify it
|
||||
## under the terms of the GNU General Public License as published by
|
||||
## the Free Software Foundation, either version 3 of the License, or
|
||||
## (at your option) any later version.
|
||||
##
|
||||
## Hop is distributed in the hope that it will be useful, but WITHOUT
|
||||
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
## License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU General Public License
|
||||
## along with Hop. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# SPKI SEXP
|
||||
|
||||
import StringIO
|
||||
|
||||
class SyntaxError(Exception): pass
|
||||
|
||||
def write_sexp_str(f, x):
|
||||
f.write(str(len(x)))
|
||||
f.write(':')
|
||||
f.write(x)
|
||||
|
||||
def write_sexp(f, sexp):
|
||||
if type(sexp) is list:
|
||||
f.write('(')
|
||||
for x in sexp: write_sexp(f, x)
|
||||
f.write(')')
|
||||
return
|
||||
if type(sexp) is str:
|
||||
write_sexp_str(f, sexp)
|
||||
return
|
||||
if type(sexp) is tuple:
|
||||
f.write('[')
|
||||
write_sexp_str(f, sexp[0])
|
||||
f.write(']')
|
||||
write_sexp_str(f, sexp[1])
|
||||
return
|
||||
|
||||
def skipws(f):
|
||||
while True:
|
||||
c = f.read(1)
|
||||
if not c.isspace(): return c
|
||||
|
||||
def read_sexp(f):
|
||||
c = skipws(f)
|
||||
if c == '(':
|
||||
l = []
|
||||
while True:
|
||||
val = read_sexp(f)
|
||||
if val is None: return l
|
||||
l.append(val)
|
||||
if c == '[':
|
||||
h = read_sexp(f)
|
||||
c = skipws(f)
|
||||
if c != ']': raise SyntaxError("Missing hint close bracket")
|
||||
b = read_sexp(f)
|
||||
return (h, b)
|
||||
if c.isdigit():
|
||||
size = ord(c) - 48
|
||||
while True:
|
||||
c = f.read(1)
|
||||
if c == ':': return f.read(size)
|
||||
if not c.isdigit(): raise SyntaxError("Illegal character in byte vector length")
|
||||
size = size * 10 + ord(c) - 48
|
||||
if c == ')':
|
||||
return None
|
||||
raise SyntaxError("Illegal character in sexp")
|
||||
|
||||
def parse(s):
|
||||
return read_sexp(StringIO.StringIO(s))
|
Loading…
Reference in New Issue