OSDN Git Service

* A happy new year.
[modchxj/mod_chxj.git] / src / chxj_str_util.c
1 /*
2  * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
3  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include "chxj_str_util.h"
18 #if !defined (__CHXJ_STR_UTIL_C__)
19 #define __CHXJ_STR_UTIL_C__
20
21 int
22 chxj_chk_numeric(const char *s)
23 {
24   int len;
25   int ii;
26
27   if (! s) return -1; /* NG(not numeric) */
28
29   len = strlen(s);
30   if (len == 0) return -1; /* NG(not numeric) */
31
32   for (ii=0; ii<len; ii++) {
33     if (ii == 0 && (s[ii] < '0' || s[ii] > '9') && s[ii] != '-') {
34       return -1; /* NG(not numeric) */
35     }
36     if (ii != 0 && (s[ii] < '0' || s[ii] > '9')) {
37       return -1; /* NG(not numeric) */
38     }
39   }
40
41   return 0; /* OK */
42 }
43
44
45 int
46 _chxj_atoi(const char *s, int base)
47 {
48   int len;
49   int ii;
50   int result;
51   int mflag = 0;
52   int break_flag = 0;
53
54   if (! s) return 0;
55
56   result = 0;
57
58   len = strlen(s);
59
60   for (ii=0; ii < len && break_flag == 0; ii++) {
61     result *= base;
62     switch(s[ii]) {
63     case '0': result += 0; break; 
64     case '1': result += 1; break;
65     case '2': result += 2; break;
66     case '3': result += 3; break;
67     case '4': result += 4; break;
68     case '5': result += 5; break;
69     case '6': result += 6; break;
70     case '7': result += 7; break;
71     case '8': result += 8; break;
72     case '9': result += 9; break;
73     case 'a': case 'A': result += 10; break;
74     case 'b': case 'B': result += 11; break;
75     case 'c': case 'C': result += 12; break;
76     case 'd': case 'D': result += 13; break;
77     case 'e': case 'E': result += 14; break;
78     case 'f': case 'F': result += 15; break;
79     case '-': 
80       result /= base;
81       if (ii != 0) {
82         break_flag = 1;
83         break;
84       }
85       mflag = 1;
86       break;
87
88     case '+':
89       result /= base;
90       if (ii != 0) {
91         break_flag = 1;
92         break;
93       }
94       break;
95
96     default: 
97       break_flag = 1;
98       result /= base;
99       break;
100     }
101   }
102
103   if (mflag)
104     result *= -1;
105
106   return result;
107 }
108
109 int
110 chxj_atoi(const char *s)
111 {
112   return _chxj_atoi(s, 10);
113 }
114 int
115 chxj_axtoi(const char *s)
116 {
117   return _chxj_atoi(s, 16);
118 }
119
120 int
121 chxj_strcasenrcmp(apr_pool_t *p, const char *s1, const char *s2, int n)
122 {
123     register int s1_len;
124     register int s2_len;
125     char *ss1;
126     char *ss2;
127     register char *ss1p;
128     register char *ss2p;
129
130     if (! s1) {
131       s1_len = 0;
132     }
133     else {
134       s1_len = strlen(s1) - 1;
135     }
136     if (! s2) {
137       s2_len = 0;
138     }
139     else {
140       s2_len = strlen(s2) - 1;
141     }
142
143     ss1 = (char *)apr_palloc(p, s1_len + 2);
144     if (!ss1) {
145       return -1;
146     }
147     ss2 = (char *)apr_palloc(p, s2_len + 2);
148     if (!ss2) {
149       return -1;
150     }
151
152     ss1[1] = ss1[0] = 0;
153     ss2[1] = ss2[0] = 0;
154     if (s1) {
155       strcpy(&ss1[1], s1);
156     }
157     if (s2) {
158       strcpy(&ss2[1], s2);
159     }
160     ss1p = &ss1[s1_len+1];
161     ss2p = &ss2[s2_len+1];
162
163     for (;*ss1p && *ss2p && *ss1p == *ss2p && n - 1 > 0; ss1p--, ss2p--, n--);
164     return (int)(*ss1p - *ss2p);
165 }
166
167
168 int
169 chxj_starts_with(const char *str, const char *word)
170 {
171   int len;
172   char *w = (char *)word;
173   char *s = (char *)str;
174   if (! w) w = "";
175   if (! s) s = "";
176   len = strlen(w);
177   if (len == 0) len = 1;
178   return strncasecmp(s, w, len) == 0;
179 }
180
181
182 char *
183 chxj_add_slash_to_doublequote(apr_pool_t *pool, const char *str)
184 {
185   char *ret;
186   int  len;
187   int  tlen;
188   int  ii;
189   int  pos;
190   int  cnt;
191
192   len = strlen(str);
193   cnt = 0;
194   for (ii=0; ii<len; ii++) {
195     if (str[ii] == '"') {
196       cnt++;
197     }
198   }
199   tlen = (len - cnt)  + (cnt * (sizeof("&quot;")-1)) + 1;
200   ret = apr_palloc(pool, tlen);
201   memset(ret, 0, tlen);
202   pos = 0;
203   for (ii=0; ii<len; ii++) {
204     if (str[ii] == '"') {
205       strcpy(&ret[pos], "&quot;");
206       pos += sizeof("&quot;")-1;
207     }
208     else {
209       ret[pos++] = str[ii];
210     }
211   }
212   return ret;
213 }
214
215
216 int
217 chxj_strcount(const char *s, const char *str)
218 {
219   register char *p = (char *)s;
220   register char i;
221   int len = strlen(str);
222   int count = 0;
223   while (*p) {
224     for (i=0; i<len; i++) {
225       if (*p == str[(unsigned int)i]) {
226         count++;
227         break;
228       }
229     }
230     p++;
231   }
232   return count;
233 }
234 #endif
235 /*
236  * vim:ts=2 et
237  */