00001 #if FL_STRING != 0 00002 00003 #if FL_INCLUDE_ALL_C == 0 00004 #include "flString.h" 00005 #include "flMemory.h" 00006 00007 #if FL_DEBUG != 0 00008 #include "flDebug.h" 00009 #endif 00010 #endif 00011 00012 u32 ustrLen(u16* inStr) { 00013 if(!inStr) 00014 return 0; 00015 u32 tempOut, i; 00016 for(i = 0, tempOut = 0; inStr[i]; i++) 00017 tempOut++; 00018 return tempOut; 00019 } 00020 00021 u32 strLen(u8* inStr) { 00022 if(!inStr) 00023 return 0; 00024 u32 tempOut, i; 00025 for(i = 0, tempOut = 0; inStr[i]; i++) 00026 tempOut++; 00027 return tempOut; 00028 } 00029 00030 u16* strToUstr(u8* inStr) { 00031 if(!inStr) 00032 return NULL; 00033 u16* tempOut = (u16*)memAlloc((strLen(inStr) + 1) << 1); 00034 if(!tempOut) { 00035 #if FL_DEBUG_WARNING != 0 00036 debugWarning("Cannot convert string to unicode.\nProbably out of memory."); 00037 #endif 00038 return NULL; 00039 } 00040 u32 i; 00041 for(i = 0; inStr[i]; i++) 00042 tempOut[i] = (u16)inStr[i]; 00043 tempOut[i] = 0; 00044 return tempOut; 00045 } 00046 00047 u8* ustrToStr(u16* inStr) { 00048 if(!inStr) 00049 return NULL; 00050 u8* tempOut = (u8*)memAlloc(ustrLen(inStr) + 1); 00051 if(!tempOut) { 00052 #if FL_DEBUG_WARNING != 0 00053 debugWarning("Cannot convert string to ascii.\nProbably out of memory."); 00054 #endif 00055 return NULL; 00056 } 00057 u32 i; 00058 for(i = 0; inStr[i]; i++) 00059 tempOut[i] = (u8)(inStr[i] & 0x00FF); 00060 tempOut[i] = 0; 00061 return tempOut; 00062 } 00063 00064 u8* strCopy(u8* inStr) { 00065 if(!inStr) 00066 return NULL; 00067 u8* tempOut = (u8*)memAlloc(strLen(inStr) + 1); 00068 if(!tempOut) { 00069 #if FL_DEBUG_WARNING != 0 00070 debugWarning("Cannot copy string.\nProbably out of memory."); 00071 #endif 00072 return NULL; 00073 } 00074 memCopy(tempOut, inStr, (strLen(inStr) + 1)); 00075 return tempOut; 00076 } 00077 00078 u8* strCopyTo(u8* inStrDest, u8* inStrSrc) { 00079 if(!inStrSrc) { 00080 #if FL_DEBUG_WARNING != 0 00081 debugWarning("Trying to copy NULL string."); 00082 #endif 00083 return NULL; 00084 } 00085 if(!inStrDest) { 00086 #if FL_DEBUG_WARNING != 0 00087 debugWarning("Trying to copy string to a NULL destination."); 00088 #endif 00089 return NULL; 00090 } 00091 memCopy(inStrDest, inStrSrc, (strLen(inStrSrc) + 1)); 00092 return inStrDest; 00093 } 00094 00095 u16* ustrCopy(u16* inStr) { 00096 if(!inStr) 00097 return NULL; 00098 u16* tempOut = (u16*)memAlloc((ustrLen(inStr) + 1) << 1); 00099 if(!tempOut) { 00100 #if FL_DEBUG_WARNING != 0 00101 debugWarning("Cannot copy unicode string.\nProbably out of memory."); 00102 #endif 00103 return NULL; 00104 } 00105 memCopy(tempOut, inStr, ((ustrLen(inStr) + 1) << 1)); 00106 return tempOut; 00107 } 00108 00109 u16* ustrCopyTo(u16* inStrDest, u16* inStrSrc) { 00110 if(!inStrSrc) { 00111 #if FL_DEBUG_WARNING != 0 00112 debugWarning("Trying to copy NULL string."); 00113 #endif 00114 return NULL; 00115 } 00116 if(!inStrDest) { 00117 #if FL_DEBUG_WARNING != 0 00118 debugWarning("Trying to copy string to a NULL destination."); 00119 #endif 00120 return NULL; 00121 } 00122 memCopy(inStrDest, inStrSrc, ((ustrLen(inStrSrc) + 1) << 1)); 00123 return inStrDest; 00124 } 00125 00126 u8* strLCase(u8* inStr) { 00127 u32 i; 00128 for(i = 0; inStr[i]; i++) { 00129 if((inStr[i] >= 'A') && (inStr[i] <= 'Z')) 00130 inStr[i] += ('a' - 'A'); 00131 } 00132 return inStr; 00133 } 00134 00135 u8* strUCase(u8* inStr) { 00136 u32 i; 00137 for(i = 0; inStr[i]; i++) { 00138 if((inStr[i] >= 'a') && (inStr[i] <= 'z')) 00139 inStr[i] -= ('a' - 'A'); 00140 } 00141 return inStr; 00142 } 00143 00144 u16* ustrLCase(u16* inStr) { 00145 u32 i; 00146 for(i = 0; inStr[i]; i++) { 00147 if((inStr[i] >= 'A') && (inStr[i] <= 'Z')) 00148 inStr[i] += ('a' - 'A'); 00149 } 00150 return inStr; 00151 } 00152 00153 u16* ustrUCase(u16* inStr) { 00154 u32 i; 00155 for(i = 0; inStr[i]; i++) { 00156 if((inStr[i] >= 'a') && (inStr[i] <= 'z')) 00157 inStr[i] -= ('a' - 'A'); 00158 } 00159 return inStr; 00160 } 00161 00162 s32 strCmp(u8* inStr0, u8* inStr1) { 00163 if(inStr0 == inStr1) 00164 return 0; 00165 if(!inStr0) { 00166 if(!inStr1) 00167 return 0; 00168 return (0 - (s32)inStr1[0]); 00169 } 00170 if(!inStr1) 00171 return ((s32)inStr1[1]); 00172 u32 i = 0; 00173 while((inStr0[i] == inStr1[i]) && inStr0[i]) 00174 i++; 00175 return ((s32)inStr0[i] - (s32)inStr1[i]); 00176 } 00177 00178 s32 ustrCmp(u16* inStr0, u16* inStr1) { 00179 if(inStr0 == inStr1) 00180 return 0; 00181 if(!inStr0) { 00182 if(!inStr1) 00183 return 0; 00184 return (0 - (s32)inStr1[0]); 00185 } 00186 if(!inStr1) 00187 return ((s32)inStr1[1]); 00188 u32 i = 0; 00189 while((inStr0[i] == inStr1[i]) && inStr0[i]) 00190 i++; 00191 return ((s32)inStr0[i] - (s32)inStr1[i]); 00192 } 00193 00194 int strToInt(u8* inStr) { 00195 if(!inStr || (inStr[0] == 0)) 00196 return 0; 00197 int tempOut = 0; 00198 u8* tempStrPtr = inStr; 00199 bool tempNeg = false; 00200 if(tempStrPtr[0] == '-') { 00201 tempNeg = true; 00202 tempStrPtr++; 00203 } else if(tempStrPtr[0] == '+') { 00204 tempStrPtr++; 00205 } 00206 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) { 00207 tempOut *= 10; 00208 tempOut += (int)(tempStrPtr[0] - '0'); 00209 tempStrPtr++; 00210 } 00211 if(tempNeg) 00212 return -tempOut; 00213 return tempOut; 00214 } 00215 00216 float strToFloat(u8* inStr) { 00217 if(!inStr || (inStr[0] == 0)) 00218 return 0.0f; 00219 float tempOut = 0.0f; 00220 u8* tempStrPtr = inStr; 00221 bool tempNeg = false; 00222 if(tempStrPtr[0] == '-') { 00223 tempNeg = true; 00224 tempStrPtr++; 00225 } else if(tempStrPtr[0] == '+') { 00226 tempStrPtr++; 00227 } 00228 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) { 00229 tempOut *= 10.0f; 00230 tempOut += (float)(tempStrPtr[0] - '0'); 00231 tempStrPtr++; 00232 } 00233 if(tempStrPtr[0] == '.') { 00234 tempStrPtr++; 00235 int i = 1; 00236 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) { 00237 if(tempStrPtr[0] != '0') 00238 tempOut += ((float)(tempStrPtr[0] - '0') / powf(10.0f, (float)i)); 00239 tempStrPtr++; i++; 00240 } 00241 } 00242 if((tempStrPtr[0] == 'e') || (tempStrPtr[0] == 'E')) { 00243 tempStrPtr++; 00244 bool tempExpNeg = false; 00245 int tempExp = 0; 00246 if(tempStrPtr[0] == '-') { 00247 tempStrPtr++; 00248 tempExpNeg = true; 00249 } else if(tempStrPtr[0] == '+') { 00250 tempStrPtr++; 00251 } 00252 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) { 00253 tempExp *= 10; 00254 tempExp += (int)(tempStrPtr[0] - '0'); 00255 tempStrPtr++; 00256 } 00257 if(tempExpNeg) 00258 tempOut /= powf(10.0f, (float)tempExp); 00259 else 00260 tempOut *= powf(10.0f, (float)tempExp); 00261 } 00262 if(tempNeg) 00263 return -tempOut; 00264 return tempOut; 00265 } 00266 00267 vect2f strToVect2f(u8* inStr) { 00268 vect2f tempOut; 00269 tempOut.x = 0.0f; 00270 tempOut.y = 0.0f; 00271 00272 if(!inStr || (inStr[0] == 0)) 00273 return tempOut; 00274 00275 u8* tempStrPtr = inStr; 00276 00277 while((tempStrPtr[0] == ' ') || (tempStrPtr[0] == ASCII_TAB) || (tempStrPtr[0] == '(')) 00278 tempStrPtr++; 00279 if(tempStrPtr[0] == 0) 00280 return tempOut; 00281 tempOut.x = strToFloat(tempStrPtr); 00282 if((tempStrPtr[0] == '+') || (tempStrPtr[0] == '-')) 00283 tempStrPtr++; 00284 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00285 tempStrPtr++; 00286 if(tempStrPtr[0] == '.') { 00287 tempStrPtr++; 00288 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00289 tempStrPtr++; 00290 } 00291 if((tempStrPtr[0] == 'e') || (tempStrPtr[0] == 'E')) { 00292 tempStrPtr++; 00293 if((tempStrPtr[0] == '-') || (tempStrPtr[0] == '+')) 00294 tempStrPtr++; 00295 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00296 tempStrPtr++; 00297 } 00298 00299 while((tempStrPtr[0] == ' ') || (tempStrPtr[0] == ASCII_TAB) || (tempStrPtr[0] == ',')) 00300 tempStrPtr++; 00301 if(tempStrPtr[0] == 0) 00302 return tempOut; 00303 tempOut.y = strToFloat(tempStrPtr); 00304 00305 return tempOut; 00306 } 00307 00308 vect3f strToVect3f(u8* inStr) { 00309 vect3f tempOut; 00310 tempOut.x = 0.0f; 00311 tempOut.y = 0.0f; 00312 tempOut.z = 0.0f; 00313 00314 if(!inStr || (inStr[0] == 0)) 00315 return tempOut; 00316 00317 u8* tempStrPtr = inStr; 00318 00319 while((tempStrPtr[0] == ' ') || (tempStrPtr[0] == ASCII_TAB) || (tempStrPtr[0] == '(')) 00320 tempStrPtr++; 00321 if(tempStrPtr[0] == 0) 00322 return tempOut; 00323 tempOut.x = strToFloat(tempStrPtr); 00324 if((tempStrPtr[0] == '+') || (tempStrPtr[0] == '-')) 00325 tempStrPtr++; 00326 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00327 tempStrPtr++; 00328 if(tempStrPtr[0] == '.') { 00329 tempStrPtr++; 00330 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00331 tempStrPtr++; 00332 } 00333 if((tempStrPtr[0] == 'e') || (tempStrPtr[0] == 'E')) { 00334 tempStrPtr++; 00335 if((tempStrPtr[0] == '-') || (tempStrPtr[0] == '+')) 00336 tempStrPtr++; 00337 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00338 tempStrPtr++; 00339 } 00340 00341 while((tempStrPtr[0] == ' ') || (tempStrPtr[0] == ASCII_TAB) || (tempStrPtr[0] == ',')) 00342 tempStrPtr++; 00343 if(tempStrPtr[0] == 0) 00344 return tempOut; 00345 tempOut.y = strToFloat(tempStrPtr); 00346 if((tempStrPtr[0] == '+') || (tempStrPtr[0] == '-')) 00347 tempStrPtr++; 00348 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00349 tempStrPtr++; 00350 if(tempStrPtr[0] == '.') { 00351 tempStrPtr++; 00352 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00353 tempStrPtr++; 00354 } 00355 if((tempStrPtr[0] == 'e') || (tempStrPtr[0] == 'E')) { 00356 tempStrPtr++; 00357 if((tempStrPtr[0] == '-') || (tempStrPtr[0] == '+')) 00358 tempStrPtr++; 00359 while((tempStrPtr[0] >= '0') && (tempStrPtr[0] <= '9')) 00360 tempStrPtr++; 00361 } 00362 00363 while((tempStrPtr[0] == ' ') || (tempStrPtr[0] == ASCII_TAB) || (tempStrPtr[0] == ',')) 00364 tempStrPtr++; 00365 if(tempStrPtr[0] == 0) 00366 return tempOut; 00367 tempOut.z = strToFloat(tempStrPtr); 00368 00369 return tempOut; 00370 } 00371 00372 #endif