/* getnoun - get a noun phrase and return the object it refers to */ int getnoun() { /* initialize the adjective list pointer */ adjectives[nptr] = adjs + aptr; /* get the optional article */ if (*wptr != NIL && wtype(*wptr) == WT_ARTICLE) wptr++; /* get optional adjectives */ while (*wptr != NIL && wtype(*wptr) == WT_ADJECTIVE) { adjs[aptr] = *wptr++; anums[aptr] = wptr - words - 1; aptr++; } adjs[aptr++] = NULL; /* get the noun itself */ if (*wptr == NIL || wtype(*wptr) != WT_NOUN) { parse_error(); return (NIL); } /* save the noun */ nouns[nptr] = *wptr++; nnums[nptr] = wptr - words - 1; return (++nptr); }
/* getverb - get a verb phrase and return the action it refers to */ int getverb() { /* get the verb */ if (*wptr == NIL || wtype(*wptr) != WT_VERB) { parse_error(); return (NIL); } verbs[0] = *wptr++; verbs[1] = NIL; /* check for a word following the verb */ if (*wptr) { verbs[1] = *wptr; verbs[2] = NIL; if (checkverb(verbs)) wptr++; else { verbs[1] = words[wcnt-1]; if (checkverb(verbs)) words[--wcnt] = NIL; else { verbs[1] = NIL; if (!checkverb(verbs)) { parse_error(); return (NIL); } } } } return (T); }
bool ManagerApp::CheckManagerDB() { int version_groups = DB_MANAGER_VERSION_GROUPS; int version_packages = DB_MANAGER_VERSION_PACKAGES; int version_authorlist = DB_MANAGER_VERSION_AUTHORLIST; int version_packagelist = DB_MANAGER_VERSION_PACKAGELIST; int version_packagelist_authors = DB_MANAGER_VERSION_PACKAGELIST_AUTHORS; int version_packagelist_warnings = DB_MANAGER_VERSION_PACKAGELIST_WARNINGS; wxSQLite3StatementBuffer temp; m_managerdb.Open(m_appdir.GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME) + wxT("manager.db")); if (!m_managerdb.TableExists(wxT("versions"))) { m_managerdb.ExecuteUpdate(wxT("create table versions(tablename char[30], version int);")); temp.Format("insert into versions values ('groups', %d);", version_groups); m_managerdb.ExecuteUpdate(temp); temp.Format("insert into versions values ('packages', %d);", version_packages); m_managerdb.ExecuteUpdate(temp); temp.Format("insert into versions values ('authorlist', %d);", version_authorlist); m_managerdb.ExecuteUpdate(temp); temp.Format("insert into versions values ('packagelist', %d);", version_packagelist); m_managerdb.ExecuteUpdate(temp); temp.Format("insert into versions values ('packagelist_authors', %d);", version_packagelist_authors); m_managerdb.ExecuteUpdate(temp); temp.Format("insert into versions values ('packagelist_warnings', %d);", version_packagelist_warnings); m_managerdb.ExecuteUpdate(temp); } else { version_groups = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'groups';")); version_packages = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'packages';")); version_authorlist = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'authorlist';")); version_packagelist = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'packagelist';")); version_packagelist_authors = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'packagelist_authors';")); version_packagelist_warnings = m_managerdb.ExecuteScalar(wxT("select version from versions where tablename = 'packagelist_warnings';")); } if ((version_groups > DB_MANAGER_VERSION_GROUPS) || (version_packages > DB_MANAGER_VERSION_PACKAGES) || (version_authorlist > DB_MANAGER_VERSION_AUTHORLIST) || (version_packagelist > DB_MANAGER_VERSION_PACKAGELIST) || (version_packagelist_authors > DB_MANAGER_VERSION_PACKAGELIST_AUTHORS) || (version_packagelist_warnings > DB_MANAGER_VERSION_PACKAGELIST_WARNINGS)) { wxLogError(_("Manager database modified by a newer version of this application.")); return false; } if (!m_managerdb.TableExists(wxT("groups"))) { m_managerdb.ExecuteUpdate(wxT("create table groups(name text, guid text);")); } if (!m_managerdb.TableExists(wxT("packages"))) { m_managerdb.ExecuteUpdate(wxT("create table packages(name text, guid text, file text, version text);")); } if (!m_managerdb.TableExists(wxT("authorlist"))) { m_managerdb.ExecuteUpdate(wxT("create table authorlist(name text, guid text, official int);")); wxFileSystem fs; m_managerdb.Begin(); try { xmlcpp::cXmlDoc xdoc(wxString(MEMORY_PREFIX RES_XML_AUTHORS).mb_str(wxConvUTF8), NULL); if (xdoc.ok()) { xmlcpp::cXmlNode child(xdoc.getRoot().children()); while (child.ok()) { if (child.name() == "author") { wxString name(child.getPropVal("name").c_str(), wxConvUTF8); name.Trim(); name.Trim(true); wxString guid(child.getPropVal("guid").c_str(), wxConvUTF8); guid.Trim(); guid.Trim(true); if (name.IsEmpty() || guid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in author list xml.")); return false; } temp.Format("insert into authorlist values ('%q', '%q', 1);", name.mb_str(wxConvUTF8).data(), guid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); } child.go_next(); } } } catch (std::exception& e) { wxLogError(wxString(e.what(), wxConvUTF8)); } /* std::auto_ptr<wxFSFile> inputfsfile(fs.OpenFile(MEMORY_PREFIX RES_XML_AUTHORS, wxFS_READ)); wxXmlDocument doc(*inputfsfile->GetStream()); wxXmlNode* child = doc.GetRoot()->GetChildren(); while (child) { if (child->GetName() == wxT("author")) { wxString name = child->GetPropVal(wxT("name"), wxT("")); name.Trim(); name.Trim(true); wxString guid = child->GetPropVal(wxT("guid"), wxT("")); guid.Trim(); guid.Trim(true); if (name.IsEmpty() || guid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in author list xml.")); return false; } temp.Format("insert into authorlist values ('%q', '%q', 1);", name.mb_str(wxConvUTF8).data(), guid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); } child = child->GetNext(); } */ m_managerdb.Commit(); } if (!m_managerdb.TableExists(wxT("packagelist"))) { m_managerdb.ExecuteUpdate(wxT("create table packagelist(name text, shortname text, guid text, version text, official int);")); } if (!m_managerdb.TableExists(wxT("packagelist_authors"))) { m_managerdb.ExecuteUpdate(wxT("create table packagelist_authors(guid text, authorguid text);")); } if (!m_managerdb.TableExists(wxT("packagelist_warnings"))) { m_managerdb.ExecuteUpdate(wxT("create table packagelist_warnings(guid text, type int, descrition text);")); } if (!m_managerdb.ExecuteScalar(wxT("select count(*) from packagelist;"))) { wxFileSystem fs; m_managerdb.Begin(); try { xmlcpp::cXmlDoc xdoc(wxString(MEMORY_PREFIX RES_XML_PACKAGES).mb_str(wxConvUTF8), NULL); if (xdoc.ok()) { xmlcpp::cXmlNode child(xdoc.getRoot().children()); while (child.ok()) { if (child.name() == "package") { wxString name(child.getPropVal("name").c_str(), wxConvUTF8); name.Trim(); name.Trim(true); wxString shortname(child.getPropVal("shortname").c_str(), wxConvUTF8); shortname.Trim(); shortname.Trim(true); wxString guid(child.getPropVal("guid").c_str(), wxConvUTF8); guid.Trim(); guid.Trim(true); wxString version(child.getPropVal("version").c_str(), wxConvUTF8); version.Trim(); version.Trim(true); if (name.IsEmpty() || guid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (name and/or guid missing).")); return false; } temp.Format("insert into packagelist values ('%q', '%q', '%q', '%q', 1);", name.mb_str(wxConvUTF8).data(), shortname.mb_str(wxConvUTF8).data(), guid.mb_str(wxConvUTF8).data(), version.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); bool haveauthor = false; if (child.hasProp("authorguid")) { wxString authorguid(child.getPropVal("authorguid").c_str(), wxConvUTF8); authorguid.Trim(); authorguid.Trim(true); if (authorguid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (authorguid empty).")); return false; } temp.Format("insert into packagelist_authors values ('%q', '%q');", guid.mb_str(wxConvUTF8).data(), authorguid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); haveauthor = true; } xmlcpp::cXmlNode subchild(child.children()); while(subchild.ok()) { if (subchild.name() == "author") { wxString authorguid(subchild.getPropVal("guid").c_str(), wxConvUTF8); authorguid.Trim(); authorguid.Trim(true); if (authorguid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (author[guid] empty).")); return false; } temp.Format("insert into packagelist_authors values ('%q', '%q');", guid.mb_str(wxConvUTF8).data(), authorguid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); haveauthor = true; } else if (subchild.name() == "warning") { wxString wtype(subchild.getPropVal("type").c_str(), wxConvUTF8); wtype.Trim(); wtype.Trim(true); if (wtype.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (warning[type] empty).")); return false; } wxString desc(subchild.content().c_str(), wxConvUTF8); desc.Trim(); desc.Trim(true); temp.Format("insert into packagelist_warnings values ('%q', '%q', '%q');", guid.mb_str(wxConvUTF8).data(), wtype.mb_str(wxConvUTF8).data(), desc.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); } subchild.go_next(); } if (!haveauthor) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (author missing).")); return false; } } child.go_next(); } } else { wxLogError(_("Failed to open package list xml.")); for (std::vector<xmlcpp::cXmlStructuredError>::const_iterator it = xdoc.getStructuredErrors().begin(); it != xdoc.getStructuredErrors().end(); ++it) wxLogError(wxString(it->message.c_str(), wxConvUTF8)); } } catch (std::exception& e) { wxLogError(wxString(e.what(), wxConvUTF8)); } /* std::auto_ptr<wxFSFile> inputfsfile(fs.OpenFile(MEMORY_PREFIX RES_XML_PACKAGES, wxFS_READ)); wxXmlDocument doc(*inputfsfile->GetStream()); wxXmlNode* child = doc.GetRoot()->GetChildren(); while (child) { if (child->GetName() == wxT("package")) { wxString name = child->GetPropVal(wxT("name"), wxT("")); name.Trim(); name.Trim(true); wxString shortname = child->GetPropVal(wxT("shortname"), wxT("")); shortname.Trim(); shortname.Trim(true); wxString guid = child->GetPropVal(wxT("guid"), wxT("")); guid.Trim(); guid.Trim(true); wxString version = child->GetPropVal(wxT("version"), wxT("0")); version.Trim(); version.Trim(true); if (name.IsEmpty() || guid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (name and/or guid missing).")); return false; } temp.Format("insert into packagelist values ('%q', '%q', '%q', '%q', 1);", name.mb_str(wxConvUTF8).data(), shortname.mb_str(wxConvUTF8).data(), guid.mb_str(wxConvUTF8).data(), version.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); bool haveauthor = false; if (child->HasProp(wxT("authorguid"))) { wxString authorguid = child->GetPropVal(wxT("authorguid"), wxT("")); authorguid.Trim(); authorguid.Trim(true); if (authorguid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (authorguid empty).")); return false; } temp.Format("insert into packagelist_authors values ('%q', '%q');", guid.mb_str(wxConvUTF8).data(), authorguid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); haveauthor = true; } wxXmlNode* subchild = child->GetChildren(); while(subchild) { if (subchild->GetName() == wxT("author")) { wxString authorguid = subchild->GetPropVal(wxT("guid"), wxT("")); authorguid.Trim(); authorguid.Trim(true); if (authorguid.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (author[guid] empty).")); return false; } temp.Format("insert into packagelist_authors values ('%q', '%q');", guid.mb_str(wxConvUTF8).data(), authorguid.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); haveauthor = true; } else if (subchild->GetName() == wxT("warning")) { wxString wtype = subchild->GetPropVal(wxT("type"), wxT("")); wtype.Trim(); wtype.Trim(true); if (wtype.IsEmpty()) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (warning[type] empty).")); return false; } wxString desc = subchild->GetNodeContent(); desc.Trim(); desc.Trim(true); temp.Format("insert into packagelist_warnings values ('%q', '%q', '%q');", guid.mb_str(wxConvUTF8).data(), wtype.mb_str(wxConvUTF8).data(), desc.mb_str(wxConvUTF8).data()); m_managerdb.ExecuteUpdate(temp); } subchild = subchild->GetNext(); } if (!haveauthor) { m_managerdb.Rollback(); wxLogError(_("Error in package list xml (author missing).")); return false; } } child = child->GetNext(); } */ m_managerdb.Commit(); } return true; }
/* parse1 - the main parser */ int parse1() { int noun1,cnt1,noun2,cnt2; int preposition,flag; /* initialize */ noun1 = noun2 = NIL; cnt1 = cnt2 = 0; nptr = aptr = 0; preposition = 0; flag = 0; /* initialize the parser result variables */ actor = action = dobject = iobject = NIL; ndobjects = 0; /* get an input line */ if (!get_line()) return (FALSE); /* check for actor */ if (wtype(*wptr) == WT_ADJECTIVE || wtype(*wptr) == WT_NOUN) { if ((actor = getnoun()) == NIL) return (FALSE); flag |= A_ACTOR; } /* get verb phrase */ if (!getverb()) return (FALSE); /* direct object, preposition and indirect object */ if (*wptr) { /* get the first set of noun phrases (direct objects) */ noun1 = nptr+1; for (;;) { /* get the next direct object */ if (getnoun() == NIL) return (FALSE); ++cnt1; /* check for more direct objects */ if (*wptr == NIL || wtype(*wptr) != WT_CONJUNCTION) break; wptr++; } /* get the preposition and indirect object */ if (*wptr) { /* get the preposition */ if (wtype(*wptr) == WT_PREPOSITION) preposition = *wptr++; /* get the second set of noun phrases (indirect object) */ noun2 = nptr+1; for (;;) { /* get the next direct object */ if (getnoun() == NIL) return (FALSE); ++cnt2; /* check for more direct objects */ if (*wptr == NIL || wtype(*wptr) != WT_CONJUNCTION) break; wptr++; } } /* make sure this is the end of the sentence */ if (*wptr) { parse_error(); return (FALSE); } } /* setup the direct and indirect objects */ if (preposition) { if (cnt2 > 1) { parse_error(); return (FALSE); } dobject = noun1; ndobjects = cnt1; iobject = noun2; } else if (noun2) { if (cnt1 > 1) { parse_error(); return (FALSE); } preposition = findword("to"); dobject = noun2; ndobjects = cnt2; iobject = noun1; } else { dobject = noun1; ndobjects = cnt1; } /* setup the flags for the action lookup */ if (dobject) flag |= A_DOBJECT; if (iobject) flag |= A_IOBJECT; /* find the action */ if ((action = findaction(verbs,preposition,flag)) == NIL) { parse_error(); return (FALSE); } /* return successfully */ return (TRUE); }