12345678910111213141516171819202122232425262728293031323334353637383940 |
- #pragma once
- namespace nall::Decode {
- //returns empty string on malformed content
- inline auto URL(string_view input) -> string {
- string output;
- for(uint n = 0; n < input.size();) {
- char c = input[n];
- //unreserved characters
- if(c >= 'A' && c <= 'Z') { output.append(c); n++; continue; }
- if(c >= 'a' && c <= 'z') { output.append(c); n++; continue; }
- if(c >= '0' && c <= '9') { output.append(c); n++; continue; }
- if(c == '-' || c == '_' || c == '.' || c == '~') { output.append(c); n++; continue; }
- //special characters
- if(c == '+') { output.append(' '); n++; continue; }
- //reserved characters
- if(c != '%' || n + 2 >= input.size()) return "";
- char hi = input[n + 1];
- char lo = input[n + 2];
- if(hi >= '0' && hi <= '9') hi -= '0';
- else if(hi >= 'A' && hi <= 'F') hi -= 'A' - 10;
- else if(hi >= 'a' && hi <= 'f') hi -= 'a' - 10;
- else return "";
- if(lo >= '0' && lo <= '9') lo -= '0';
- else if(lo >= 'A' && lo <= 'F') lo -= 'A' - 10;
- else if(lo >= 'a' && lo <= 'f') lo -= 'a' - 10;
- else return "";
- char byte = hi * 16 + lo;
- output.append(byte);
- n += 3;
- }
- return output;
- }
- }
|