/[winpt]/trunk/Src/wptUtil.cpp
ViewVC logotype

Annotation of /trunk/Src/wptUtil.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 247 - (hide annotations)
Fri Jul 21 08:19:24 2006 UTC (18 years, 7 months ago) by twoaday
File size: 4541 byte(s)


1 werner 36 /* wptUtil.cpp - Helper functions
2     * Copyright (C) 2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20 twoaday 190
21 werner 36 #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <string.h>
26 twoaday 214 #include <stdlib.h>
27 werner 36 #include <stdio.h>
28     #include <ctype.h>
29    
30     /* code taken from glibc-2.2.1/sysdeps/generic/strsep.c */
31 twoaday 190 char*
32 werner 36 strsep (char **stringp, const char *delim)
33     {
34     char *begin, *end;
35     begin = *stringp;
36    
37     if (begin == NULL)
38     return NULL;
39    
40     /* A frequent case is when the delimiter string contains only one
41     character. Here we don't need to call the expensive `strpbrk'
42     function and instead work using `strchr'. */
43     if (delim[0] == '\0' || delim[1] == '\0') {
44     char ch = delim[0];
45     if (ch == '\0')
46     end = NULL;
47     else {
48     if (*begin == ch)
49     end = begin;
50     else if (*begin == '\0')
51     end = NULL;
52     else
53     end = strchr (begin + 1, ch);
54     }
55     }
56     else /* Find the end of the token. */
57     end = strpbrk (begin, delim);
58 twoaday 217 if (end) {
59 werner 36 /* Terminate the token and set *STRINGP past NUL character. */
60     *end++ = '\0';
61     *stringp = end;
62     }
63     else
64     /* No more delimiters; this is the last token. */
65     *stringp = NULL;
66    
67     return begin;
68     }
69    
70    
71     /* Like strstr but this version is case in-sentensive. */
72 twoaday 190 const char *
73 werner 36 stristr (const char *buf, const char *sub)
74     {
75     const char *t, *s ;
76     size_t n;
77     size_t buflen = strlen (buf);
78    
79     for( t=buf, n=buflen, s=sub ; n ; t++, n-- ) {
80     if( toupper(*t) == toupper(*s) ) {
81     for( buf=t++, buflen = n--, s++;
82     n && toupper(*t) == toupper(*s); t++, s++, n-- )
83     ;
84     if( !*s )
85     return buf;
86     t = buf; n = buflen; s = sub ;
87     }
88     }
89     return NULL ;
90     }
91    
92 twoaday 190
93 twoaday 247 /* Check if @fname is a valid file name on a Window file system.
94     If is_path = 1, @fname is treated as a file name without any separators. */
95     int
96     check_file_name (const char *fname, int is_path)
97     {
98     const char *not_allowed = "/*?\"<>|";
99     size_t i;
100    
101     /* If we are not in path mode (@is_path = 1) we also consider
102     path separators as illegal chars. */
103     if (!is_path) {
104     if (strchr (fname, ':') || strchr (fname, '\\'))
105     return -1;
106     }
107    
108     for (i=0; i < strlen (fname); i++) {
109     if (strchr (not_allowed, fname[i]))
110     return -1;
111     }
112     return 0;
113     }
114    
115    
116 twoaday 190 /* Check if the email address @email only contain valid characters.
117     Return 0 on success. */
118     int
119     check_email_address (const char *email)
120     {
121 twoaday 214 const char *allowed = "@._-%+;";
122 twoaday 190 size_t i;
123    
124     if (!strchr (email, '@'))
125     return -1;
126     for (i=0; i < strlen (email); i++) {
127 twoaday 225 if (isxdigit (email[i]) || isalpha (email[i])
128 twoaday 190 || strchr (allowed, email[i]))
129     continue;
130     else
131     return -1;
132     }
133     return 0;
134     }
135 twoaday 214
136    
137     /* Return a substring of @str from the position @begin
138     to position @end. */
139     char*
140     substr (const char *str, unsigned int begin, unsigned int end)
141     {
142     char *p;
143     size_t i, pos;
144    
145     if (end > strlen (str) || begin > strlen (str) || (end-begin) < 0)
146     return NULL;
147    
148 twoaday 225 p = new char[end-begin+1];
149 twoaday 214 if (!p)
150     abort ();
151    
152     for (i = begin, pos=0; i < end; i++)
153     p[pos++] = str[i];
154     p[pos] = '\0';
155     return p;
156     }
157 twoaday 217
158    
159     /* Remove %AB sequences from the input buffer @in
160     and store the raw data in @out. */
161     void
162 twoaday 225 unhexify_buffer (const char *in, char **r_out)
163 twoaday 217 {
164 twoaday 225 char temp[3], *out;
165     size_t len, pos, i=0;
166 twoaday 217
167 twoaday 225 len = strlen (in);
168     out = new char[len+1];
169     if (!out)
170 twoaday 217 abort ();
171 twoaday 225 memset (out, 0, len+1);
172     for (pos = 0; pos < len; pos++) {
173 twoaday 217 if (in[pos] == '%' && in[pos+1] == '%')
174 twoaday 225 out[i++] = '%';
175 twoaday 217 else if (in[pos] == '%') {
176     temp[0] = in[++pos];
177     temp[1] = in[++pos];
178     temp[2] = 0;
179 twoaday 225 out[i++] = (char)strtoul (temp, NULL, 16);
180 twoaday 217 }
181     else
182 twoaday 225 out[i++] = in[pos];
183 twoaday 217 }
184 twoaday 225 out[i] = 0;
185     *r_out = out;
186 twoaday 217 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26