changed awk to carry on even if lt_dlinit() fails
This commit is contained in:
parent
763efada8f
commit
7675a86234
@ -140,7 +140,7 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm)
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* zero out the object */
|
/* zero out the object */
|
||||||
QSE_MEMSET (awk, 0, QSE_SIZEOF(qse_awk_t));
|
QSE_MEMSET (awk, 0, QSE_SIZEOF(*awk));
|
||||||
|
|
||||||
/* remember the memory manager */
|
/* remember the memory manager */
|
||||||
awk->mmgr = mmgr;
|
awk->mmgr = mmgr;
|
||||||
|
@ -114,6 +114,9 @@ typedef struct xtn_t
|
|||||||
int gbl_environ;
|
int gbl_environ;
|
||||||
|
|
||||||
qse_awk_ecb_t ecb;
|
qse_awk_ecb_t ecb;
|
||||||
|
#if defined(USE_LTDL)
|
||||||
|
int ltdl_fail;
|
||||||
|
#endif
|
||||||
} xtn_t;
|
} xtn_t;
|
||||||
|
|
||||||
typedef struct rxtn_t
|
typedef struct rxtn_t
|
||||||
@ -184,11 +187,19 @@ qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t
|
|||||||
int qse_awk_stdmodstartup (qse_awk_t* awk)
|
int qse_awk_stdmodstartup (qse_awk_t* awk)
|
||||||
{
|
{
|
||||||
#if defined(USE_LTDL)
|
#if defined(USE_LTDL)
|
||||||
|
|
||||||
/* lt_dlinit() can be called more than once and
|
/* lt_dlinit() can be called more than once and
|
||||||
* lt_dlexit() shuts down libltdl if it's called as many times as
|
* lt_dlexit() shuts down libltdl if it's called as many times as
|
||||||
* corresponding lt_dlinit(). so it's safe to call lt_dlinit()
|
* corresponding lt_dlinit(). so it's safe to call lt_dlinit()
|
||||||
* and lt_dlexit() at the library level. */
|
* and lt_dlexit() at the library level. */
|
||||||
return (lt_dlinit () != 0)? -1: 0;
|
if (lt_dlinit() != 0)
|
||||||
|
{
|
||||||
|
xtn_t* xtn = QSE_XTN(awk);
|
||||||
|
xtn->ltdl_fail = 1;
|
||||||
|
/* carry on even if ltdl initialize failed */
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
@ -199,8 +210,8 @@ int qse_awk_stdmodstartup (qse_awk_t* awk)
|
|||||||
void qse_awk_stdmodshutdown (qse_awk_t* awk)
|
void qse_awk_stdmodshutdown (qse_awk_t* awk)
|
||||||
{
|
{
|
||||||
#if defined(USE_LTDL)
|
#if defined(USE_LTDL)
|
||||||
|
xtn_t* xtn = QSE_XTN(awk);
|
||||||
lt_dlexit ();
|
if (!xtn->ltdl_fail) lt_dlexit ();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
@ -214,6 +225,15 @@ void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec)
|
|||||||
qse_mchar_t* modpath;
|
qse_mchar_t* modpath;
|
||||||
const qse_char_t* tmp[4];
|
const qse_char_t* tmp[4];
|
||||||
int count;
|
int count;
|
||||||
|
xtn_t* xtn = QSE_XTN(awk);
|
||||||
|
|
||||||
|
if (xtn->ltdl_fail)
|
||||||
|
{
|
||||||
|
/* ltdl_init() failed during initialization.
|
||||||
|
* return failure immediately */
|
||||||
|
qse_awk_seterrnum (awk, QSE_AWK_ENOIMPL, QSE_NULL);
|
||||||
|
return QSE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
if (spec->prefix) tmp[count++] = spec->prefix;
|
if (spec->prefix) tmp[count++] = spec->prefix;
|
||||||
@ -364,7 +384,7 @@ void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name)
|
|||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
mname = name;
|
mname = name;
|
||||||
#else
|
#else
|
||||||
mname = qse_wcstombsdup (name, QSE_NULL, awk->mmgr);
|
mname = qse_wcstombsdup (name, QSE_NULL, awk->mmgr);
|
||||||
if (!mname)
|
if (!mname)
|
||||||
{
|
{
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
@ -434,6 +454,7 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_aw
|
|||||||
|
|
||||||
/* initialize extension */
|
/* initialize extension */
|
||||||
xtn = (xtn_t*) QSE_XTN (awk);
|
xtn = (xtn_t*) QSE_XTN (awk);
|
||||||
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
|
||||||
/* add intrinsic global variables and functions */
|
/* add intrinsic global variables and functions */
|
||||||
if (add_globals(awk) <= -1 ||
|
if (add_globals(awk) <= -1 ||
|
||||||
|
@ -756,7 +756,7 @@ qse_httpd_t* qse_httpd_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
|||||||
if (httpd == QSE_NULL) goto oops;
|
if (httpd == QSE_NULL) goto oops;
|
||||||
|
|
||||||
xtn = (httpd_xtn_t*)qse_httpd_getxtn (httpd);
|
xtn = (httpd_xtn_t*)qse_httpd_getxtn (httpd);
|
||||||
QSE_MEMSET (xtn, 0, QSE_SIZEOF(httpd_xtn_t*));
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
|
||||||
#if defined(USE_LTDL)
|
#if defined(USE_LTDL)
|
||||||
/* lt_dlinit() can be called more than once and
|
/* lt_dlinit() can be called more than once and
|
||||||
|
@ -107,7 +107,17 @@ qse_sed_t* qse_sed_openstd (qse_size_t xtnsize)
|
|||||||
|
|
||||||
qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
||||||
{
|
{
|
||||||
return qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize);
|
qse_sed_t* sed;
|
||||||
|
xtn_t* xtn;
|
||||||
|
|
||||||
|
sed = qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize);
|
||||||
|
if (!sed) return QSE_NULL;
|
||||||
|
|
||||||
|
/* initialize the my own extension area excluding xtnsize */
|
||||||
|
xtn = (xtn_t*) QSE_XTN(sed);
|
||||||
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
|
||||||
|
return sed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qse_sed_getxtnstd (qse_sed_t* sed)
|
void* qse_sed_getxtnstd (qse_sed_t* sed)
|
||||||
|
@ -97,6 +97,7 @@ qse_xli_t* qse_xli_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_si
|
|||||||
|
|
||||||
/* initialize extension */
|
/* initialize extension */
|
||||||
xtn = (xtn_t*) QSE_XTN (xli);
|
xtn = (xtn_t*) QSE_XTN (xli);
|
||||||
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
|
||||||
xtn->ecb.close = fini_xtn;
|
xtn->ecb.close = fini_xtn;
|
||||||
xtn->ecb.clear = clear_xtn;
|
xtn->ecb.clear = clear_xtn;
|
||||||
|
Loading…
Reference in New Issue
Block a user