X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=util.cc;h=13ad9918d5a21e69dedeb3e9636bc34a99c9897f;hb=a855c59ca566ee7a55fc3dda56ab70943a85ef32;hp=9e985af2af2b3d23189f30e9d23d46597f872485;hpb=4bda3653b0b3a270acdf643cf4918a97dbf147c5;p=cumulus.git diff --git a/util.cc b/util.cc index 9e985af..13ad991 100644 --- a/util.cc +++ b/util.cc @@ -27,7 +27,7 @@ string uri_encode(const string &in) for (size_t i = 0; i < in.length(); i++) { unsigned char c = in[i]; - if (c >= '+' && c < 0x7f) { + if (c >= '+' && c < 0x7f && c != '@') { out += c; } else { char buf[4]; @@ -71,18 +71,32 @@ string uri_decode(const string &in) return result; } -/* Return the string representation of an integer. */ -string encode_int(long long n) +/* Return the string representation of an integer. Will try to produce output + * in decimal, hexadecimal, or octal according to base, though this is just + * advisory. For negative numbers, will always use decimal. */ +string encode_int(long long n, int base) { char buf[64]; + + if (n >= 0 && base == 16) { + sprintf(buf, "0x%llx", n); + return buf; + } + + if (n > 0 && base == 8) { + sprintf(buf, "0%llo", n); + return buf; + } + sprintf(buf, "%lld", n); return buf; } -/* Return the string representation of an integer. */ +/* Parse the string representation of an integer. Accepts decimal, octal, and + * hexadecimal, just as C would (recognizes the 0 and 0x prefixes). */ long long parse_int(const string &s) { - return strtoll(s.c_str(), NULL, 10); + return strtoll(s.c_str(), NULL, 0); } /* Output a dictionary of string key/value pairs to the given output stream.