OSDN Git Service

* Fixed Bug.
[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
19 int
20 chxj_chk_numeric(const char *s)
21 {
22   int len;
23   int ii;
24
25   if (! s) return -1; /* NG(not numeric) */
26
27   len = strlen(s);
28   if (len == 0) return -1; /* NG(not numeric) */
29
30   for (ii=0; ii<len; ii++) {
31     if (ii == 0 && (s[ii] < '0' || s[ii] > '9') && s[ii] != '-') {
32       return -1; /* NG(not numeric) */
33     }
34     if (ii != 0 && (s[ii] < '0' || s[ii] > '9')) {
35       return -1; /* NG(not numeric) */
36     }
37   }
38
39   return 0; /* OK */
40 }
41
42
43
44 int
45 chxj_atoi(const char *s)
46 {
47   int len;
48   int ii;
49   int result;
50   int mflag = 0;
51   int break_flag = 0;
52
53   if (! s) return 0;
54
55   result = 0;
56
57   len = strlen(s);
58
59   for (ii=0; ii < len && break_flag == 0; ii++) {
60     result *= 10;
61     switch(s[ii]) {
62     case '0': result += 0; break; 
63     case '1': result += 1; break;
64     case '2': result += 2; break;
65     case '3': result += 3; break;
66     case '4': result += 4; break;
67     case '5': result += 5; break;
68     case '6': result += 6; break;
69     case '7': result += 7; break;
70     case '8': result += 8; break;
71     case '9': result += 9; break;
72     case '-': 
73       result /= 10;
74       if (ii != 0) {
75         break_flag = 1;
76         break;
77       }
78       mflag = 1;
79       break;
80
81     case '+':
82       result /= 10;
83       if (ii != 0) {
84         break_flag = 1;
85         break;
86       }
87       break;
88
89     default: 
90       break_flag = 1;
91       result /= 10;
92       break;
93     }
94   }
95
96   if (mflag)
97     result *= -1;
98
99   return result;
100 }
101
102 int
103 chxj_strcasenrcmp(apr_pool_t *p, const char *s1, const char *s2, int n)
104 {
105     register int s1_len;
106     register int s2_len;
107     char *ss1;
108     char *ss2;
109     register char *ss1p;
110     register char *ss2p;
111
112     if (! s1) {
113       s1_len = 0;
114     }
115     else {
116       s1_len = strlen(s1) - 1;
117     }
118     if (! s2) {
119       s2_len = 0;
120     }
121     else {
122       s2_len = strlen(s2) - 1;
123     }
124
125     ss1 = (char *)apr_palloc(p, s1_len + 2);
126     if (!ss1) {
127       return -1;
128     }
129     ss2 = (char *)apr_palloc(p, s2_len + 2);
130     if (!ss2) {
131       return -1;
132     }
133
134     ss1[1] = ss1[0] = 0;
135     ss2[1] = ss2[0] = 0;
136     if (s1) {
137       strcpy(&ss1[1], s1);
138     }
139     if (s2) {
140       strcpy(&ss2[1], s2);
141     }
142     ss1p = &ss1[s1_len+1];
143     ss2p = &ss2[s2_len+1];
144
145     for (;*ss1p && *ss2p && *ss1p == *ss2p && n - 1 > 0; ss1p--, ss2p--, n--);
146     return (int)(*ss1p - *ss2p);
147 }
148
149
150 int
151 chxj_starts_with(const char *str, const char *word)
152 {
153   int len;
154   char *w = (char *)word;
155   char *s = (char *)str;
156   if (! w) w = "";
157   if (! s) s = "";
158   len = strlen(w);
159   if (len == 0) len = 1;
160   return strncasecmp(s, w, len) == 0;
161 }
162
163
164 char *
165 chxj_add_slash_to_doublequote(apr_pool_t *pool, const char *str)
166 {
167   char *ret;
168   int  len;
169   int  tlen;
170   int  ii;
171   int  pos;
172   int  cnt;
173
174   len = strlen(str);
175   cnt = 0;
176   for (ii=0; ii<len; ii++) {
177     if (str[ii] == '"') {
178       cnt++;
179     }
180   }
181   tlen = (len - cnt)  + (cnt * (sizeof("&quot;")-1)) + 1;
182   ret = apr_palloc(pool, tlen);
183   memset(ret, 0, tlen);
184   pos = 0;
185   for (ii=0; ii<len; ii++) {
186     if (str[ii] == '"') {
187       strcpy(&ret[pos], "&quot;");
188       pos += sizeof("&quot;")-1;
189     }
190     else {
191       ret[pos++] = str[ii];
192     }
193   }
194   return ret;
195 }
196 /*
197  * vim:ts=2 et
198  */