02.05.2012, 16:21
I made my own version of sscanf aka 'UnParams'.
It's slow
It's only test of my practice
It's slow

It's only test of my practice

pawn Код:
#define isNull(%0) \
(%0[0] == 0 || (%0[0] == 1 && %0[1] == 0))
stock
UnParams(params[],format[],{Float,_}:...)
{
if(isNull(params)) return 0;
new
formatPos = 0,
num = numargs(),
startPos = 2,
space = ' ',
startChar = 0,
pos = 0
;
while((startChar = params[pos]) && startChar == space)
{
pos++;
}
while(startPos < num)
{
switch(format[formatPos])
{
case 'd','D':
{
new
str[35],
ch,
posParam = pos+1
;
while((ch = params[posParam]) && ch != space)
{
if(ch > '9' || ch < '0')
{
return 0;
}
posParam++;
}
strmid(str,params,pos,pos + (posParam - pos));
pos = posParam;
setarg(startPos,0,strval(str));
formatPos++;
}
case 's','S':
{
new
str[128],
ch,
posParam = pos + 1,
index
;
while((ch = params[posParam]) && ch != space)
{
posParam++;
}
strmid(str,params,pos + (((ch = params[pos]) && ch == space) ? 1 : 0),pos + (posParam - pos));
for(new p,x = strlen(str);p < x;p++)
{
ch = str[p];
setarg(startPos,index,ch);
index++;
}
pos = posParam;
formatPos++;
}
case 'f','F':
{
new
str[35],
ch,
posParam = pos+1,
dots
;
while((ch = params[posParam]) && ch != space)
{
if(ch > '9' || ch < '0')
{
if(ch == '.' && dots < 1) dots++;
else return 0;
}
posParam++;
}
strmid(str,params,pos + (((ch = params[pos]) && ch == space) ? 1 : 0),pos + (posParam - pos));
pos = posParam;
setarg(startPos,0,_:floatstr(str));
formatPos++;
}
}
startPos++;
}
return 1;
}