core/sm_stringutil.cpp
changeset 230 f6abafc7c96c
parent 227 72ab30bba3b9
child 233 968f92668138
     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 +}