From b10f3cdf9422140fbb73b849ad714f060cb5299d Mon Sep 17 00:00:00 2001 From: Makise Kurisu Date: Mon, 19 Jan 2015 16:17:36 +0100 Subject: [PATCH] Very basic and crude error forwarding works --- vcom/main.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++------ vcom/vcom.pro | 1 + 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/vcom/main.cpp b/vcom/main.cpp index 85744c2..c9f09b2 100644 --- a/vcom/main.cpp +++ b/vcom/main.cpp @@ -1,6 +1,11 @@ #include #include #include +#include +#include +//#include + +//#define DEBUG_EN DEBUG_EN /* * @@ -49,8 +54,12 @@ int main(int argc, char **argv) string work = ""; // Current library string vhdl = ""; // Input VHDL files char tempdir[256] = ""; // Compile dir + string args; - getcwd(tempdir, sizeof(tempdir)); + if (!getcwd(tempdir, sizeof(tempdir))) { + cerr << "Error getting current working dir!" << endl; + return 1; + } for (i=1; i < argc; ++i) { if (ISOPT("-work")) { @@ -79,18 +88,59 @@ int main(int argc, char **argv) vhdl.append(" "); } - - cout << "\n\nVHDL SOURCE DETECTED:" << endl; +#ifdef DEBUG_EN + cout << "\n\nVCOM CALL PARSED:" << endl; cout << "\twork=" << work << endl; cout << "\tvhdl=" << vhdl << endl; cout << "\ttempdir=" << tempdir << endl; +#endif - cout << "\n\nCALLING GHDL for syntax checking:" << endl; + if (work == "" || vhdl == "" || string(tempdir) == "") { + cerr << "Error: Incomplete/Unsupported vcom call." << endl; + return 2; + } + args = "ghdl -s --ieee=synopsys --warn-no-vital-generic --workdir=" + string(tempdir) + " --work=" + work + " " + vhdl + " 2>&1"; - string args; - args = "ghdl -s --ieee=synopsys --warn-no-vital-generic --workdir=" + string(tempdir) + " --work=" + work + " " + vhdl; - cout << "\t" << args << endl; + // Launch GHDL + FILE *proc; + char buf[512]; + vector < string > result; + + proc = popen(args.c_str(), "r"); + + if (proc == NULL) { + cerr << "Error: Could not invoke GHDL." << endl; + return 1; + } + + while(fgets(buf, sizeof(buf), proc)!=NULL){ + //cout << buf; + string temp = ""; + char *ptr = buf; + + result.clear(); + + while (*ptr != '\0') { + if (*ptr == ':' || *ptr == '\0') { + result.push_back(temp); + temp = ""; + } + else { + temp.append(" "); + temp[temp.length()-1] = *ptr; + } + ptr++; + } + result.push_back(temp); + + // Regex extract! (Edit: Leave regex for later :D) + // target=** Error: /home/markus/workspaceSigasi/blink/src/top.vhd(32): (vcom-1136) Unknown identifier "counter_i2". + // source=/home/markus/workspaceSigasi/blink/src/top.vhd:32:19: no declaration for "counter_i2" + cout << "** Error: " << result[0] << "(" << result[1] << "):" << result[3]; + } + + pclose(proc); return 0; } diff --git a/vcom/vcom.pro b/vcom/vcom.pro index c3348d2..c4a1a92 100644 --- a/vcom/vcom.pro +++ b/vcom/vcom.pro @@ -5,3 +5,4 @@ CONFIG -= qt SOURCES += main.cpp +#QMAKE_CXXFLAGS += -std=c++11