00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <ctype.h>
00030 #include <string.h>
00031
00032 #include "libavutil/mem.h"
00033 #include "libavutil/avstring.h"
00034 #include "urldecode.h"
00035
00036 char *ff_urldecode(const char *url)
00037 {
00038 int s = 0, d = 0, url_len = 0;
00039 char c;
00040 char *dest = NULL;
00041
00042 if (!url)
00043 return NULL;
00044
00045 url_len = strlen(url) + 1;
00046 dest = av_malloc(url_len);
00047
00048 if (!dest)
00049 return NULL;
00050
00051 while (s < url_len) {
00052 c = url[s++];
00053
00054 if (c == '%' && s + 2 < url_len) {
00055 char c2 = url[s++];
00056 char c3 = url[s++];
00057 if (isxdigit(c2) && isxdigit(c3)) {
00058 c2 = av_tolower(c2);
00059 c3 = av_tolower(c3);
00060
00061 if (c2 <= '9')
00062 c2 = c2 - '0';
00063 else
00064 c2 = c2 - 'a' + 10;
00065
00066 if (c3 <= '9')
00067 c3 = c3 - '0';
00068 else
00069 c3 = c3 - 'a' + 10;
00070
00071 dest[d++] = 16 * c2 + c3;
00072
00073 } else {
00074 dest[d++] = c;
00075 dest[d++] = c2;
00076 dest[d++] = c3;
00077 }
00078 } else if (c == '+') {
00079 dest[d++] = ' ';
00080 } else {
00081 dest[d++] = c;
00082 }
00083
00084 }
00085
00086 return dest;
00087 }