[AJUDA] sscanf
#2

Poe isto no final do GM:
PHP код:
stock sscanf(string[], format[], {Float,_}:...)
{
    
#if defined isnull
        
if (isnull(string))
    
#else
        
if (string[0] == || (string[0] == && string[1] == 0))
    
#endif
        
{
            return 
format[0];
        }
    
#pragma tabsize 4
    
new
        
formatPos 0,
        
stringPos 0,
        
paramPos 2,
        
paramCount numargs(),
        
delim ' ';
    while (
string[stringPos] && string[stringPos] <= ' ')
    {
        
stringPos++;
    }
    while (
paramPos paramCount && string[stringPos])
    {
        switch (
format[formatPos++])
        {
            case 
'\0':
            {
                return 
0;
            }
            case 
'i''d':
            {
                new
                    
neg 1,
                    
num 0,
                    
ch string[stringPos];
                if (
ch == '-')
                {
                    
neg = -1;
                    
ch string[++stringPos];
                }
                do
                {
                    
stringPos++;
                    if (
'0' <= ch <= '9')
                    {
                        
num = (num 10) + (ch '0');
                    }
                    else
                    {
                        return -
1;
                    }
                }
                while ((
ch string[stringPos]) > ' ' && ch != delim);
                
setarg(paramPos0num neg);
            }
            case 
'h''x':
            {
                new
                    
num 0,
                    
ch string[stringPos];
                do
                {
                    
stringPos++;
                    switch (
ch)
                    {
                        case 
'x''X':
                        {
                            
num 0;
                            continue;
                        }
                        case 
'0' .. '9':
                        {
                            
num = (num << 4) | (ch '0');
                        }
                        case 
'a' .. 'f':
                        {
                            
num = (num << 4) | (ch - ('a' 10));
                        }
                        case 
'A' .. 'F':
                        {
                            
num = (num << 4) | (ch - ('A' 10));
                        }
                        default:
                        {
                            return -
1;
                        }
                    }
                }
                while ((
ch string[stringPos]) > ' ' && ch != delim);
                
setarg(paramPos0num);
            }
            case 
'c':
            {
                
setarg(paramPos0string[stringPos++]);
            }
            case 
'f':
            {
 
                new 
changestr[16], changepos 0strpos stringPos;     
                while(
changepos 16 && string[strpos] && string[strpos] != delim)
                {
                    
changestr[changepos++] = string[strpos++];
                    } 
                
changestr[changepos] = '\0'
                
setarg(paramPos,0,_:floatstr(changestr)); 
            } 
            case 
'p':
            {
                
delim format[formatPos++];
                continue;
            }
            case 
'\'':
            {
                new
                    
end formatPos 1,
                    
ch;
                while ((
ch format[++end]) && ch != '\'') {}
                if (!
ch)
                {
                    return -
1;
                }
                
format[end] = '\0';
                if ((
ch strfind(stringformat[formatPos], falsestringPos)) == -1)
                {
                    if (
format[end 1])
                    {
                        return -
1;
                    }
                    return 
0;
                }
                
format[end] = '\'';
                
stringPos ch + (end formatPos);
                
formatPos end 1;
            }
            case 
'u':
            {
                new
                    
end stringPos 1,
                    
id 0,
                    
bool:num true,
                    
ch;
                while ((
ch string[++end]) && ch != delim)
                {
                    if (
num)
                    {
                        if (
'0' <= ch <= '9')
                        {
                            
id = (id 10) + (ch '0');
                        }
                        else
                        {
                            
num false;
                        }
                    }
                }
                if (
num && IsPlayerConnected(id))
                {
                    
setarg(paramPos0id);
                }
                else
                {
                    
#if !defined foreach
                        #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
                        #define __SSCANF_FOREACH__
                    #endif
                    
string[end] = '\0';
                    
num false;
                    new
                        
name[MAX_PLAYER_NAME];
                    
id end stringPos;
                    foreach (
Playerplayerid)
                    {
                        
GetPlayerName(playeridnamesizeof (name));
                        if (!
strcmp(namestring[stringPos], trueid))
                        {
                            
setarg(paramPos0playerid);
                            
num true;
                            break;
                        }
                    }
                    if (!
num)
                    {
                        
setarg(paramPos0INVALID_PLAYER_ID);
                    }
                    
string[end] = ch;
                    
#if defined __SSCANF_FOREACH__
                        #undef foreach
                        #undef __SSCANF_FOREACH__
                    #endif
                
}
                
stringPos end;
            }
            case 
's''z':
            {
                new
                    
0,
                    
ch;
                if (
format[formatPos])
                {
                    while ((
ch string[stringPos++]) && ch != delim)
                    {
                        
setarg(paramPosi++, ch);
                    }
                    if (!
i)
                    {
                        return -
1;
                    }
                }
                else
                {
                    while ((
ch string[stringPos++]))
                    {
                        
setarg(paramPosi++, ch);
                    }
                }
                
stringPos--;
                
setarg(paramPosi'\0');
            }
            default:
            {
                continue;
            }
        }
        while (
string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
        {
            
stringPos++;
        }
        while (
string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
        {
            
stringPos++;
        }
        
paramPos++;
    }
    do
    {
        if ((
delim format[formatPos++]) > ' ')
        {
            if (
delim == '\'')
            {
                while ((
delim format[formatPos++]) && delim != '\'') {}
            }
            else if (
delim != 'z')
            {
                return 
delim;
            }
        }
    }
    while (
delim ' ');
    return 
0;

Reply


Messages In This Thread
[AJUDA] sscanf - by Felipe_Wesker - 07.08.2011, 14:52
Re: [AJUDA] sscanf - by Shadoww5 - 07.08.2011, 15:07
Re: [AJUDA] sscanf - by Felipe_Wesker - 07.08.2011, 15:14
Re: [AJUDA] sscanf - by RockFire - 07.08.2011, 15:16
Re: [AJUDA] sscanf - by Felipe_Wesker - 07.08.2011, 15:23
Re: [AJUDA] sscanf - by RockFire - 07.08.2011, 15:27
Re: [AJUDA] sscanf - by Felipe_Wesker - 07.08.2011, 15:30
Re: [AJUDA] sscanf - by Felipe_Wesker - 08.08.2011, 15:50
Re: [AJUDA] sscanf - by ApolloRJ - 08.08.2011, 18:33
Re: [AJUDA] sscanf - by [BEP]AcerPilot - 09.08.2011, 02:35

Forum Jump:


Users browsing this thread: 3 Guest(s)