| /***************************************************************************** |
| * _ _ ____ _ |
| * 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 <daniel@haxx.se> |
| * |
| * 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 <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| 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; |
| |
| } |