Advertisement
Apjjm

ATDD Scripting: StringParsing

Jun 6th, 2012
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.34 KB | None | 0 0
  1. //Begin String Parsing
  2. /* String Parsing functions   V2.0 */
  3. /* Written by: Apjjm               */
  4. //+ Private Parsing functions
  5. int  _ParseDigit(uint8 digit) {
  6.     int d = digit-48; //48 is ASCII code for 0
  7.     return ((d>= 0)&&(d<=9)) ? d : -1; }
  8. bool _ParseExp(uint8 digit) {
  9.     return (digit == 69) || (digit == 101); //ASCII for e or E
  10. }
  11. bool _ParseSign(uint8 digit) {
  12.     return (digit == 45);  // -sign
  13. }
  14. bool _ParsePoint(uint8 digit) {
  15.     return (digit == 46);
  16. }
  17. bool _ParseExpSpace(uint8 digit) {
  18.     return (digit == 43)||(digit == 32);
  19. }
  20. float _ParseMakeFloat(int n1, int n2, int n3, bool hasD, bool hasE, bool signE, bool signN, int leading) {
  21.   float output = n1;
  22.      if(hasD) {
  23.     int ln=(""+n2).length() + leading; float temp=n2;
  24.     for(int i=0; i<ln; i++) temp /= 10;
  25.     output += signN?-temp:temp;
  26.    } if(hasE) {
  27.     for(int i =0; i<n3; i++)
  28.      output = signE?(output/10):(output*10);
  29.    } return output;
  30. }
  31. int _ParseMakeInt(int n1, int n3, bool hasE, bool signE) {
  32.   int output = n1;
  33.   if(hasE) {
  34.    for(int i =0; i<n3; i++)
  35.      output = signE?(output/10):(output*10);
  36.            } return output;
  37. }
  38. //-
  39.  
  40. //Parses a given string to an array of floats
  41. float[] parseStringToFloatArray(string &in asString) {
  42.   float[] output={}; int state = 0;
  43.   bool finalise = false; //Need to store number in array?
  44.   bool reading = false; //In the process of reading a number?
  45.   bool numsign = false; //Whether or not number is signed
  46.   bool expsign = false; // " " " " " " " exponent is signed
  47.   bool hasexp = false; //Has an exponent?
  48.   bool hasdec = false; //Has points?
  49.   int numbers = 0; //Temp store for numbers
  50.   int points =0;   //Temp store for decimals
  51.   int expons =0;   //Temp store for exponent
  52.   int leading =0; //Temp for leading 0s on decimals
  53.   for(int i=0; i<asString.length(); i++) { uint8 chr = asString[i];
  54.     int d = _ParseDigit(chr);
  55.     switch(state) {
  56.      case 0:  {  //Looking for: - or digit
  57.         if(d>=0 && d<=9) {
  58.           numbers=numsign?-d:d;
  59.           reading = true; //State we are reading a number
  60.           state = 1;  //Number has begun, jump to number reading stage
  61.          } else if(_ParseSign(chr)) {
  62.           numsign=true; //Read a minus sign. Mark number as possibly signed?
  63.          } else {
  64.           numsign=false; //Didn't read a sign - reset sign state.
  65.          } break;
  66.        }
  67.      case 1:  {  //Read digits until a "." or exponent is found
  68.         if(d>=0 && d<=9) {
  69.           numbers=(numbers * 10) + d; //Add each digit
  70.          } else if(_ParsePoint(chr)) {
  71.           state = 2; //Read a decimal point - jump to decimal reading state
  72.          } else if(_ParseExp(chr)) {
  73.           state = 3; //Read an exponent marker - jump to exponent reading state
  74.          } else { //Nothing matches. Finish.
  75.           reading = false; finalise = true;
  76.          } break;
  77.        }
  78.      case 2:  {  //Read digits until an exponent is found
  79.         if(d>=0 && d<=9) {
  80.           if(d == 0 && points == 0) leading++;
  81.           points = (points * 10) + d;
  82.           hasdec=true;
  83.          } else if(_ParseExp(chr)) {
  84.           state = 3;
  85.          } else { //Nothing matches. Finish.
  86.           reading = false; finalise = true;
  87.          } break;
  88.        }
  89.      case 3:  {  //Looking for: - + or whitespace signs or a digit
  90.         if(d>=0 && d<=9) {
  91.           expons=d; hasexp=true; state =4;
  92.          } else if(_ParseSign(chr)) {
  93.           expsign=true;
  94.          } else if(_ParseExpSpace(chr)) {
  95.           expsign=false;
  96.          } else {
  97.           expsign=false; reading = false; finalise = true;
  98.          } break;
  99.        }
  100.      case 4:  {  //Reading digits for exponent
  101.         if(d>=0 && d<=9) {
  102.           expons = (expons * 10) + d; hasexp=true;
  103.          } else {
  104.           reading = false; finalise = true;
  105.          } break;
  106.        }
  107.                   }
  108.     if(finalise) {
  109.       int index = output.length(); output.resize(index+1); //Resize array, store target index
  110.       output[index] = _ParseMakeFloat(numbers, points, expons, hasdec, hasexp, expsign, numsign, leading); //Store number
  111.       numbers = 0; points = 0; expons = 0; state = 0; leading=0; //Reset vars
  112.       finalise = false; reading = false; hasexp=false; expsign=false; numsign = false; hasdec=false;
  113.                  }
  114.    }
  115.    if(reading) {
  116.      int index = output.length(); output.resize(index+1);
  117.      output[index] = _ParseMakeFloat(numbers, points, expons, hasdec, hasexp, expsign, numsign, leading);
  118.                }
  119.   return output;    
  120. }
  121.  
  122. //Parses a given string to an array of ints
  123. int[] parseStringToIntArray(string &in asString) {
  124.   int[] output={}; int state = 0;
  125.   bool finalise = false; //Need to store number in array?
  126.   bool reading = false; //In the process of reading a number?
  127.   bool numsign = false; //Whether or not number is signed
  128.   bool expsign = false; // " " " " " " " exponent is signed
  129.   bool hasexp = false; //Has an exponent?
  130.   int numbers = 0; //Temp store for numbers
  131.   int expons =0;   //Temp store for exponent
  132.   for(int i=0; i<asString.length(); i++) { uint8 chr = asString[i];
  133.     int d = _ParseDigit(chr);
  134.     switch(state) {
  135.      case 0:  {  //Looking for: - or digit
  136.         if(d>=0 && d<=9) {
  137.           numbers=numsign?-d:d;
  138.           reading = true; //State we are reading a number
  139.           state = 1;  //Number has begun, jump to number reading stage
  140.          } else if(_ParseSign(chr)) {
  141.           numsign=true; //Read a minus sign. Mark number as possibly signed?
  142.          } else  {
  143.           numsign=false; //Didn't read a sign - reset sign state.
  144.          } break;
  145.        }
  146.      case 1:  {  //Read digits until exponent is found
  147.         if(d>=0 && d<=9) {
  148.           numbers=(numbers * 10) + d; //Add each digit
  149.          } else if(_ParseExp(chr)) {
  150.           state = 3; //Read an exponent marker - jump to exponent reading state
  151.          } else { //Nothing matches. Finish.
  152.           reading = false;
  153.           finalise = true;
  154.          } break;
  155.        }
  156.      case 3:  {  //Looking for: - + or whitespace signs or a digit
  157.         if(d>=0 && d<=9) {
  158.           expons=d; hasexp=true; state =4;
  159.          } else if(_ParseSign(chr)) {
  160.           expsign=true;
  161.          } else if(_ParseExpSpace(chr)) {
  162.          expsign=false;
  163.          } else {
  164.           expsign=false; reading = false; finalise = true;
  165.          } break;
  166.        }
  167.      case 4:  {  //Reading digits for exponent
  168.         if(d>=0 && d<=9)
  169.          {
  170.           expons = (expons * 10) + d; hasexp=true;
  171.          } else {
  172.           reading = false; finalise = true;
  173.          }
  174.        }
  175.                   }
  176.     if(finalise) {
  177.       int index = output.length(); output.resize(index+1);
  178.       output[index] = _ParseMakeInt(numbers, expons, hasexp, expsign);
  179.       numbers = 0; expons = 0; state = 0; finalise = false; reading = false;
  180.       hasexp=false; expsign=false; numsign = false;
  181.                  }
  182.    }
  183.    if(reading) {
  184.      int index = output.length(); output.resize(index+1);
  185.      output[index] = _ParseMakeInt(numbers, expons, hasexp, expsign);
  186.                }
  187.   return output;    
  188. }
  189.  
  190. //Parses all the digits out of a given string, ignorning sign
  191. uint parseStringUInt(string &in asString) {
  192.     uint output = 0;
  193.     for(uint i=0; i<asString.length(); i++) {
  194.       int digit = _ParseDigit(asString[i]);
  195.       output = (digit> -1)?(10*output+digit):(output); }
  196.     return output;
  197. }
  198. //End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement