OSDN Git Service

* Added test code of the <plaintext> for au XHTML converter.
[modchxj/mod_chxj.git] / src / chxj_str_util.c
1 /*
2  * Copyright (C) 2005-2008 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 = strlen(s);
23   int ii;
24
25   for (ii=0; ii<len; ii++) {
26     if (ii == 0 && (s[ii] < '0' || s[ii] > '9') && s[ii] != '-') {
27       return -1; /* NG */
28     }
29     if (ii != 0 && (s[ii] < '0' || s[ii] > '9')) {
30       return -1; /* NG */
31     }
32   }
33
34   return 0; /* OK */
35 }
36
37
38
39 int
40 chxj_atoi(const char* s)
41 {
42   int len = strlen(s);
43   int ii;
44   int result;
45   int mflag = 0;
46
47   result = 0;
48
49   for (ii=0; ii < len; ii++) {
50     result *= 10;
51     switch(s[ii]) {
52     case '0': result += 0; break; 
53     case '1': result += 1; break;
54     case '2': result += 2; break;
55     case '3': result += 3; break;
56     case '4': result += 4; break;
57     case '5': result += 5; break;
58     case '6': result += 6; break;
59     case '7': result += 7; break;
60     case '8': result += 8; break;
61     case '9': result += 9; break;
62     case '-': 
63       if (ii == 0)
64         mflag = 1;
65       break;
66
67     default: break;
68
69     }
70   }
71
72   if (mflag)
73     result *= -1;
74
75   return result;
76 }
77
78 int
79 chxj_strcasenrcmp(apr_pool_t *p, const char *s1, const char *s2, int n)
80 {
81     register int s1_len;
82     register int s2_len;
83     char *ss1;
84     char *ss2;
85     register char *ss1p;
86     register char *ss2p;
87
88     s1_len = strlen(s1) - 1;
89     s2_len = strlen(s2) - 1;
90
91     ss1 = (char *)apr_palloc(p, s1_len + 2);
92     if (!ss1) {
93       return -1;
94     }
95     ss2 = (char *)apr_palloc(p, s2_len + 2);
96     if (!ss2) {
97       return -1;
98     }
99
100     strcpy(&ss1[1], s1);
101     strcpy(&ss2[1], s2);
102     ss1[0] = 0;
103     ss2[0] = 0;
104     ss1p = &ss1[s1_len+1];
105     ss2p = &ss2[s2_len+1];
106
107     for (;*ss1p && *ss2p && *ss1p == *ss2p && n - 1 > 0; ss1p--, ss2p--, n--);
108
109     return (int)(*ss1p - *ss2p);
110 }
111
112
113 int
114 chxj_starts_with(const char *str, const char *word)
115 {
116   int len = strlen(word);
117   return strncasecmp(str, word, len) == 0;
118 }
119 /*
120  * vim:ts=2 et
121  */