Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Begin String Parsing
- /* String Parsing functions V2.0 */
- /* Written by: Apjjm */
- //+ Private Parsing functions
- int _ParseDigit(uint8 digit) {
- int d = digit-48; //48 is ASCII code for 0
- return ((d>= 0)&&(d<=9)) ? d : -1; }
- bool _ParseExp(uint8 digit) {
- return (digit == 69) || (digit == 101); //ASCII for e or E
- }
- bool _ParseSign(uint8 digit) {
- return (digit == 45); // -sign
- }
- bool _ParsePoint(uint8 digit) {
- return (digit == 46);
- }
- bool _ParseExpSpace(uint8 digit) {
- return (digit == 43)||(digit == 32);
- }
- float _ParseMakeFloat(int n1, int n2, int n3, bool hasD, bool hasE, bool signE, bool signN, int leading) {
- float output = n1;
- if(hasD) {
- int ln=(""+n2).length() + leading; float temp=n2;
- for(int i=0; i<ln; i++) temp /= 10;
- output += signN?-temp:temp;
- } if(hasE) {
- for(int i =0; i<n3; i++)
- output = signE?(output/10):(output*10);
- } return output;
- }
- int _ParseMakeInt(int n1, int n3, bool hasE, bool signE) {
- int output = n1;
- if(hasE) {
- for(int i =0; i<n3; i++)
- output = signE?(output/10):(output*10);
- } return output;
- }
- //-
- //Parses a given string to an array of floats
- float[] parseStringToFloatArray(string &in asString) {
- float[] output={}; int state = 0;
- bool finalise = false; //Need to store number in array?
- bool reading = false; //In the process of reading a number?
- bool numsign = false; //Whether or not number is signed
- bool expsign = false; // " " " " " " " exponent is signed
- bool hasexp = false; //Has an exponent?
- bool hasdec = false; //Has points?
- int numbers = 0; //Temp store for numbers
- int points =0; //Temp store for decimals
- int expons =0; //Temp store for exponent
- int leading =0; //Temp for leading 0s on decimals
- for(int i=0; i<asString.length(); i++) { uint8 chr = asString[i];
- int d = _ParseDigit(chr);
- switch(state) {
- case 0: { //Looking for: - or digit
- if(d>=0 && d<=9) {
- numbers=numsign?-d:d;
- reading = true; //State we are reading a number
- state = 1; //Number has begun, jump to number reading stage
- } else if(_ParseSign(chr)) {
- numsign=true; //Read a minus sign. Mark number as possibly signed?
- } else {
- numsign=false; //Didn't read a sign - reset sign state.
- } break;
- }
- case 1: { //Read digits until a "." or exponent is found
- if(d>=0 && d<=9) {
- numbers=(numbers * 10) + d; //Add each digit
- } else if(_ParsePoint(chr)) {
- state = 2; //Read a decimal point - jump to decimal reading state
- } else if(_ParseExp(chr)) {
- state = 3; //Read an exponent marker - jump to exponent reading state
- } else { //Nothing matches. Finish.
- reading = false; finalise = true;
- } break;
- }
- case 2: { //Read digits until an exponent is found
- if(d>=0 && d<=9) {
- if(d == 0 && points == 0) leading++;
- points = (points * 10) + d;
- hasdec=true;
- } else if(_ParseExp(chr)) {
- state = 3;
- } else { //Nothing matches. Finish.
- reading = false; finalise = true;
- } break;
- }
- case 3: { //Looking for: - + or whitespace signs or a digit
- if(d>=0 && d<=9) {
- expons=d; hasexp=true; state =4;
- } else if(_ParseSign(chr)) {
- expsign=true;
- } else if(_ParseExpSpace(chr)) {
- expsign=false;
- } else {
- expsign=false; reading = false; finalise = true;
- } break;
- }
- case 4: { //Reading digits for exponent
- if(d>=0 && d<=9) {
- expons = (expons * 10) + d; hasexp=true;
- } else {
- reading = false; finalise = true;
- } break;
- }
- }
- if(finalise) {
- int index = output.length(); output.resize(index+1); //Resize array, store target index
- output[index] = _ParseMakeFloat(numbers, points, expons, hasdec, hasexp, expsign, numsign, leading); //Store number
- numbers = 0; points = 0; expons = 0; state = 0; leading=0; //Reset vars
- finalise = false; reading = false; hasexp=false; expsign=false; numsign = false; hasdec=false;
- }
- }
- if(reading) {
- int index = output.length(); output.resize(index+1);
- output[index] = _ParseMakeFloat(numbers, points, expons, hasdec, hasexp, expsign, numsign, leading);
- }
- return output;
- }
- //Parses a given string to an array of ints
- int[] parseStringToIntArray(string &in asString) {
- int[] output={}; int state = 0;
- bool finalise = false; //Need to store number in array?
- bool reading = false; //In the process of reading a number?
- bool numsign = false; //Whether or not number is signed
- bool expsign = false; // " " " " " " " exponent is signed
- bool hasexp = false; //Has an exponent?
- int numbers = 0; //Temp store for numbers
- int expons =0; //Temp store for exponent
- for(int i=0; i<asString.length(); i++) { uint8 chr = asString[i];
- int d = _ParseDigit(chr);
- switch(state) {
- case 0: { //Looking for: - or digit
- if(d>=0 && d<=9) {
- numbers=numsign?-d:d;
- reading = true; //State we are reading a number
- state = 1; //Number has begun, jump to number reading stage
- } else if(_ParseSign(chr)) {
- numsign=true; //Read a minus sign. Mark number as possibly signed?
- } else {
- numsign=false; //Didn't read a sign - reset sign state.
- } break;
- }
- case 1: { //Read digits until exponent is found
- if(d>=0 && d<=9) {
- numbers=(numbers * 10) + d; //Add each digit
- } else if(_ParseExp(chr)) {
- state = 3; //Read an exponent marker - jump to exponent reading state
- } else { //Nothing matches. Finish.
- reading = false;
- finalise = true;
- } break;
- }
- case 3: { //Looking for: - + or whitespace signs or a digit
- if(d>=0 && d<=9) {
- expons=d; hasexp=true; state =4;
- } else if(_ParseSign(chr)) {
- expsign=true;
- } else if(_ParseExpSpace(chr)) {
- expsign=false;
- } else {
- expsign=false; reading = false; finalise = true;
- } break;
- }
- case 4: { //Reading digits for exponent
- if(d>=0 && d<=9)
- {
- expons = (expons * 10) + d; hasexp=true;
- } else {
- reading = false; finalise = true;
- }
- }
- }
- if(finalise) {
- int index = output.length(); output.resize(index+1);
- output[index] = _ParseMakeInt(numbers, expons, hasexp, expsign);
- numbers = 0; expons = 0; state = 0; finalise = false; reading = false;
- hasexp=false; expsign=false; numsign = false;
- }
- }
- if(reading) {
- int index = output.length(); output.resize(index+1);
- output[index] = _ParseMakeInt(numbers, expons, hasexp, expsign);
- }
- return output;
- }
- //Parses all the digits out of a given string, ignorning sign
- uint parseStringUInt(string &in asString) {
- uint output = 0;
- for(uint i=0; i<asString.length(); i++) {
- int digit = _ParseDigit(asString[i]);
- output = (digit> -1)?(10*output+digit):(output); }
- return output;
- }
- //End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement