Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*=================================================================
- _ ____ _____ __ __
- (_) _ \ ___ |_ _|__ __ _| \/ |
- | | |_) / __| | |/ _ \/ _` | |\/| |
- | | __/\__ \ | | __/ (_| | | | |
- |_|_| |___/ |_|\___|\__,_|_| |_|
- Created by Bruno da Silva
- www.ips-team.blogspot.com
- sscanf Compactible with 0.3d Version!
- =================================================================*/
- ////////////////////////////////////////////////////////////
- //
- //
- // Versão atual: 13/09/2011 - 18:20
- // Versão: Testes Beta (próximo lançamento 15/11)
- //
- // Returns:
- // false: error and true: sucess
- //
- // Format:
- // u - name or id player
- // s ~ z - string
- // i ~ d - numbers
- // c - caractere
- // f - float
- // r(iszd) - reverte string/número/float
- // p<delimiter> - novo delimitador
- // e<formatenum> - alocar formatação na enum
- // a<formatarray> - alocar formatação aqui
- // g(searchstring) - procurar string e retornar o inicio e o fim dela
- // {comentários na formatação}
- //
- //
- //
- // NOT FINISHED (security problems)
- //
- // Autor: [iPs] BrunoSilva (Copyright iPsTeaM)
- // Thank Y_Less (designed it from the script his)
- //
- // www.ips-team.blogspot.com
- //
- ///////////////////////////////////////////////////////////
- sscanf(string[], format[],{Float,_}:...)
- {
- #if !defined isNull
- #define isNull(%0) (!%0[0] || %0[0] == '\1' && !%0[1])
- #endif
- #if defined strcpy
- #undef strcpy
- #endif
- #if !defined foreach
- #define foreach(%0,%1) for (new %1 = 0; %1 != MAX_PLAYERS; ++%1) if(IsPlayerConnected(%1))
- #endif
- #define strcpy(%0,%1) strcat((%0[0] = '\0', %0), %1, sizeof(%0))
- #define MAX_BUFFER 128
- if(isNull(string))
- {
- return false;
- }
- new
- formatCount = -1,
- stringCount = -1,
- paramsCount = 2,
- delim = 0x20,
- bool:silentMod = false,
- totalParams = numargs()
- ;
- static
- temporaria[MAX_BUFFER]
- ;
- strcpy(temporaria, string);
- #pragma unused string
- while(format[++formatCount])
- {
- switch(format[formatCount])
- {
- case '{':
- {
- silentMod = true;
- continue;
- }
- case '}':
- {
- silentMod = false;
- continue;
- }
- }
- if(silentMod)
- {
- continue;
- }
- switch(format[formatCount])
- {
- case 'i', 'd':
- {
- new
- numero,
- caractere = temporaria[stringCount + 1],
- negativo = 1 ;
- if(caractere == '-')
- {
- ++stringCount;
- negativo = -1;
- }
- while((caractere = temporaria[++stringCount]) != delim && caractere)
- {
- if ('0' <= caractere <= '9')
- {
- numero = (numero * 10) + (caractere - '0');
- }
- else
- {
- return false;
- }
- }
- setarg(paramsCount, 0, numero * negativo);
- ++paramsCount;
- continue;
- }
- case 'f':
- {
- new sscanfValor = -1;
- new
- stringFloat[15]
- ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringFloat[++sscanfValor] = temporaria[stringCount];
- }
- if(sscanfValor != -1)
- {
- setarg(paramsCount, 0, _:floatstr(stringFloat));
- ++paramsCount;
- }
- #pragma unused sscanfValor
- continue;
- }
- case 'u':
- {
- new
- texto,
- tempVal = stringCount,
- stringTemp[MAX_BUFFER],
- caractere = temporaria[stringCount + 1] ;
- while((caractere = temporaria[++tempVal]) != delim && temporaria[stringCount]) if ('0' > caractere || '9' < caractere)
- {
- texto = 1;
- break;
- }
- if(!texto)
- {
- while((caractere = temporaria[++stringCount])!= delim && caractere)
- {
- texto = (texto * 10) + (caractere - '0');
- }
- texto = 10;
- setarg(paramsCount, 0, texto);
- }
- else
- {
- texto = -1;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringTemp[++texto] = temporaria[stringCount];
- }
- foreach(Player, i)
- {
- static
- name[MAX_PLAYER_NAME]
- ;
- GetPlayerName(i, name, MAX_PLAYER_NAME);
- if(-1 != strfind(name, stringTemp, true))
- {
- setarg(paramsCount, 0, i);
- texto = 10;
- break;
- }
- }
- }
- if(10 != texto)
- {
- setarg(paramsCount, 0, -1);
- }
- ++paramsCount;
- continue;
- }
- case 's', 'z':
- {
- new
- sscanfValor = -1
- ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- setarg(paramsCount, ++sscanfValor, temporaria[stringCount]);
- }
- if(sscanfValor != -1)
- {
- ++paramsCount;
- }
- #pragma unused sscanfValor
- continue;
- }
- case 'c':
- {
- if(!temporaria[++stringCount]) return false;
- setarg(paramsCount, 0, temporaria[stringCount]);
- continue;
- }
- case '(':
- {
- switch(format[formatCount - 1])
- {
- case 'g':
- {
- new
- findString[MAX_BUFFER],
- sscanfValor = -1
- ;
- while(format[++formatCount] != ')')
- {
- findString[++sscanfValor] = format[formatCount];
- }
- if(-1 != sscanfValor)
- {
- sscanfValor = strfind(temporaria, findString, true);
- if(-1 != sscanfValor)
- {
- setarg(paramsCount, 0, sscanfValor);
- stringCount = sscanfValor+strlen(findString)+1;
- setarg(++paramsCount, 0, stringCount);
- }
- }
- ++paramsCount;
- #pragma unused sscanfValor
- continue;
- }
- case 'r':
- {
- while(format[++formatCount] )
- {
- switch(format[formatCount])
- {
- case ')':
- {
- break;
- }
- case 's' , 'z':
- {
- new
- sscanfValor = -1,
- bufferString[MAX_BUFFER] ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- bufferString[++sscanfValor] = temporaria[stringCount];
- }
- new
- i = sscanfValor
- ;
- sscanfValor = -1;
- for( ; 0xFFFFFFFF != i; --i)
- {
- setarg(paramsCount, ++sscanfValor, bufferString[i]);
- }
- if(sscanfValor != -1)
- {
- ++paramsCount;
- }
- #pragma unused sscanfValor
- }
- case 'f':
- {
- new
- sscanfValor = -1,
- stringFloat[MAX_BUFFER] ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringFloat[++sscanfValor] = temporaria[stringCount];
- }
- new
- i = sscanfValor
- ;
- sscanfValor = -1;
- for( ; -1 != i; --i)
- {
- stringFloat[++sscanfValor] = stringFloat[i];
- }
- if(sscanfValor != -1)
- {
- setarg(++paramsCount, 0, _:floatstr(stringFloat));
- }
- #pragma unused sscanfValor
- }
- case 'd' , 'i':
- {
- new
- sscanfValor = -1,
- stringValue[MAX_BUFFER] ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringValue[++sscanfValor] = temporaria[stringCount];
- }
- new
- i = sscanfValor
- ;
- sscanfValor = -1;
- for( ; -1 != i; --i)
- {
- stringValue[++sscanfValor] = stringValue[i];
- }
- if(sscanfValor != -1)
- {
- setarg(++paramsCount, 0, strval(stringValue));
- }
- #pragma unused sscanfValor
- }
- }
- }
- continue;
- }
- }
- }
- case '<':
- {
- new
- paramEnum = -1
- ;
- switch(format[formatCount-1])
- {
- case 'e' , 'a':
- {
- while(format[++formatCount])
- {
- switch(format[formatCount])
- {
- case '>':
- {
- break ;
- }
- case 'i', 'd':
- {
- new
- numero,
- caractere = temporaria[stringCount + 1],
- negativo = 1 ;
- if(caractere == '-')
- {
- ++stringCount;
- negativo = -1;
- }
- while((caractere = temporaria[++stringCount]) != delim && caractere)
- {
- if ('0' <= caractere <= '9')
- {
- numero = (numero * 10) + (caractere - '0');
- }
- else
- {
- return false;
- }
- }
- setarg(paramsCount, ++paramEnum, numero * negativo);
- continue;
- }
- case 'u':
- {
- new
- texto,
- tempVal = stringCount,
- stringTemp[MAX_BUFFER],
- caractere = temporaria[stringCount + 1] ;
- while((caractere = temporaria[++tempVal]) != delim && temporaria[stringCount]) if ('0' > caractere || '9' < caractere)
- {
- texto = 1;
- break;
- }
- if(!texto)
- {
- while((caractere = temporaria[++stringCount])!= delim && caractere)
- {
- texto = (texto * 10) + (caractere - '0');
- }
- texto = 10;
- setarg(paramsCount, ++paramEnum, texto);
- }
- else
- {
- texto = -1;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringTemp[++texto] = temporaria[stringCount];
- }
- foreach(Player, i)
- {
- static
- name[MAX_PLAYER_NAME]
- ;
- GetPlayerName(i, name, MAX_PLAYER_NAME);
- if(-1 != strfind(name, stringTemp, true))
- {
- setarg(paramsCount, ++paramEnum, i);
- texto = 10;
- break;
- }
- }
- }
- if(10 != texto)
- {
- setarg(paramsCount, ++paramEnum, -1) ;
- }
- continue;
- }
- case 'f':
- {
- new
- sscanfValor = -1,
- stringFloat[15] ;
- while(temporaria[++stringCount] != delim && temporaria[stringCount])
- {
- stringFloat[++sscanfValor] = temporaria[stringCount];
- }
- if(sscanfValor != -1)
- {
- setarg(paramsCount, ++paramEnum, _:floatstr(stringFloat));
- }
- #pragma unused sscanfValor
- continue;
- }
- case 'c':
- {
- setarg(paramsCount, ++paramEnum, temporaria[++stringCount]);
- continue;
- }
- }
- }
- ++paramsCount;
- }
- case 'p':
- {
- delim = format[++formatCount];
- while(format[++formatCount] != '>') continue;
- }
- }
- }
- }
- }
- return paramsCount == totalParams;
- }
Add Comment
Please, Sign In to add comment