View Raw SPL
#include 

/* delimiters */
extern _rttab;
extern _rtspace;
extern _rtcomma;
extern _rtsemi;
extern _rtother;
extern _rtotherstr;
extern _readt_skip_delimiters;
extern _readt_comma_decimal;
extern _rthex;
extern _rtcsv;
extern _rtlbf;
extern _rtlidt;
extern _rtpvnuml;

extern _cvs_rttab;
extern _cvs_rtspace;
extern _cvs_rtcomma;
extern _cvs_rtsemi;
extern _cvs_rtother;
extern _cvs_rtotherstr;
extern _cvs_readt_skip_delimiters;
extern _cvs_readt_comma_decimal;
extern _cvs_rthex;

extern _rtnanstr;
extern _rtinfstr;
extern _rtwspstr;

static _rttab_save;
static _rtspace_save;
static _rtcomma_save;
static _rtsemi_save;
static _rtother_save;
static _rtotherstr_save;

static _readt_skip_delimiters_save;
static _readt_comma_decimal_save;


/* gui based readt */
rtfname(fname)
{
        local orgname, fn, dl, collist, rtcol, rtnaninf;
        local comment_line, units_line, func, form;
        local rtnanstr, rtinfstr, rtwspstr;

        /* set default name to appear in dialog box */
        if (argc > 0)
        {
                /* use input filename */
                setvar("_rtfname", fname);
                setvar("_rtpickdir", strrev(strfind(pathchar, strrev(_rtfname))));
        }
        else
        {
                /* just define the variable */
                defvar("_rtfname", "");
        }

        /* define start directory if it doesn't already exist */
        defvar("_rtpickdir", "");

        /* define numpts if it doesn't already exist */
        defvar("_rtnumpts", "-1");

        /* define starting column if it doesn't already exist */
        defvar("_rtstartcol", "1");

        /* define column list if it doesn't already exist */
        defvar("_rtcollist", "-1");

        /* define offset if it doesn't already exist */
        defvar("_rtoffset", "1");

        /* _pickfile_status == 1 if dialog was successful */
        setvar("_pickfile_status", 0);

        /* define CSV if it doesn't already exist */
        defvar("_rtcsv", 0);

        /* comma as decimal point */
        defvar("_readt_comma_decimal", rtfname_comma_decimal());

        /* number of preview lines */
        defvar("_rtpvnuml", 1024);

        /* remember original name */
        orgname = _rtfname;

        rtfname_def_delim();

        /* default delimiters */
        if (_rtcsv)
        {
                rtfname_def_csv_delim();
        }

        /* save initial delimiters */
        rtfname_save_delim();

        /* nan and inf values */
        defvar("_rtnanstr", getconf("READT_NA"));
        defvar("_rtinfstr", getconf("READT_INF"));
        defvar("_rtinfwsp", getconf("READT_WHITESPACE"));

        /* default value */
        setvar("_rtdefval", castreal(getconf("readt_default_value")));

        /* mdy ordering */
        defvar("_rtlidt", castint(getconf("locale_idate")));

        /* invoke dialog box */
        _mf("readt.tab");

        /* add -1 to collist if necessary */
        if (strlen(strfind("-1", _rtcollist)) == 0)
        {
                collist = strcat(_rtcollist, ",-1");
        }
        else
        {
                collist = _rtcollist;
        }

        if (_pickfile_status == 1)
        {
                /*
                 *  dialog was successful
                 */

                /* set delimiters */
                _setrtdl(_rttab, _rtspace, _rtcomma, _rtsemi, _rtother, _rtotherstr);

                if (_rtcsv)
                {
                        /* save CSV delimiters */
                        rtfname_save_csv_delim();
                }

                /* remember default directory */
                setvar("_rtpickdir", strrev(strfind(pathchar, strrev(_rtfname))));
                fn = sprintf('"%s"', _rtfname);

                /* check if double quote a delimiter */
                if (strlen(strfind('"', _readt_delimiters)) > 0)
                {
                        dl = sprintf("'%s'", _readt_delimiters);
                }
                else
                {
                        dl = sprintf('"%s"', _readt_delimiters);
                }

                rtcol = (castint(_rtnumcol) > 0) ? castint(_rtnumcol) : (_rtsccol ? -1 : 0);

                /* nan and inf template strings */
                rtnaninf = "";

                rtnanstr = (strlen(_rtnanstr) > 0 && strcmp(_rtnanstr, getconf("READT_NA")) != 0)
                           ? _rtnanstr : "";

                rtinfstr = (strlen(_rtinfstr) > 0 && strcmp(_rtinfstr, getconf("READT_INF")) != 0)
                           ? _rtinfstr : "";

                rtwspstr = (strlen(_rtwspstr) > 0 && strcmp(_rtwspstr, getconf("READT_WHITESPACE")) != 0)
                           ? _rtwspstr : "";


                if (strlen(rtnanstr) > 0)
                {
                        rtnaninf = sprintf('"%s"', rtnanstr);

                        if (strlen(rtinfstr) > 0)
                        {
                                rtnaninf = sprintf('%s, "%s"', rtnaninf, rtinfstr);

                                if (_readt_comma_decimal)
                                {
                                        rtnaninf = sprintf('%s, "%s"', rtnaninf, ",");

                                        if (strlen(_rtwspstr) > 0)
                                        {
                                                rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                                        }

                                }
                                else if (strlen(rtwspstr) > 0)
                                {
                                        rtnaninf = sprintf('%s, ""', rtnaninf);
                                        rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                                }
                        }
                        else if (_readt_comma_decimal)
                        {
                                rtnaninf = sprintf('%s, "", "%s"', rtnaninf, ",");

                                if (strlen(rtwspstr) > 0)
                                {
                                        rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                                }
                        }
                        else if (strlen(rtwspstr) > 0)
                        {
                                rtnaninf = sprintf('%s, "", ""', rtnaninf);
                                rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                        }
                }
                else if (strlen(rtinfstr) > 0)
                {
                        rtnaninf = sprintf('"", "%s"', rtinfstr);

                        if (_readt_comma_decimal)
                        {
                                rtnaninf = sprintf('%s, "%s"', rtnaninf, ",");

                                if (strlen(rtwspstr) > 0)
                                {
                                        rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                                }
                        }
                        else if (strlen(rtwspstr) > 0)
                        {
                                rtnaninf = sprintf('%s, ""', rtnaninf);
                                rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                        }
                }
                else if (_readt_comma_decimal)
                {
                        rtnaninf = '"", "", ","';

                        if (strlen(_rtwspstr) > 0)
                        {
                                rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                        }
                }
                else if (strlen(rtwspstr) > 0)
                {
                        rtnaninf = '"", "", ""';
                        rtnaninf = rtfname_wsp(rtnaninf, rtwspstr);
                }

                /* explicit comment and units line */
                comment_line = castint(getconf("readt_comment_line"));
                units_line   = castint(getconf("readt_units_line"));

                if (strlen(_rtfname) > 0)
                {
                        if (strlen(rtnaninf) > 0)
                        {
                                form = sprintf("readt(%s, %s, %s, %s, %s, %s, %s, %s, %s, %d", fn, _rtoffset, _rtstartcol, collist, _rtnumpts, _rthex, dl, rtnaninf, _readt_skip_delimiters, rtcol);
                        }
                        else
                        {
                                form = sprintf("readt(%s, %s, %s, %s, %s, %s, %s, %s, %d", fn, _rtoffset, _rtstartcol, collist, _rtnumpts, _rthex, dl, _readt_skip_delimiters, rtcol);
                        }

                        endstr = ")";

                        if (_rtlidt != castint(getconf("locale_idate")))
                        {
                                endstr = sprintf(", 1, %d%s", _rtlidt, endstr);
                        }

                        if (units_line >= 0 || comment_line >= 0 || strlen(endstr) > 1)
                        {
                                endstr = sprintf(", 0, %d, %d%s", comment_line, units_line, endstr);
                        }

                        form = form + endstr;

                        if (_rtlbf)
                        {
                                form = sprintf("%s;label(%s)", form, fn);
                        }

                        form = sprintf("%s := (%s)", _dwin, form);
                        eval(form);
                }
        }
        else
        {
                /* reset to original name */
                if (strlen(orgname) > 0)
                {
                        setvar("_rtfname", orgname);
                }
        }

        if (_rtcsv)
        {
                rtfname_restore_delim();
        }
}


rtfname_def_delim()
{
        defvar("_rttab",     "0");
        defvar("_rtspace",   "1");
        defvar("_rtcomma",   "0");
        defvar("_rtsemi",    "0");
        defvar("_rtother",   "0");
        defvar("_rtotherstr", "");
        defvar("_readt_skip_delimiters", "1");
        defvar("_readt_comma_decimal",   0);
        defvar("_rthex", "0");
}


rtfname_def_csv_delim()
{
        defvar("_cvs_rttab",     "0");
        defvar("_cvs_rtspace",   "0");
        defvar("_cvs_rtcomma",   "1");
        defvar("_cvs_rtsemi",    "0");
        defvar("_cvs_rtother",   "0");
        defvar("_cvs_rtotherstr", "");
        defvar("_cvs_readt_skip_delimiters", "0");
        defvar("_cvs_readt_comma_decimal", 0);
        defvar("_cvs_rthex", "0");
}


rtfname_save_delim()
{
        _rttab_save                 = _rttab;
        _rtspace_save               = _rtspace;
        _rtcomma_save               = _rtcomma;
        _rtsemi_save                = _rtsemi;
        _rtother_save               = _rtother;
        _rtotherstr_save            = _rtotherstr;
        _readt_skip_delimiters_save = _readt_skip_delimiters;
        _readt_comma_decimal_save   = _readt_comma_decimal;
        _rthex_save                 = _rthex;
}


rtfname_set_csv_delim()
{
        _rttab                 = _cvs_rttab;
        _rtspace               = _cvs_rtspace;
        _rtcomma               = _cvs_rtcomma;
        _rtsemi                = _cvs_rtsemi;
        _rtother               = _cvs_rtother;
        _rtotherstr            = _cvs_rtotherstr;
        _readt_skip_delimiters = _cvs_readt_skip_delimiters;
        _readt_comma_decimal   = _cvs_readt_comma_decimal;
}


rtfname_save_csv_delim()
{
        _cvs_rttab                 = _rttab;
        _cvs_rtspace               = _rtspace;
        _cvs_rtcomma               = _rtcomma;
        _cvs_rtsemi                = _rtsemi;
        _cvs_rtother               = _rtother;
        _cvs_rtotherstr            = _rtotherstr;
        _cvs_readt_skip_delimiters = _readt_skip_delimiters;
        _cvs_readt_comma_decimal   = _readt_comma_decimal;
        _cvs_rthex                 = _rthex;
}


rtfname_restore_delim()
{
        _rttab                 = _rttab_save;
        _rtspace               = _rtspace_save;
        _rtcomma               = _rtcomma_save;
        _rtsemi                = _rtsemi_save;
        _rtother               = _rtother_save;
        _rtotherstr            = _rtotherstr_save;
        _readt_skip_delimiters = _readt_skip_delimiters_save;
        _readt_comma_decimal   = _readt_comma_decimal_save;
}


rtfname_setdelim()
{
        if (_rtcsv)
        {
                rtfname_def_csv_delim();
                rtfname_set_csv_delim();
        }
        else
        {
                rtfname_restore_delim();
        }
}


rtfname_filespec()
{
        if (_rtcsv)
        {
                /* CSV, DAT, TXT files */
                spec = _rdtopt_cfo;
        }
        else
        {
                /* DAT, TXT files */
                spec = _rdtopt_tfo;
        }

        return(spec);
}


rtfname_comma_decimal()
{
        local dstr, status = 0;

        dstr = getconf("readt_decimal");

        if (strlen(dstr) > 0)
        {
                if (strextract(dstr, 1, 1) == ",")
                {
                        status = 1;
                }
        }

        return(status);
}


rtfname_wsp (rtnaninf, rtwspstr)
{
        if (strlen(strfind('"', rtwspstr)) > 0)
        {
                rtnaninf = sprintf("%s, '%s'", rtnaninf, rtwspstr);
        }
        else
        {
                rtnaninf = sprintf('%s, "%s"', rtnaninf, rtwspstr);
        }

        return(rtnaninf);
}