/***************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * The Original Code is Curl. * * The Initial Developer of the Original Code is Daniel Stenberg. * * Portions created by the Initial Developer are Copyright (C) 1998. * All Rights Reserved. * * ------------------------------------------------------------ * Main author: * - Daniel Stenberg * * http://curl.haxx.se * * $Source$ * $Revision$ * $Date$ * $Author$ * $State$ * $Locker$ * * ------------------------------------------------------------ ****************************************************************************/ /* Escape and unescape URL encoding in strings. The functions return a new * allocated string or NULL if an error occurred. */ #include #include #include char *curl_escape(char *string) { int alloc=strlen(string)+1; char *ns = malloc(alloc); unsigned char in; int newlen = alloc; int index=0; while(*string) { in = *string; if(' ' == in) ns[index++] = '+'; else if(!(in >= 'a' && in <= 'z') && !(in >= 'A' && in <= 'Z') && !(in >= '0' && in <= '9')) { /* encode it */ newlen += 2; /* the size grows with two, since this'll become a %XX */ if(newlen > alloc) { alloc *= 2; ns = realloc(ns, alloc); if(!ns) return NULL; } sprintf(&ns[index], "%%%02X", in); index+=3; } else { /* just copy this */ ns[index++]=in; } string++; } ns[index]=0; /* terminate it */ return ns; } char *curl_unescape(char *string, int length) { int alloc = (length?length:strlen(string))+1; char *ns = malloc(alloc); unsigned char in; int index=0; int hex; while(--alloc) { in = *string; if('+' == in) in = ' '; else if('%' == in) { /* encoded part */ if(sscanf(string+1, "%02X", &hex)) { in = hex; string+=2; } } ns[index++] = in; string++; } ns[index]=0; /* terminate it */ return ns; }