// MEMBER -> [ OBJECT s_dot ] < // k_type | k_name | k_attrib | k_version | k_uuid | k_uunm | // k_clsid | k_iid | k_value > // int P_Member(LubeToken token) { ObjectType object; MemberType member; PSTATEDESC pDesc; if (IsObjectToken(token)) { object = GetObjectType(token); if (Object_None == object) object = s_pContext->m_curObject; if (_PeekToken() != Token_S_dot) { ErrorReport(Lube_E_InvalidMember, g_szCurrentToken); return Ret_Continue; } _GetToken(); // skip s_dot token = _GetToken(); } else { object = s_pContext->m_curObject; } member = GetMemberType(object, token); if (Member_None == member) return Ret_Continue; pDesc = s_pContext->CreateBlockette(State_Member); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } pDesc->object = object; pDesc->member = member; return Ret_Continue; }
// FUNC -> ident s_lparen [ MEMBER | OBJECT | string ] s_rparen // int P_Func(const char *pszFunc, PSTATEDESC pDesc) { int nIndex, nRet; LubeToken token; if (_PeekToken() != Token_S_lparen) { ErrorReport(Lube_E_UnexpectSymbol, pszFunc); return Ret_Continue; } nIndex = GetUserFuncIndex(pszFunc); if (nIndex < 0) { ErrorReport(Lube_E_UndefFunc, pszFunc); return Ret_AbortOnError; } _GetToken(); // skip s_lparen if (NULL == pDesc) { pDesc = s_pContext->CreateBlockette(State_Func); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } } pDesc->dwExtra = (DWORD)nIndex; token = _GetToken(); if (Token_string == token) { pDesc->uDataSize = strlen(g_szCurrentToken) + 1; pDesc->pvData = new char[pDesc->uDataSize]; if (!pDesc->pvData) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } strcpy((char *)pDesc->pvData, g_szCurrentToken); token = _GetToken(); } else if (IsKeywordToken(token)) { nRet = GetMemberObject(token, pDesc); if (Ret_Continue != nRet) return nRet; token = _GetToken(); } if (CheckUserFuncArg(nIndex, pDesc) < 0) { ErrorReport(Lube_E_InvalidFuncArg); } if (Token_S_rparen != token) { ErrorReport(Lube_E_ExpectSymbol, ")"); } return Ret_Continue; }
status_t CDDBQuery::GetSites(bool (*eachFunc)(const char *site, int port, const char *latitude, const char *longitude, const char *description, void *state), void *passThru) { if (!_IsConnected()) _Connect(); BString tmp; tmp = "sites\n"; STRACE((">%s", tmp.String())); if (fSocket.Send(tmp.String(), tmp.Length()) == -1) return B_ERROR; _ReadLine(tmp); if (tmp.FindFirst("210") == -1) { _Disconnect(); return B_ERROR; } for (;;) { BString site; int32 sitePort; BString latitude; BString longitude; BString description; _ReadLine(tmp); if (tmp == ".") break; const char *scanner = tmp.String(); scanner = _GetToken(scanner, site); BString portString; scanner = _GetToken(scanner, portString); sitePort = atoi(portString.String()); scanner = _GetToken(scanner, latitude); scanner = _GetToken(scanner, longitude); description = scanner; if (eachFunc(site.String(), sitePort, latitude.String(), longitude.String(), description.String(), passThru)) break; } _Disconnect(); return B_OK; }
// STATEMENT -> TEMPLATE | WITH | IF | FUNC | MEMBER | TEXT // int P_Statement() { LubeToken token; token = _GetToken(); switch (token) { case Token_text: return CreateTextBlockette(); case Token_K_output: return P_Output(); case Token_K_template: return P_Template(); case Token_K_with: return P_With(); case Token_K_if: return P_If(); case Token_ident: return P_Func(g_szCurrentToken, NULL); case Token_eof: if (0 != *s_pContext->m_pTextBuffer) CreateTextBlockette(); return Ret_EndOfFile; case Token_string: ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); return Ret_Continue; case Token_error: return Ret_AbortOnError; default: return P_Member(token); } }
// OUTPUT -> k_output string { STATEMENT } k_end k_output // int P_Output() { int nRet; PSTATEDESC pDesc; pDesc = s_pContext->CreateStatement(State_Output); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } if (_GetToken() != Token_string) { ErrorReport(Lube_E_ExpectSymbol, "output file name"); return Ret_AbortOnError; } pDesc->uDataSize = strlen(g_szCurrentToken) + 1; pDesc->pvData = new char[pDesc->uDataSize]; if (!pDesc->pvData) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } strcpy((char *)pDesc->pvData, g_szCurrentToken); while (_PeekToken() != Token_K_end) { nRet = P_Statement(); if (Ret_EndOfFile == nRet) { ErrorReport(Lube_E_UnexpectEOF); return Ret_AbortOnError; } if (Ret_Continue != nRet) return nRet; } _GetToken(); // skip k_end if (_GetToken() != Token_K_output) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); } s_pContext->LeaveStatement(); return Ret_Continue; }
// LUBE -> INPUT { STATMENT } // INPUT -> k_input < k_module | k_class | k_interface > // int P_Lube() { int nRet; LubeToken token; if (_GetToken() != Token_K_input) { ErrorReport(Lube_E_ExpectSymbol, "input"); return Ret_AbortOnError; } switch (token = _GetToken()) { case Token_K_module: s_pContext->m_curObject = Object_Module; break; case Token_K_class: s_pContext->m_curObject = Object_Class; s_pContext->m_nClass++; break; case Token_K_interface: s_pContext->m_curObject = Object_Interface; s_pContext->m_nInterface++; break; default: ErrorReport(Lube_E_InvalidInput, g_szCurrentToken); case Token_error: return Ret_AbortOnError; } s_pContext->m_pCurrentState->object = s_pContext->m_curObject; while ((nRet = P_Statement()) == Ret_Continue); if (Token_K_class == token) { s_pContext->m_nClass--; } else if (Token_K_interface == token) { s_pContext->m_nInterface--; } return nRet; }
int GetMemberObject(LubeToken token, PSTATEDESC pDesc) { if (IsObjectToken(token)) { pDesc->object = GetObjectType(token); if (Object_None == pDesc->object) { pDesc->object = s_pContext->m_curObject; } if (Object_LubeOption == pDesc->object) { pDesc->member = Member_Name; return Ret_Continue; } if (Object_CompilingEnv== pDesc->object) { pDesc->member = Member_Name; return Ret_Continue; } if (Object_InuptType== pDesc->object) { pDesc->member = Member_Name; return Ret_Continue; } if (_PeekToken() != Token_S_dot) return Ret_Continue; _GetToken(); // skip s_dot token = _GetToken(); } else { pDesc->object = s_pContext->m_curObject; } if (IsMemberToken(token)) { pDesc->member = GetMemberType(pDesc->object, token); } else { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); } return Ret_Continue; }
// TEMPLATE -> k_template string // int P_Template() { int nRet; PSTATEDESC pDesc; ObjectType object; pDesc = s_pContext->CreateStatement(State_Template); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } if (_GetToken() != Token_string) { ErrorReport(Lube_E_ExpectSymbol, "template name"); return Ret_AbortOnError; } nRet = FindTemplate(s_pContext->m_pLube, g_szCurrentToken); if (nRet < 0) { nRet = DoCompiling(g_szCurrentToken); } if (nRet >= 0) { pDesc->dwExtra = nRet; object = s_pContext->m_pLube->ppTemplates[nRet]->tRoot.object; if (Object_Class == object) { if (s_pContext->m_nClass > 0) { pDesc->object = Object_Class; } else { ErrorReport(Lube_E_NoValidObject, "class"); } } else if (Object_Interface == object) { if (s_pContext->m_nInterface > 0) { pDesc->object = Object_Interface; } else { ErrorReport(Lube_E_NoValidObject, "interface"); } } } s_pContext->LeaveStatement(); return Ret_Continue; }
// IF -> k_if CONDITION { < k_and | k_or > CONDITION } { STATEMENT } // [ k_else { STATEMENT } ] k_end k_if // int P_If() { BOOL bElse = FALSE; int nRet; LubeToken token; PSTATEDESC pDesc, pNextDesc; pDesc = s_pContext->CreateStatement(State_If); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } pDesc = s_pContext->CreateBlockette(State_Condition); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } nRet = P_Condition(pDesc); if (nRet != Ret_Continue) return nRet; token = _PeekToken(); while (Token_K_and == token || Token_K_or == token) { token = _GetToken(); // skip k_and or k_or pNextDesc = s_pContext->CreateBlockette(State_Condition); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } nRet = P_Condition(pNextDesc); if (nRet != Ret_Continue) return nRet; pDesc->dwCondition |= (Token_K_and == token ? Condition_And:Condition_Or); pDesc = pNextDesc; token = _PeekToken(); } while (token != Token_K_end) { if (Token_K_else == token) { if (bElse) { ErrorReport(Lube_E_MultiElse); } else { pDesc = s_pContext->CreateBlockette(State_Else); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory); return Ret_AbortOnError; } bElse = TRUE; } _GetToken(); // skip k_else } else { nRet = P_Statement(); if (Ret_EndOfFile == nRet) { ErrorReport(Lube_E_UnexpectEOF); return Ret_AbortOnError; } if (Ret_Continue != nRet) return nRet; } token = _PeekToken(); } _GetToken(); // skip k_end if (_GetToken() != Token_K_if) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); } s_pContext->LeaveStatement(); // leave if statement return Ret_Continue; }
// CONDITION -> OBJCOND | MEMCOND | FUNCOND // MEMCOND -> MEMBER k_is [ k_not ] string // OBJCOND -> OBJECT k_is [ k_not ] < k_first | k_last > // FUNCOND -> FUNC k_is [ k_not ] < k_true | k_false > // int P_Condition(PSTATEDESC pDesc) { LubeToken token; int nRet; token = _GetToken(); if (Token_ident == token) { nRet = P_Func(g_szCurrentToken, pDesc); if (Ret_Continue != nRet) return nRet; pDesc->dwCondition |= Condition_Function; } else { nRet = GetMemberObject(token, pDesc); if (Ret_Continue != nRet) return nRet; } if (Token_K_is != _GetToken()) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); return Ret_AbortOnError; } token = _GetToken(); if (Token_K_not == token) { pDesc->dwCondition |= Condition_Not; token = _GetToken(); } if (Condition_Function & pDesc->dwCondition) { switch (token) { case Token_K_true: pDesc->dwCondition |= Condition_True; break; case Token_K_false: pDesc->dwCondition |= Condition_False; break; default: ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); case Token_error: return Ret_AbortOnError; } return Ret_Continue; } else if (Member_None == pDesc->member) { switch (token) { case Token_K_first: pDesc->dwCondition |= Condition_First; break; case Token_K_last: pDesc->dwCondition |= Condition_Last; break; default: ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); case Token_error: return Ret_AbortOnError; } if (Object_Module == pDesc->object || Object_Parent == pDesc->object) { ErrorReport(Lube_E_HasNoOrder); } return Ret_Continue; } else if (Token_string != token) { if (Token_error != token) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); } return Ret_AbortOnError; } return CheckMemberCondition(pDesc, g_szCurrentToken); }
// WITH -> k_with [ k_all | k_first | k_last ] // OBJECT k_do { STATEMENT } k_end k_do // int P_With() { StatementType type; LubeToken token; PSTATEDESC pDesc; ObjectType origObject = Object_None; DWORD dwCondition = 0; int nRet; token = _GetToken(); if (Token_K_all == token) { type = State_WithAll; token = _GetToken(); } else { if (Token_K_first == token) { dwCondition = Condition_First; token = _GetToken(); } else if (Token_K_last == token) { dwCondition = Condition_Last; token = _GetToken(); } type = State_With; } pDesc = s_pContext->CreateStatement(type); if (!pDesc) { ErrorReport(Lube_E_OutOfMemory, g_szCurrentToken); return Ret_AbortOnError; } pDesc->dwCondition = dwCondition; if (type == State_WithAll || 0 != dwCondition) { pDesc->object = GetConditionObjectType(token); } else { pDesc->object = GetObjectType(token); } if (Object_None != pDesc->object) { origObject = s_pContext->EnterObject(pDesc->object); } if (_GetToken() != Token_K_do) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); return Ret_AbortOnError; } while (_PeekToken() != Token_K_end) { nRet = P_Statement(); if (Ret_EndOfFile == nRet) { ErrorReport(Lube_E_UnexpectEOF); return Ret_AbortOnError; } if (Ret_Continue != nRet) return nRet; } _GetToken(); // skip k_end if (_GetToken() != Token_K_do) { ErrorReport(Lube_E_UnexpectSymbol, g_szCurrentToken); } s_pContext->LeaveStatement(); // leave with statement if (pDesc->object != Object_None) { s_pContext->LeaveObject(origObject); } return Ret_Continue; }
status_t CDDBQuery::_ReadFromServer(BString &data) { // This function queries the given CDDB server for the existence of the disc's data and // saves the data to file once obtained. // Query for the existence of the disc in the database char idString[10]; sprintf(idString, "%08lx", fCDData.DiscID()); BString query; int32 trackCount = GetTrackCount(&fSCSIData); BString offsetString = OffsetsToString(&fSCSIData); int32 discLength = (fCDData.DiscTime()->GetMinutes() * 60) + fCDData.DiscTime()->GetSeconds(); query << "cddb query " << idString << ' ' << trackCount << ' ' << offsetString << ' ' << discLength << '\n'; STRACE((">%s", query.String())); if (fSocket.Send(query.String(), query.Length()) == -1) { _Disconnect(); return B_ERROR; } BString tmp; _ReadLine(tmp); STRACE(("<%s", tmp.String())); BString category; BString queryDiscID(idString); if (tmp.FindFirst("200") != 0) { if (tmp.FindFirst("211") == 0) { // A 211 means that the query was not exact. To make sure that we don't // have a problem with this in the future, we will choose the first entry that // the server returns. This may or may not be wise, but in my experience, the first // one has been the right one. _ReadLine(tmp); // Get the category from the what the server returned _GetToken(tmp.String(), category); // Now we will get the disc ID for the CD. We will need this when we query for // the track name list. If we send the track name query with the real discID, nothing // will be returned. However, if we send the one from the entry, we'll get the names // and we can take these names attach them to the disc that we have. _GetToken(tmp.String() + category.CountChars(), queryDiscID); // This is to suck up any more search results that the server sends us. BString throwaway; _ReadLine(throwaway); while (throwaway.ByteAt(0) != '.') _ReadLine(throwaway); } else { // We get here for any time the CDDB server does not recognize the CD, amongst other things STRACE(("CDDB lookup error: %s\n", tmp.String())); fCDData.SetGenre("misc"); return B_NAME_NOT_FOUND; } } else { _GetToken(tmp.String() + 3, category); } STRACE(("CDDBQuery::_ReadFromServer: Genre: %s\n", category.String())); if (!category.Length()) { STRACE(("Set genre to 'misc'\n")); category = "misc"; } // Query for the disc's data - artist, album, tracks, etc. query = ""; query << "cddb read " << category << ' ' << queryDiscID << '\n' ; if (fSocket.Send(query.String(), query.Length()) == -1) { _Disconnect(); return B_ERROR; } while (true) { _ReadLine(tmp); if (tmp == "." || tmp == ".\n") break; data << tmp << '\n'; } return B_OK; }
void ZSimpleParser::_GetFormerNOther(FILE* fp, LPSTR lpszFormer, LPSTR lpszOther) { _GetToken(fp, lpszFormer); _GetToken(fp, lpszOther); }