Advertisement
YashasSamaga

strcmp vs non-strcmp

Jul 12th, 2015
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 9.05 KB | None | 0 0
  1. /*******************************************************************************************************************************
  2.  ZCMD Improved (I-ZCMD)
  3.  
  4.  This include is just a re-make of the ZCMD Command Processor ( V0.3.1 31/10/2009) originnaly developed by Zeex.
  5.  
  6.  Version:0.3
  7.  
  8.  Credits:
  9.  Yashas
  10.  Zeex for the original include
  11. *******************************************************************************************************************************/
  12. #if defined _I_ZCMD_INCLUDED_V0_3_0_
  13.     #endinput
  14. #endif
  15. #define _I_ZCMD_INCLUDED_V0_3_0_
  16. #define _I_ZCMD_INCLUDED
  17. /******************************************************************************************************************************/
  18. #if !defined MAX_COMMANDS
  19.     #define MAX_COMMANDS 512
  20. #endif
  21.  
  22. #define MAX_FUNC_NAME 32
  23.  
  24. #define COMMAND:%1(%2)          \
  25.             forward cmd_%1(%2); \
  26.             public cmd_%1(%2)
  27.  
  28. #define CMD:%1(%2) \
  29.             COMMAND:%1(%2)
  30.  
  31. #define command(%1,%2,%3) \
  32.             COMMAND:%1(%2, %3)
  33.  
  34. #define cmd(%1,%2,%3) \
  35.             COMMAND:%1(%2, %3)
  36.  
  37. #define CMD_SUCCESS 1
  38. #define CMD_FAILURE 0
  39. /******************************************************************************************************************************/
  40. #if defined OnPlayerCommandReceived
  41.     forward OnPlayerCommandReceived(playerid,cmdtext[]);
  42. #endif
  43. #if defined OnPlayerCommandPerformed
  44.     forward OnPlayerCommandPerformed(playerid,cmdtext[], success);
  45. #endif
  46. /******************************************************************************************************************************/
  47. static izcmd_pointer_OPCP = 0;
  48.  
  49. static izcmd_start_index[59] =
  50. {
  51.     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  52.     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  53. };
  54. static izcmd_end_index[59] =
  55. {
  56.     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  57.     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  58. };
  59. static izcmd_command_count = 0;
  60.  
  61. static izcmd_commands[MAX_COMMANDS][MAX_FUNC_NAME - 4];
  62. static izcmd_command_func_address[MAX_COMMANDS];
  63. /******************************************************************************************************************************/
  64. static izcmd_Init()
  65. {
  66.     new offsetDAT, offsetPFT, offsetNFT, addr, number_of_publics,chr;
  67.     new prefix[4] = {'c','m','d','_'},funcname[MAX_FUNC_NAME-4];
  68.  
  69.     if((addr = funcidx("OnPlayerCommandPerformed")) != -1)
  70.     {
  71.         #emit LCTRL       1
  72.         #emit NEG
  73.         #emit ADD.C       32
  74.         #emit STOR.pri  izcmd_pointer_OPCP
  75.         #emit LREF.alt  izcmd_pointer_OPCP
  76.  
  77.         #emit LCTRL 1
  78.         #emit NEG
  79.         #emit ADD
  80.         #emit LOAD.S.alt  addr
  81.         #emit SHL.C.alt   3
  82.         #emit ADD
  83.         #emit STOR.pri  izcmd_pointer_OPCP
  84.         #emit LREF.pri  izcmd_pointer_OPCP
  85.         #emit STOR.pri  izcmd_pointer_OPCP
  86.     }
  87.     //COMPILER BUG FIX
  88.     {
  89.         #emit LCTRL 1
  90.         #emit NEG
  91.         #emit STOR.S.PRI offsetDAT
  92.  
  93.         #emit ADD.C 32
  94.         #emit STOR.S.PRI addr
  95.         #emit LREF.S.PRI addr
  96.         #emit LOAD.S.ALT addr
  97.         #emit ADD
  98.         #emit CONST.ALT 32
  99.         #emit SUB
  100.         #emit STOR.S.PRI offsetPFT
  101.  
  102.         #emit LOAD.S.PRI offsetDAT
  103.         #emit ADD.C 36
  104.         #emit STOR.S.PRI addr
  105.         #emit LREF.S.PRI addr
  106.         #emit LOAD.S.ALT addr
  107.         #emit ADD
  108.         #emit CONST.ALT 36
  109.         #emit SUB
  110.         #emit STOR.S.PRI offsetNFT
  111.     }
  112.     number_of_publics = ((offsetNFT - offsetPFT) >>> 3);
  113.  
  114.     for(new i = 0; i < number_of_publics; i++)
  115.     {
  116.         new j;
  117.         addr = (i << 3) + offsetPFT + 4;
  118.  
  119.         #emit LREF.S.pri addr
  120.         #emit LOAD.S.alt offsetDAT
  121.         #emit ADD
  122.         #emit STOR.S.pri addr
  123.  
  124.         for(;;)
  125.         {
  126.             #emit LREF.S.pri addr
  127.             #emit STOR.S.pri chr
  128.  
  129.             #emit LOAD.S.pri addr
  130.             #emit INC.pri
  131.             #emit STOR.S.pri addr
  132.  
  133.             if(j < 4)
  134.             {
  135.                 if((chr & 0xFF) != prefix[j++])
  136.                     break;
  137.             }
  138.             else if((funcname[j++-4] = chr & 0xFF) == EOS)
  139.             {
  140.                 if(izcmd_start_index[funcname[0]-64] == -1)
  141.                     izcmd_start_index[funcname[0]-64] = izcmd_command_count;
  142.  
  143.                 izcmd_end_index[funcname[0]-64] = izcmd_command_count+1;
  144.  
  145.                 #emit LCTRL       1
  146.                 #emit NEG
  147.                 #emit ADD.C       32
  148.                 #emit STOR.S.pri  addr
  149.                 #emit LREF.S.alt  addr
  150.  
  151.                 #emit LCTRL 1
  152.                 #emit NEG
  153.                 #emit ADD
  154.                 #emit LOAD.S.alt  i
  155.                 #emit SHL.C.alt   3
  156.                 #emit ADD
  157.                 #emit STOR.S.pri  addr
  158.                 #emit LREF.S.pri  addr
  159.                 #emit STOR.S.pri  addr
  160.  
  161.                 izcmd_command_func_address[izcmd_command_count] = addr;
  162.                 strcat(izcmd_commands[izcmd_command_count++],funcname);
  163.                
  164.                 break;
  165.             }
  166.         }
  167.     }
  168.  
  169.     /*for(new n = 0; n < 59; n++)
  170.     {
  171.         if(izcmd_start_index[n] == -1) continue;
  172.  
  173.         new bool:swaped = false;
  174.         do
  175.         {
  176.             for(new j = izcmd_start_index[n],m = izcmd_end_index[n] - izcmd_start_index[n];j < (m-1);j++)
  177.             {
  178.                 for(new k = 0;k < (MAX_FUNC_NAME-4);k++)
  179.                 {
  180.                     if(izcmd_commands[j][k] < izcmd_commands[j+1][k]) break;
  181.                     else if(izcmd_commands[j][k] > izcmd_commands[j+1][k])
  182.                     {
  183.                         swaped = true;
  184.  
  185.                         tmp[0] = 0;
  186.                         strcat(tmp,izcmd_commands[j]);
  187.  
  188.                         izcmd_commands[j][0] = 0;
  189.                         strcat(izcmd_commands[j],izcmd_commands[j+1]);
  190.  
  191.                         izcmd_commands[j+1][0] = 0;
  192.                         strcat(izcmd_commands[j+1],tmp);
  193.                         break;
  194.                     }
  195.                 }
  196.             }
  197.         }while(swaped);
  198.     }*/
  199. }
  200. /******************************************************************************************************************************/
  201. #if defined FILTERSCRIPT
  202.     public OnFilterScriptInit()
  203.     {
  204.         izcmd_Init();
  205.         #if defined izcmd_OnFilterScriptInit
  206.             return izcmd_OnFilterScriptInit();
  207.         #else
  208.             return 1;
  209.         #endif
  210.     }
  211.  
  212.     #if defined _ALS_OnFilterScriptInit
  213.         #undef OnFilterScriptInit
  214.     #else
  215.         #define _ALS_OnFilterScriptInit
  216.     #endif
  217.     #define OnFilterScriptInit izcmd_OnFilterScriptInit
  218.  
  219.     #if defined OnFilterScriptInit
  220.         forward OnFilterScriptInit();
  221.     #endif
  222. #else
  223.     public OnGameModeInit()
  224.     {
  225.         izcmd_Init();
  226.         #if defined izcmd_OnGameModeInit
  227.             return izcmd_OnGameModeInit();
  228.         #else
  229.             return 1;
  230.         #endif
  231.     }
  232.  
  233.     #if defined _ALS_OnGameModeInit
  234.         #undef OnGameModeInit
  235.     #else
  236.         #define _ALS_OnGameModeInit
  237.     #endif
  238.     #define OnGameModeInit izcmd_OnGameModeInit
  239.  
  240.     #if defined izcmd_OnGameModeInit
  241.     forward izcmd_OnGameModeInit();
  242.     #endif
  243. #endif
  244. /******************************************************************************************************************************/
  245. public OnPlayerCommandText(playerid, cmdtext[])
  246. {
  247.     #if defined OnPlayerCommandReceived
  248.         if(!OnPlayerCommandReceived(playerid,cmdtext)) return 1;
  249.     #endif
  250.  
  251.     static start,end,pos,left_right;
  252.  
  253.     if((start = izcmd_start_index[(left_right = cmdtext[1] - 64)]) == -1)
  254.     {
  255.         #if !defined OnPlayerCommandPerformed
  256.         switch(false)
  257.         {
  258.             case true:
  259.             {
  260.         #endif
  261.                 #emit PUSH.C 0
  262.                 #emit PUSH.S cmdtext
  263.                 #emit PUSH.S playerid
  264.                 #emit PUSH.C 12
  265.  
  266.                 #emit LCTRL      6
  267.                 #emit ADD.C      28
  268.                 #emit PUSH.pri
  269.  
  270.                 #emit LOAD.pri izcmd_pointer_OPCP
  271.                 #emit SCTRL      6
  272.  
  273.                 #emit RETN
  274.         #if !defined OnPlayerCommandPerformed
  275.             }
  276.         }
  277.         #endif
  278.  
  279.         #emit ZERO.pri
  280.         #emit RETN
  281.     }
  282.  
  283.     new i = (start + (end = izcmd_end_index[left_right]))>>1;
  284.  
  285.     if((pos = (strfind(cmdtext[1]," ",false,0) + 1)))   cmdtext[pos] = 0;
  286.  
  287.     while(start <= end)
  288.     {
  289.  
  290.         if((left_right = strcmp(cmdtext[1],izcmd_commands[i])) > 0)
  291.             i = (end + (start = i+1))>>1;
  292.         else if(left_right < 0)
  293.             i = ((end = i-1) + start)>>1;
  294.         else
  295.         {
  296.             #emit LOAD.S.alt cmdtext
  297.             #emit LOAD.pri pos
  298.             #emit ADD.C 1
  299.             #emit IDXADDR
  300.  
  301.             #emit PUSH.pri
  302.  
  303.             #emit PUSH.S playerid
  304.             #emit PUSH.C 8
  305.             #emit LCTRL      6
  306.             #emit ADD.C      40
  307.             #emit PUSH.pri
  308.  
  309.             #emit CONST.alt izcmd_command_func_address
  310.             #emit LOAD.S.pri i
  311.             #emit LIDX
  312.  
  313.             #emit SCTRL      6
  314.  
  315.             #emit PUSH.pri
  316.  
  317.             #if !defined OnPlayerCommandPerformed
  318.             switch(false)
  319.             {
  320.                 case true:
  321.                 {
  322.             #endif
  323.                     cmdtext[pos] = ' ';
  324.  
  325.                     #emit PUSH.S cmdtext
  326.                     #emit PUSH.S playerid
  327.                     #emit PUSH.C 12
  328.  
  329.                     #emit LCTRL      6
  330.                     #emit ADD.C      28
  331.                     #emit PUSH.pri
  332.  
  333.                     #emit LOAD.pri izcmd_pointer_OPCP
  334.                     #emit SCTRL      6
  335.  
  336.                     #emit RETN
  337.  
  338.             #if !defined OnPlayerCommandPerformed
  339.                 }
  340.             }
  341.             #endif
  342.  
  343.             #emit POP.pri
  344.             #emit RETN
  345.         }
  346.     }
  347.  
  348.     #if !defined OnPlayerCommandPerformed
  349.     switch(false)
  350.     {
  351.         case true:
  352.         {
  353.     #endif
  354.             cmdtext[pos] = ' ';
  355.  
  356.             #emit PUSH.C 0
  357.             #emit PUSH.S cmdtext
  358.             #emit PUSH.S playerid
  359.             #emit PUSH.C 12
  360.  
  361.             #emit LCTRL      6
  362.             #emit ADD.C      28
  363.             #emit PUSH.pri
  364.  
  365.             #emit LOAD.pri izcmd_pointer_OPCP
  366.             #emit SCTRL      6
  367.  
  368.             #emit RETN
  369.  
  370.     #if !defined OnPlayerCommandPerformed
  371.         }
  372.     }
  373.     #endif
  374.  
  375.     #emit RETN
  376.  
  377.     return 1; //COMPILER BUG FIX
  378. }
  379. /******************************************************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement