added sed::str_to_str to the sed module for awk

fixed some build issues on legacy systems
This commit is contained in:
2014-02-20 05:29:32 +00:00
parent a29a11e9fc
commit d49fd50ecc
26 changed files with 518 additions and 331 deletions

View File

@ -48,7 +48,9 @@
# define INCL_DOSERRORS
# include <os2.h>
#elif defined(__DOS__)
# include <cwdllfnc.h>
# if !defined(QSE_ENABLE_STATIC_MODULE)
# include <cwdllfnc.h>
# endif
#else
# include <unistd.h>
# include <ltdl.h>
@ -1340,7 +1342,13 @@ StdAwk::flt_t StdAwk::sqrt (flt_t x)
void* StdAwk::modopen (const mod_spec_t* spec)
{
#if defined(USE_LTDL)
#if defined(QSE_ENABLE_STATIC_MODULE)
/* this won't be called at all when modules are linked into
* the main library. */
this->setError (QSE_AWK_ENOIMPL);
return QSE_NULL;
#elif defined(USE_LTDL)
void* h;
qse_mchar_t* modpath;
@ -1470,7 +1478,10 @@ void* StdAwk::modopen (const mod_spec_t* spec)
void StdAwk::modclose (void* handle)
{
#if defined(USE_LTDL)
#if defined(QSE_ENABLE_STATIC_MODULE)
/* this won't be called at all when modules are linked into
* the main library. */
#elif defined(USE_LTDL)
lt_dlclose ((lt_dlhandle)handle);
#elif defined(_WIN32)
FreeLibrary ((HMODULE)handle);
@ -1499,7 +1510,11 @@ void* StdAwk::modsym (void* handle, const qse_char_t* name)
}
#endif
#if defined(USE_LTDL)
#if defined(QSE_ENABLE_STATIC_MODULE)
/* this won't be called at all when modules are linked into
* the main library. */
s = QSE_NULL;
#elif defined(USE_LTDL)
s = lt_dlsym ((lt_dlhandle)handle, mname);
#elif defined(_WIN32)
s = (void*)GetProcAddress ((HMODULE)handle, mname);

View File

@ -18,7 +18,7 @@
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mod-str.h"
#include "mod-sed.h"
#include <qse/sed/stdsed.h>
#include "../cmn/mem.h"
@ -51,10 +51,10 @@ static qse_char_t* errmsg[] =
static int fnc_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
uctx_list_t* list;
qse_awk_val_t* retv;
qse_awk_int_t errnum;
/*
list = rtx_to_list (rtx, fi);
if (qse_awk_rtx_getnargs (rtx) <= 0 ||
@ -62,6 +62,11 @@ static int fnc_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
errnum = list->errnum;
}
*/
ret = qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 0), &id);
if (ret <= -1) errnum = -1;
if (errnum < 0 || errnum >= QSE_COUNTOF(errmsg)) errnum = QSE_COUNTOF(errmsg) - 1;
@ -78,8 +83,7 @@ static int fnc_file_to_file (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
qse_sed_t* sed = QSE_NULL;
qse_awk_val_t* retv;
qse_awk_val_t* a[3];
qse_char_t* str[3];
qse_size_t len[3];
qse_xstr_t xstr[3];
int i = 0, ret = 0;
/* result = sed::file_to_file ("s/ABC/123/g", input_file, output_file [, option_string]) */
@ -96,21 +100,21 @@ static int fnc_file_to_file (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
for (i = 0; i < 3; i++)
{
a[i] = qse_awk_rtx_getarg (rtx, i);
str[i] = qse_awk_rtx_getvalstr (rtx, a[i], &len[i]);
if (str[i] == QSE_NULL)
xstr[i].ptr = qse_awk_rtx_getvalstr (rtx, a[i], &xstr[i].len);
if (xstr[i].ptr == QSE_NULL)
{
ret = -2;
goto oops;
}
}
if (qse_sed_compstdstrx (sed, str[0], len[0]) <= -1)
if (qse_sed_compstdxstr (sed, &xstr[0]) <= -1)
{
ret = -3; /* compile error */
goto oops;
}
if (qse_sed_execstdfile (sed, str[1], str[2], QSE_NULL) <= -1)
if (qse_sed_execstdfile (sed, xstr[1].ptr, xstr[2].ptr, QSE_NULL) <= -1)
{
ret = -4;
goto oops;
@ -123,7 +127,7 @@ oops:
while (i > 0)
{
--i;
qse_awk_rtx_freevalstr (rtx, a[i], str[i]);
qse_awk_rtx_freevalstr (rtx, a[i], xstr[i].ptr);
}
if (sed) qse_sed_close (sed);
@ -133,7 +137,76 @@ oops:
static int fnc_str_to_str (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
return -1;
qse_sed_t* sed = QSE_NULL;
qse_awk_val_t* retv;
qse_awk_val_t* a[2], * tmp;
qse_xstr_t xstr[2];
qse_xstr_t outstr;
int i = 0, ret = 0, n;
sed = qse_sed_openstdwithmmgr (qse_awk_rtx_getmmgr(rtx), 0);
if (sed == QSE_NULL)
{
ret = -2;
goto oops;
}
/* TODO qse_set_opt (TRAIT) using the optional parameter */
for (i = 0; i < 2; i++)
{
a[i] = qse_awk_rtx_getarg (rtx, i);
xstr[i].ptr = qse_awk_rtx_getvalstr (rtx, a[i], &xstr[i].len);
if (xstr[i].ptr == QSE_NULL)
{
ret = -2;
goto oops;
}
}
if (qse_sed_compstdxstr (sed, &xstr[0]) <= -1)
{
ret = -3; /* compile error */
goto oops;
}
if (qse_sed_execstdxstr (sed, &xstr[1], &outstr, QSE_NULL) <= -1)
{
ret = -4;
goto oops;
}
tmp = qse_awk_rtx_makestrvalwithxstr (rtx, &outstr);
qse_sed_freemem (sed, outstr.ptr);
if (!tmp)
{
ret = -1;
goto oops;
}
qse_awk_rtx_refupval (rtx, tmp);
n = qse_awk_rtx_setrefval (rtx, qse_awk_rtx_getarg (rtx, 2), tmp);
qse_awk_rtx_refdownval (rtx, tmp);
if (n <= -1)
{
ret = -5;
goto oops;
}
oops:
retv = qse_awk_rtx_makeintval (rtx, ret);
if (retv == QSE_NULL) retv = qse_awk_rtx_makeintval (rtx, -1);
while (i > 0)
{
--i;
qse_awk_rtx_freevalstr (rtx, a[i], xstr[i].ptr);
}
if (sed) qse_sed_close (sed);
qse_awk_rtx_setretval (rtx, retv);
return 0;
}
typedef struct fnctab_t fnctab_t;
@ -172,7 +245,6 @@ static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qs
}
}
ea.ptr = name;
ea.len = qse_strlen(name);
qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL);

View File

@ -389,7 +389,12 @@ static int fnc_sleep (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
DosSleep ((ULONG)QSE_SEC_TO_MSEC(lv));
rx = 0;
#elif defined(__DOS__)
rx = sleep (lv);
#if (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
sleep (lv);
rx = 0;
#else
rx = sleep (lv);
#endif
#elif defined(HAVE_NANOSLEEP)
struct timespec req;
req.tv_sec = lv;
@ -409,7 +414,12 @@ static int fnc_sleep (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
rx = 0;
#elif defined(__DOS__)
/* no high-resolution sleep() is available */
rx = sleep ((qse_awk_int_t)fv);
#if (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
sleep ((qse_awk_int_t)fv);
rx = 0;
#else
rx = sleep ((qse_awk_int_t)fv);
#endif;
#elif defined(HAVE_NANOSLEEP)
struct timespec req;
req.tv_sec = (qse_awk_int_t)fv;

View File

@ -52,7 +52,9 @@
# define INCL_DOSERRORS
# include <os2.h>
#elif defined(__DOS__)
# include <cwdllfnc.h>
# if !defined(QSE_ENABLE_STATIC_MODULE)
# include <cwdllfnc.h>
# endif
#else
# include <unistd.h>
# include <ltdl.h>

View File

@ -201,106 +201,8 @@ qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_awk_flt_t v)
return (qse_awk_val_t*)val;
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithmbs (
qse_awk_rtx_t* rtx, const qse_mchar_t* mbs)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrval (rtx, mbs, qse_mbslen(mbs));
#else
qse_awk_val_t* v;
qse_wxstr_t tmp;
tmp.ptr = qse_mbstowcsdup (mbs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)&tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcs (
qse_awk_rtx_t* rtx, const qse_wchar_t* wcs)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mxstr_t tmp;
tmp.ptr = qse_wcstombsdup (wcs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrval (rtx, wcs, qse_wcslen(wcs));
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithstr (
qse_awk_rtx_t* rtx, const qse_char_t* str)
{
return qse_awk_rtx_makestrval (rtx, str, qse_strlen(str));
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithmcstr (
qse_awk_rtx_t* rtx, const qse_mcstr_t* mcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrvalwithcstr (rtx, mcstr);
#else
qse_awk_val_t* v;
qse_wxstr_t tmp;
qse_size_t mbslen;
mbslen = mcstr->len;
tmp.ptr = qse_mbsntowcsdup (mcstr->ptr, &mbslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)&tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcstr (
qse_awk_rtx_t* rtx, const qse_wcstr_t* wcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mxstr_t tmp;
qse_size_t wcslen;
wcslen = wcstr->len;
tmp.ptr = qse_wcsntombsdup (wcstr->ptr, &wcslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrvalwithcstr (rtx, wcstr);
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithcstr (
qse_awk_rtx_t* rtx, const qse_cstr_t* str)
qse_awk_val_t* qse_awk_rtx_makestrvalwithxstr (
qse_awk_rtx_t* rtx, const qse_xstr_t* str)
{
qse_awk_val_str_t* val = QSE_NULL;
qse_size_t rlen = str->len;
@ -347,6 +249,110 @@ init:
return (qse_awk_val_t*)val;
}
QSE_INLINE qse_awk_val_t* qse_awk_rtx_makestrvalwithcstr (
qse_awk_rtx_t* rtx, const qse_cstr_t* str)
{
return qse_awk_rtx_makestrvalwithxstr (rtx, (const qse_xstr_t*)str);
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithmbs (
qse_awk_rtx_t* rtx, const qse_mchar_t* mbs)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrval (rtx, mbs, qse_mbslen(mbs));
#else
qse_awk_val_t* v;
qse_wxstr_t tmp;
tmp.ptr = qse_mbstowcsdup (mbs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcs (
qse_awk_rtx_t* rtx, const qse_wchar_t* wcs)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mxstr_t tmp;
tmp.ptr = qse_wcstombsdup (wcs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrval (rtx, wcs, qse_wcslen(wcs));
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithstr (
qse_awk_rtx_t* rtx, const qse_char_t* str)
{
return qse_awk_rtx_makestrval (rtx, str, qse_strlen(str));
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithmcstr (
qse_awk_rtx_t* rtx, const qse_mcstr_t* mcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrvalwithcstr (rtx, mcstr);
#else
qse_awk_val_t* v;
qse_wxstr_t tmp;
qse_size_t mbslen;
mbslen = mcstr->len;
tmp.ptr = qse_mbsntowcsdup (mcstr->ptr, &mbslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcstr (
qse_awk_rtx_t* rtx, const qse_wcstr_t* wcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mxstr_t tmp;
qse_size_t wcslen;
wcslen = wcstr->len;
tmp.ptr = qse_wcsntombsdup (wcstr->ptr, &wcslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrvalwithcstr (rtx, wcstr);
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrval (
qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t len)
{