Advertisement
NewbProgramming

SCANF for SampSharp

Dec 12th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.33 KB | None | 0 0
  1.         static private bool SSCANF(string parameters, string format, out List<object> argument_list)
  2.         {
  3.             /*
  4.              *  Based on: https://wiki.sa-mp.com/wiki/Sscanf_code
  5.              *  
  6.              *  Differences:
  7.              *  - You have to pass in an object list, it cannot be supplied via. parameters.
  8.              *  - 'u' will return BasePlayer.
  9.              *  - Returns a boolean, true = successful, false = unsuccessful.
  10.              */
  11.             NP_Log.LogDebug("SSCANF: '{0}' '{1}'", parameters, format);
  12.  
  13.             argument_list = new List<object>();
  14.  
  15.             if(string.IsNullOrWhiteSpace(parameters))
  16.             {
  17.                 NP_Log.LogDebug("SSCANF: parameters is whitespace or null.");
  18.                 return false;
  19.             }
  20.            
  21.             string[] parameter = parameters.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  22.  
  23.             for(int i = 0, l = format.Length; i < l; ++i)
  24.             {
  25.                 if(parameter.Length == 0)
  26.                 {
  27.                     NP_Log.LogDebug("SSCANF: Format did not match parameter length.");
  28.                     return false;
  29.                 }
  30.                
  31.                 try { // Only thing that can throw an error is Parse.
  32.                     switch(format[i])
  33.                     {
  34.                     case ' ': // Skip whitespace.
  35.                     continue;
  36.                     break;
  37.                     case 'c': // Character.
  38.                         char c = parameter[0][0];
  39.  
  40.                         argument_list.Add(c);
  41.  
  42.                         parameter = parameter.Skip(1).ToArray();
  43.                     break;
  44.                     case 'd': // Integer.
  45.                     case 'i':
  46.                         int number = int.Parse(parameter[0]);
  47.  
  48.                         argument_list.Add(number);
  49.  
  50.                         parameter = parameter.Skip(1).ToArray();
  51.                     break;
  52.                     case 'h': // HEXADECIMAL (Colour).
  53.                     case 'x':
  54.                         int hex = int.Parse(parameter[0], NumberStyles.HexNumber);
  55.  
  56.                         argument_list.Add(hex);
  57.  
  58.                         parameter = parameter.Skip(1).ToArray();
  59.                     break;
  60.                     case 'f': // Float or double.
  61.                         float flt = (float) double.Parse(parameter[0]);
  62.  
  63.                         argument_list.Add(flt);
  64.  
  65.                         parameter = parameter.Skip(1).ToArray();
  66.                         break;
  67.                     case 's': // String.
  68.                         string text;
  69.                        
  70.                         if((i + 1) == l)
  71.                         {
  72.                             text = string.Join(" ", parameter);
  73.                         }
  74.                         else
  75.                         {
  76.                             text = parameter[0];
  77.                         }
  78.  
  79.                         argument_list.Add(text);
  80.  
  81.                         parameter = parameter.Skip(1).ToArray();
  82.                     break;
  83.                     case 'z': // Optional string.
  84.                     break;
  85.                     case 'u': // Will try to convert to BasePlayer.
  86.                         BasePlayer player = null;
  87.                        
  88.                         try
  89.                         {
  90.                             player = BasePlayer.Find(int.Parse(parameter[0]));
  91.                         }
  92.                         catch(Exception ex)
  93.                         {
  94.                             player = BasePlayer.All.FirstOrDefault(p => p.Name.ToLower() == parameter[0].ToLower());
  95.                         }
  96.                        
  97.                         argument_list.Add(player);
  98.  
  99.                         parameter = parameter.Skip(1).ToArray();
  100.                     break;
  101.                     default: // Return false to any other string.
  102.                         NP_Log.LogDebug("SSCANF: Invalid format.");
  103.                         return false;
  104.                     break;
  105.                     }
  106.                 }
  107.                 catch(Exception ex)
  108.                 {
  109.                     NP_Log.LogDebug("SSCANF: Parsing error.");
  110.                     return false;
  111.                 }
  112.             }
  113.  
  114.             NP_Log.LogDebug("SSCANF: Success.");
  115.             return true;
  116.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement