TRISTATE CTextParser::FindExactIdentifier(char* szIdentifier) { char* szPosition; TRISTATE result; PushPosition(); SkipWhiteSpace(); for (;;) { szPosition = mszParserPos; result = GetExactIdentifier(szIdentifier); if (result == TRIERROR) { //We've reached the end of the file without finding the identifier. PopPosition(); return TRIFALSE; } else if (result == TRIFALSE) { //Try the next actual character along. StepRight(); SkipWhiteSpace(); } else if (result == TRITRUE) { mszParserPos = szPosition; PassPosition(); return TRITRUE; } } }
TRISTATE CTextParser::GetDebugCharacterSequence(char* szSequence) { TRISTATE tResult; PushPosition(); tResult = GetExactCharacterSequence(szSequence); PopPosition(); return tResult; }
static void do_one_note (gint mid_c_offset, gint enshift, gint notenum) {//g_print("do one note Adding mask %x, Chord mask %x\n", (Denemo.keyboard_state & ADDING_MASK) , (Denemo.keyboard_state & CHORD_MASK)); if ((Denemo.keyboard_state & ADDING_MASK) && (Denemo.keyboard_state & CHORD_MASK)) { add_or_delete_note_to_chord (mid_c_offset, enshift, notenum); } else { DenemoObject *curobj = NULL; //check for non-printing notes - back up to the first non-printing note. gboolean non_printing_note = FALSE; PushPosition (NULL, NULL); while (cursor_to_prev_note ()) { curobj = Denemo.project->movement->currentobject->data; if (!curobj->isinvisible) break; else non_printing_note = TRUE; } if (Denemo.project->movement->currentobject) { curobj = Denemo.project->movement->currentobject->data; if (non_printing_note) { if (!curobj->isinvisible) cursor_to_next_note (); (void)pop_position ();//Discard the pushed position } else PopPosition (NULL, NULL);// go to where we started, as there are no non-printing notes } else PopPosition (NULL, NULL);// go to where we started, as there are no non-printing notes action_note_into_score (mid_c_offset, enshift, notenum); if (Denemo.keyboard_state & ADDING_MASK) Denemo.keyboard_state |= CHORD_MASK; set_midi_in_status (); } }
TRISTATE CTextParser::FindStartOfLine(void) { char cCurrent; BOOL bInQuotes; PushPosition(); //If we're off the end of the file we can't return the beginning of the line. if (mbOutsideText) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } bInQuotes = FALSE; for (;;) { cCurrent = mszParserPos[0]; if (cCurrent == '"') { bInQuotes = !bInQuotes; } if (!bInQuotes) { SkipLeftCStyleComment(); } StepLeft(); //If we have no more text then the start of the line is the start of the text. if (mbOutsideText) { mszParserPos = mszStartOfText; miColumn = 0; PassPosition(); return TRITRUE; } if (!bInQuotes) { //Get the current character. cCurrent = mszParserPos[0]; //If we get find an end of line character we've gone to far, go right again. if (cCurrent == '\n') { StepRight(); PassPosition(); return TRITRUE; } } } }
TRISTATE CTextParser::GetHFExactIdentifierAndString(char* szIdentifier, char* szString) { TRISTATE tReturn; PushPosition(); tReturn = GetExactIdentifier(szIdentifier); if ((tReturn == TRIERROR) || (tReturn == TRIFALSE)) { PopPosition(); return tReturn; } tReturn = GetString(szString); if ((tReturn == TRIERROR) || (tReturn == TRIFALSE)) { PopPosition(); return tReturn; } PassPosition(); return TRITRUE; }
// ----------------------- Helper Functions ------------------------------ ////////////////////////////////////////////////////////////////////////// // // ////////////////////////////////////////////////////////////////////////// TRISTATE CTextParser::GetHFExactIdentifierAndInteger(char* szIdentifier, int* piInt) { TRISTATE tReturn; PushPosition(); tReturn = GetExactIdentifier(szIdentifier); if ((tReturn == TRIERROR) || (tReturn == TRIFALSE)) { PopPosition(); return tReturn; } tReturn = GetInteger(piInt); if ((tReturn == TRIERROR) || (tReturn == TRIFALSE)) { PopPosition(); return tReturn; } PassPosition(); return TRITRUE; }
TRISTATE CTextParser::GetCharacterSequence(char* szSequence, int* piLength) { char c; BOOL bFirst; int iPos; bFirst = TRUE; iPos = 0; PushPosition(); SkipWhiteSpace(); //Make sure we're not off the end of the file. if (mbOutsideText) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } for (;;) { if (!mbOutsideText) { c = mszParserPos[0]; StepRight(); if (IsWhiteSpace(c)) { if (bFirst) { if (szSequence) szSequence[iPos] = 0; PopPosition(); return TRIFALSE; } else { if (szSequence) szSequence[iPos] = 0; if (szSequence) PassPosition(); else PopPosition(); SafeAssign(piLength, iPos); return TRITRUE; } } else { if (szSequence) szSequence[iPos] = c; } } else { if (bFirst) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } else { if (szSequence) szSequence[iPos] = 0; if (szSequence) PassPosition(); else PopPosition(); SafeAssign(piLength, iPos); return TRITRUE; } } bFirst = FALSE; iPos++; } }
BOOL CTextParser::SkipCPPStyleComment(void) { char cCurrent; int iCount; if (mbOutsideText) { return TRUE; } PushPosition(); cCurrent = mszParserPos[0]; if (cCurrent == '/') { StepRight(); if (!mbOutsideText) { cCurrent = mszParserPos[0]; if (cCurrent == '/') { for (iCount = 0;; iCount++) { StepRight(); if (!mbOutsideText) { cCurrent = mszParserPos[0]; if (cCurrent == '\n') { //This is the end of the line and the end of the comment. StepRight(); PassPosition(); return TRUE; } if (mbAnnotated) { if (cCurrent == '@') { //Wasn't a comment, was an annotation. PopPosition(); return FALSE; } } } else { PassPosition(); return TRUE; } } } else { PopPosition(); return TRUE; } } else { //Wasn't a comment. StepLeft(); return TRUE; } } PopPosition(); return TRUE; }
TRISTATE CTextParser::FindEndOfLine(void) { char cCurrent; BOOL bInQuotes; char cPrev; BOOL bInCppComment; PushPosition(); //If we're off the end of the file we can't go to the end of the line. if (mbOutsideText) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } bInCppComment = FALSE; bInQuotes = FALSE; cCurrent = 0; for (;;) { cPrev = cCurrent; cCurrent = mszParserPos[0]; if ((cPrev == '/') && (cCurrent == '/')) { bInCppComment = TRUE; } if (!bInCppComment) { if (cCurrent == '"') { bInQuotes = !bInQuotes; } if (!bInQuotes) { SkipCStyleComment(); } } //If we have no more text then ... blah, blah, blah if (mbOutsideText) { mszParserPos = mszEndOfText; miColumn--; //This might work. PassPosition(); return TRITRUE; } if ((!bInQuotes) || (bInCppComment)) //Note: (NOT in quotes) OR (in Cpp comment). { //If we get find an end of line character we've gone to far, go right again. cCurrent = mszParserPos[0]; if (cCurrent == '\n') { PassPosition(); return TRITRUE; } } StepRight(); } }
TRISTATE CTextParser::GetFloat(double* pf) { unsigned long long int ulliLeft; unsigned long long int ulliRight; TRISTATE tReturn; int iNumDecimals; double fLeft; double fRight; double fTemp; BOOL bLeft; int iSign; PushPosition(); SkipWhiteSpace(); *pf = 0.0f; if (!mbOutsideText) { //Try and get the mantissa. tReturn = GetDigits(&ulliLeft, &iSign, NULL); bLeft = TRUE; //Just return on errors an non-numbers. if (tReturn == TRIFALSE) { //There may still be a decimal point... ulliLeft = 0; bLeft = FALSE; } else if (tReturn == TRIERROR) { PopPosition(); SetErrorSyntaxError(); return TRIERROR; } fLeft = ((double)ulliLeft) * iSign; tReturn = GetExactCharacter('.', FALSE); if (tReturn == TRITRUE) { tReturn = GetDigits(&ulliRight, &iSign, &iNumDecimals); if (tReturn == TRITRUE) { if (iSign <= 0) { //Cant have: 34.-342 but -34.342 would be fine. PopPosition(); SetErrorSyntaxError(); return TRIERROR; } fRight = (double)ulliRight; fTemp = pow(10.0L, -iNumDecimals); fRight *= fTemp; if (fLeft >= 0) { *pf = fLeft + fRight; } else { *pf = fLeft - fRight; } PassPosition(); return TRITRUE; } else { //A decimal point must be followed by a number. PopPosition(); SetErrorSyntaxError(); return TRIERROR; } } else { //No decimal point... if (!bLeft) { //No digits and no point... PopPosition(); return TRIFALSE; } else { *pf = fLeft; PassPosition(); return TRITRUE; } } } else { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } }
TRISTATE CTextParser::GetOctal(unsigned long long int* pulli, int* piNumDigits) { unsigned long long int iNum; int iTemp; TRISTATE tReturn; int i; PushPosition(); SkipWhiteSpace(); tReturn = GetExactCharacter('0', FALSE); if (tReturn != TRITRUE) { PopPosition(); return tReturn; } *pulli = 0; i = 0; if (!mbOutsideText) { iNum = 0; for (;;) { if (!mbOutsideText) { tReturn = GetDigit(&iTemp, 8); if (tReturn == TRITRUE) { i++; iNum *= 8; iNum += iTemp; } else if ((tReturn == TRIFALSE) || (tReturn == TRIERROR)) { *pulli = iNum; if (piNumDigits) { *piNumDigits = i; } PassPosition(); return TRITRUE; } } else { if (i > 0) { *pulli = iNum; if (piNumDigits) { *piNumDigits = i; } PassPosition(); return TRITRUE; } PopPosition(); SetErrorSyntaxError(); return TRIERROR; } } } else { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } }
TRISTATE CTextParser::GetDigits(unsigned long long int* pulli, int* piSign, int* piNumDigits, BOOL bSkipWhiteSpace, BOOL bTestSign) { unsigned long long int iNum; int iSign; int iTemp; TRISTATE tReturn; BOOL bFirstDigit; int i; //This still needs to be failed on the case where the number is larger than MAX_ULONG. PushPosition(); if (bSkipWhiteSpace) { SkipWhiteSpace(); } *pulli = 0; i = 0; if (!mbOutsideText) { iNum = 0; if (bTestSign) GetSign(&iSign); else iSign = 1; bFirstDigit = TRUE; for (;;) { if (!mbOutsideText) { tReturn = GetDigit(&iTemp); if (tReturn == TRITRUE) { i++; iNum *= 10; iNum += iTemp; } else if ((tReturn == TRIFALSE) || (tReturn == TRIERROR)) { break; } bFirstDigit = FALSE; } else { break; } } if (bFirstDigit) { //might already have got a sign... so reset the parser. PopPosition(); return TRIFALSE; } else { *piSign = iSign; *pulli = iNum; if (piNumDigits) { *piNumDigits = i; } PassPosition(); return TRITRUE; } } else { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } }
TRISTATE CTextParser::GetQuotedCharacterSequence(char cOpenQuote, char cCloseQuote, char* szString, int* piLength, BOOL bPassOnTest, BOOL bSkipWhiteSpace) { int iPos; char cCurrent; TRISTATE tReturn; char cEscape; PushPosition(); if (bSkipWhiteSpace) { SkipWhiteSpace(); } if (!mbOutsideText) { if (GetExactCharacter(cOpenQuote, FALSE)) { iPos = 0; for (;;) { if (!mbOutsideText) { cCurrent = mszParserPos[0]; if (cCurrent == cCloseQuote) { if (szString) szString[iPos] = 0; StepRight(); if (szString || bPassOnTest) PassPosition(); else PopPosition(); SafeAssign(piLength, iPos); return TRITRUE; } //We have an escape character... else if (cCurrent == '\\') { StepRight(); tReturn = GetEscapeCode(&cEscape); if (szString) szString[iPos] = cEscape; iPos++; if (tReturn == TRIFALSE) { PopPosition(); SetErrorSyntaxError(); return TRIERROR; } else if (tReturn == TRIERROR) { PopPosition(); //Don't set the error here, it's already been set by GetEscapeCode return TRIERROR; } } else if (cCurrent == '\n') { //Just ignore new lines. StepRight(); } else { if (szString) szString[iPos] = cCurrent; iPos++; StepRight(); } } else { //This has never been tested. PopPosition(); SetErrorSyntaxError(); return TRIERROR; } } } else { //No quote so not a string. PopPosition(); return TRIFALSE; } } else { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } }
TRISTATE CTextParser::GetIdentifier(char* szIdentifier, int* piLength, BOOL bPassOnTest) { char c; BOOL bFirst; int iPos; bFirst = TRUE; iPos = 0; PushPosition(); SkipWhiteSpace(); //Make sure we're not off the end of the file. if (mbOutsideText) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } for (;;) { if (!mbOutsideText) { if (GetIdentifierCharacter(&c, bFirst) != TRITRUE) { if (bFirst) { if (szIdentifier) szIdentifier[iPos] = 0; PopPosition(); return TRIFALSE; } else { if (szIdentifier) szIdentifier[iPos] = 0; if (szIdentifier || bPassOnTest) PassPosition(); else PopPosition(); SafeAssign(piLength, iPos); return TRITRUE; } } else { if (szIdentifier) szIdentifier[iPos] = c; } } else { if (bFirst) { PopPosition(); SetErrorEndOfFile(); return TRIERROR; } else { if (szIdentifier) szIdentifier[iPos] = 0; if (szIdentifier) PassPosition(); else PopPosition(); SafeAssign(piLength, iPos); return TRITRUE; } } bFirst = FALSE; iPos++; } }