1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Simple URL decoding function 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Antti Seppälä 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * References: 6cabdff1aSopenharmony_ci * RFC 3986: Uniform Resource Identifier (URI): Generic Syntax 7cabdff1aSopenharmony_ci * T. Berners-Lee et al. The Internet Society, 2005 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * based on http://www.icosaedro.it/apache/urldecode.c 10cabdff1aSopenharmony_ci * from Umberto Salsi (salsi@icosaedro.it) 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * This file is part of FFmpeg. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 15cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 16cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 17cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 20cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 21cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22cabdff1aSopenharmony_ci * Lesser General Public License for more details. 23cabdff1aSopenharmony_ci * 24cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 25cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 26cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 27cabdff1aSopenharmony_ci */ 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include <string.h> 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "libavutil/mem.h" 32cabdff1aSopenharmony_ci#include "libavutil/avstring.h" 33cabdff1aSopenharmony_ci#include "urldecode.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cichar *ff_urldecode(const char *url, int decode_plus_sign) 36cabdff1aSopenharmony_ci{ 37cabdff1aSopenharmony_ci int s = 0, d = 0, url_len = 0; 38cabdff1aSopenharmony_ci char c; 39cabdff1aSopenharmony_ci char *dest = NULL; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci if (!url) 42cabdff1aSopenharmony_ci return NULL; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci url_len = strlen(url) + 1; 45cabdff1aSopenharmony_ci dest = av_malloc(url_len); 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci if (!dest) 48cabdff1aSopenharmony_ci return NULL; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci while (s < url_len) { 51cabdff1aSopenharmony_ci c = url[s++]; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci if (c == '%' && s + 2 < url_len) { 54cabdff1aSopenharmony_ci char c2 = url[s++]; 55cabdff1aSopenharmony_ci char c3 = url[s++]; 56cabdff1aSopenharmony_ci if (av_isxdigit(c2) && av_isxdigit(c3)) { 57cabdff1aSopenharmony_ci c2 = av_tolower(c2); 58cabdff1aSopenharmony_ci c3 = av_tolower(c3); 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci if (c2 <= '9') 61cabdff1aSopenharmony_ci c2 = c2 - '0'; 62cabdff1aSopenharmony_ci else 63cabdff1aSopenharmony_ci c2 = c2 - 'a' + 10; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci if (c3 <= '9') 66cabdff1aSopenharmony_ci c3 = c3 - '0'; 67cabdff1aSopenharmony_ci else 68cabdff1aSopenharmony_ci c3 = c3 - 'a' + 10; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci dest[d++] = 16 * c2 + c3; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci } else { /* %zz or something other invalid */ 73cabdff1aSopenharmony_ci dest[d++] = c; 74cabdff1aSopenharmony_ci dest[d++] = c2; 75cabdff1aSopenharmony_ci dest[d++] = c3; 76cabdff1aSopenharmony_ci } 77cabdff1aSopenharmony_ci } else if (c == '+' && decode_plus_sign) { 78cabdff1aSopenharmony_ci dest[d++] = ' '; 79cabdff1aSopenharmony_ci } else { 80cabdff1aSopenharmony_ci dest[d++] = c; 81cabdff1aSopenharmony_ci } 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci } 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci return dest; 86cabdff1aSopenharmony_ci} 87