* Pre-process the xml text to remove all embedded comments
  * LOG_ERROR all occurrences of mangled xml tags in the file
    - <TAG> ... no </TAG>
    - Tag not a member of the parent tag set
    - Unknown tag
    - Mismatched tags, <TAG>...</ATAG>; probably a typing error
      or not using an xml editor to prepare the file.
pull/1/head
David Freese 2013-08-08 13:35:46 -05:00
rodzic 2cb46f4078
commit 9ea6687fdb
3 zmienionych plików z 108 dodań i 59 usunięć

Wyświetl plik

@ -3587,7 +3587,7 @@ Fl_Button *btnInitHAMLIB=(Fl_Button *)0;
static void cb_btnInitHAMLIB(Fl_Button* o, void*) {
progdefaults.initInterface();
o->labelcolor(FL_FOREGROUND_COLOR);
btnRevertHAMLIB->deactivate();
//btnRevertHAMLIB->activate();
progdefaults.changed = true;
}
@ -7865,7 +7865,7 @@ le Earth)"));
} // Fl_Tabs* tabsModems
tabModems->end();
} // Fl_Group* tabModems
{ tabRig = new Fl_Group(0, 25, 540, 340, _("Rig"));
{ tabRig = new Fl_Group(0, 23, 540, 345, _("Rig"));
tabRig->tooltip(_("Transceiver control"));
tabRig->hide();
{ tabsRig = new Fl_Tabs(0, 23, 540, 345);
@ -7956,7 +7956,7 @@ le Earth)"));
} // Fl_Group* grpPTTdelays
o->end();
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(0, 50, 540, 320, _("RigCAT"));
{ Fl_Group* o = new Fl_Group(0, 48, 540, 320, _("RigCAT"));
o->tooltip(_("Rig Control using xml spec file"));
o->hide();
{ chkUSERIGCAT = new Fl_Check_Button(215, 60, 110, 20, _("Use RigCAT"));
@ -8111,8 +8111,9 @@ le Earth)"));
o->value(progdefaults.RigCatRestoreTIO);
} // Fl_Check_Button* chk_restore_tio
{ btnRevertRIGCAT = new Fl_Button(385, 289, 113, 24, _("Revert"));
btnRevertRIGCAT->tooltip(_("Initialize hamlib interface"));
btnRevertRIGCAT->tooltip(_("Reset rigCAT interface"));
btnRevertRIGCAT->callback((Fl_Callback*)cb_btnRevertRIGCAT);
btnRevertRIGCAT->hide();
btnRevertRIGCAT->deactivate();
} // Fl_Button* btnRevertRIGCAT
{ Fl_Check_Button* o = chkRigCatVSP = new Fl_Check_Button(276, 300, 100, 25, _("VSP Enable"));
@ -8326,8 +8327,9 @@ le Earth)"));
o->value(progdefaults.HamlibXONXOFFflow);
} // Fl_Check_Button* chkHamlibXONXOFFflow
{ btnRevertHAMLIB = new Fl_Button(383, 289, 113, 24, _("Revert"));
btnRevertHAMLIB->tooltip(_("Initialize hamlib interface"));
btnRevertHAMLIB->tooltip(_("Reset hamlib interface"));
btnRevertHAMLIB->callback((Fl_Callback*)cb_btnRevertHAMLIB);
btnRevertHAMLIB->hide();
btnRevertHAMLIB->deactivate();
} // Fl_Button* btnRevertHAMLIB
grpHamlib->end();

Wyświetl plik

@ -3916,8 +3916,8 @@ progdefaults.changed = true;}
}
}
Fl_Group tabRig {
label Rig
tooltip {Transceiver control} xywh {0 25 540 340} hide
label Rig open
tooltip {Transceiver control} xywh {0 23 540 345} hide
} {
Fl_Tabs tabsRig {open
xywh {0 23 540 345} selection_color 50
@ -4060,8 +4060,8 @@ progdefaults.changed = true;}
}
}
Fl_Group {} {
label RigCAT
tooltip {Rig Control using xml spec file} xywh {0 50 540 320} hide
label RigCAT open
tooltip {Rig Control using xml spec file} xywh {0 48 540 320} hide
} {
Fl_Check_Button chkUSERIGCAT {
label {Use RigCAT}
@ -4244,7 +4244,7 @@ btnRevertRIGCAT->activate();}
callback {btnInitRIGCAT->labelcolor(FL_FOREGROUND_COLOR);
btnInitRIGCAT->redraw_label();
rigCAT_restore_defaults();}
tooltip {Initialize hamlib interface} xywh {385 289 113 24} deactivate
tooltip {Reset rigCAT interface} xywh {385 289 113 24} hide deactivate
code0 {\#include "rigio.h"}
}
Fl_Check_Button chkRigCatVSP {
@ -4385,7 +4385,7 @@ in format: param=val ...} xywh {32 321 320 22} align 5
label Initialize
callback {progdefaults.initInterface();
o->labelcolor(FL_FOREGROUND_COLOR);
btnRevertHAMLIB->deactivate();
//btnRevertHAMLIB->activate();
progdefaults.changed = true;}
tooltip {Initialize hamlib interface} xywh {383 320 113 24}
}
@ -4454,7 +4454,7 @@ btnInitHAMLIB->redraw_label();
\#if USE_HAMLIB
hamlib_restore_defaults();
\#endif}
tooltip {Initialize hamlib interface} xywh {383 289 113 24} deactivate
tooltip {Reset hamlib interface} xywh {383 289 113 24} hide deactivate
}
}
}

Wyświetl plik

@ -43,9 +43,11 @@
#include "fileselect.h"
#include "confdialog.h"
#include "icons.h"
using namespace std;
//#define DEBUGXML
//#define DEBUGXML 1
void parseRIGDEF(size_t &);
void parseRIG(size_t &);
@ -59,7 +61,6 @@ void parseMODECMD(size_t &);
void parseMODEREPLY(size_t &);
void parseTITLE(size_t &);
void parseLSBMODES(size_t &);
void parseCOMMENTS(size_t &);
void parseDISCARD(size_t &);
void parseWRITE_DELAY(size_t &);
@ -129,7 +130,6 @@ TAGS rigdeftags[] = {
{"<MODE-REPLY", parseMODEREPLY},
{"<TITLE", parseTITLE},
{"<LSBMODES", parseLSBMODES},
{"<!--", parseCOMMENTS},
{"<PROGRAMMER", parseDISCARD},
{"<STATUS", parseDISCARD},
{"<WRITE_DELAY", parseWRITE_DELAY},
@ -195,7 +195,7 @@ void print(size_t &p0, int indent)
#ifdef DEBUGXML
std::string istr(indent, '\t');
size_t tend = strXML.find(">", p0);
LOG_VERBOSE("%s%s", istr.c_str(), strXML.substr(p0, tend - p0 + 1).c_str());
LOG_INFO("%s%s", istr.c_str(), strXML.substr(p0, tend - p0 + 1).c_str());
#endif
}
@ -430,38 +430,50 @@ void parseBWdefs(size_t &p0, list<BW> &lbw)
string strELEMENT;
string stemp;
if (pend == string::npos) {
LOG_ERROR("Unmatched tag %s", strXML.substr(p0, 10).c_str());
p0++;
return;
}
print(p0,0);
p0 = nextTag(p0);
while (p0 != string::npos && p0 < pend && tagIs(p0, "<ELEMENT")) {
elend = tagEnd(p0);
p0 = nextTag(p0);
if (isSymbol(p0, strELEMENT)) {
p0 = tagEnd(p0);
p0 = nextTag(p0);
while (p0 != string::npos && p0 < elend) {
print(p0,1);
if ( isBytes(p0, stemp) ) {
size_t p1 = nextTag(p0);
while (p1 != string::npos && p1 < pend && tagIs(p1, "<ELEMENT")) {
elend = tagEnd(p1);
if (elend == string::npos || elend > pend) {
LOG_ERROR("Unmatched tag %s", "<ELEMENT");
p0 = pend;
return;
}
p1 = nextTag(p1);
if (isSymbol(p1, strELEMENT)) {
p1 = tagEnd(p1);
p1 = nextTag(p1);
while (p1 != string::npos && p1 < elend) {
print(p1,1);
if ( isBytes(p1, stemp) ) {
lbw.push_back(BW(strELEMENT,stemp));
p1 = tagEnd(p1);
}
else if ( isByte(p0, ch) ) {
else if ( isByte(p1, ch) ) {
stemp = ch;
lbw.push_back(BW(strELEMENT,stemp));
p1 = tagEnd(p1);
}
else if ( isInt(p0, n) ) {
else if ( isInt(p1, n) ) {
stemp = (char)(n & 0xFF);
lbw.push_back(BW(strELEMENT, stemp));
p1 = tagEnd(p1);
}
else if ( isString(p0, stemp) ) {
else if ( isString(p1, stemp) ) {
lbw.push_back(BW(strELEMENT,stemp));
p1 = tagEnd(p1);
} else {
LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str());
parseDISCARD(p1);
}
p0 = tagEnd(p0);
p0 = nextTag(p0);
p1 = nextTag(p1);
}
}
p0 = nextTag(p0);
p1 = nextTag(p1);
}
p0 = pend;
}
@ -711,15 +723,18 @@ void parseIOSdata(size_t &p0)
while (p1 < pend) {
pv = datatags;
while (pv->tag) {
if (strXML.find(pv->tag, p1) == p1) {
print(p1, 1);
if (pv->fp)
(pv->fp)(p1);
if (strXML.find(pv->tag, p1) == p1)
break;
}
pv++;
}
p1 = tagEnd(p1);
if (pv->fp) {
print(p1, 1);
(pv->fp)(p1);
p1 = tagEnd(p1);
} else {
LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str());
parseDISCARD(p1);
}
p1 = nextTag(p1);
}
}
@ -775,17 +790,19 @@ bool parseIOS(size_t &p0, TAGS *valid)
while (p1 < pend) {
pv = valid;
while (pv->tag) {
if (strXML.find(pv->tag, p1) == p1) {
print(p1, 1);
if (pv->fp)
(pv->fp)(p1);
if (strXML.find(pv->tag, p1) == p1)
break;
}
pv++;
}
p1 = tagEnd(p1);
if (pv->fp) {
print(p1, 1);
(pv->fp)(p1);
p1 = tagEnd(p1);
} else {
LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str());
parseDISCARD(p1);
}
p1 = nextTag(p1);
// if (pv->tag == 0) p1 = pend;
}
p0 = pend;
return (!iosTemp.SYMBOL.empty());
@ -803,14 +820,12 @@ void parseREPLY(size_t &p0)
reply.push_back(iosTemp);
}
void parseCOMMENTS(size_t &p0)
{
p0 = strXML.find("-->",p0);
}
void parseRIGDEF(size_t &p0)
{
p0 = nextTag(p0);
print(p0,0);
size_t p1 = tagEnd(p0);
if (p1 != string::npos)
strXML.erase(p1);
}
void parseDISCARD(size_t &p0)
@ -822,10 +837,10 @@ void parseDISCARD(size_t &p0)
void parseXML()
{
size_t p0;
p0 = 0;
p0 = nextTag(p0);
TAGS *pValid;
size_t p0 = 0;
TAGS *pValid = rigdeftags;
p0 = strXML.find("<");
while (p0 != string::npos) {
pValid = rigdeftags;
while (pValid->tag) {
@ -833,14 +848,44 @@ void parseXML()
break;
pValid++;
}
if (pValid->tag)
if (pValid->tag) {
(pValid->fp)(p0);
else
} else {
LOG_ERROR("Invalid tag: %s", strXML.substr(p0, 10).c_str());
parseDISCARD(p0);
}
p0 = nextTag(p0);
}
}
bool remove_comments()
{
size_t p0 = 0;
size_t p1 = 0;
// remove comments from xml text
while ((p0 = strXML.find("<!--")) != string::npos) {
p1 = strXML.find("-->", p0);
if (p1 == string::npos) {
fl_alert2("Corrupt rig XML defintion file\nMismatched comment tags!");
return false;
}
strXML.erase(p0, p1 - p0 + 3);
}
if (strXML.find("-->") != string::npos) {
fl_alert2("Corrupt rig XML defintion file\nMismatched comment tags!");
return false;
}
return true;
}
bool testXML()
{
if (!remove_comments()) return false;
return true;
}
bool readRigXML()
{
char szLine[256];
@ -866,8 +911,10 @@ bool readRigXML()
strXML.append(szLine);
}
xmlfile.close();
parseXML();
return true;
if (testXML()) {
parseXML();
return true;
}
}
return false;
}