Added natives str_to_float and float_to_str; indents are now tabs
This commit is contained in:
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 }
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user