summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua')
-rw-r--r--Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua92
1 files changed, 92 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua b/Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua
new file mode 100644
index 00000000000..ed9e7814e60
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/luasocket/src/mbox.lua
@@ -0,0 +1,92 @@
+local _M = {}
+
+if module then
+ mbox = _M
+end
+
+function _M.split_message(message_s)
+ local message = {}
+ message_s = string.gsub(message_s, "\r\n", "\n")
+ string.gsub(message_s, "^(.-\n)\n", function (h) message.headers = h end)
+ string.gsub(message_s, "^.-\n\n(.*)", function (b) message.body = b end)
+ if not message.body then
+ string.gsub(message_s, "^\n(.*)", function (b) message.body = b end)
+ end
+ if not message.headers and not message.body then
+ message.headers = message_s
+ end
+ return message.headers or "", message.body or ""
+end
+
+function _M.split_headers(headers_s)
+ local headers = {}
+ headers_s = string.gsub(headers_s, "\r\n", "\n")
+ headers_s = string.gsub(headers_s, "\n[ ]+", " ")
+ string.gsub("\n" .. headers_s, "\n([^\n]+)", function (h) table.insert(headers, h) end)
+ return headers
+end
+
+function _M.parse_header(header_s)
+ header_s = string.gsub(header_s, "\n[ ]+", " ")
+ header_s = string.gsub(header_s, "\n+", "")
+ local _, __, name, value = string.find(header_s, "([^%s:]-):%s*(.*)")
+ return name, value
+end
+
+function _M.parse_headers(headers_s)
+ local headers_t = _M.split_headers(headers_s)
+ local headers = {}
+ for i = 1, #headers_t do
+ local name, value = _M.parse_header(headers_t[i])
+ if name then
+ name = string.lower(name)
+ if headers[name] then
+ headers[name] = headers[name] .. ", " .. value
+ else headers[name] = value end
+ end
+ end
+ return headers
+end
+
+function _M.parse_from(from)
+ local _, __, name, address = string.find(from, "^%s*(.-)%s*%<(.-)%>")
+ if not address then
+ _, __, address = string.find(from, "%s*(.+)%s*")
+ end
+ name = name or ""
+ address = address or ""
+ if name == "" then name = address end
+ name = string.gsub(name, '"', "")
+ return name, address
+end
+
+function _M.split_mbox(mbox_s)
+ local mbox = {}
+ mbox_s = string.gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n"
+ local nj, i, j = 1, 1, 1
+ while 1 do
+ i, nj = string.find(mbox_s, "\n\nFrom .-\n", j)
+ if not i then break end
+ local message = string.sub(mbox_s, j, i-1)
+ table.insert(mbox, message)
+ j = nj+1
+ end
+ return mbox
+end
+
+function _M.parse(mbox_s)
+ local mbox = _M.split_mbox(mbox_s)
+ for i = 1, #mbox do
+ mbox[i] = _M.parse_message(mbox[i])
+ end
+ return mbox
+end
+
+function _M.parse_message(message_s)
+ local message = {}
+ message.headers, message.body = _M.split_message(message_s)
+ message.headers = _M.parse_headers(message.headers)
+ return message
+end
+
+return _M