fixed a "-1" bug in atcprintf
moved string functions to the stringutils file added strncopy --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40235
This commit is contained in:
		
							parent
							
								
									f068587ecc
								
							
						
					
					
						commit
						4153221ca8
					
				| @ -1,3 +1,5 @@ | |||||||
|  | #include <stdlib.h> | ||||||
|  | #include <ctype.h> | ||||||
| #include "sm_stringutil.h" | #include "sm_stringutil.h" | ||||||
| 
 | 
 | ||||||
| #define ALT				0x00000001		/* alternate form */ | #define ALT				0x00000001		/* alternate form */ | ||||||
| @ -262,7 +264,7 @@ size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext | |||||||
| 	int n; | 	int n; | ||||||
| 	char sign; | 	char sign; | ||||||
| 	const char *fmt; | 	const char *fmt; | ||||||
| 	size_t llen = maxlen; | 	size_t llen = maxlen - 1; | ||||||
| 
 | 
 | ||||||
| 	buf_p = buffer; | 	buf_p = buffer; | ||||||
| 	arg = *param; | 	arg = *param; | ||||||
| @ -337,7 +339,7 @@ reswitch: | |||||||
| 		case 'c': | 		case 'c': | ||||||
| 			{ | 			{ | ||||||
| 				CHECK_ARGS(0); | 				CHECK_ARGS(0); | ||||||
| 				if (llen <= 1) | 				if (!llen) | ||||||
| 				{ | 				{ | ||||||
| 					goto done; | 					goto done; | ||||||
| 				} | 				} | ||||||
| @ -387,7 +389,7 @@ reswitch: | |||||||
| 			} | 			} | ||||||
| 		case '%': | 		case '%': | ||||||
| 			{ | 			{ | ||||||
| 				if (llen <= 1) | 				if (!llen) | ||||||
| 				{ | 				{ | ||||||
| 					goto done; | 					goto done; | ||||||
| 				} | 				} | ||||||
| @ -397,7 +399,7 @@ reswitch: | |||||||
| 			} | 			} | ||||||
| 		case '\0': | 		case '\0': | ||||||
| 			{ | 			{ | ||||||
| 				if (llen <= 1) | 				if (!llen) | ||||||
| 				{ | 				{ | ||||||
| 					goto done; | 					goto done; | ||||||
| 				} | 				} | ||||||
| @ -407,7 +409,7 @@ reswitch: | |||||||
| 			} | 			} | ||||||
| 		default: | 		default: | ||||||
| 			{ | 			{ | ||||||
| 				if (llen <= 1) | 				if (!llen) | ||||||
| 				{ | 				{ | ||||||
| 					goto done; | 					goto done; | ||||||
| 				} | 				} | ||||||
| @ -423,3 +425,61 @@ done: | |||||||
| 	*param = arg; | 	*param = arg; | ||||||
| 	return (maxlen - llen); | 	return (maxlen - llen); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | const char *stristr(const char *str, const char *substr) | ||||||
|  | { | ||||||
|  | 	if (!*substr) | ||||||
|  | 	{ | ||||||
|  | 		return ((char *)str); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	char *needle = (char *)substr; | ||||||
|  | 	char *prevloc = (char *)str; | ||||||
|  | 	char *haystack = (char *)str; | ||||||
|  | 
 | ||||||
|  | 	while (*haystack) | ||||||
|  | 	{ | ||||||
|  | 		if (tolower(*haystack) == tolower(*needle)) | ||||||
|  | 		{ | ||||||
|  | 			haystack++; | ||||||
|  | 			if (!*++needle) | ||||||
|  | 			{ | ||||||
|  | 				return prevloc; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			haystack = ++prevloc; | ||||||
|  | 			needle = (char *)substr; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | inline int StrConvInt(const char *str) | ||||||
|  | { | ||||||
|  | 	char *dummy; | ||||||
|  | 	return strtol(str, &dummy, 10); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | inline float StrConvFloat(const char *str) | ||||||
|  | { | ||||||
|  | 	char *dummy; | ||||||
|  | 	return (float)strtod(str, &dummy); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int strncopy(char *dest, const char *src, size_t count) | ||||||
|  | { | ||||||
|  | 	if (!count) | ||||||
|  | 	{ | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	char *start = dest; | ||||||
|  | 	while ((*src) && (--count)) | ||||||
|  | 	{ | ||||||
|  | 		*dest++ = *src++; | ||||||
|  | 	} | ||||||
|  | 	*dest = '\0'; | ||||||
|  | 
 | ||||||
|  | 	return (dest - start); | ||||||
|  | } | ||||||
|  | |||||||
| @ -8,5 +8,9 @@ | |||||||
| using namespace SourcePawn; | using namespace SourcePawn; | ||||||
| 
 | 
 | ||||||
| size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param); | size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param); | ||||||
|  | const char *stristr(const char *str, const char *substr); | ||||||
|  | int StrConvInt(const char *str); | ||||||
|  | float StrConvFloat(const char *str); | ||||||
|  | int strncopy(char *dest, const char *src, size_t count); | ||||||
| 
 | 
 | ||||||
| #endif // _INCLUDE_SOURCEMOD_STRINGUTIL_H_
 | #endif // _INCLUDE_SOURCEMOD_STRINGUTIL_H_
 | ||||||
|  | |||||||
| @ -1,41 +1,11 @@ | |||||||
| #include "sm_platform.h" | #include "sm_platform.h" | ||||||
| #include <ctype.h> |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <stdlib.h> |  | ||||||
| #include "sp_vm_api.h" | #include "sp_vm_api.h" | ||||||
| #include "sp_vm_typeutil.h" | #include "sp_vm_typeutil.h" | ||||||
|  | #include "sm_stringutil.h" | ||||||
| 
 | 
 | ||||||
| using namespace SourcePawn; | using namespace SourcePawn; | ||||||
| 
 | 
 | ||||||
| const char *stristr(const char *str, const char *substr) |  | ||||||
| { |  | ||||||
| 	if (!*substr) |  | ||||||
| 	{ |  | ||||||
| 		return ((char *)str); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	char *needle = (char *)substr; |  | ||||||
| 	char *prevloc = (char *)str; |  | ||||||
| 	char *haystack = (char *)str; |  | ||||||
| 
 |  | ||||||
| 	while (*haystack) |  | ||||||
| 	{ |  | ||||||
| 		if (tolower(*haystack) == tolower(*needle)) |  | ||||||
| 		{ |  | ||||||
| 			haystack++; |  | ||||||
| 			if (!*++needle) |  | ||||||
| 			{ |  | ||||||
| 				return prevloc; |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			haystack = ++prevloc; |  | ||||||
| 			needle = (char *)substr; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| inline const char *_strstr(const char *str, const char *substr) | inline const char *_strstr(const char *str, const char *substr) | ||||||
| { | { | ||||||
| #ifdef PLATFORM_WINDOWS | #ifdef PLATFORM_WINDOWS | ||||||
| @ -45,17 +15,6 @@ inline const char *_strstr(const char *str, const char *substr) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline int StrConvInt(const char *str) |  | ||||||
| { |  | ||||||
| 	char *dummy; |  | ||||||
| 	return strtol(str, &dummy, 10); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| inline float StrConvFloat(const char *str) |  | ||||||
| { |  | ||||||
| 	char *dummy; |  | ||||||
| 	return (float)strtod(str, &dummy); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| /*********************************************
 | /*********************************************
 | ||||||
| *                                            * | *                                            * | ||||||
| @ -107,21 +66,12 @@ static cell_t sm_equal(IPluginContext *pCtx, const cell_t *params) | |||||||
| 
 | 
 | ||||||
| static cell_t sm_strcopy(IPluginContext *pCtx, const cell_t *params) | static cell_t sm_strcopy(IPluginContext *pCtx, const cell_t *params) | ||||||
| { | { | ||||||
| 	char *dest, *src, *start; | 	char *dest, *src; | ||||||
| 	int len; |  | ||||||
| 
 | 
 | ||||||
| 	pCtx->LocalToString(params[1], &dest); | 	pCtx->LocalToString(params[1], &dest); | ||||||
| 	pCtx->LocalToString(params[3], &src); | 	pCtx->LocalToString(params[3], &src); | ||||||
| 	len = params[2]; |  | ||||||
| 
 | 
 | ||||||
| 	start = dest; | 	return strncopy(dest, src, params[2]); | ||||||
| 	while ((*src) && (len--)) |  | ||||||
| 	{ |  | ||||||
| 		*dest++ = *src++; |  | ||||||
| 	} |  | ||||||
| 	*dest = '\0'; |  | ||||||
| 
 |  | ||||||
| 	return (dest - start); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static cell_t sm_strtonum(IPluginContext *pCtx, const cell_t *params) | static cell_t sm_strtonum(IPluginContext *pCtx, const cell_t *params) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user