Added natives str_to_float and float_to_str; indents are now tabs

This commit is contained in:
Pavol Marko 2005-09-06 16:29:27 +00:00
parent d3e2bad4e7
commit af79fe8e20

@ -34,23 +34,23 @@
const char* stristr(const char* str,const char* substr) const char* stristr(const char* str,const char* substr)
{ {
register char *needle = (char *)substr; register char *needle = (char *)substr;
register char *prevloc = (char *)str; register char *prevloc = (char *)str;
register char *haystack = (char *)str; register char *haystack = (char *)str;
while (*haystack) { while (*haystack) {
if (tolower(*haystack) == tolower(*needle)) { if (tolower(*haystack) == tolower(*needle)) {
haystack++; haystack++;
if (!*++needle) if (!*++needle)
return prevloc; return prevloc;
} }
else { else {
haystack = ++prevloc; haystack = ++prevloc;
needle = (char *)substr; needle = (char *)substr;
} }
} }
return NULL; return NULL;
} }
char* format_amxstring(AMX *amx, cell *params, int parm,int& len) char* format_amxstring(AMX *amx, cell *params, int parm,int& len)
@ -60,39 +60,39 @@ char* format_amxstring(AMX *amx, cell *params, int parm,int& len)
int amxstring_len(cell* a) int amxstring_len(cell* a)
{ {
register int c = 0; register int c = 0;
while( a[ c ] ) while( a[ c ] )
++c; ++c;
return c; return c;
} }
cell* get_amxaddr(AMX *amx,cell amx_addr) cell* get_amxaddr(AMX *amx,cell amx_addr)
{ {
return (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); return (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
} }
int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max) int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max)
{ {
cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
cell* start = dest; cell* start = dest;
while (max--&&*source) while (max--&&*source)
*dest++=(cell)*source++; *dest++=(cell)*source++;
*dest = 0; *dest = 0;
return dest-start; return dest-start;
} }
char* get_amxstring(AMX *amx,cell amx_addr,int id, int& len) char* get_amxstring(AMX *amx,cell amx_addr,int id, int& len)
{ {
static char buffor[4][3072]; static char buffor[4][3072];
register cell* source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); register cell* source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
register char* dest = buffor[id]; register char* dest = buffor[id];
char* start = dest; char* start = dest;
while ((*dest++=(char)(*source++))) while ((*dest++=(char)(*source++)))
; ;
len = --dest - start; len = --dest - start;
return start; return start;
} }
void copy_amxmemory(cell* dest,cell* src,int len) void copy_amxmemory(cell* dest,cell* src,int len)
@ -104,348 +104,408 @@ void copy_amxmemory(cell* dest,cell* src,int len)
char* parse_arg(char** line,int& state) char* parse_arg(char** line,int& state)
{ {
static char arg[3072]; static char arg[3072];
char* dest = arg; char* dest = arg;
state = 0; state = 0;
while(**line) { while(**line) {
if ( isspace(**line) ) { if ( isspace(**line) ) {
if (state == 1) if (state == 1)
break; break;
else if (!state) { else if (!state) {
(*line)++; (*line)++;
continue; continue;
} }
} }
else if (state != 2) else if (state != 2)
state = 1; state = 1;
if (**line=='"') { if (**line=='"') {
(*line)++; (*line)++;
if (state == 2) if (state == 2)
break; break;
state = 2; state = 2;
continue; continue;
} }
*dest++ = *(*line)++; *dest++ = *(*line)++;
} }
*dest = '\0'; *dest = '\0';
return arg; return arg;
} }
static cell AMX_NATIVE_CALL replace(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL replace(AMX *amx, cell *params) /* 4 param */
{ {
static char buffor[3072]; static char buffor[3072];
cell *a = get_amxaddr(amx,params[1]); cell *a = get_amxaddr(amx,params[1]);
cell *b = get_amxaddr(amx,params[3]); cell *b = get_amxaddr(amx,params[3]);
cell *c = get_amxaddr(amx,params[4]); cell *c = get_amxaddr(amx,params[4]);
int iMain = amxstring_len(a); int iMain = amxstring_len(a);
int iWhat = amxstring_len(b); int iWhat = amxstring_len(b);
int iWith = amxstring_len(c); int iWith = amxstring_len(c);
int iPot = iMain + iWith - iWhat; int iPot = iMain + iWith - iWhat;
if (iPot>=params[2]){ if (iPot>=params[2]){
amx_RaiseError(amx,AMX_ERR_NATIVE); amx_RaiseError(amx,AMX_ERR_NATIVE);
return 0; return 0;
} }
char *d = buffor; char *d = buffor;
cell *x, *y, *z = a, *l = a; cell *x, *y, *z = a, *l = a;
int p = 0; int p = 0;
while(*a){ while(*a){
if (*a==*b){ if (*a==*b){
x=a+1; x=a+1;
y=b+1; y=b+1;
p=1; p=1;
if (!*y) break; if (!*y) break;
while(*x==*y){ while(*x==*y){
x++; y++; p++; x++; y++; p++;
if (!*y) break; if (!*y) break;
} }
if (!*y) break; if (!*y) break;
p = 0; p = 0;
*d++=(char)*a++; *d++=(char)*a++;
continue; continue;
} }
*d++=(char)*a++; *d++=(char)*a++;
} }
if (p){ if (p){
while(*c) *d++=(char)*c++; while(*c) *d++=(char)*c++;
a+=p; a+=p;
while(*a) *d++=(char)*a++; while(*a) *d++=(char)*a++;
*d=0; *d=0;
d = buffor; d = buffor;
while(*d) *z++=*d++; while(*d) *z++=*d++;
*z=0; *z=0;
return (z-l); return (z-l);
} }
return 0; return 0;
} }
static cell AMX_NATIVE_CALL contain(AMX *amx, cell *params) /* 2 param */ static cell AMX_NATIVE_CALL contain(AMX *amx, cell *params) /* 2 param */
{ {
register cell *a = get_amxaddr(amx,params[2]); register cell *a = get_amxaddr(amx,params[2]);
register cell *b = get_amxaddr(amx,params[1]); register cell *b = get_amxaddr(amx,params[1]);
register cell *c = b; register cell *c = b;
cell* str = b; cell* str = b;
cell* substr = a; cell* substr = a;
while (*c) { while (*c) {
if (*c == *a) { if (*c == *a) {
c++; c++;
if (!*++a) if (!*++a)
return b - str; return b - str;
} }
else { else {
c = ++b; c = ++b;
a = substr; a = substr;
} }
} }
return -1; return -1;
} }
static cell AMX_NATIVE_CALL containi(AMX *amx, cell *params) /* 2 param */ static cell AMX_NATIVE_CALL containi(AMX *amx, cell *params) /* 2 param */
{ {
register cell *a = get_amxaddr(amx,params[2]); register cell *a = get_amxaddr(amx,params[2]);
register cell *b = get_amxaddr(amx,params[1]); register cell *b = get_amxaddr(amx,params[1]);
register cell *c = b; register cell *c = b;
cell* str = b; cell* str = b;
cell* substr = a; cell* substr = a;
while (*c) { while (*c) {
if (tolower(*c) == tolower(*a)) { if (tolower(*c) == tolower(*a)) {
c++; c++;
if (!*++a) if (!*++a)
return b - str; return b - str;
} }
else { else {
c = ++b; c = ++b;
a = substr; a = substr;
} }
} }
return -1; return -1;
} }
static cell AMX_NATIVE_CALL strtonum(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL strtonum(AMX *amx, cell *params) /* 1 param */
{ {
int iLen; int iLen;
return atoi(get_amxstring(amx,params[1],0,iLen)); return atoi(get_amxstring(amx, params[1], 0, iLen));
} }
static cell AMX_NATIVE_CALL numtostr(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL numtostr(AMX *amx, cell *params) /* 3 param */
{ {
char szTemp[32]; char szTemp[32];
sprintf(szTemp,"%d",(int)params[1]); sprintf(szTemp, "%d", (int)params[1]);
return set_amxstring(amx,params[2],szTemp,params[3]); return set_amxstring(amx, params[2], szTemp, params[3]);
}
static cell AMX_NATIVE_CALL str_to_float(AMX *amx, cell *params)
{
cell *str = get_amxaddr(amx, params[1]);
bool neg=false;
unsigned long part1 = 0;
if (*str == '-')
{
neg = true;
++str;
}
else if (*str == '+')
++str;
while (*str)
{
if (*str == '.')
{
++str;
break;
}
if (*str < '0' || *str > '9')
{
REAL fl = neg ? -static_cast<REAL>(part1) : static_cast<REAL>(part1);
return amx_ftoc(fl);
}
part1 *= 10;
part1 += *str - '0';
++str;
}
unsigned long part2 = 0;
unsigned long div = 1;
while (*str)
{
if (*str < '0' || *str > '9')
break;
part2 *= 10;
part2 += *str - '0';
div *= 10;
++str;
}
REAL fl = static_cast<REAL>(part1) + (static_cast<REAL>(part2) / div);
if (neg)
fl = -fl;
return amx_ftoc(fl);
}
static cell AMX_NATIVE_CALL float_to_str(AMX *amx, cell *params)
{
char szTemp[32];
sprintf(szTemp, "%f", amx_ctof(params[1]));
return set_amxstring(amx, params[2], szTemp, params[3]);
} }
static cell AMX_NATIVE_CALL add(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL add(AMX *amx, cell *params) /* 4 param */
{ {
cell *src = get_amxaddr(amx,params[3]); cell *src = get_amxaddr(amx,params[3]);
cell *dest = get_amxaddr(amx,params[1]); cell *dest = get_amxaddr(amx,params[1]);
cell *start = dest; cell *start = dest;
int c = params[2], d = params[4]; int c = params[2], d = params[4];
while(*dest&&c--) while(*dest&&c--)
++dest; ++dest;
if (d){ if (d){
while(c--&&d--&&*src) while(c--&&d--&&*src)
*dest++=*src++; *dest++=*src++;
*dest=0; *dest=0;
return (dest-start); return (dest-start);
} }
while(c--&&*src) while(c--&&*src)
*dest++=*src++; *dest++=*src++;
*dest=0; *dest=0;
return (dest-start); return (dest-start);
} }
static cell AMX_NATIVE_CALL copy(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL copy(AMX *amx, cell *params) /* 4 param */
{ {
cell *src = get_amxaddr(amx,params[3]); cell *src = get_amxaddr(amx,params[3]);
cell *dest = get_amxaddr(amx,params[1]); cell *dest = get_amxaddr(amx,params[1]);
cell *start = dest; cell *start = dest;
int c = params[2]; int c = params[2];
while(c--&&*src) while(c--&&*src)
*dest++=*src++; *dest++=*src++;
*dest=0; *dest=0;
return (dest-start); return (dest-start);
} }
static cell AMX_NATIVE_CALL copyc(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL copyc(AMX *amx, cell *params) /* 4 param */
{ {
cell *src = get_amxaddr(amx,params[3]); cell *src = get_amxaddr(amx,params[3]);
cell *dest = get_amxaddr(amx,params[1]); cell *dest = get_amxaddr(amx,params[1]);
cell *start = dest; cell *start = dest;
int c = params[2]; int c = params[2];
cell ch = params[4]; cell ch = params[4];
while(c--&&*src&&*src!=ch) while(c--&&*src&&*src!=ch)
*dest++=*src++; *dest++=*src++;
*dest=0; *dest=0;
return (dest-start); return (dest-start);
} }
static cell AMX_NATIVE_CALL setc(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL setc(AMX *amx, cell *params) /* 4 param */
{ {
cell *src = get_amxaddr(amx,params[1]); cell *src = get_amxaddr(amx,params[1]);
int c = params[2]; int c = params[2];
cell ch = params[3]; cell ch = params[3];
while(c--) while(c--)
*src++=ch; *src++=ch;
return 1; return 1;
} }
static cell AMX_NATIVE_CALL equal(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL equal(AMX *amx, cell *params) /* 3 param */
{ {
cell *a = get_amxaddr(amx,params[1]); cell *a = get_amxaddr(amx,params[1]);
cell *b = get_amxaddr(amx,params[2]); cell *b = get_amxaddr(amx,params[2]);
int c = params[3]; int c = params[3];
if (c) { if (c) {
while (--c&&*a&&(*a==*b)) while (--c&&*a&&(*a==*b))
++a, ++b; ++a, ++b;
return (*a-*b)?0:1; return (*a-*b)?0:1;
} }
int ret; int ret;
while(!(ret=*a-*b)&&*b) while(!(ret=*a-*b)&&*b)
++a, ++b; ++a, ++b;
return ret?0:1; return ret?0:1;
} }
static cell AMX_NATIVE_CALL equali(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL equali(AMX *amx, cell *params) /* 3 param */
{ {
cell *a = get_amxaddr(amx,params[1]); cell *a = get_amxaddr(amx,params[1]);
cell *b = get_amxaddr(amx,params[2]); cell *b = get_amxaddr(amx,params[2]);
int f,l, c = params[3]; int f,l, c = params[3];
if (c) { if (c) {
do { do {
f = tolower(*a++); f = tolower(*a++);
l = tolower(*b++); l = tolower(*b++);
} }
while (--c &&l&&f&& f==l); while (--c &&l&&f&& f==l);
return(f - l)?0:1; return(f - l)?0:1;
} }
do { do {
f = tolower(*a++); f = tolower(*a++);
l = tolower(*b++); l = tolower(*b++);
} while (f && f == l); } while (f && f == l);
return (f - l)?0:1; return (f - l)?0:1;
} }
static cell AMX_NATIVE_CALL format(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL format(AMX *amx, cell *params) /* 3 param */
{ {
int len; int len;
return set_amxstring(amx,params[1],format_amxstring(amx,params,3,len),params[2]); return set_amxstring(amx,params[1],format_amxstring(amx,params,3,len),params[2]);
} }
static cell AMX_NATIVE_CALL parse(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL parse(AMX *amx, cell *params) /* 3 param */
{ {
int inum = *params/sizeof(cell), iarg = 2, c; int inum = *params/sizeof(cell), iarg = 2, c;
char* arg, *parse = get_amxstring(amx,params[1],0,c); char* arg, *parse = get_amxstring(amx,params[1],0,c);
cell *cptr; cell *cptr;
int state; int state;
while(*parse){ while(*parse){
arg = parse_arg(&parse,state); arg = parse_arg(&parse,state);
if (state){ if (state){
if (inum <= iarg) if (inum <= iarg)
return( (iarg-2)>>1 ); return( (iarg-2)>>1 );
cptr = get_amxaddr(amx,params[iarg++]); cptr = get_amxaddr(amx,params[iarg++]);
c = *get_amxaddr(amx,params[iarg++]); c = *get_amxaddr(amx,params[iarg++]);
while(c--&&*arg) while(c--&&*arg)
*cptr++=(cell)*arg++; *cptr++=(cell)*arg++;
*cptr=0; *cptr=0;
} }
} }
return( (iarg-2)>>1 ); return( (iarg-2)>>1 );
} }
static cell AMX_NATIVE_CALL strtolower(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL strtolower(AMX *amx, cell *params) /* 1 param */
{ {
cell *cptr = get_amxaddr(amx,params[1]); cell *cptr = get_amxaddr(amx,params[1]);
cell *begin = cptr; cell *begin = cptr;
while(*cptr){ while(*cptr){
*cptr = tolower(*cptr); *cptr = tolower(*cptr);
cptr++; cptr++;
} }
return cptr - begin; return cptr - begin;
} }
static cell AMX_NATIVE_CALL strtoupper(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL strtoupper(AMX *amx, cell *params) /* 1 param */
{ {
cell *cptr = get_amxaddr(amx,params[1]); cell *cptr = get_amxaddr(amx,params[1]);
cell *begin = cptr; cell *begin = cptr;
while(*cptr){ while(*cptr){
*cptr = toupper(*cptr); *cptr = toupper(*cptr);
cptr++; cptr++;
} }
return cptr - begin; return cptr - begin;
} }
int fo_numargs(AMX *amx) int fo_numargs(AMX *amx)
{ {
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
cell bytes= * (cell *)(data+(int)amx->frm+2*sizeof(cell)); cell bytes= * (cell *)(data+(int)amx->frm+2*sizeof(cell));
return (int)(bytes/sizeof(cell)); return (int)(bytes/sizeof(cell));
} }
int fo_getargnum(AMX *amx, int pos) int fo_getargnum(AMX *amx, int pos)
{ {
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell)); cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell));
return *(cell *)(data+(int)value); return *(cell *)(data+(int)value);
} }
float fo_getargfloat(AMX *amx, int pos) float fo_getargfloat(AMX *amx, int pos)
{ {
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell)); cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell));
cell number = *(cell *)(data+(int)value); cell number = *(cell *)(data+(int)value);
return *(REAL *)((void *)&number); return *(REAL *)((void *)&number);
} }
char* fo_getargstr(AMX *amx, int swap, int pos) char* fo_getargstr(AMX *amx, int swap, int pos)
{ {
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
cell src_value= * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell)); cell src_value= * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell));
cell value; cell value;
static char buffer[2][3072]; static char buffer[2][3072];
char* b = buffer[swap]; char* b = buffer[swap];
int a = 0; int a = 0;
do { do {
value = src_value + a++ * sizeof(cell); value = src_value + a++ * sizeof(cell);
value = *(cell *)(data+(int)value); value = *(cell *)(data+(int)value);
*b++ = static_cast<char>(value); *b++ = static_cast<char>(value);
} while (value); } while (value);
return buffer[swap]; return buffer[swap];
} }
char* format_arguments(AMX *amx, int parm,int& len) char* format_arguments(AMX *amx, int parm,int& len)
{ {
static char buffer[2][3072]; static char buffer[2][3072];
static char format[16]; static char format[16];
char *ptr,*arg, *dest = *buffer; char *ptr,*arg, *dest = *buffer;
char *src = fo_getargstr(amx, 0,parm++); char *src = fo_getargstr(amx, 0,parm++);
int numparam = fo_numargs(amx); int numparam = fo_numargs(amx);
while(*src) { while(*src) {
if (*src=='%'&&*(src+1)) { if (*src=='%'&&*(src+1)) {
ptr = format; ptr = format;
*ptr++ = *src++; *ptr++ = *src++;
if (*src=='%'){ if (*src=='%'){
*dest++=*src++; *dest++=*src++;
continue; continue;
} }
while (!isalpha(*ptr++=*src++)) while (!isalpha(*ptr++=*src++))
; ;
*ptr='\0'; *ptr='\0';
if (numparam < parm) continue; if (numparam < parm) continue;
arg = buffer[1]; arg = buffer[1];
switch(*(ptr-1)){ switch(*(ptr-1)){
case 's': sprintf(arg,format,fo_getargstr(amx,1, parm++)); break; case 's': sprintf(arg,format,fo_getargstr(amx,1, parm++)); break;
case 'f': case 'g': sprintf(arg,format,fo_getargfloat(amx, parm++)); break; case 'f': case 'g': sprintf(arg,format,fo_getargfloat(amx, parm++)); break;
default: sprintf(arg,format,fo_getargnum(amx, parm++)); default: sprintf(arg,format,fo_getargnum(amx, parm++));
} }
while(*arg) *dest++=*arg++; while(*arg) *dest++=*arg++;
continue; continue;
} }
*dest++=*src++; *dest++=*src++;
} }
*dest='\0'; *dest='\0';
len = dest - *buffer; len = dest - *buffer;
return *buffer; return *buffer;
} }
//added by BAILOPAN for jtp10181 //added by BAILOPAN for jtp10181
@ -563,34 +623,34 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */
static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params) static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params)
{ {
int len; int len;
int pos = params[3]; int pos = params[3];
if (pos < 0){ if (pos < 0){
amx_RaiseError(amx,AMX_ERR_NATIVE); amx_RaiseError(amx,AMX_ERR_NATIVE);
return 0; return 0;
} }
char* string = format_arguments(amx, pos ,len); // indexed from 0 char* string = format_arguments(amx, pos ,len); // indexed from 0
return set_amxstring(amx,params[1],string,params[2]); return set_amxstring(amx,params[1],string,params[2]);
} }
static cell AMX_NATIVE_CALL is_digit(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_digit(AMX *amx, cell *params)
{ {
return isdigit( params[1] ); return isdigit( params[1] );
} }
static cell AMX_NATIVE_CALL is_alnum(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_alnum(AMX *amx, cell *params)
{ {
return isalnum( params[1] ); return isalnum( params[1] );
} }
static cell AMX_NATIVE_CALL is_space(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_space(AMX *amx, cell *params)
{ {
return isspace( params[1] ); return isspace( params[1] );
} }
static cell AMX_NATIVE_CALL is_alpha(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_alpha(AMX *amx, cell *params)
{ {
return isalpha( params[1] ); return isalpha( params[1] );
} }
static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params)
@ -629,7 +689,7 @@ static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params)
len--; len--;
} }
} }
for (i=0; i<len; i++) for (i=0; i<len; i++)
{ {
if (isspace(asdf[i]) && !flag) if (isspace(asdf[i]) && !flag)
@ -651,26 +711,26 @@ static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL n_strcat(AMX *amx,cell *params) static cell AMX_NATIVE_CALL n_strcat(AMX *amx,cell *params)
{ {
cell *cdest,*csrc; cell *cdest,*csrc;
cdest = get_amxaddr(amx, params[1]); cdest = get_amxaddr(amx, params[1]);
csrc = get_amxaddr(amx, params[2]); csrc = get_amxaddr(amx, params[2]);
int num = params[3]; int num = params[3];
while (*cdest && num) while (*cdest && num)
{ {
cdest++; cdest++;
num--; num--;
} }
if (!num) if (!num)
return 0; return 0;
while (*csrc && num) while (*csrc && num)
{ {
*cdest++ = *csrc++; *cdest++ = *csrc++;
num--; num--;
} }
*cdest = 0; *cdest = 0;
return params[3] - num; return params[3] - num;
} }
static cell AMX_NATIVE_CALL n_strcmp(AMX *amx, cell *params) static cell AMX_NATIVE_CALL n_strcmp(AMX *amx, cell *params)
@ -749,6 +809,8 @@ AMX_NATIVE_INFO string_Natives[] = {
{ "strcat", n_strcat }, { "strcat", n_strcat },
{ "strfind", n_strfind }, { "strfind", n_strfind },
{ "strcmp", n_strcmp }, { "strcmp", n_strcmp },
{ "str_to_float", str_to_float },
{ "float_to_str", float_to_str },
{ NULL, NULL } { NULL, NULL }
}; };