Advertisement
ipsBruno

(Pawn) sscanfex

Sep 27th, 2013
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.57 KB | None | 0 0
  1.  
  2. /*
  3.     * SSCANF otimizada
  4.     * Por Bruno (27/09/2013)
  5.     * sscanfex( "string para tratar", "formatacao", variáveis )
  6.     *
  7.     * Formatação é:
  8.     * u -> jogadores
  9.     * n, u, i -> valores int
  10.     * s, z -> strings
  11.     * f -> floats
  12.     * H -> decodificar string em HEX
  13.     * pCARACTERE -> colocar novo delimitador: exemplo: p|
  14.     * Ainda não acabei, faltam mais!
  15.     *
  16. */
  17.  
  18. stock sscanfex( string[], const formatex[] , {Float,_}: ... )
  19. {
  20.  
  21.     static parametro, arg, args, stringPos;
  22.  
  23.     new tempBuff[0xff];
  24.  
  25.     args = numargs();
  26.  
  27.     #emit CONST.alt        8
  28.     #emit LCTRL            5
  29.     #emit ADD
  30.     #emit ADD.C            12
  31.     #emit STOR.pri         parametro
  32.  
  33.     #if defined DEBUG
  34.     {
  35.  
  36.  
  37.         #define D(%1->%0) \
  38.         printf( "SSCANFEX PARAM("#%1")" , %0 )
  39.     }
  40.     #endif
  41.  
  42.     arg = strlen(formatex) ;
  43.  
  44.     new delim[] = " ";
  45.  
  46.     if( strfind( string, "  ", false ) != -1 || arg != args - 2)
  47.         return 1;
  48.  
  49.     stringPos = strfind( string, delim , false ) ;
  50.  
  51.  
  52.     for( arg = 0 ; arg != args; ++ arg ) {
  53.  
  54.         switch( formatex[arg] ) {
  55.  
  56.             case EOS:
  57.                 return false;
  58.  
  59.  
  60.             case 'p' : {
  61.                 delim[0] = formatex[arg ++] ;
  62.             }
  63.  
  64.             case 'z', 's' : {
  65.  
  66.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  67.  
  68.                 if( stringPos != -1 ) {
  69.                     tempBuff [ stringPos ] = '\0';
  70.  
  71.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  72.                 }
  73.  
  74.                 #if defined DEBUG
  75.                 {
  76.  
  77.                     D("%s"->tempBuff) ;
  78.                 }
  79.                 #endif
  80.  
  81.                 #emit LOAD.PRI  parametro
  82.                 #emit LOAD.I
  83.  
  84.                 #emit PUSH.C        0xff
  85.                 #emit PUSH.ADR      tempBuff
  86.  
  87.                 #emit PUSH.PRI
  88.                 #emit PUSH.C        12
  89.  
  90.                 #emit SYSREQ.C      strcat
  91.                 #emit STACK 16
  92.  
  93.                 parametro += 4;
  94.  
  95.                 stringPos = strfind( string, delim , false )  ;
  96.  
  97.             }
  98.             case 'u' : {
  99.  
  100.                 new bool: isFind [ 1 char ];
  101.  
  102.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  103.  
  104.                 if( stringPos != -1 ) {
  105.                     tempBuff [ stringPos ] = '\0';
  106.  
  107.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  108.                 }
  109.  
  110.                 #if !defined foreach
  111.                 for(new i = GetMaxPlayers() - 1 ; i > -1; i--) if(IsPlayerConnected(i))
  112.                 #else
  113.                 #if _FOREACH_LOCAL_VERSION == 17
  114.                 foreach (new i : Player)
  115.                 #else
  116.                 foreach(Player,i)
  117.                 #endif
  118.                 #endif
  119.                 {
  120.  
  121.  
  122.                     static szName[MAX_PLAYER_NAME];
  123.                     GetPlayerName( i, szName, sizeof szName );
  124.                     if( -1 != strfind ( szName, tempBuff, true ) ) {
  125.                         setarg( arg + 2, 0 , i );
  126.                         isFind{0} = true;
  127.                     }
  128.                 }
  129.  
  130.                 if(!isFind{0}) {
  131.                     setarg( arg + 2, 0 , -1 );
  132.                 }
  133.  
  134.                 stringPos = strfind( string, delim , false )  ;
  135.                 parametro += 4;
  136.             }
  137.  
  138.             case 'H': {
  139.  
  140.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  141.  
  142.                 if( stringPos != -1 ) {
  143.                     tempBuff [ stringPos ] = '\0';
  144.  
  145.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  146.                 }
  147.  
  148.                 new
  149.                 stringTexto[0xff],
  150.                 stringTemp[4],
  151.                 alocarNumerosInts;
  152.  
  153.                 for (new i; tempBuff[i]; i++)
  154.                 {
  155.  
  156.  
  157.                     format(stringTemp, 4, "%s%s", tempBuff[i++], tempBuff[i]);
  158.  
  159.                     switch (stringTemp[1])
  160.                     {
  161.  
  162.                         case 0x58  , 0x78:                      alocarNumerosInts = 0;
  163.                         case 0x30 .. 0x39:                      alocarNumerosInts = (stringTemp[0] << 4) | (stringTemp[1] - 0x30);
  164.                         case 0x61 .. 0x66:                      alocarNumerosInts = (stringTemp[0] << 4) | (stringTemp[1] - (0x61 - 0xA));
  165.                         case 0x40 .. 0x46:                      alocarNumerosInts = (stringTemp[0] << 4) | (stringTemp[1] - (0x41 - 0xA));
  166.                     }
  167.  
  168.                     format(stringTexto, 500, "%s%c", stringTexto, alocarNumerosInts);
  169.                 }
  170.  
  171.  
  172.                 #emit LOAD.PRI      parametro
  173.                 #emit LOAD.I
  174.  
  175.                 #emit PUSH.C        0xff
  176.                 #emit PUSH.ADR      stringTexto
  177.  
  178.                 #emit PUSH.PRI
  179.                 #emit PUSH.C        12
  180.  
  181.                 #emit SYSREQ.C      strcat
  182.                 #emit STACK 16
  183.  
  184.  
  185.                 stringPos = strfind( string, delim , false )  ;
  186.  
  187.                 #if defined DEBUG
  188.                 {
  189.  
  190.                     D("%s"->stringTexto) ;
  191.                 }
  192.                 #endif
  193.  
  194.                 parametro += 4;
  195.  
  196.             }
  197.  
  198.             case 'x', 'h': {
  199.  
  200.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  201.  
  202.                 if( stringPos != -1 ) {
  203.                     tempBuff [ stringPos ] = '\0';
  204.  
  205.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  206.                 }
  207.  
  208.                 new x, set, ch;
  209.  
  210.                 if(tolower(tempBuff[1]) == 'x') x = 2;
  211.  
  212.                 for( ; tempBuff[x]; x++) {
  213.  
  214.                     ch = tempBuff[x];
  215.  
  216.                     switch (ch)
  217.                     {
  218.  
  219.                         case '0' .. '9':
  220.                         set = (set << 4) | (ch - 48);
  221.                         case 'a' .. 'f':
  222.                         set = (set << 4) | (ch - 87);
  223.                         case 'A' .. 'F':
  224.                         set = (set << 4) | (ch - 55);
  225.                     }
  226.                 }
  227.  
  228.                 stringPos = strfind( string, delim , false )  ;
  229.  
  230.                 setarg( arg + 2, 0 , set );
  231.  
  232.                 #if defined DEBUG
  233.                 {
  234.  
  235.                     D("%x"->getarg( arg + 2, 0)) ;
  236.                 }
  237.                 #endif
  238.                 parametro += 4;
  239.  
  240.  
  241.             }
  242.             case 'i' , 'd' , 'n' : {
  243.  
  244.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  245.  
  246.                 if( stringPos != -1 ) {
  247.                     tempBuff [ stringPos ] = '\0';
  248.  
  249.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  250.                 }
  251.  
  252.                 setarg( arg + 2, 0 , strval ( tempBuff ) );
  253.  
  254.                 stringPos = strfind( string, delim , false )  ;
  255.  
  256.                 #if defined DEBUG
  257.                 {
  258.  
  259.  
  260.                     D("%d"->getarg( arg + 2, 0)) ;
  261.                 }
  262.                 #endif
  263.  
  264.  
  265.                 parametro += 4;
  266.  
  267.             }
  268.  
  269.             case 'f' : {
  270.  
  271.                 strcat( ( tempBuff[0] = '\0' ,  tempBuff) , string , 0xff );
  272.  
  273.                 if( stringPos != -1 ) {
  274.  
  275.                     tempBuff [ stringPos ] = '\0';
  276.  
  277.                     format( string , 0xff , "%s" , string [ stringPos + 1] );
  278.                 }
  279.  
  280.  
  281.                 setarg( arg + 2, 0 , _: floatstr ( tempBuff ) );
  282.  
  283.                 parametro += 4;
  284.  
  285.  
  286.                 #if defined DEBUG
  287.                 {
  288.  
  289.  
  290.  
  291.                     D("%f"->Float:getarg( arg + 2, 0)) ;
  292.                 }
  293.                 #endif
  294.  
  295.                 stringPos = strfind( string, delim , false )  ;
  296.             }
  297.         }
  298.     }
  299.     return 0;
  300.  
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement