kopia lustrzana https://github.com/jamescoxon/dl-fldigi
XML parser
* 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
rodzic
6fcf6bd00e
commit
bdbaf78c1e
|
@ -3484,7 +3484,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;
|
||||
}
|
||||
|
||||
|
@ -7831,8 +7831,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"));
|
||||
|
@ -8046,8 +8047,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();
|
||||
|
|
|
@ -3799,7 +3799,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
Fl_Group tabRig {
|
||||
label Rig
|
||||
label Rig open
|
||||
tooltip {Transceiver control} xywh {0 23 540 345} hide
|
||||
} {
|
||||
Fl_Tabs tabsRig {open
|
||||
|
@ -3943,7 +3943,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label RigCAT
|
||||
label RigCAT open
|
||||
tooltip {Rig Control using xml spec file} xywh {0 48 540 320} hide
|
||||
} {
|
||||
Fl_Check_Button chkUSERIGCAT {
|
||||
|
@ -4125,7 +4125,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 {
|
||||
|
@ -4264,7 +4264,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}
|
||||
}
|
||||
|
@ -4333,7 +4333,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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 &);
|
||||
|
@ -130,7 +131,6 @@ TAGS rigdeftags[] = {
|
|||
{"<MODE-REPLY", parseMODEREPLY},
|
||||
{"<TITLE", parseTITLE},
|
||||
{"<LSBMODES", parseLSBMODES},
|
||||
{"<!--", parseCOMMENTS},
|
||||
{"<PROGRAMMER", parseDISCARD},
|
||||
{"<STATUS", parseDISCARD},
|
||||
{"<WRITE_DELAY", parseWRITE_DELAY},
|
||||
|
@ -197,7 +197,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
|
||||
}
|
||||
|
||||
|
@ -433,38 +433,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;
|
||||
}
|
||||
|
@ -722,15 +734,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);
|
||||
}
|
||||
}
|
||||
|
@ -786,17 +801,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());
|
||||
|
@ -814,14 +831,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)
|
||||
|
@ -833,10 +848,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) {
|
||||
|
@ -844,14 +859,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];
|
||||
|
@ -877,8 +922,10 @@ bool readRigXML()
|
|||
strXML.append(szLine);
|
||||
}
|
||||
xmlfile.close();
|
||||
parseXML();
|
||||
return true;
|
||||
if (testXML()) {
|
||||
parseXML();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue