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"
|
||||
|
||||
#define ALT 0x00000001 /* alternate form */
|
||||
@ -262,7 +264,7 @@ size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext
|
||||
int n;
|
||||
char sign;
|
||||
const char *fmt;
|
||||
size_t llen = maxlen;
|
||||
size_t llen = maxlen - 1;
|
||||
|
||||
buf_p = buffer;
|
||||
arg = *param;
|
||||
@ -337,7 +339,7 @@ reswitch:
|
||||
case 'c':
|
||||
{
|
||||
CHECK_ARGS(0);
|
||||
if (llen <= 1)
|
||||
if (!llen)
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
@ -387,7 +389,7 @@ reswitch:
|
||||
}
|
||||
case '%':
|
||||
{
|
||||
if (llen <= 1)
|
||||
if (!llen)
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
@ -397,7 +399,7 @@ reswitch:
|
||||
}
|
||||
case '\0':
|
||||
{
|
||||
if (llen <= 1)
|
||||
if (!llen)
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
@ -407,7 +409,7 @@ reswitch:
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (llen <= 1)
|
||||
if (!llen)
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
@ -423,3 +425,61 @@ done:
|
||||
*param = arg;
|
||||
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;
|
||||
|
||||
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_
|
||||
|
@ -1,41 +1,11 @@
|
||||
#include "sm_platform.h"
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "sp_vm_api.h"
|
||||
#include "sp_vm_typeutil.h"
|
||||
#include "sm_stringutil.h"
|
||||
|
||||
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)
|
||||
{
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
@ -45,17 +15,6 @@ inline const char *_strstr(const char *str, const char *substr)
|
||||
#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)
|
||||
{
|
||||
char *dest, *src, *start;
|
||||
int len;
|
||||
char *dest, *src;
|
||||
|
||||
pCtx->LocalToString(params[1], &dest);
|
||||
pCtx->LocalToString(params[3], &src);
|
||||
len = params[2];
|
||||
|
||||
start = dest;
|
||||
while ((*src) && (len--))
|
||||
{
|
||||
*dest++ = *src++;
|
||||
}
|
||||
*dest = '\0';
|
||||
|
||||
return (dest - start);
|
||||
return strncopy(dest, src, params[2]);
|
||||
}
|
||||
|
||||
static cell_t sm_strtonum(IPluginContext *pCtx, const cell_t *params)
|
||||
|
Loading…
Reference in New Issue
Block a user