fixed a "-1" bug in atcprintf
authorBorja Ferrer <faluco@alliedmods.net>
Fri Dec 29 23:28:44 2006 +0000 (2006-12-29)
changeset 230f6abafc7c96c
parent 229 7819a42069e4
child 231 4050f574314a
fixed a "-1" bug in atcprintf
moved string functions to the stringutils file
added strncopy
core/sm_stringutil.cpp
core/sm_stringutil.h
core/smn_string.cpp
     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)