1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#include "ACProject.h"
#include "Puma/SysCall.h"
#include <libxml/xpath.h>
ACProject::ACProject (ErrorStream &err, int &argc, char **&argv)
: CProject (err, argc, argv) {
}
void ACProject::addFiles (xmlDocPtr doc, xmlNodePtr node, const string& xpath) {
xmlXPathContextPtr m_Context = xmlXPathNewContext(doc);
xmlXPathCompExprPtr m_Expr = xmlXPathCompile((const xmlChar*)xpath.c_str());;
xmlXPathObjectPtr m_Result = 0;
if( m_Context != 0 && m_Expr != 0 ) {
m_Result = xmlXPathCompiledEval(m_Expr,m_Context);
if( m_Result != 0 && m_Result->nodesetval != 0 ) {
for( int i=0; i<m_Result->nodesetval->nodeNr; ++i ) {
xmlChar* path = xmlGetProp(m_Result->nodesetval->nodeTab[i],
(xmlChar*)"path");
xmlChar* relpath = xmlGetProp(m_Result->nodesetval->nodeTab[i],
(xmlChar*)"relpath");
if (path) {
string destname;
if (numPaths () && dest (0)) {
// make the destination path
destname = dest (0);
char last = destname[destname.length () - 1];
if (last != '/' && last != '\\')
destname += '/';
#ifdef WIN32
SysCall::MakeUnixPath ((char*)relpath);
#endif
destname += (const char*)relpath;
}
else
destname = "<unused-dest-name>";
// add the file to the project
PathManager::addFile ((const char*)path, destname.c_str ());
}
else {
assert (false);
}
if (path != 0) xmlFree(path);
if (relpath != 0) xmlFree(relpath);
}
xmlXPathFreeObject(m_Result);
}
}
if( m_Context ) xmlXPathFreeContext(m_Context);
if( m_Expr ) xmlXPathFreeCompExpr(m_Expr);
}
// Add a new file to the project.
Unit *ACProject::addFile (Filename file) {
return Project::addFile (file, "<unused-dest-name>");
}
bool ACProject::loadProject (string acprj) {
//std::cout << "try to find project" << std::endl;
if( acprj.empty() == false ) {
//std::cout << "proj file " << acprj << std::endl;
xmlDocPtr doc = xmlParseFile(acprj.c_str());
if( doc != 0 ) {
xmlNodePtr root = xmlDocGetRootElement(doc);
if( root != 0 ) {
addFiles(doc,root,"/project/source/file");
addFiles(doc,root,"/project/aspect/file[@active='true']");
return true;
}
}
}
return false;
}
|