Corrected compiler error
[rofl0r-motor.git] / src / project / projecttake.cc
blob9d178ff854d296b750faf2b069fe1a91a57db8f5
1 #include "projecttake.h"
2 #include "motormisc.h"
3 #include "motorproject.h"
5 projecttake::projecttake() {
8 projecttake::projecttake(const string &definition) {
9 regex_t r;
10 string buf, token;
11 regmatch_t rm[4];
12 bool rdone;
14 rdone = false;
15 token = getword(buf = definition);
16 if(token != "take") buf = definition;
18 if(!regcomp(&r, "^\"(.+)\" to (.+) from (.+)$", REG_EXTENDED)) {
19 if(rdone = !regexec(&r, buf.c_str(), 4, rm, 0)) kind = text;
20 regfree(&r);
23 if(!rdone && !regcomp(&r, "^(.+) to (.+) from (.+)$", REG_EXTENDED)) {
24 if(rdone = !regexec(&r, buf.c_str(), 4, rm, 0)) kind = folder;
25 regfree(&r);
28 if(!rdone || (rm[3].rm_so == -1)) throw (0);
30 placefrom = buf.substr(rm[1].rm_so, rm[1].rm_eo-rm[1].rm_so);
31 placeto = buf.substr(rm[2].rm_so, rm[2].rm_eo-rm[2].rm_so);
32 sourcetemplate = buf.substr(rm[3].rm_so, rm[3].rm_eo-rm[3].rm_so);
35 projecttake::~projecttake() {
38 void projecttake::exec(const string &pname) {
39 vector<motorfolder>::iterator ifold, ffold;
40 vector<motorfile>::iterator ifile;
41 motorproject mp;
42 string fname;
44 if(!(mp = motorproject(pname)).empty()) {
45 if(kind == text) {
47 if((ifold = find(project.foldbegin(), project.foldend(), placeto))
48 != project.foldend())
49 ifold->addfile(motorfile(getparsed(mp, placefrom)));
51 } else if(kind == folder) {
53 if((ifold = find(project.foldbegin(), project.foldend(), placeto)) != project.foldend())
54 if((ffold = find(mp.foldbegin(), mp.foldend(), placefrom)) != mp.foldend()) {
55 for(ifile = ffold->begin(); ifile != ffold->end(); ifile++) {
56 fname = mp.transformfname(projectpaths::absolute, ifile->getfname());
57 ifold->addfile(fname);
64 project.chdir();
67 void projecttake::undo(const string &pname) {
68 vector<motorfolder>::iterator ifold, ffold;
69 vector<motorfile>::iterator ifile, ef;
70 motorproject mp;
71 string fname;
73 if(!(mp = motorproject(pname)).empty()) {
74 if(kind == text) {
76 if((ifold = find(project.foldbegin(), project.foldend(), placeto)) != project.foldend())
77 if((ifile = find(ifold->begin(), ifold->end(), getparsed(mp, placefrom))) != ifold->end())
78 ifold->removefile(*ifile);
80 } else if(kind == folder) {
82 if((ifold = find(project.foldbegin(), project.foldend(), placeto)) != project.foldend())
83 if((ffold = find(mp.foldbegin(), mp.foldend(), placefrom)) != mp.foldend()) {
84 for(ifile = ffold->begin(); ifile != ffold->end(); ifile++)
85 if((ef = find(ifold->begin(), ifold->end(), ifile->getfname())) != ifold->end()) {
86 fname = mp.transformfname(projectpaths::absolute, ef->getfname());
87 ifold->removefile(fname);
94 project.chdir();
97 string projecttake::getsourcetemplate() {
98 return sourcetemplate;