annotate th_string.c @ 2:ecfa4e3597e3

Cleanups in th-libs.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 20 Mar 2008 01:06:03 +0000
parents 728243125263
children 707e35b03f89
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * Miscellaneous string-handling related utility-functions
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * Programmed and designed by Matti 'ccr' Hamalainen
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * (C) Copyright 2002-2008 Tecnic Software productions (TNSP)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 *
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * Please read file 'COPYING' for information on license and distribution.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 #ifdef HAVE_CONFIG_H
2
ecfa4e3597e3 Cleanups in th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
9 #include "config.h"
0
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 #endif
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 #include "th_string.h"
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 #define LPREV (pNode->pPrev)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 #define LNEXT (pNode->pNext)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16 /* Allocate memory for a string with given length
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
17 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 char_t *th_stralloc(const size_t l)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20 assert(l > 0);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21 return th_malloc(sizeof(char_t) * l);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
23
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 char_t *th_strrealloc(char_t * s, const size_t l)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27 assert(l > 0);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28 return th_realloc(s, sizeof(char_t) * l);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 /* Calculate the length of a string [strlen]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 size_t th_strlen(char_t * pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 size_t l = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 char_t *s = pStr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38 assert(pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
40 while (*s) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 s++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42 l++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45 return l;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49 /* Duplicate a string [strdup]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 char_t *th_strdup(char_t * pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53 char_t *pResult, *s, *d;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
54
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 if (!pStr) return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57 /* Allocate memory for destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58 pResult = th_stralloc(th_strlen(pStr) + 1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59 if (!pResult)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 /* Copy to the destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63 s = pStr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 d = pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65 while (*s) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66 *(d++) = *(s++);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 *d = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 return pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
71 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
72
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
74 /* Concatenate a string [strcat]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
76 char_t *th_strcat(char_t * pDest, char_t * pSource)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 char_t *s, *d;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79 assert(pSource);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
80 assert(pDest);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82 /* Copy to the destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
83 s = pSource;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84 d = pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86 while (*d) d++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
88 while (*s) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 *(d++) = *(s++);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
90 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
91 *d = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
92
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
93 return pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97 /* Copy a string [strcpy, strncpy]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
99 char_t *th_strcpy(char_t * pDest, char_t * pSource)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
100 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
101 char_t *s, *d;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
102 assert(pSource);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
103 assert(pDest);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
105 /* Copy to the destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
106 s = pSource;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107 d = pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 while (*s) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
110 *(d++) = *(s++);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
111 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112 *d = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
113
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
114 return pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
115 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
117
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
118 char_t *th_strncpy(char_t * pDest, char_t * pSource, size_t n)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
119 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120 char_t *s, *d;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 size_t i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122 assert(pSource);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123 assert(pDest);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
125 /* Copy to the destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
126 i = n;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
127 s = pSource;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128 d = pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129 while (*s && (i > 0)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 *(d++) = *(s++);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
131 i--;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
134 /* Fill rest of space with zeros */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135 while (i > 0) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136 *(d++) = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137 i--;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 /* Ensure that last is always zero */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 pDest[n - 1] = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
143 return pDest;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147 /* Compare given strings [strcmp, strncmp]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 int th_strcmp(char_t * pStr1, char_t * pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 char_t *s1, *s2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152 assert(pStr1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153 assert(pStr2);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 if (pStr1 == pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 /* Go through the string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 s1 = pStr1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 s2 = pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 while (*s1 && *s2 && (*s1 == *s2)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 s1++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164 s2++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
166
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
167 return ((*s1) - (*s2));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
169
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
170
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
171 int th_strncmp(char_t * pStr1, char_t * pStr2, size_t n)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173 char_t *s1, *s2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174 assert(pStr1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
175 assert(pStr2);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 if (pStr1 == pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
181 /* Go through the string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
182 s1 = pStr1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
183 s2 = pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
184 while ((n > 0) && *s1 && *s2 && (*s1 == *s2)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
185 s1++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 s2++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187 n--;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
189
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190 if (n > 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191 return ((*s1) - (*s2));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
196
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197 /* Compare two strings ignoring case [strcasecmp, strncasecmp]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
198 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
199 int th_strcasecmp(char_t * pStr1, char_t * pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
200 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
201 char_t *s1, *s2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
202 assert(pStr1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
203 assert(pStr2);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
204
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
205 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 if (pStr1 == pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
207 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
208
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209 /* Go through the string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 s1 = pStr1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211 s2 = pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212 while (*s1 && *s2 && (th_tolower(*s1) == th_tolower(*s2))) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213 s1++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214 s2++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
216
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
217 return (th_tolower(*s1) - th_tolower(*s2));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
220
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221 int th_strncasecmp(char_t * pStr1, char_t * pStr2, size_t n)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
223 char_t *s1, *s2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
224 assert(pStr1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
225 assert(pStr2);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
226
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
228 if (pStr1 == pStr2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231 /* Go through the string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232 s1 = pStr1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233 s2 = pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234 while ((n > 0) && *s1 && *s2 && (th_tolower(*s1) == th_tolower(*s2))) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
235 s1++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 s2++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 n--;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
238 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
239
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 if (n > 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 return (th_tolower(*s1) - th_tolower(*s2));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
244 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
245
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
246
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
247 /* Remove all occurences of control characters, in-place.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248 * Resulting string is always shorter or same length than original.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 void th_strip_ctrlchars(char_t * pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
251 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252 char_t *i, *j;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
253 assert(pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
254
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255 i = pStr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 j = pStr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
257 while (*i) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
258 if (!th_iscntrl(*i))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
259 *(j++) = *i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
260 i++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
262
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263 *j = 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
265
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 /* Locate a substring [strstr]
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 char_t *th_strstr(char_t * haystack, char_t * needle)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 char_t *h, *n, *s;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 assert(haystack);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273 assert(needle);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275 /* If 'needle' is empty, we return 'haystack' */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
276 if (!*needle)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 return haystack;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
278
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279 /* Search for 'needle' in 'haystack' */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280 h = haystack;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
281 n = needle;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 while (*h) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283 /* Find possible start of 'needle' */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 while (*h && (*h != *n))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
285 h++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
287 if (*h == *n) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
288 /* Found, check rest */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
289 s = h;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290 n = needle;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
291 while (*h) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292 if (!*n)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293 return s;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
295 if (*h != *n)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
296 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
297 n++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
298 h++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
299 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
300 h = s;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
301 h++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
302 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
303 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
304
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
305 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
306 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
307
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
308
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
309 /* Copy a given string over in *ppResult.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
310 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
311 int th_pstrcpy(char_t ** ppResult, char_t * pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
312 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
313 assert(ppResult);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
314
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
315 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
316 if (!pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
317 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
318
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
319 /* Allocate memory for destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
320 th_free(*ppResult);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
321 *ppResult = th_stralloc(th_strlen(pStr) + 1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
322 if (!*ppResult)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
323 return -2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
324
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
325 /* Copy to the destination */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
326 th_strcpy(*ppResult, pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
327
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
330
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
331
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
332 /* Concatenates a given string into string pointed by *ppResult.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
333 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
334 int th_pstrcat(char_t ** ppResult, char_t * pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
335 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
336 assert(ppResult);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
337
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
338 /* Check the string pointers */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
339 if (!pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
340 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
341
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
342 if (*ppResult != NULL) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
343 *ppResult = th_strrealloc(*ppResult, th_strlen(*ppResult) + th_strlen(pStr) + 1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
344 if (*ppResult == NULL)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
345 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
346
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
347 th_strcat(*ppResult, pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
348 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
349 *ppResult = th_stralloc(th_strlen(pStr) + 1);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
350 if (*ppResult == NULL)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
351 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
352
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
353 th_strcpy(*ppResult, pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
354 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
355
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
357 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
358
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
359
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
360 /* Find next non-whitespace character in string.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
361 * Updates iPos into the position of such character and
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
362 * returns pointer to the string.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
363 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
364 char_t *th_findnext(char_t * pStr, size_t * iPos)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
365 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
366 assert(pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
367
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
368 /* Terminating NULL-character is not whitespace! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
369 while (th_isspace(pStr[*iPos]))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
370 (*iPos)++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
371 return &pStr[*iPos];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
372 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
373
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
374
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
375 /* Find next chSep-character from string
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
376 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
377 char_t *th_findsep(char_t * pStr, size_t * iPos, char_t chSep)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
378 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
379 assert(pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
380
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
381 /* Terminating NULL-character is not digit! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
382 while (pStr[*iPos] && (pStr[*iPos] != chSep))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 (*iPos)++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
384 return &pStr[*iPos];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
385 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
386
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
387
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
388 /* Find next chSep- or whitespace from string
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
389 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
390 char_t *th_findseporspace(char_t * pStr, size_t * iPos, char_t chSep)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
391 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
392 assert(pStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
393
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
394 /* Terminating NULL-character is not digit! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
395 while (!th_isspace(pStr[*iPos]) && (pStr[*iPos] != chSep))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
396 (*iPos)++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
397 return &pStr[*iPos];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
398 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
399
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
400
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
401 /* Compare a string to a pattern. Case-SENSITIVE version.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
402 * The matching pattern can consist of any normal characters plus
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
403 * wildcards ? and *. "?" matches any character and "*" matches
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
404 * any number of characters.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
405 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
406 BOOL th_strmatch(char_t * pStr, char_t * pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
407 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
408 BOOL didMatch, isAnyMode, isEnd;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
409 char_t *tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
410
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
411 /* Check given pattern and string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
412 if (!pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
413 return FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
414 if (!pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
415 return FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
416
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
417 /* Initialize */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
418 tmpPattern = NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
419 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
420 isEnd = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
421 isAnyMode = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
422
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
423 /* Start comparision */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
424 do {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
425 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
426 switch (*pPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
427 case '?':
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
428 /* Any single character matches */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
429 if (*pStr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
430 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
431 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
432 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
433 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
434 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
435
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
436 case '*':
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
437 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
438 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
439 if (!*pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
440 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
441 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
442 tmpPattern = pPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
443 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
444
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
445 case 0:
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
446 if (isAnyMode) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
447 if (*pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
448 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
449 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
450 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
451 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
452 if (*pStr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
453 if (tmpPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
454 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
455 pPattern = tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
456 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
457 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
458 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
459 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
460 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
461 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
462 default:
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
463 if (isAnyMode) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
464 if ((*pPattern) == (*pStr)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
465 isAnyMode = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
466 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
467 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
468 if (*pStr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
469 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
470 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
471 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
472 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
473 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
474 if ((*pPattern) == (*pStr)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
475 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
476 if (*pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
477 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
478 if (*pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
479 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
480 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
481 if (tmpPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
482 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
483 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
484 pPattern = tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
485 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
486 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
487 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
488
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
489 if (!*pStr && !*pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
490 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
491 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
492
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
493 } /* switch */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
494
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
495 } while ((didMatch) && (!isEnd));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
496
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
497 return didMatch;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
498 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
499
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
500
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
501 /* Compare a string to a pattern. Case-INSENSITIVE version.
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
502 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
503 BOOL th_strcasematch(char_t * pStr, char_t * pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
504 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
505 BOOL didMatch, isAnyMode, isEnd;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
506 char_t *tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
507
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
508 /* Check given pattern and string */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
509 if (!pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
510 return FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
511 if (!pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
512 return FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
513
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
514 /* Initialize */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
515 tmpPattern = NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
516 didMatch = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
517 isEnd = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
518 isAnyMode = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
519
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
520 /* Start comparision */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
521 do {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
522 switch (*pPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
523 case '?':
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
524 /* Any single character matches */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
525 if (*pStr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
526 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
527 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
528 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
529 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
530 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
531
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
532 case '*':
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
533 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
534 if (!*pPattern || (*pPattern == '?'))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
535 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
536 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
537 tmpPattern = pPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
538 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
539
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
540 case 0:
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
541 if (isAnyMode) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
542 if (*pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
543 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
544 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
545 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
546 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
547 if (*pStr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
548 if (tmpPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
549 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
550 pPattern = tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
551 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
552 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
553 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
554 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
555 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
556 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
557
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
558 default:
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
559 if (isAnyMode) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
560 if (th_tolower(*pPattern) == th_tolower(*pStr)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
561 isAnyMode = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
562 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
563 if (*pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
564 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
565 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
566 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
567 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
568 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
569 if (th_tolower(*pPattern) == th_tolower(*pStr)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
570 if (*pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
571 pPattern++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
572 if (*pStr)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
573 pStr++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
574 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
575 if (tmpPattern) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
576 isAnyMode = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
577 pPattern = tmpPattern;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
578 } else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
579 didMatch = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
580 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
581 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
582
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
583 if (!*pStr && !*pPattern)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
584 isEnd = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
585 break;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
586
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
587 } /* switch */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
588
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
589 } while ((didMatch) && (!isEnd));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
590
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
591 return didMatch;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
592 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
593
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
594
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
595 /*
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
596 * Handling of string-lists and hashes
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
597 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
598 t_str_node *th_strnode_new(char_t * pcStr, ulint_t nUsed, void *pData)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
599 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
600 t_str_node *pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
601
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
602 /* Allocate memory for new node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
603 pResult = (t_str_node *) th_calloc(1, sizeof(t_str_node));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
604 if (!pResult)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
605 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
606
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
607 /* Set fields */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
608 th_pstrcpy(&pResult->pcStr, pcStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
609 pResult->nUsed = nUsed;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
610 pResult->pData = pData;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
611
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
612 return pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
613 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
614
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
615
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
616 void th_strnode_free(t_str_node * pNode)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
617 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
618 assert(pNode);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
619
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
620 th_free(pNode->pcStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
621 th_free(pNode);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
622 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
623
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
624
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
625 /* Insert a new node into strlist
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
626 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
627 void th_strlist_insert(t_str_node ** strList, t_str_node * pNode)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
628 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
629 assert(strList);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
630 assert(pNode);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
631
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
632 /* Insert into linked list */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
633 if (*strList) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
634 /* The first node's pPrev points to last node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
635 LPREV = (*strList)->pPrev; /* New node's prev = Previous last node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
636 (*strList)->pPrev->pNext = pNode; /* Previous last node's next = New node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
637 (*strList)->pPrev = pNode; /* New last node = New node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
638 LNEXT = NULL; /* But next is NULL! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
639 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
640 (*strList) = pNode; /* First node ... */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
641 LPREV = pNode; /* ... it's also last */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
642 LNEXT = NULL; /* But next is NULL! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
643 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
644
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
645 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
646
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
647
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
648 /* Free a given strlist
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
649 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
650 void th_strlist_free(t_str_node * strList)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
651 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
652 t_str_node *pNode, *nNode;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
653
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
654 pNode = strList;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
655 while (pNode) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
656 nNode = pNode->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
657 th_strnode_free(pNode);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
658 pNode = nNode;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
659 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
660 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
661
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
662
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
663 /* Create a strIndex from strlist
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
664 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
665 t_str_index *th_strlist_makeindex(t_str_node * strList)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
666 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
667 t_str_index *pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
668 t_str_node *pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
669 ulint_t n;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
670 assert(strList);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
671
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
672 /* Computer number of nodes */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
673 for (n = 0, pCurr = strList; pCurr; pCurr = pCurr->pNext)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
674 n++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
675
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
676 /* Check number of nodes */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
677 if (n == 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
678 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
679
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
680 /* Allocate memory for index */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
681 pResult = (t_str_index *) th_calloc(1, sizeof(t_str_index));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
682 if (!pResult)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
683 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
684
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
685 pResult->n = n;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
686 pResult->ppIndex = (t_str_node **) th_calloc(n, sizeof(t_str_node *));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
687 if (!pResult->ppIndex) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
688 th_free(pResult);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
689 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
690 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
691
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
692 /* Create the index */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
693 for (n = 0, pCurr = strList; pCurr && (n < pResult->n); pCurr = pCurr->pNext)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
694 pResult->ppIndex[n++] = pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
695
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
696 return pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
697 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
698
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
699
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
700 /* Insert a node into given strhash
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
701 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
702 int th_strhash_insert(t_str_hash strHash, t_str_node * pNode, BOOL ignoreCase)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
703 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
704 int i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
705 assert(strHash);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
706 assert(pNode);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
707 assert(pNode->pcStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
708
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
709 if (ignoreCase)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
710 i = th_tolower(pNode->pcStr[0]);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
711 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
712 i = pNode->pcStr[0];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
713
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
714 /* Check the hashcode */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
715 if ((i < 0) && (i >= SET_HASH_MAXINDEX))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
716 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
717
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
718 if (strHash[i]) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
719 /* The first node's pPrev points to last node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
720 pNode->pPrev = strHash[i]->pPrev; /* New node's prev = Previous last node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
721 strHash[i]->pPrev->pNext = pNode; /* Previous last node's next = New node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
722 strHash[i]->pPrev = pNode; /* New last node = New node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
723 pNode->pNext = NULL; /* But next is NULL! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
724 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
725 strHash[i] = pNode; /* First node */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
726 pNode->pPrev = pNode; /* But also last */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
727 pNode->pNext = NULL; /* But next is NULL! */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
728 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
729
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
730 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
731 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
732
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
733
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
734 /* Free a given strhash
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
735 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
736 void th_strhash_free(t_str_hash strHash)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
737 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
738 int i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
739 assert(strHash);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
740
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
741 for (i = 0; i < SET_HASH_MAXINDEX; i++)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
742 th_strlist_free(strHash[i]);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
743 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
744
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
745
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
746 /* Change pData for matching entries to new value
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
747 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
748 void th_strhash_change_pdata(t_str_hash strHash, void *pFind, void *pNew)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
749 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
750 t_str_node *pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
751 int i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
752 assert(strHash);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
753
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
754 for (i = 0; i < SET_HASH_MAXINDEX; i++) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
755 /* Find from linked list */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
756 pCurr = strHash[i];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
757 while (pCurr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
758 if (pCurr->pData == pFind)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
759 pCurr->pData = pNew;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
760
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
761 pCurr = pCurr->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
762 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
763 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
764 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
765
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
766
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
767 /* Search a string from a given stringhash, either case-sensitive or insensitive
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
768 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
769 t_str_node *th_strhash_search(t_str_hash strHash, char_t * findStr, BOOL ignoreCase)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
770 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
771 t_str_node *pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
772 int i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
773 BOOL isFound;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
774 assert(strHash);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
775 assert(findStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
776
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
777 isFound = FALSE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
778 pCurr = NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
779
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
780 /* Check hashcode */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
781 if (ignoreCase)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
782 i = ((unsigned char) th_tolower(findStr[0]));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
783 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
784 i = ((unsigned char) findStr[0]);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
785
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
786 if ((i < 0) && (i >= SET_HASH_MAXINDEX))
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
787 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
788
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
789 /* Find from linked list */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
790 pCurr = strHash[i];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
791
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
792 if (ignoreCase) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
793 /* Case in-sensitive search */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
794 while (pCurr && !isFound) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
795 if (th_strcasecmp(findStr, pCurr->pcStr) == 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
796 isFound = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
797 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
798 pCurr = pCurr->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
799 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
800 } else {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
801 /* Case sensitive search */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
802 while (pCurr && !isFound) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
803 if (th_strcmp(findStr, pCurr->pcStr) == 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
804 isFound = TRUE;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
805 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
806 pCurr = pCurr->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
807 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
808 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
809
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
810 /* Return result */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
811 if (isFound)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
812 return pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
813 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
814 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
815 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
816
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
817
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
818 /* Create a strIndex from strHash
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
819 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
820 t_str_index *th_strhash_makeindex(t_str_hash strHash)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
821 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
822 t_str_index *pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
823 t_str_node *pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
824 unsigned int n, i;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
825 assert(strHash);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
826
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
827 /* Computer number of nodes */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
828 for (n = i = 0; i < SET_HASH_MAXINDEX; i++) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
829 pCurr = strHash[i];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
830 while (pCurr) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
831 n++;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
832 pCurr = pCurr->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
833 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
834 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
835
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
836 /* Check number of nodes */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
837 if (n <= 0)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
838 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
839
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
840 /* Allocate memory for index */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
841 pResult = (t_str_index *) th_calloc(1, sizeof(t_str_index));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
842 if (!pResult)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
843 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
844
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
845 pResult->n = n;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
846 pResult->ppIndex = (t_str_node **) th_calloc(n, sizeof(t_str_node *));
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
847 if (!pResult->ppIndex) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
848 th_free(pResult);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
849 return NULL;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
850 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
851
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
852 /* Create the index */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
853 for (n = i = 0; (i < SET_HASH_MAXINDEX) && (n < pResult->n); i++) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
854 pCurr = strHash[i];
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
855 while (pCurr && (n < pResult->n)) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
856 pResult->ppIndex[n++] = pCurr;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
857 pCurr = pCurr->pNext;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
858 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
859 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
860
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
861 return pResult;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
862 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
863
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
864
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
865 /* Free a given strIndex
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
866 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
867 void th_strindex_free(t_str_index * strIndex)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
868 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
869 if (strIndex) {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
870 th_free(strIndex->ppIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
871 th_free(strIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
872 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
873 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
874
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
875
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
876 /* Compare two t_str_nodes by nUsed
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
877 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
878 int th_strindex_cmp_used(const void *pNode1, const void *pNode2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
879 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
880 t_str_node *pStr1, *pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
881
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
882 pStr1 = *(t_str_node **) pNode1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
883 pStr2 = *(t_str_node **) pNode2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
884
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
885 if (pStr1->nUsed > pStr2->nUsed)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
886 return -1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
887 else if (pStr1->nUsed < pStr2->nUsed)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
888 return 1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
889 else
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
890 return 0;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
891 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
892
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
893
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
894 /* Sort an strIndex by nUsed, using th_strindex_cmp_used()
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
895 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
896 void th_strindex_sort_nused(t_str_index * strIndex)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
897 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
898 assert(strIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
899 assert(strIndex->ppIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
900
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
901 qsort(strIndex->ppIndex, strIndex->n, sizeof(t_str_node *), th_strindex_cmp_used);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
902 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
903
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
904
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
905 /* Compare two t_str_nodes via strcmp()
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
906 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
907 int th_strindex_cmp_alpha(const void *pNode1, const void *pNode2)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
908 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
909 t_str_node *pStr1, *pStr2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
910
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
911 pStr1 = *(t_str_node **) pNode1;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
912 pStr2 = *(t_str_node **) pNode2;
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
913
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
914 return th_strcmp(pStr1->pcStr, pStr2->pcStr);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
915 }
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
916
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
917
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
918 /* Sort an strIndex by nUsed, using th_strindex_cmp_used()
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
919 */
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
920 void th_strindex_sort_alpha(t_str_index * strIndex)
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
921 {
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
922 assert(strIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
923 assert(strIndex->ppIndex);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
924
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
925 qsort(strIndex->ppIndex, strIndex->n, sizeof(t_str_node *), th_strindex_cmp_alpha);
728243125263 Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
926 }