1.1 --- a/core/sm_stringutil.cpp Fri Dec 29 23:18:13 2006 +0000
1.2 +++ b/core/sm_stringutil.cpp Fri Dec 29 23:28:44 2006 +0000
1.3 @@ -1,3 +1,5 @@
1.4 +#include <stdlib.h>
1.5 +#include <ctype.h>
1.6 #include "sm_stringutil.h"
1.7
1.8 #define ALT 0x00000001 /* alternate form */
1.9 @@ -262,7 +264,7 @@
1.10 int n;
1.11 char sign;
1.12 const char *fmt;
1.13 - size_t llen = maxlen;
1.14 + size_t llen = maxlen - 1;
1.15
1.16 buf_p = buffer;
1.17 arg = *param;
1.18 @@ -337,7 +339,7 @@
1.19 case 'c':
1.20 {
1.21 CHECK_ARGS(0);
1.22 - if (llen <= 1)
1.23 + if (!llen)
1.24 {
1.25 goto done;
1.26 }
1.27 @@ -387,7 +389,7 @@
1.28 }
1.29 case '%':
1.30 {
1.31 - if (llen <= 1)
1.32 + if (!llen)
1.33 {
1.34 goto done;
1.35 }
1.36 @@ -397,7 +399,7 @@
1.37 }
1.38 case '\0':
1.39 {
1.40 - if (llen <= 1)
1.41 + if (!llen)
1.42 {
1.43 goto done;
1.44 }
1.45 @@ -407,7 +409,7 @@
1.46 }
1.47 default:
1.48 {
1.49 - if (llen <= 1)
1.50 + if (!llen)
1.51 {
1.52 goto done;
1.53 }
1.54 @@ -423,3 +425,61 @@
1.55 *param = arg;
1.56 return (maxlen - llen);
1.57 }
1.58 +
1.59 +const char *stristr(const char *str, const char *substr)
1.60 +{
1.61 + if (!*substr)
1.62 + {
1.63 + return ((char *)str);
1.64 + }
1.65 +
1.66 + char *needle = (char *)substr;
1.67 + char *prevloc = (char *)str;
1.68 + char *haystack = (char *)str;
1.69 +
1.70 + while (*haystack)
1.71 + {
1.72 + if (tolower(*haystack) == tolower(*needle))
1.73 + {
1.74 + haystack++;
1.75 + if (!*++needle)
1.76 + {
1.77 + return prevloc;
1.78 + }
1.79 + } else {
1.80 + haystack = ++prevloc;
1.81 + needle = (char *)substr;
1.82 + }
1.83 + }
1.84 +
1.85 + return NULL;
1.86 +}
1.87 +
1.88 +inline int StrConvInt(const char *str)
1.89 +{
1.90 + char *dummy;
1.91 + return strtol(str, &dummy, 10);
1.92 +}
1.93 +
1.94 +inline float StrConvFloat(const char *str)
1.95 +{
1.96 + char *dummy;
1.97 + return (float)strtod(str, &dummy);
1.98 +}
1.99 +
1.100 +int strncopy(char *dest, const char *src, size_t count)
1.101 +{
1.102 + if (!count)
1.103 + {
1.104 + return 0;
1.105 + }
1.106 +
1.107 + char *start = dest;
1.108 + while ((*src) && (--count))
1.109 + {
1.110 + *dest++ = *src++;
1.111 + }
1.112 + *dest = '\0';
1.113 +
1.114 + return (dest - start);
1.115 +}
2.1 --- a/core/sm_stringutil.h Fri Dec 29 23:18:13 2006 +0000
2.2 +++ b/core/sm_stringutil.h Fri Dec 29 23:28:44 2006 +0000
2.3 @@ -8,5 +8,9 @@
2.4 using namespace SourcePawn;
2.5
2.6 size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param);
2.7 +const char *stristr(const char *str, const char *substr);
2.8 +int StrConvInt(const char *str);
2.9 +float StrConvFloat(const char *str);
2.10 +int strncopy(char *dest, const char *src, size_t count);
2.11
2.12 #endif // _INCLUDE_SOURCEMOD_STRINGUTIL_H_
3.1 --- a/core/smn_string.cpp Fri Dec 29 23:18:13 2006 +0000
3.2 +++ b/core/smn_string.cpp Fri Dec 29 23:28:44 2006 +0000
3.3 @@ -1,41 +1,11 @@
3.4 #include "sm_platform.h"
3.5 -#include <ctype.h>
3.6 #include <string.h>
3.7 -#include <stdlib.h>
3.8 #include "sp_vm_api.h"
3.9 #include "sp_vm_typeutil.h"
3.10 +#include "sm_stringutil.h"
3.11
3.12 using namespace SourcePawn;
3.13
3.14 -const char *stristr(const char *str, const char *substr)
3.15 -{
3.16 - if (!*substr)
3.17 - {
3.18 - return ((char *)str);
3.19 - }
3.20 -
3.21 - char *needle = (char *)substr;
3.22 - char *prevloc = (char *)str;
3.23 - char *haystack = (char *)str;
3.24 -
3.25 - while (*haystack)
3.26 - {
3.27 - if (tolower(*haystack) == tolower(*needle))
3.28 - {
3.29 - haystack++;
3.30 - if (!*++needle)
3.31 - {
3.32 - return prevloc;
3.33 - }
3.34 - } else {
3.35 - haystack = ++prevloc;
3.36 - needle = (char *)substr;
3.37 - }
3.38 - }
3.39 -
3.40 - return NULL;
3.41 -}
3.42 -
3.43 inline const char *_strstr(const char *str, const char *substr)
3.44 {
3.45 #ifdef PLATFORM_WINDOWS
3.46 @@ -45,17 +15,6 @@
3.47 #endif
3.48 }
3.49
3.50 -inline int StrConvInt(const char *str)
3.51 -{
3.52 - char *dummy;
3.53 - return strtol(str, &dummy, 10);
3.54 -}
3.55 -
3.56 -inline float StrConvFloat(const char *str)
3.57 -{
3.58 - char *dummy;
3.59 - return (float)strtod(str, &dummy);
3.60 -}
3.61
3.62 /*********************************************
3.63 * *
3.64 @@ -107,21 +66,12 @@
3.65
3.66 static cell_t sm_strcopy(IPluginContext *pCtx, const cell_t *params)
3.67 {
3.68 - char *dest, *src, *start;
3.69 - int len;
3.70 + char *dest, *src;
3.71
3.72 pCtx->LocalToString(params[1], &dest);
3.73 pCtx->LocalToString(params[3], &src);
3.74 - len = params[2];
3.75
3.76 - start = dest;
3.77 - while ((*src) && (len--))
3.78 - {
3.79 - *dest++ = *src++;
3.80 - }
3.81 - *dest = '\0';
3.82 -
3.83 - return (dest - start);
3.84 + return strncopy(dest, src, params[2]);
3.85 }
3.86
3.87 static cell_t sm_strtonum(IPluginContext *pCtx, const cell_t *params)