/*****************************************************************************
- ** FILE IDENTIFICATION
- **
- ** EZSET - Parameter control for EZPLOT
- **
- ** This is part of the CTSim program
- ** Copyright (C) 1983-2000 Kevin Rosenberg
- **
- ** $Id: ezset.cpp,v 1.8 2000/12/06 01:46:43 kevin Exp $
- **
- ** This program is free software; you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License (version 2) as
- ** published by the Free Software Foundation.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program; if not, write to the Free Software
- ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- ******************************************************************************/
+** FILE IDENTIFICATION
+**
+** EZSET - Parameter control for EZPLOT
+**
+** This is part of the CTSim program
+** Copyright (c) 1983-2009 Kevin Rosenberg
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License (version 2) as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+******************************************************************************/
#include "ctsupport.h"
#include "ezplot.h"
#include "pol.h"
-bool EZPlot::ezset_initialized = false;
-int
-EZPlot::ezset (char *command)
+bool
+EZPlot::ezset (const std::string& command)
{
- if (! ezset_initialized) {
- pol_init();
- initkw();
- pol_skpword ("please");
- pol_skpword ("use");
- pol_skpword ("are");
- pol_skpword ("and");
- pol_skpword ("is");
- pol_skpword ("the");
- pol_skpword ("equals");
- pol_skpchar ("=");
+ return ezset (command.c_str());
+}
- pol_usefile (P_USE_STR,"");
- set_inputline ("!eoc ,");
- pol_reader ();
- pol_closefile ();
- ezset_initialized = true;
- }
- return (ezcmd (command));
+bool
+EZPlot::ezset (const char* const command)
+{
+
+ return ezcmd (command);
}
-bool
-EZPlot::ezcmd (char *comm)
+bool
+EZPlot::ezcmd (const char* const comm)
{
- pol_usefile (P_USE_STR, "");
- set_inputline (comm);
+ m_pol.usefile (POL::P_USE_STR, "");
+ m_pol.set_inputline (comm);
- char str[MAXTOK+1];
+ char str [POL::MAXTOK+1];
int code;
bool retval = true;
- if (! pol_usertok (str, &code)) {
- sys_error(ERR_WARNING, "Illegal EZSET command: %s", str);
- pol_reader();
+ if (! m_pol.readUserToken (str, &code)) {
+ sys_error (ERR_WARNING, "Illegal EZSET command: %s", str);
+ m_pol.reader();
retval = false;
}
else
retval = do_cmd (code);
- pol_closefile(); /* close input string file */
+ m_pol.closefile(); /* close input string file */
return (retval);
}
-int
+bool
EZPlot::do_cmd (int lx)
{
char str [1024];
switch (lx) {
case S_TEXTSIZE:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
- {
- if (f >= 0.0 && f <= 1.0) {
- v_textsize = f;
- s_textsize = TRUE;
- } else
- s_textsize = FALSE;
- }
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (f >= 0.0 && f <= 1.0) {
+ v_textsize = f;
+ s_textsize = TRUE;
+ } else
+ s_textsize = FALSE;
+ }
break;
case S_REPLOT:
- plot ();
+ plot (m_pSGP);
break;
case S_CLEAR:
clearCurves ();
break;
case S_TITLE:
- gettext (strIn, sizeof(strIn));
+ m_pol.readText (strIn, sizeof(strIn));
c_title = strIn;
break;
case S_LEGEND:
- gettext (strIn, sizeof(strIn));
- c_legend = strIn;
+ m_pol.readText (strIn, sizeof(strIn));
+ if (m_iCurrentCurve >= 0)
+ setLegend (m_iCurrentCurve, strIn);
break;
case S_XLABEL:
- gettext (strIn, sizeof(strIn));
+ m_pol.readText (strIn, sizeof(strIn));
c_xlabel = strIn;
break;
case S_YLABEL:
- gettext (strIn, sizeof(strIn));
+ m_pol.readText (strIn, sizeof(strIn));
c_ylabel = strIn;
break;
case S_XCROSS:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_xcross = f;
s_xcross = TRUE;
} else
s_xcross = FALSE;
break;
case S_YCROSS:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_ycross = f;
s_ycross = TRUE;
} else
s_ymax = FALSE;
break;
case S_XMIN:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_xmin = f;
s_xmin = TRUE;
}
break;
case S_XMAX:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_xmax = f;
s_xmax = TRUE;
}
break;
case S_YMIN:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_ymin = f;
s_ymin = TRUE;
}
break;
case S_YMAX:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE) {
v_ymax = f;
s_ymax = TRUE;
}
o_linestyle = SGP::LS_SOLID;
break;
case S_DASH:
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE) {
+ int ls;
+ ls = SGP::LS_DASH1;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
if (n == 1)
- o_linestyle = SGP::LS_DASH1;
+ ls = SGP::LS_DASH1;
else if (n == 2)
- o_linestyle = SGP::LS_DASH2;
+ ls = SGP::LS_DASH2;
else if (n == 3)
- o_linestyle = SGP::LS_DASH3;
+ ls = SGP::LS_DASH3;
else if (n == 4)
- o_linestyle = SGP::LS_DASH4;
- else
- o_linestyle = SGP::LS_DASH1;
- } else
- o_linestyle = SGP::LS_DASH1;
+ ls = SGP::LS_DASH4;
+ else if (n == 5)
+ ls = SGP::LS_DOTTED;
+ }
+ if (m_iCurrentCurve < 0)
+ o_linestyle = ls;
+ else
+ setLinestyle (m_iCurrentCurve, ls);
break;
case S_NOLINE:
o_linestyle = SGP::LS_NOLINE;
break;
case S_PEN:
case S_COLOR:
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE)
- {
- if (n >= 0)
- o_color = n;
- else
- bad_option("The color you picked");
- }
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE)
+ {
+ if (n >= 0) {
+ if (m_iCurrentCurve < 0)
+ o_color = n;
+ else
+ setColor (m_iCurrentCurve, n);
+ } else
+ bad_option("The color you picked");
+ }
break;
case S_BOX:
o_box = TRUE;
o_grid = FALSE;
break;
case S_XLENGTH:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
if (f > 0.0 && f <= 1.0)
- o_xlength = f;
- break;
+ o_xlength = f;
+ break;
case S_YLENGTH:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
if (f > 0.0 && f <= 1.0)
- o_ylength = f;
- break;
+ o_ylength = f;
+ break;
case S_XPORIGIN:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
if (f >= 0.0 && f < 1.0)
- o_xporigin = f;
- break;
+ o_xporigin = f;
+ break;
case S_YPORIGIN:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
if (f >= 0.0 && f < 1.0)
- o_yporigin = f;
- break;
+ o_yporigin = f;
+ break;
case S_TAG:
- if (pol_word("no", 2) == TRUE)
+ if (m_pol.readWord("no", 2) == TRUE)
o_tag = FALSE;
- else if (pol_word("off", 2) == TRUE)
+ else if (m_pol.readWord("off", 2) == TRUE)
o_tag = FALSE;
else
o_tag = TRUE;
break;
case S_LEGENDBOX:
- if (pol_word("inside", 2) == TRUE)
+ if (m_pol.readWord("inside", 2) == TRUE)
o_legendbox = INSIDE;
- else if (pol_word("outside", 3) == TRUE)
+ else if (m_pol.readWord("outside", 3) == TRUE)
o_legendbox = OUTSIDE;
- else if (pol_word("none",2) == TRUE)
+ else if (m_pol.readWord("none",2) == TRUE)
o_legendbox = NOLEGEND;
else {
- gettext (str, MAXTOK);
+ m_pol.readText (str, POL::MAXTOK);
bad_option(str);
}
break;
case S_XLEGEND:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
- {
- if (f >= 0.0 && f < 1.0) {
- v_xlegend = f;
- s_xlegend = TRUE;
- }
- else
- s_xlegend = FALSE;
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ {
+ if (f >= 0.0 && f < 1.0) {
+ v_xlegend = f;
+ s_xlegend = TRUE;
}
+ else
+ s_xlegend = FALSE;
+ }
break;
case S_YLEGEND:
- if (pol_float (&f, TT_REAL, FALSE, 0.0, 0.0) == TRUE)
- {
- if (f >= 0.0 && f < 1.0) {
- v_ylegend = f;
- s_ylegend = TRUE;
- }
- else
- s_ylegend = FALSE;
+ if (m_pol.readFloat (&f, POL::TT_REAL, FALSE, 0.0, 0.0) == TRUE)
+ {
+ if (f >= 0.0 && f < 1.0) {
+ v_ylegend = f;
+ s_ylegend = TRUE;
}
+ else
+ s_ylegend = FALSE;
+ }
break;
case S_SYMBOL:
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE) {
- if (n > 0 && n <= MAXSYMBOL)
- o_symbol = n;
- else
- o_symbol = 1;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
+ if (n > 0 && n <= MAXSYMBOL) {
+ if (m_iCurrentCurve < 0)
+ o_symbol = n;
+ else
+ setSymbol (m_iCurrentCurve, n);
+ }
} else {
- if (pol_word("every",5) == TRUE) {
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE) {
- if (n > 0)
- o_symfreq = n;
- else
- o_symfreq = 1;
- }
- } else if (pol_word ("none",4) == TRUE) {
- o_symbol = -1;
+ if (m_pol.readWord("every",5) == TRUE) {
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
+ int sym = 1;
+ if (n > 0)
+ sym = n;
+ if (m_iCurrentCurve < 0)
+ o_symfreq = sym;
+ else
+ setSymbolFreq (m_iCurrentCurve, sym);
+ }
+ } else if (m_pol.readWord ("none",4) == TRUE) {
+ o_symbol = -1;
}
}
break;
+ case S_CURVE:
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
+ if (n > 0)
+ m_iCurrentCurve = n - 1;
+ } else {
+ if (m_pol.readWord ("all",3) == TRUE)
+ m_iCurrentCurve = -1;
+ }
+ break;
case S_XTICKS:
- if (pol_usertok(str,&lx) == FALSE)
+ if (m_pol.readUserToken(str,&lx) == FALSE)
break;
if (lx == S_ABOVE)
o_xticks = ABOVE;
else if (lx == S_LABEL)
o_xtlabel = TRUE;
else if (lx == S_MAJOR) {
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE)
- if (n > 1 && n < 100)
- o_xmajortick = n;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE)
+ if (n > 1 && n < 100)
+ o_xmajortick = n;
} else if (lx == S_MINOR)
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE)
- if (n >= 0 && n < 100)
- o_xminortick = n;
- break;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE)
+ if (n >= 0 && n < 100)
+ o_xminortick = n;
+ break;
case S_YTICKS:
- if (pol_usertok(str,&lx) == FALSE)
+ if (m_pol.readUserToken(str,&lx) == FALSE)
break;
if (lx == S_RIGHT)
o_yticks = RIGHT;
else if (lx == S_LABEL)
o_ytlabel = TRUE;
else if (lx == S_MAJOR) {
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE)
- if (n > 1 && n < 100)
- o_ymajortick = n;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE)
+ if (n > 1 && n < 100)
+ o_ymajortick = n;
} else if (lx == S_MINOR)
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE)
- if (n >= 0 && n < 100)
- o_yminortick = n;
- break;
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE)
+ if (n >= 0 && n < 100)
+ o_yminortick = n;
+ break;
case S_LXFRAC:
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE) {
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
if (n >= 0) {
- v_lxfrac = n;
- s_lxfrac = TRUE;
+ v_lxfrac = n;
+ s_lxfrac = TRUE;
}
} else
s_lxfrac = FALSE;
break;
case S_LYFRAC:
- if (pol_integer (&n, TT_REAL, FALSE, 0, 0) == TRUE) {
+ if (m_pol.readInteger (&n, POL::TT_REAL, FALSE, 0, 0) == TRUE) {
if (n >= 0) {
- v_lyfrac = n;
- s_lyfrac = TRUE;
+ v_lyfrac = n;
+ s_lyfrac = TRUE;
}
} else
s_lyfrac = FALSE;
break;
}
- pol_reader ();
- return (TRUE);
+ m_pol.reader ();
+ return (true);
}
-void
-EZPlot::bad_option (char *opt)
+void
+EZPlot::bad_option (const char *opt)
{
sys_error (ERR_WARNING, "INVALID option: %s", opt);
}
-/*----------------------------------------------------------------------*/
-/* LEXIGRAPHICAL CODES */
-/*----------------------------------------------------------------------*/
-static struct key {
- char *keyword;
- int code;
-} keytab[] = {
- {"solid", S_SOLID},
- {"dash", S_DASH},
- {"noline", S_NOLINE},
- {"black", S_BLACK},
- {"red", S_RED},
- {"blue", S_BLUE},
- {"green", S_GREEN},
- {"pen", S_PEN},
- {"symbol", S_SYMBOL},
- {"every", S_EVERY},
- {"none", S_NONE},
- {"legend", S_LEGEND},
- {"xlegend", S_XLEGEND},
- {"ylegend", S_YLEGEND},
+//----------------------------------------------------------------------
+// KEYWORDS / CODES TABLE
+//----------------------------------------------------------------------
+const struct KeywordCodeTable EZPlot::m_sKeywords[] =
+{
+ {"solid", S_SOLID},
+ {"dash", S_DASH},
+ {"curve", S_CURVE},
+ {"noline", S_NOLINE},
+ {"black", S_BLACK},
+ {"red", S_RED},
+ {"blue", S_BLUE},
+ {"green", S_GREEN},
+ {"pen", S_PEN},
+ {"symbol", S_SYMBOL},
+ {"every", S_EVERY},
+ {"none", S_NONE},
+ {"legend", S_LEGEND},
+ {"xlegend", S_XLEGEND},
+ {"ylegend", S_YLEGEND},
- {"xlin", S_XLIN},
- {"ylin", S_YLIN},
- {"xlog", S_XLOG},
- {"ylog", S_YLOG},
- {"xlabel", S_XLABEL},
- {"ylabel", S_YLABEL},
- {"xlength", S_XLENGTH},
- {"ylength", S_YLENGTH},
+ {"xlin", S_XLIN},
+ {"ylin", S_YLIN},
+ {"xlog", S_XLOG},
+ {"ylog", S_YLOG},
+ {"xlabel", S_XLABEL},
+ {"ylabel", S_YLABEL},
+ {"xlength", S_XLENGTH},
+ {"ylength", S_YLENGTH},
- {"xticks", S_XTICKS},
- {"yticks", S_YTICKS},
- {"above", S_ABOVE},
- {"label", S_LABEL},
- {"below", S_BELOW},
- {"nolabel", S_NOLABEL},
- {"right", S_RIGHT},
- {"left", S_LEFT},
+ {"xticks", S_XTICKS},
+ {"yticks", S_YTICKS},
+ {"above", S_ABOVE},
+ {"label", S_LABEL},
+ {"below", S_BELOW},
+ {"nolabel", S_NOLABEL},
+ {"right", S_RIGHT},
+ {"left", S_LEFT},
- {"xautoscale", S_XAUTOSCALE},
- {"yautoscale", S_YAUTOSCALE},
- {"xmin", S_XMIN},
- {"ymin", S_YMIN},
- {"xmax", S_XMAX},
- {"ymax", S_YMAX},
- {"lxfrac", S_LXFRAC},
- {"lyfrac", S_LYFRAC},
- {"xcross", S_XCROSS},
- {"ycross", S_YCROSS},
- {"noxaxis", S_NOXAXIS},
- {"noyaxis", S_NOYAXIS},
- {"xporigin", S_XPORIGIN},
- {"yporigin", S_YPORIGIN},
- {"title", S_TITLE},
- {"xtitle", S_XTITLE},
- {"ytitle", S_YTITLE},
+ {"xautoscale", S_XAUTOSCALE},
+ {"yautoscale", S_YAUTOSCALE},
+ {"xmin", S_XMIN},
+ {"ymin", S_YMIN},
+ {"xmax", S_XMAX},
+ {"ymax", S_YMAX},
+ {"lxfrac", S_LXFRAC},
+ {"lyfrac", S_LYFRAC},
+ {"xcross", S_XCROSS},
+ {"ycross", S_YCROSS},
+ {"noxaxis", S_NOXAXIS},
+ {"noyaxis", S_NOYAXIS},
+ {"xporigin", S_XPORIGIN},
+ {"yporigin", S_YPORIGIN},
+ {"title", S_TITLE},
+ {"xtitle", S_XTITLE},
+ {"ytitle", S_YTITLE},
- {"replot", S_REPLOT},
- {"clear", S_CLEAR},
- {"store", S_STORE},
- {"restore", S_RESTORE},
- {"amark", S_AMARK},
- {"units", S_UNITS},
- {"inches", S_INCHES},
- {"user", S_USER},
+ {"replot", S_REPLOT},
+ {"clear", S_CLEAR},
+ {"store", S_STORE},
+ {"restore", S_RESTORE},
+ {"amark", S_AMARK},
+ {"units", S_UNITS},
+ {"inches", S_INCHES},
+ {"user", S_USER},
- {"data", S_DATA},
- {"help", S_HELP},
- {"exit", S_EXIT},
+ {"data", S_DATA},
+ {"help", S_HELP},
+ {"exit", S_EXIT},
- {"box", S_BOX},
- {"nobox", S_NOBOX},
- {"grid", S_GRID},
- {"nogrid", S_NOGRID},
- {"major", S_MAJOR},
- {"minor", S_MINOR},
- {"color", S_COLOR},
- {"legendbox", S_LEGENDBOX},
+ {"box", S_BOX},
+ {"nobox", S_NOBOX},
+ {"grid", S_GRID},
+ {"nogrid", S_NOGRID},
+ {"major", S_MAJOR},
+ {"minor", S_MINOR},
+ {"color", S_COLOR},
+ {"legendbox", S_LEGENDBOX},
- {"no", S_NO},
+ {"no", S_NO},
- {"textsize", S_TEXTSIZE},
- };
+ {"textsize", S_TEXTSIZE},
+};
-static const unsigned int NKEYS=(sizeof(keytab) / sizeof(struct key));
+const int EZPlot::NKEYS = (sizeof(EZPlot::m_sKeywords) / sizeof (struct KeywordCodeTable));
-void
-EZPlot::initkw(void)
+void
+EZPlot::initKeywords ()
{
- for (unsigned int i = 0; i < NKEYS; i++)
- if (! pol_install(keytab[i].keyword, keytab[i].code))
- sys_error(ERR_SEVERE, "error installing ezset keywords [initkw]");
+ for (int i = 0; i < NKEYS; i++)
+ m_pol.addKeyword (m_sKeywords[i].keyword, m_sKeywords [i].code);
}