jbe/bsw@0: function param._get_parser(format_info, param_type) jbe/bsw@0: if format_info == nil or format_info == "" then jbe/bsw@0: return function(str) jbe/bsw@0: return param_type:load(str) jbe/bsw@0: end jbe/bsw@0: else jbe/bsw@0: local format_options = {} jbe/bsw@0: local format_type, rest = string.match( jbe/bsw@0: format_info, jbe/bsw@0: "^([A-Za-z][A-Za-z0-9_]*)(.*)$" jbe/bsw@0: ) jbe/bsw@0: if format_type then jbe/bsw@0: rest = string.gsub(rest, "\\\\", "\\e") jbe/bsw@0: rest = string.gsub(rest, "\\'", "\\q") jbe/bsw@0: if jbe/bsw@0: string.find(rest, "\\$") or jbe/bsw@0: string.find(rest, "\\[^eq]") jbe/bsw@0: then jbe/bsw@0: format_type = nil jbe/bsw@0: else jbe/bsw@0: while rest ~= "" do jbe/bsw@0: local key, value, new_rest jbe/bsw@0: key, value, new_rest = string.match( jbe/bsw@0: rest, jbe/bsw@0: "^-([A-Za-z][A-Za-z0-9_]*)-'([^']*)'(.*)$" jbe/bsw@0: ) jbe/bsw@0: if value then jbe/bsw@0: value = string.gsub(value, "\\q", "'") jbe/bsw@0: value = string.gsub(value, "\\e", "\\") jbe/bsw@0: format_options[key] = value jbe/bsw@0: else jbe/bsw@0: key, value, new_rest = string.match( jbe/bsw@0: rest, jbe/bsw@0: "^-([A-Za-z][A-Za-z0-9_]*)-([^-]*)(.*)$" jbe/bsw@0: ) jbe/bsw@0: if value then jbe/bsw@0: if string.find(value, "^[0-9.Ee+-]+$") then jbe/bsw@0: local num = tonumber(value) jbe/bsw@0: if not num then jbe/bsw@0: format_type = nil jbe/bsw@0: break jbe/bsw@0: end jbe/bsw@0: format_options[key] = num jbe/bsw@0: elseif value == "t" then jbe/bsw@0: format_options[key] = true jbe/bsw@0: elseif value == "f" then jbe/bsw@0: format_options[key] = false jbe/bsw@0: else jbe/bsw@0: format_type = nil jbe/bsw@0: break jbe/bsw@0: end jbe/bsw@0: else jbe/bsw@0: format_type = nil jbe/bsw@0: break jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: rest = new_rest jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: if not format_type then jbe/bsw@0: error("Illegal format string in GET/POST parameters found.") jbe/bsw@0: end jbe/bsw@0: local parse_func = parse[format_type] jbe/bsw@0: if not parse_func then jbe/bsw@0: error("Unknown format identifier in GET/POST parameters encountered.") jbe/bsw@0: end jbe/bsw@0: return function(str) jbe/bsw@0: return parse_func(str, param_type, format_options) jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: end