| rev | 
   line source | 
| 
jbe/bsw@0
 | 
     1 function param._get_parser(format_info, param_type)
 | 
| 
jbe/bsw@0
 | 
     2   if format_info == nil or format_info == "" then
 | 
| 
jbe/bsw@0
 | 
     3     return function(str)
 | 
| 
jbe/bsw@0
 | 
     4       return param_type:load(str)
 | 
| 
jbe/bsw@0
 | 
     5     end
 | 
| 
jbe/bsw@0
 | 
     6   else
 | 
| 
jbe/bsw@0
 | 
     7     local format_options = {}
 | 
| 
jbe/bsw@0
 | 
     8     local format_type, rest = string.match(
 | 
| 
jbe/bsw@0
 | 
     9       format_info,
 | 
| 
jbe/bsw@0
 | 
    10       "^([A-Za-z][A-Za-z0-9_]*)(.*)$"
 | 
| 
jbe/bsw@0
 | 
    11     )
 | 
| 
jbe/bsw@0
 | 
    12     if format_type then
 | 
| 
jbe/bsw@0
 | 
    13       rest = string.gsub(rest, "\\\\", "\\e")
 | 
| 
jbe/bsw@0
 | 
    14       rest = string.gsub(rest, "\\'", "\\q")
 | 
| 
jbe/bsw@0
 | 
    15       if
 | 
| 
jbe/bsw@0
 | 
    16         string.find(rest, "\\$") or
 | 
| 
jbe/bsw@0
 | 
    17         string.find(rest, "\\[^eq]")
 | 
| 
jbe/bsw@0
 | 
    18       then
 | 
| 
jbe/bsw@0
 | 
    19         format_type = nil
 | 
| 
jbe/bsw@0
 | 
    20       else
 | 
| 
jbe/bsw@0
 | 
    21         while rest ~= "" do
 | 
| 
jbe/bsw@0
 | 
    22           local key, value, new_rest
 | 
| 
jbe/bsw@0
 | 
    23           key, value, new_rest = string.match(
 | 
| 
jbe/bsw@0
 | 
    24             rest,
 | 
| 
jbe/bsw@0
 | 
    25             "^-([A-Za-z][A-Za-z0-9_]*)-'([^']*)'(.*)$"
 | 
| 
jbe/bsw@0
 | 
    26           )
 | 
| 
jbe/bsw@0
 | 
    27           if value then
 | 
| 
jbe/bsw@0
 | 
    28             value = string.gsub(value, "\\q", "'")
 | 
| 
jbe/bsw@0
 | 
    29             value = string.gsub(value, "\\e", "\\")
 | 
| 
jbe/bsw@0
 | 
    30             format_options[key] = value
 | 
| 
jbe/bsw@0
 | 
    31           else
 | 
| 
jbe/bsw@0
 | 
    32             key, value, new_rest = string.match(
 | 
| 
jbe/bsw@0
 | 
    33               rest,
 | 
| 
jbe/bsw@0
 | 
    34               "^-([A-Za-z][A-Za-z0-9_]*)-([^-]*)(.*)$"
 | 
| 
jbe/bsw@0
 | 
    35             )
 | 
| 
jbe/bsw@0
 | 
    36             if value then
 | 
| 
jbe/bsw@0
 | 
    37               if string.find(value, "^[0-9.Ee+-]+$") then
 | 
| 
jbe/bsw@0
 | 
    38                 local num = tonumber(value)
 | 
| 
jbe/bsw@0
 | 
    39                 if not num then
 | 
| 
jbe/bsw@0
 | 
    40                   format_type = nil
 | 
| 
jbe/bsw@0
 | 
    41                   break
 | 
| 
jbe/bsw@0
 | 
    42                 end
 | 
| 
jbe/bsw@0
 | 
    43                 format_options[key] = num
 | 
| 
jbe/bsw@0
 | 
    44               elseif value == "t" then
 | 
| 
jbe/bsw@0
 | 
    45                 format_options[key] = true
 | 
| 
jbe/bsw@0
 | 
    46               elseif value == "f" then
 | 
| 
jbe/bsw@0
 | 
    47                 format_options[key] = false
 | 
| 
jbe/bsw@0
 | 
    48               else
 | 
| 
jbe/bsw@0
 | 
    49                 format_type = nil
 | 
| 
jbe/bsw@0
 | 
    50                 break
 | 
| 
jbe/bsw@0
 | 
    51               end
 | 
| 
jbe/bsw@0
 | 
    52             else
 | 
| 
jbe/bsw@0
 | 
    53               format_type = nil
 | 
| 
jbe/bsw@0
 | 
    54               break
 | 
| 
jbe/bsw@0
 | 
    55             end
 | 
| 
jbe/bsw@0
 | 
    56           end
 | 
| 
jbe/bsw@0
 | 
    57           rest = new_rest
 | 
| 
jbe/bsw@0
 | 
    58         end
 | 
| 
jbe/bsw@0
 | 
    59       end
 | 
| 
jbe/bsw@0
 | 
    60     end
 | 
| 
jbe/bsw@0
 | 
    61     if not format_type then
 | 
| 
jbe/bsw@0
 | 
    62       error("Illegal format string in GET/POST parameters found.")
 | 
| 
jbe/bsw@0
 | 
    63     end
 | 
| 
jbe/bsw@0
 | 
    64     local parse_func = parse[format_type]
 | 
| 
jbe/bsw@0
 | 
    65     if not parse_func then
 | 
| 
jbe/bsw@0
 | 
    66       error("Unknown format identifier in GET/POST parameters encountered.")
 | 
| 
jbe/bsw@0
 | 
    67     end
 | 
| 
jbe/bsw@0
 | 
    68     return function(str)
 | 
| 
jbe/bsw@0
 | 
    69       return parse_func(str, param_type, format_options)
 | 
| 
jbe/bsw@0
 | 
    70     end
 | 
| 
jbe/bsw@0
 | 
    71   end
 | 
| 
jbe/bsw@0
 | 
    72 end
 |