changed the module loader to attempt to find '_load' and 'load_' as in addition to 'load'.
added the stat field to qse_awk_val_t. added DLL loading for DOS32/CauseWay deprecated PROCINFO. you can use various sys::xxxx() functions to get equivalent information. migrated time() to sys::gettime() and added sys::settime().
This commit is contained in:
@ -8,9 +8,9 @@ AM_CPPFLAGS = \
|
||||
if WIN32
|
||||
# you must adjust the value of DEFAULT_MODPOSTFIX according to
|
||||
# -version-info in ../../mod/awk/Makefile.am
|
||||
AM_CPPFLAGS += -DDEFAULT_MODPREFIX=\"libqseawk-\" -DDEFAULT_MODPOSTFIX=\"-1\"
|
||||
AM_CPPFLAGS += -DQSE_AWK_DEFAULT_MODPREFIX=\"libqseawk-\" -DQSE_AWK_DEFAULT_MODPOSTFIX=\"-1\"
|
||||
else
|
||||
AM_CPPFLAGS += -DDEFAULT_MODPREFIX=\"$(libdir)/libqseawk-\" -DDEFAULT_MODPOSTFIX=\"\"
|
||||
AM_CPPFLAGS += -DQSE_AWK_DEFAULT_MODPREFIX=\"$(libdir)/libqseawk-\" -DQSE_AWK_DEFAULT_MODPOSTFIX=\"\"
|
||||
endif
|
||||
|
||||
lib_LTLIBRARIES = libqseawk.la
|
||||
|
@ -37,8 +37,8 @@ host_triplet = @host@
|
||||
|
||||
# you must adjust the value of DEFAULT_MODPOSTFIX according to
|
||||
# -version-info in ../../mod/awk/Makefile.am
|
||||
@WIN32_TRUE@am__append_1 = -DDEFAULT_MODPREFIX=\"libqseawk-\" -DDEFAULT_MODPOSTFIX=\"-1\"
|
||||
@WIN32_FALSE@am__append_2 = -DDEFAULT_MODPREFIX=\"$(libdir)/libqseawk-\" -DDEFAULT_MODPOSTFIX=\"\"
|
||||
@WIN32_TRUE@am__append_1 = -DQSE_AWK_DEFAULT_MODPREFIX=\"libqseawk-\" -DQSE_AWK_DEFAULT_MODPOSTFIX=\"-1\"
|
||||
@WIN32_FALSE@am__append_2 = -DQSE_AWK_DEFAULT_MODPREFIX=\"$(libdir)/libqseawk-\" -DQSE_AWK_DEFAULT_MODPOSTFIX=\"\"
|
||||
@ENABLE_CXX_TRUE@am__append_3 = libqseawkxx.la
|
||||
subdir = lib/awk
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
|
@ -41,11 +41,12 @@
|
||||
# define USE_LTDL
|
||||
# endif
|
||||
#elif defined(__OS2__)
|
||||
# define INCL_DOSMODULEMGR
|
||||
# define INCL_DOSPROCESS
|
||||
# define INCL_DOSERRORS
|
||||
# include <os2.h>
|
||||
#elif defined(__DOS__)
|
||||
/* anything ? */
|
||||
# include <cwdllfnc.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <ltdl.h>
|
||||
@ -133,11 +134,9 @@ int StdAwk::open ()
|
||||
this->gbl_argc = addGlobal (QSE_T("ARGC"));
|
||||
this->gbl_argv = addGlobal (QSE_T("ARGV"));
|
||||
this->gbl_environ = addGlobal (QSE_T("ENVIRON"));
|
||||
this->gbl_procinfo = addGlobal (QSE_T("PROCINFO"));
|
||||
if (this->gbl_argc <= -1 ||
|
||||
this->gbl_argv <= -1 ||
|
||||
this->gbl_environ <= -1 ||
|
||||
this->gbl_procinfo <= -1)
|
||||
this->gbl_environ <= -1)
|
||||
{
|
||||
goto oops;
|
||||
}
|
||||
@ -145,7 +144,6 @@ int StdAwk::open ()
|
||||
if (addFunction (QSE_T("rand"), 0, 0, (FunctionHandler)&StdAwk::rand, 0) <= -1 ||
|
||||
addFunction (QSE_T("srand"), 0, 1, (FunctionHandler)&StdAwk::srand, 0) <= -1 ||
|
||||
addFunction (QSE_T("system"), 1, 1, (FunctionHandler)&StdAwk::system, 0) <= -1 ||
|
||||
addFunction (QSE_T("time"), 0, 0, (FunctionHandler)&StdAwk::time, 0) <= -1 ||
|
||||
addFunction (QSE_T("setioattr"), 3, 3, (FunctionHandler)&StdAwk::setioattr, QSE_AWK_RIO) <= -1 ||
|
||||
addFunction (QSE_T("getioattr"), 2, 2, (FunctionHandler)&StdAwk::getioattr, QSE_AWK_RIO) <= -1)
|
||||
{
|
||||
@ -342,81 +340,10 @@ int StdAwk::build_environ (Run* run)
|
||||
return xret;
|
||||
}
|
||||
|
||||
int StdAwk::build_procinfo (Run* run)
|
||||
{
|
||||
static qse_cstr_t names[] =
|
||||
{
|
||||
{ QSE_T("pid"), 3 },
|
||||
{ QSE_T("ppid"), 5 },
|
||||
{ QSE_T("pgrp"), 4 },
|
||||
{ QSE_T("uid"), 3 },
|
||||
{ QSE_T("gid"), 3 },
|
||||
{ QSE_T("euid"), 4 },
|
||||
{ QSE_T("egid"), 4 },
|
||||
{ QSE_T("tid"), 3 }
|
||||
};
|
||||
|
||||
#if defined(__OS2__)
|
||||
PTIB tib;
|
||||
PPIB pib;
|
||||
|
||||
if (DosGetInfoBlocks (&tib, &pib) != NO_ERROR)
|
||||
{
|
||||
tib = QSE_NULL;
|
||||
pib = QSE_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
Value v_procinfo (run);
|
||||
|
||||
for (size_t i = 0; i < QSE_COUNTOF(names); i++)
|
||||
{
|
||||
qse_long_t val = -99931; /* -99931 randomly chosen */
|
||||
|
||||
#if defined(_WIN32)
|
||||
switch (i)
|
||||
{
|
||||
case 0: val = GetCurrentProcessId(); break;
|
||||
case 7: val = GetCurrentThreadId(); break;
|
||||
}
|
||||
#elif defined(__OS2__)
|
||||
switch (i)
|
||||
{
|
||||
case 0: if (pib) val = pib->pib_ulpid; break;
|
||||
case 7: if (tib && tib->tib_ptib2) val = tib->tib_ptib2->tib2_ultid; break;
|
||||
}
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
switch (i)
|
||||
{
|
||||
case 0: val = getpid(); break;
|
||||
case 1: val = getppid(); break;
|
||||
case 2: val = getpgrp(); break;
|
||||
case 3: val = getuid(); break;
|
||||
case 4: val = getgid(); break;
|
||||
case 5: val = geteuid(); break;
|
||||
case 6: val = getegid(); break;
|
||||
#if defined(HAVE_GETTID)
|
||||
case 7: val = gettid(); break;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
if (val == -99931) continue;
|
||||
|
||||
if (v_procinfo.setIndexedInt (
|
||||
Value::Index (names[i].ptr, names[i].len), val) <= -1) return -1;
|
||||
|
||||
}
|
||||
|
||||
return run->setGlobal (this->gbl_procinfo, v_procinfo);
|
||||
}
|
||||
|
||||
int StdAwk::make_additional_globals (Run* run)
|
||||
{
|
||||
if (build_argcv (run) <= -1 ||
|
||||
build_environ (run) <= -1 ||
|
||||
build_procinfo (run) <= -1) return -1;
|
||||
build_environ (run) <= -1) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -478,16 +405,6 @@ int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
#endif
|
||||
}
|
||||
|
||||
int StdAwk::time (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
qse_ntime_t now;
|
||||
|
||||
if (qse_gettime (&now) <= -1) now = 0;
|
||||
|
||||
return ret.setInt (now);
|
||||
}
|
||||
|
||||
qse_cmgr_t* StdAwk::getcmgr (const char_t* ioname)
|
||||
{
|
||||
QSE_ASSERT (this->cmgrtab_inited == true);
|
||||
@ -1429,7 +1346,7 @@ void* StdAwk::modopen (const mod_spec_t* spec)
|
||||
#elif defined(_WIN32)
|
||||
|
||||
HMODULE h;
|
||||
qse_char_t* path;
|
||||
qse_char_t* modpath;
|
||||
const qse_char_t* tmp[4];
|
||||
int count;
|
||||
|
||||
@ -1439,16 +1356,16 @@ void* StdAwk::modopen (const mod_spec_t* spec)
|
||||
if (spec->postfix) tmp[count++] = spec->postfix;
|
||||
tmp[count] = QSE_NULL;
|
||||
|
||||
path = qse_stradup (tmp, QSE_NULL, this->getMmgr());
|
||||
if (!path)
|
||||
modpath = qse_stradup (tmp, QSE_NULL, this->getMmgr());
|
||||
if (!modpath)
|
||||
{
|
||||
this->setError (QSE_AWK_ENOMEM);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
h = LoadLibrary (path);
|
||||
h = LoadLibrary (modpath);
|
||||
|
||||
QSE_MMGR_FREE (awk->mmgr, path);
|
||||
QSE_MMGR_FREE (awk->mmgr, modpath);
|
||||
|
||||
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
|
||||
return h;
|
||||
@ -1487,9 +1404,35 @@ void* StdAwk::modopen (const mod_spec_t* spec)
|
||||
|
||||
#elif defined(__DOS__)
|
||||
|
||||
/*TODO: implemente this */
|
||||
this->setError (QSE_AWK_ENOIMPL);
|
||||
return QSE_NULL;
|
||||
void* h;
|
||||
qse_mchar_t* modpath;
|
||||
const qse_char_t* tmp[4];
|
||||
int count;
|
||||
|
||||
count = 0;
|
||||
if (spec->prefix) tmp[count++] = spec->prefix;
|
||||
tmp[count++] = spec->name;
|
||||
if (spec->postfix) tmp[count++] = spec->postfix;
|
||||
tmp[count] = QSE_NULL;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
modpath = qse_mbsadup (tmp, QSE_NULL, awk->mmgr);
|
||||
#else
|
||||
modpath = qse_wcsatombsdup (tmp, QSE_NULL, awk->mmgr);
|
||||
#endif
|
||||
if (!modpath)
|
||||
{
|
||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
h = LoadModule (modpath);
|
||||
|
||||
QSE_MMGR_FREE (awk->mmgr, modpath);
|
||||
|
||||
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
|
||||
return h;
|
||||
|
||||
#else
|
||||
|
||||
this->setError (QSE_AWK_ENOIMPL);
|
||||
@ -1507,7 +1450,7 @@ void StdAwk::modclose (void* handle)
|
||||
#elif defined(__OS2__)
|
||||
DosFreeModule ((HMODULE)handle);
|
||||
#elif defined(__DOS__)
|
||||
/*TODO: implemente this */
|
||||
FreeModule (handle);
|
||||
#else
|
||||
/* nothing to do */
|
||||
#endif
|
||||
@ -1536,8 +1479,7 @@ void* StdAwk::modsym (void* handle, const qse_char_t* name)
|
||||
#elif defined(__OS2__)
|
||||
if (DosQueryProcAddr ((HMODULE)handle, 0, mname, (PFN*)&s) != NO_ERROR) s = QSE_NULL;
|
||||
#elif defined(__DOS__)
|
||||
/*TODO: implemente this */
|
||||
s = QSE_NULL;
|
||||
s = GetProcAddress (handle, mname);
|
||||
#else
|
||||
s = QSE_NULL;
|
||||
#endif
|
||||
|
@ -131,7 +131,7 @@ void* qse_awk_addfnc (qse_awk_t* awk, const qse_cstr_t* name, const qse_awk_fnc_
|
||||
qse_char_t* tmp;
|
||||
|
||||
tmp = (qse_char_t*)(fnc + 1);
|
||||
fnc->name.len = qse_strxncpy (tmp, name->len+1, name, name->len);
|
||||
fnc->name.len = qse_strxncpy (tmp, name->len+1, name->ptr, name->len);
|
||||
fnc->name.ptr = tmp;
|
||||
|
||||
fnc->spec = *spec;
|
||||
|
@ -6437,14 +6437,14 @@ static qse_awk_mod_t* query_module (
|
||||
|
||||
if (awk->opt.mod[0].len > 0)
|
||||
spec.prefix = awk->opt.mod[0].ptr;
|
||||
#if defined(DEFAULT_MODPREFIX)
|
||||
else spec.prefix = QSE_T(DEFAULT_MODPREFIX);
|
||||
#if defined(QSE_AWK_DEFAULT_MODPREFIX)
|
||||
else spec.prefix = QSE_T(QSE_AWK_DEFAULT_MODPREFIX);
|
||||
#endif
|
||||
|
||||
if (awk->opt.mod[1].len > 0)
|
||||
spec.postfix = awk->opt.mod[1].ptr;
|
||||
#if defined(DEFAULT_MODPOSTFIX)
|
||||
else spec.postfix = QSE_T(DEFAULT_MODPOSTFIX);
|
||||
#if defined(QSE_AWK_DEFAULT_MODPOSTFIX)
|
||||
else spec.postfix = QSE_T(QSE_AWK_DEFAULT_MODPOSTFIX);
|
||||
#endif
|
||||
|
||||
QSE_MEMSET (&md, 0, QSE_SIZEOF(md));
|
||||
@ -6464,15 +6464,22 @@ static qse_awk_mod_t* query_module (
|
||||
}
|
||||
|
||||
load = awk->prm.modsym (awk, md.handle, QSE_T("load"));
|
||||
if (!load)
|
||||
if (!load)
|
||||
{
|
||||
load = awk->prm.modsym (awk, md.handle, QSE_T("_load"));
|
||||
if (!load)
|
||||
{
|
||||
load = awk->prm.modsym (awk, md.handle, QSE_T("load_"));
|
||||
if (!load)
|
||||
{
|
||||
ea.ptr = QSE_T("load");
|
||||
ea.len = 4;
|
||||
qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL);
|
||||
|
||||
ea.ptr = QSE_T("load");
|
||||
ea.len = 4;
|
||||
qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL);
|
||||
|
||||
awk->prm.modclose (awk, md.handle);
|
||||
return QSE_NULL;
|
||||
awk->prm.modclose (awk, md.handle);
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* i copy-insert 'md' into the table before calling 'load'.
|
||||
|
@ -5771,6 +5771,7 @@ static qse_awk_val_t* __eval_call (
|
||||
#ifdef DEBUG_RUN
|
||||
qse_dprintf (QSE_T("block run complete nargs = %d\n"), (int)nargs);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < nargs; i++)
|
||||
{
|
||||
qse_awk_rtx_refdownval (run, STACK_ARG(run,i));
|
||||
|
@ -50,7 +50,7 @@
|
||||
# define INCL_DOSERRORS
|
||||
# include <os2.h>
|
||||
#elif defined(__DOS__)
|
||||
/* anything ? */
|
||||
# include <cwdllfnc.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <ltdl.h>
|
||||
@ -115,7 +115,6 @@ typedef struct xtn_t
|
||||
int gbl_argc;
|
||||
int gbl_argv;
|
||||
int gbl_environ;
|
||||
int gbl_procinfo;
|
||||
|
||||
qse_awk_ecb_t ecb;
|
||||
} xtn_t;
|
||||
@ -349,7 +348,7 @@ static void* custom_awk_modopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec)
|
||||
#elif defined(_WIN32)
|
||||
|
||||
HMODULE h;
|
||||
qse_char_t* path;
|
||||
qse_char_t* modpath;
|
||||
const qse_char_t* tmp[4];
|
||||
int count;
|
||||
|
||||
@ -359,16 +358,16 @@ static void* custom_awk_modopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec)
|
||||
if (spec->postfix) tmp[count++] = spec->postfix;
|
||||
tmp[count] = QSE_NULL;
|
||||
|
||||
path = qse_stradup (tmp, QSE_NULL, awk->mmgr);
|
||||
if (!path)
|
||||
modpath = qse_stradup (tmp, QSE_NULL, awk->mmgr);
|
||||
if (!modpath)
|
||||
{
|
||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
h = LoadLibrary (path);
|
||||
h = LoadLibrary (modpath);
|
||||
|
||||
QSE_MMGR_FREE (awk->mmgr, path);
|
||||
QSE_MMGR_FREE (awk->mmgr, modpath);
|
||||
|
||||
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
|
||||
return h;
|
||||
@ -407,9 +406,34 @@ static void* custom_awk_modopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec)
|
||||
|
||||
#elif defined(__DOS__)
|
||||
|
||||
/*TODO: implemente this */
|
||||
qse_awk_seterrnum (awk, QSE_AWK_ENOIMPL, QSE_NULL);
|
||||
return -1;
|
||||
void* h;
|
||||
qse_mchar_t* modpath;
|
||||
const qse_char_t* tmp[4];
|
||||
int count;
|
||||
|
||||
count = 0;
|
||||
if (spec->prefix) tmp[count++] = spec->prefix;
|
||||
tmp[count++] = spec->name;
|
||||
if (spec->postfix) tmp[count++] = spec->postfix;
|
||||
tmp[count] = QSE_NULL;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
modpath = qse_mbsadup (tmp, QSE_NULL, awk->mmgr);
|
||||
#else
|
||||
modpath = qse_wcsatombsdup (tmp, QSE_NULL, awk->mmgr);
|
||||
#endif
|
||||
if (!modpath)
|
||||
{
|
||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
h = LoadModule (modpath);
|
||||
|
||||
QSE_MMGR_FREE (awk->mmgr, modpath);
|
||||
|
||||
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
|
||||
return h;
|
||||
|
||||
#else
|
||||
qse_awk_seterrnum (awk, QSE_AWK_ENOIMPL, QSE_NULL);
|
||||
@ -426,7 +450,7 @@ static void custom_awk_modclose (qse_awk_t* awk, void* handle)
|
||||
#elif defined(__OS2__)
|
||||
DosFreeModule ((HMODULE)handle);
|
||||
#elif defined(__DOS__)
|
||||
/*TODO: implemente this */
|
||||
FreeModule (handle);
|
||||
#else
|
||||
/* nothing to do */
|
||||
#endif
|
||||
@ -458,8 +482,8 @@ static void* custom_awk_modsym (qse_awk_t* awk, void* handle, const qse_char_t*
|
||||
if (DosQueryProcAddr ((HMODULE)handle, 0, mname, (PFN*)&s) != NO_ERROR) s = QSE_NULL;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
/*TODO: implemente this */
|
||||
s = QSE_NULL;
|
||||
s = GetProcAddress (handle, mname);
|
||||
|
||||
#else
|
||||
s = QSE_NULL;
|
||||
#endif
|
||||
@ -1788,7 +1812,7 @@ static int build_argcv (
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int __build_environ (
|
||||
qse_awk_rtx_t* rtx, int gbl_id, qse_env_char_t* envarr[])
|
||||
{
|
||||
@ -1940,122 +1964,12 @@ static int build_environ (qse_awk_rtx_t* rtx, int gbl_id)
|
||||
return xret;
|
||||
}
|
||||
|
||||
static int build_procinfo (qse_awk_rtx_t* rtx, int gbl_id)
|
||||
{
|
||||
qse_awk_val_t* v_info;
|
||||
qse_awk_val_t* v_tmp;
|
||||
qse_size_t i;
|
||||
|
||||
#if defined(__OS2__)
|
||||
PTIB tib;
|
||||
PPIB pib;
|
||||
#endif
|
||||
|
||||
static qse_cstr_t names[] =
|
||||
{
|
||||
{ QSE_T("pid"), 3 },
|
||||
{ QSE_T("ppid"), 5 },
|
||||
{ QSE_T("pgrp"), 4 },
|
||||
{ QSE_T("uid"), 3 },
|
||||
{ QSE_T("gid"), 3 },
|
||||
{ QSE_T("euid"), 4 },
|
||||
{ QSE_T("egid"), 4 },
|
||||
{ QSE_T("tid"), 3 }
|
||||
};
|
||||
|
||||
v_info = qse_awk_rtx_makemapval (rtx);
|
||||
if (v_info == QSE_NULL) return -1;
|
||||
|
||||
qse_awk_rtx_refupval (rtx, v_info);
|
||||
|
||||
#if defined(__OS2__)
|
||||
if (DosGetInfoBlocks (&tib, &pib) != NO_ERROR)
|
||||
{
|
||||
tib = QSE_NULL;
|
||||
pib = QSE_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < QSE_COUNTOF(names); i++)
|
||||
{
|
||||
qse_long_t val = -99931; /* -99931 randomly chosen */
|
||||
|
||||
#if defined(_WIN32)
|
||||
switch (i)
|
||||
{
|
||||
case 0: val = GetCurrentProcessId(); break;
|
||||
case 7: val = GetCurrentThreadId(); break;
|
||||
}
|
||||
#elif defined(__OS2__)
|
||||
switch (i)
|
||||
{
|
||||
case 0: if (pib) val = pib->pib_ulpid; break;
|
||||
case 7: if (tib && tib->tib_ptib2) val = tib->tib_ptib2->tib2_ultid; break;
|
||||
}
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
switch (i)
|
||||
{
|
||||
case 0: val = getpid(); break;
|
||||
case 1: val = getppid(); break;
|
||||
case 2: val = getpgrp(); break;
|
||||
case 3: val = getuid(); break;
|
||||
case 4: val = getgid(); break;
|
||||
case 5: val = geteuid(); break;
|
||||
case 6: val = getegid(); break;
|
||||
#if defined(HAVE_GETTID)
|
||||
case 7: val = gettid(); break;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
if (val == -99931) continue;
|
||||
|
||||
v_tmp = qse_awk_rtx_makeintval (rtx, val);
|
||||
if (v_tmp == QSE_NULL)
|
||||
{
|
||||
qse_awk_rtx_refdownval (rtx, v_info);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* increment reference count of v_tmp in advance as if
|
||||
* it has successfully been assigned into ARGV. */
|
||||
qse_awk_rtx_refupval (rtx, v_tmp);
|
||||
|
||||
if (qse_htb_upsert (
|
||||
((qse_awk_val_map_t*)v_info)->map,
|
||||
(void*)names[i].ptr, names[i].len, v_tmp, 0) == QSE_NULL)
|
||||
{
|
||||
/* if the assignment operation fails, decrements
|
||||
* the reference of v_tmp to free it */
|
||||
qse_awk_rtx_refdownval (rtx, v_tmp);
|
||||
|
||||
/* the values previously assigned into the
|
||||
* map will be freeed when v_env is freed */
|
||||
qse_awk_rtx_refdownval (rtx, v_info);
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (qse_awk_rtx_setgbl (rtx, gbl_id, v_info) == -1)
|
||||
{
|
||||
qse_awk_rtx_refdownval (rtx, v_info);
|
||||
return -1;
|
||||
}
|
||||
|
||||
qse_awk_rtx_refdownval (rtx, v_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int make_additional_globals (
|
||||
qse_awk_rtx_t* rtx, xtn_t* xtn,
|
||||
const qse_char_t* id, const qse_char_t*const icf[])
|
||||
{
|
||||
if (build_argcv (rtx, xtn->gbl_argc, xtn->gbl_argv, id, icf) <= -1 ||
|
||||
build_environ (rtx, xtn->gbl_environ) <= -1 ||
|
||||
build_procinfo (rtx, xtn->gbl_procinfo) <= -1) return -1;
|
||||
build_environ (rtx, xtn->gbl_environ) <= -1) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2282,20 +2196,6 @@ skip_system:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fnc_time (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||
{
|
||||
qse_awk_val_t* r;
|
||||
qse_ntime_t now;
|
||||
|
||||
if (qse_gettime (&now) <= -1) now = 0;
|
||||
|
||||
r = qse_awk_rtx_makeintval (rtx, now);
|
||||
if (r == QSE_NULL) return -1;
|
||||
|
||||
qse_awk_rtx_setretval (rtx, r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int timeout_code (const qse_char_t* name)
|
||||
{
|
||||
if (qse_strcasecmp (name, QSE_T("rtimeout")) == 0) return 0;
|
||||
@ -2600,11 +2500,11 @@ static int add_globals (qse_awk_t* awk)
|
||||
|
||||
xtn->gbl_argc = add_global (awk, QSE_T("ARGC"), 4);
|
||||
xtn->gbl_argv = add_global (awk, QSE_T("ARGV"), 4);
|
||||
xtn->gbl_environ = add_global (awk, QSE_T("ENVIRON"), 7);
|
||||
xtn->gbl_procinfo = add_global (awk, QSE_T("PROCINFO"), 8);
|
||||
|
||||
if (xtn->gbl_argc <= -1 || xtn->gbl_argv <= -1 ||
|
||||
xtn->gbl_environ <= -1 || xtn->gbl_procinfo <= -1) return -1;
|
||||
if (xtn->gbl_argc <= -1 || xtn->gbl_argv <= -1) return -1;
|
||||
|
||||
xtn->gbl_environ = add_global (awk, QSE_T("ENVIRON"), 7);
|
||||
if (xtn->gbl_environ <= -1) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2621,7 +2521,6 @@ static struct fnctab_t fnctab[] =
|
||||
{ {QSE_T("rand"), 4}, { {0, 0, QSE_NULL}, fnc_rand, 0 } },
|
||||
{ {QSE_T("srand"), 5}, { {0, 1, QSE_NULL}, fnc_srand, 0 } },
|
||||
{ {QSE_T("system"), 6}, { {1, 1, QSE_NULL}, fnc_system , 0 } },
|
||||
{ {QSE_T("time"), 4}, { {0, 0, QSE_NULL}, fnc_time, 0 } },
|
||||
{ {QSE_T("setioattr"), 9}, { {3, 3, QSE_NULL}, fnc_setioattr, QSE_AWK_RIO } },
|
||||
{ {QSE_T("getioattr"), 9}, { {2, 2, QSE_NULL}, fnc_getioattr, QSE_AWK_RIO } }
|
||||
};
|
||||
|
@ -27,36 +27,36 @@
|
||||
|
||||
#define CHUNKSIZE QSE_AWK_VAL_CHUNK_SIZE
|
||||
|
||||
static qse_awk_val_nil_t awk_nil = { QSE_AWK_VAL_NIL, 0, 0 };
|
||||
static qse_awk_val_str_t awk_zls = { QSE_AWK_VAL_STR, 0, 0, { QSE_T(""), 0 } };
|
||||
static qse_awk_val_nil_t awk_nil = { QSE_AWK_VAL_NIL, 0, 1, 0 };
|
||||
static qse_awk_val_str_t awk_zls = { QSE_AWK_VAL_STR, 0, 1, 0, { QSE_T(""), 0 } };
|
||||
|
||||
qse_awk_val_t* qse_awk_val_nil = (qse_awk_val_t*)&awk_nil;
|
||||
qse_awk_val_t* qse_awk_val_zls = (qse_awk_val_t*)&awk_zls;
|
||||
|
||||
static qse_awk_val_int_t awk_int[] =
|
||||
{
|
||||
{ QSE_AWK_VAL_INT, 0, 0, -1, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 0, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 1, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 2, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 3, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 4, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 5, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 6, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 7, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 8, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 9, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 10, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 11, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 12, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 13, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 14, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 15, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 16, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 17, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 18, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 19, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 0, 20, QSE_NULL }
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, -1, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 0, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 1, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 2, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 3, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 4, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 5, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 6, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 7, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 8, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 9, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 10, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 11, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 12, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 13, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 14, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 15, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 16, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 17, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 18, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 19, QSE_NULL },
|
||||
{ QSE_AWK_VAL_INT, 0, 1, 0, 20, QSE_NULL }
|
||||
};
|
||||
|
||||
qse_awk_val_t* qse_awk_val_negone = (qse_awk_val_t*)&awk_int[0];
|
||||
@ -123,6 +123,7 @@ qse_awk_val_t* qse_awk_rtx_makeintval (qse_awk_rtx_t* rtx, qse_long_t v)
|
||||
|
||||
val->type = QSE_AWK_VAL_INT;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->val = v;
|
||||
val->nde = QSE_NULL;
|
||||
@ -178,6 +179,7 @@ qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_flt_t v)
|
||||
|
||||
val->type = QSE_AWK_VAL_FLT;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->val = v;
|
||||
val->nde = QSE_NULL;
|
||||
@ -322,6 +324,7 @@ init:
|
||||
#endif
|
||||
val->type = QSE_AWK_VAL_STR;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->val.len = str->len;
|
||||
val->val.ptr = (qse_char_t*)(val + 1);
|
||||
@ -380,6 +383,7 @@ init:
|
||||
#endif
|
||||
val->type = QSE_AWK_VAL_STR;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->val.len = len1 + len2;
|
||||
val->val.ptr = (qse_char_t*)(val + 1);
|
||||
@ -436,6 +440,7 @@ qse_awk_val_t* qse_awk_rtx_makerexval (
|
||||
|
||||
val->type = QSE_AWK_VAL_REX;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->str.len = str->len;
|
||||
|
||||
@ -506,6 +511,7 @@ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx)
|
||||
|
||||
val->type = QSE_AWK_VAL_MAP;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->map = qse_htb_open (
|
||||
run, 256, 70, free_mapval, same_mapval, run->awk->mmgr);
|
||||
@ -530,6 +536,7 @@ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx)
|
||||
|
||||
val->type = QSE_AWK_VAL_MAP;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->map = (qse_htb_t*)(val + 1);
|
||||
|
||||
@ -715,6 +722,7 @@ qse_awk_val_t* qse_awk_rtx_makerefval (
|
||||
|
||||
val->type = QSE_AWK_VAL_REF;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->nstr = 0;
|
||||
val->id = id;
|
||||
val->adr = adr;
|
||||
@ -722,6 +730,15 @@ qse_awk_val_t* qse_awk_rtx_makerefval (
|
||||
return (qse_awk_val_t*)val;
|
||||
}
|
||||
|
||||
/*
|
||||
* if shared objects link a static library, statically defined objects
|
||||
* in the static library will be instatiated in the multiple shared objects.
|
||||
*
|
||||
* so equality check with a value pointer doesn't work
|
||||
* if the code crosses the library boundaries. instead, i decided to
|
||||
* add a field to indicate if a value is static.
|
||||
*
|
||||
|
||||
#define IS_STATICVAL(val) \
|
||||
((val) == QSE_NULL || \
|
||||
(val) == qse_awk_val_nil || \
|
||||
@ -730,6 +747,8 @@ qse_awk_val_t* qse_awk_rtx_makerefval (
|
||||
(val) == qse_awk_val_one || \
|
||||
((val) >= (qse_awk_val_t*)&awk_int[0] && \
|
||||
(val) <= (qse_awk_val_t*)&awk_int[QSE_COUNTOF(awk_int)-1]))
|
||||
*/
|
||||
#define IS_STATICVAL(val) ((val)->stat)
|
||||
|
||||
int qse_awk_rtx_isstaticval (qse_awk_rtx_t* rtx, qse_awk_val_t* val)
|
||||
{
|
||||
@ -853,8 +872,8 @@ void qse_awk_rtx_refdownval (qse_awk_rtx_t* rtx, qse_awk_val_t* val)
|
||||
#endif
|
||||
|
||||
QSE_ASSERTX (val->ref > 0,
|
||||
"the reference count of a value should be greater than zero for it"
|
||||
" to be decremented. check the source code for any bugs");
|
||||
"the reference count of a value should be greater than zero for it "
|
||||
"to be decremented. check the source code for any bugs");
|
||||
|
||||
val->ref--;
|
||||
if (val->ref <= 0)
|
||||
|
Reference in New Issue
Block a user