projects
/
prosody.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mod_motd, mod_register, mod_private, mod_http_errors, mod_admin_adhoc: Remove unused...
[prosody.git]
/
tools
/
erlparse.lua
diff --git
a/tools/erlparse.lua
b/tools/erlparse.lua
index f2d410a3626bd9dd512f9b57420d5e8b8265535b..174585d338433d3c9db14a4f722ed4c029e41c68 100644
(file)
--- a/
tools/erlparse.lua
+++ b/
tools/erlparse.lua
@@
-1,21
+1,27
@@
-- Prosody IM
-- Prosody IM
--- Copyright (C) 2008-20
09
Matthew Wild
--- Copyright (C) 2008-20
09
Waqas Hussain
+-- Copyright (C) 2008-20
10
Matthew Wild
+-- Copyright (C) 2008-20
10
Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
-
+local string_byte, string_char = string.byte, string.char;
+local t_concat, t_insert = table.concat, table.insert;
+local type, tonumber, tostring = type, tonumber, tostring;
local file = nil;
local last = nil;
local file = nil;
local last = nil;
+local line = 1;
local function read(expected)
local ch;
if last then
ch = last; last = nil;
local function read(expected)
local ch;
if last then
ch = last; last = nil;
- else ch = file:read(1); end
- if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil")); end
+ else
+ ch = file:read(1);
+ if ch == "\n" then line = line + 1; end
+ end
+ if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil").." on line "..line); end
return ch;
end
local function pushback(ch)
return ch;
end
local function pushback(ch)
@@
-27,91
+33,113
@@
local function peek()
return last;
end
return last;
end
-local _A, _a, _Z, _z, _0, _9, __, _at, _space
= string.byte("AaZz09@_ ", 1, 9
);
+local _A, _a, _Z, _z, _0, _9, __, _at, _space
, _minus = string_byte("AaZz09@_ -", 1, 10
);
local function isLowerAlpha(ch)
local function isLowerAlpha(ch)
- ch = string
.
byte(ch) or 0;
+ ch = string
_
byte(ch) or 0;
return (ch >= _a and ch <= _z);
end
local function isNumeric(ch)
return (ch >= _a and ch <= _z);
end
local function isNumeric(ch)
- ch = string
.
byte(ch) or 0;
- return (ch >= _0 and ch <= _9);
+ ch = string
_
byte(ch) or 0;
+ return (ch >= _0 and ch <= _9)
or ch == _minus
;
end
local function isAtom(ch)
end
local function isAtom(ch)
- ch = string
.
byte(ch) or 0;
+ ch = string
_
byte(ch) or 0;
return (ch >= _A and ch <= _Z) or (ch >= _a and ch <= _z) or (ch >= _0 and ch <= _9) or ch == __ or ch == _at;
end
local function isSpace(ch)
return (ch >= _A and ch <= _Z) or (ch >= _a and ch <= _z) or (ch >= _0 and ch <= _9) or ch == __ or ch == _at;
end
local function isSpace(ch)
- ch = string
.
byte(ch) or "x";
+ ch = string
_
byte(ch) or "x";
return ch <= _space;
end
return ch <= _space;
end
+local escapes = {["\\b"]="\b", ["\\d"]="\127", ["\\e"]="\27", ["\\f"]="\f", ["\\n"]="\n", ["\\r"]="\r", ["\\s"]=" ", ["\\t"]="\t", ["\\v"]="\v", ["\\\""]="\"", ["\\'"]="'", ["\\\\"]="\\"};
local function readString()
read("\""); -- skip quote
local slash = nil;
local function readString()
read("\""); -- skip quote
local slash = nil;
- local str =
""
;
+ local str =
{}
;
while true do
local ch = read();
while true do
local ch = read();
- if ch == "\"" and not slash then break; end
- str = str..ch;
+ if slash then
+ slash = slash..ch;
+ if not escapes[slash] then error("Unknown escape sequence: "..slash); end
+ str[#str+1] = escapes[slash];
+ slash = nil;
+ elseif ch == "\"" then
+ break;
+ elseif ch == "\\" then
+ slash = ch;
+ else
+ str[#str+1] = ch;
+ end
end
end
- str = str:gsub("\\.", {["\\b"]="\b", ["\\d"]="\d", ["\\e"]="\e", ["\\f"]="\f", ["\\n"]="\n", ["\\r"]="\r", ["\\s"]="\s", ["\\t"]="\t", ["\\v"]="\v", ["\\\""]="\"", ["\\'"]="'", ["\\\\"]="\\"});
- return str;
+ return t_concat(str);
end
local function readAtom1()
end
local function readAtom1()
- local var =
read()
;
+ local var =
{ read() }
;
while isAtom(peek()) do
while isAtom(peek()) do
- var
= var..
read();
+ var
[#var+1] =
read();
end
end
- return
var
;
+ return
t_concat(var)
;
end
local function readAtom2()
end
local function readAtom2()
- local str =
read("'")
;
+ local str =
{ read("'") }
;
local slash = nil;
while true do
local ch = read();
local slash = nil;
while true do
local ch = read();
- str
= str..
ch;
+ str
[#str+1] =
ch;
if ch == "'" and not slash then break; end
end
if ch == "'" and not slash then break; end
end
- return
str
;
+ return
t_concat(str)
;
end
local function readNumber()
end
local function readNumber()
- local num =
read()
;
+ local num =
{ read() }
;
while isNumeric(peek()) do
while isNumeric(peek()) do
- num = num..read();
+ num[#num+1] = read();
+ end
+ if peek() == "." then
+ num[#num+1] = read();
+ while isNumeric(peek()) do
+ num[#num+1] = read();
+ end
end
end
- return tonumber(
num
);
+ return tonumber(
t_concat(num)
);
end
local readItem = nil;
local function readTuple()
local t = {};
end
local readItem = nil;
local function readTuple()
local t = {};
- local s =
""
; -- string representation
+ local s =
{}
; -- string representation
read(); -- read {, or [, or <
while true do
local item = readItem();
if not item then break; end
read(); -- read {, or [, or <
while true do
local item = readItem();
if not item then break; end
- if type(item) ~=
type(0)
or item > 255 then
+ if type(item) ~=
"number"
or item > 255 then
s = nil;
elseif s then
s = nil;
elseif s then
- s
= s..string.
char(item);
+ s
[#s+1] = string_
char(item);
end
end
- t
able.
insert(t, item);
+ t
_
insert(t, item);
end
read(); -- read }, or ], or >
end
read(); -- read }, or ], or >
- if s and
s ~= ""
then
- return
s
+ if s and
#s > 0
then
+ return
t_concat(s)
else
return t
end;
end
local function readBinary()
read("<"); -- read <
else
return t
end;
end
local function readBinary()
read("<"); -- read <
+ -- Discard PIDs
+ if isNumeric(peek()) then
+ while peek() ~= ">" do read(); end
+ read(">");
+ return {};
+ end
local t = readTuple();
read(">") -- read >
local ch = peek();
local t = readTuple();
read(">") -- read >
local ch = peek();
- if type(t) ==
type("")
then
+ if type(t) ==
"string"
then
-- binary is a list of integers
return t;
-- binary is a list of integers
return t;
- elseif type(t) ==
type({})
then
+ elseif type(t) ==
"table"
then
if t[1] then
-- binary contains string
return t[1];
if t[1] then
-- binary contains string
return t[1];