switched from wpitchoune@gmail.com to jeanfi@gmail.com (my usual email)
[psensor.git] / src / plib / url.c
1 /*
2     Copyright (C) 2010 jeanfi@gmail.com
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17     02110-1301 USA
18 */
19
20 /*
21   Part of the following code is based on:
22   http://www.geekhideout.com/urlcode.shtml
23 */
24
25 #include "plib/url.h"
26
27 #include <ctype.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 char *url_normalize(const char *url)
32 {
33         int n = strlen(url);
34         char *ret = strdup(url);
35
36         if (url[n - 1] == '/')
37                 ret[n - 1] = '\0';
38
39         return ret;
40 }
41
42 char to_hex(char code)
43 {
44         static char hex[] = "0123456789abcdef";
45         return hex[code & 0x0f];
46 }
47
48 /*
49    Returns a url-encoded version of str.
50 */
51 char *url_encode(const char *str)
52 {
53         char *c, *buf, *pbuf;
54
55         buf = malloc(strlen(str) * 3 + 1);
56         pbuf = buf;
57
58         c = (char *)str;
59
60         while (*c) {
61
62                 if (isalnum(*c) ||
63                     *c == '.' || *c == '_' || *c == '-' || *c == '~')
64                         *pbuf++ = *c;
65                 else {
66                         *pbuf++ = '%';
67                         *pbuf++ = to_hex(*c >> 4);
68                         *pbuf++ = to_hex(*c & 0x0f);
69                 }
70                 c++;
71         }
72         *pbuf = '\0';
73
74         return buf;
75 }