diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index 7c5623e4..0c0ac5af 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1036,7 +1036,7 @@ static int awk_main (int argc, qse_char_t* argv[]) mmgr = &xma_mmgr; } - awk = qse_awk_openstdwithmmgr (mmgr, 0); + awk = qse_awk_openstdwithmmgr (mmgr, 0, QSE_NULL); /*awk = qse_awk_openstd (0);*/ if (awk == QSE_NULL) { diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 23dde2f8..33663513 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1435,7 +1435,7 @@ extern "C" { #endif /** - * The qse_awk_open() function creates a new qse_awk_t object. The object + * The qse_awk_open() function creates a new #qse_awk_t object. The object * created can be passed to other qse_awk_xxx() functions and is valid until * it is destroyed with the qse_awk_close() function. The function saves the * memory manager pointer while it copies the contents of the primitive @@ -1451,24 +1451,28 @@ extern "C" { * &mmgr, // NOT OK because the contents of mmgr is * // invalidated when dummy() returns. * 0, - * &prm // OK + * &prm, // OK + * QSE_NULL * ); * } * \endcode * + * Upon failure, it stores the error number to a variable pointed to + * by \a errnum. if \a errnum is #QSE_NULL, no error number is stored. + * * \return a pointer to a qse_awk_t object on success, #QSE_NULL on failure. */ QSE_EXPORT qse_awk_t* qse_awk_open ( - qse_mmgr_t* mmgr, /**< memory manager */ - qse_size_t xtnsize, /**< extension size in bytes */ - qse_awk_prm_t* prm /**< pointer to a primitive function structure */ + qse_mmgr_t* mmgr, /**< memory manager */ + qse_size_t xtnsize, /**< extension size in bytes */ + const qse_awk_prm_t* prm, /**< pointer to a primitive function structure */ + qse_awk_errnum_t* errnum /**< pointer to an error number varaible */ ); /** * The qse_awk_close() function destroys a qse_awk_t object. - * \return 0 on success, -1 on failure */ -QSE_EXPORT int qse_awk_close ( +QSE_EXPORT void qse_awk_close ( qse_awk_t* awk /**< awk */ ); @@ -1512,10 +1516,9 @@ QSE_EXPORT void qse_awk_setprm ( * reuse a qse_awk_t instance that finished being used, you may call * qse_awk_clear() instead of destroying and creating a new * #qse_awk_t instance using qse_awk_close() and qse_awk_open(). - * - * \return 0 on success, -1 on failure + */ -QSE_EXPORT int qse_awk_clear ( +QSE_EXPORT void qse_awk_clear ( qse_awk_t* awk ); diff --git a/qse/include/qse/awk/stdawk.h b/qse/include/qse/awk/stdawk.h index 4cc9c99d..f87d62fd 100644 --- a/qse/include/qse/awk/stdawk.h +++ b/qse/include/qse/awk/stdawk.h @@ -96,7 +96,8 @@ extern "C" { * over qse_awk_open() if you don't need finer-grained customization. */ QSE_EXPORT qse_awk_t* qse_awk_openstd ( - qse_size_t xtnsize /**< extension size in bytes */ + qse_size_t xtnsize, /**< extension size in bytes */ + qse_awk_errnum_t* errnum /**< pointer to an error number variable */ ); /** @@ -105,8 +106,9 @@ QSE_EXPORT qse_awk_t* qse_awk_openstd ( * except that you can specify your own memory manager. */ QSE_EXPORT qse_awk_t* qse_awk_openstdwithmmgr ( - qse_mmgr_t* mmgr, /**< memory manager */ - qse_size_t xtnsize /**< extension size in bytes */ + qse_mmgr_t* mmgr, /**< memory manager */ + qse_size_t xtnsize, /**< extension size in bytes */ + qse_awk_errnum_t* errnum /**< pointer to an error number variable */ ); /** diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index d9fd7347..e397e609 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1122,10 +1122,11 @@ int Awk::open () prm.modclose = modclose; prm.modsym = modsym; - awk = qse_awk_open (this->getMmgr(), QSE_SIZEOF(xtn_t), &prm); + qse_awk_errnum_t errnum; + awk = qse_awk_open (this->getMmgr(), QSE_SIZEOF(xtn_t), &prm, &errnum); if (awk == QSE_NULL) { - setError (QSE_AWK_ENOMEM); + this->setError (errnum); return -1; } @@ -1145,7 +1146,7 @@ int Awk::open () qse_awk_close (awk); awk = QSE_NULL; - setError (QSE_AWK_ENOMEM); + this->setError (QSE_AWK_ENOMEM); return -1; } diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index afd545be..bb7739c7 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -54,7 +54,7 @@ static int init_token (qse_mmgr_t* mmgr, qse_awk_tok_t* tok) static void fini_token (qse_awk_tok_t* tok) { - if (tok->name != QSE_NULL) + if (tok->name) { qse_str_close (tok->name); tok->name = QSE_NULL; @@ -63,17 +63,44 @@ static void fini_token (qse_awk_tok_t* tok) static void clear_token (qse_awk_tok_t* tok) { - if (tok->name != QSE_NULL) qse_str_clear (tok->name); + if (tok->name) qse_str_clear (tok->name); tok->type = 0; tok->loc.file = QSE_NULL; tok->loc.line = 0; tok->loc.colm = 0; } -qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* prm) +qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_awk_prm_t* prm, qse_awk_errnum_t* errnum) { qse_awk_t* awk; + awk = (qse_awk_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_awk_t) + xtnsize); + if (awk) + { + int xret; + + xret = qse_awk_init (awk, mmgr, prm); + if (xret <= -1) + { + if (errnum) *errnum = qse_awk_geterrnum(awk); + QSE_MMGR_FREE (mmgr, awk); + awk = QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(awk), 0, xtnsize); + } + else if (errnum) *errnum = QSE_AWK_ENOMEM; + + return awk; +} + +void qse_awk_close (qse_awk_t* awk) +{ + qse_awk_fini (awk); + QSE_MMGR_FREE (awk->mmgr, awk); +} + +int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm) +{ static qse_htb_style_t treefuncbs = { { @@ -106,16 +133,20 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr QSE_HTB_HASHER_DEFAULT }; - /* allocate the object */ - awk = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_awk_t) + xtnsize); - if (awk == QSE_NULL) return QSE_NULL; - - /* zero out the object + extension area */ - QSE_MEMSET (awk, 0, QSE_SIZEOF(qse_awk_t) + xtnsize); + /* zero out the object */ + QSE_MEMSET (awk, 0, QSE_SIZEOF(qse_awk_t)); /* remember the memory manager */ awk->mmgr = mmgr; + /* initialize error handling fields */ + awk->errinf.num = QSE_AWK_ENOERR; + awk->errinf.loc.line = 0; + awk->errinf.loc.colm = 0; + awk->errinf.loc.file = QSE_NULL; + awk->errstr = qse_awk_dflerrstr; + awk->stopall = 0; + /* progagate the primitive functions */ QSE_ASSERT (prm != QSE_NULL); QSE_ASSERT (prm->math.pow != QSE_NULL); @@ -124,48 +155,68 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr prm->math.pow == QSE_NULL || prm->math.mod == QSE_NULL) { - QSE_AWK_FREE (awk, awk); - return QSE_NULL; + qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); + goto oops; } awk->prm = *prm; - if (init_token (mmgr, &awk->ptok) == -1) goto oops; - if (init_token (mmgr, &awk->tok) == -1) goto oops; - if (init_token (mmgr, &awk->ntok) == -1) goto oops; + if (init_token (mmgr, &awk->ptok) <= -1 || + init_token (mmgr, &awk->tok) <= -1 || + init_token (mmgr, &awk->ntok) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); + goto oops; + } + + awk->opt.trait = QSE_AWK_MODERN; +#if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) + awk->opt.trait |= QSE_AWK_CRLF; +#endif + + awk->tree.ngbls = 0; + awk->tree.ngbls_base = 0; + awk->tree.begin = QSE_NULL; + awk->tree.begin_tail = QSE_NULL; + awk->tree.end = QSE_NULL; + awk->tree.end_tail = QSE_NULL; + awk->tree.chain = QSE_NULL; + awk->tree.chain_tail = QSE_NULL; + awk->tree.chain_size = 0; /* TODO: initial map size?? */ - awk->tree.funs = qse_htb_open ( - mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1 - ); - if (awk->tree.funs == QSE_NULL) goto oops; - *(qse_awk_t**)QSE_XTN(awk->tree.funs) = awk; - qse_htb_setstyle (awk->tree.funs, &treefuncbs); - - awk->parse.funs = qse_htb_open ( - mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1 - ); - if (awk->parse.funs == QSE_NULL) goto oops; - *(qse_awk_t**)QSE_XTN(awk->parse.funs) = awk; - qse_htb_setstyle (awk->parse.funs, - qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER) - ); - - awk->parse.named = qse_htb_open ( - mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1 - ); - if (awk->parse.named == QSE_NULL) goto oops; - *(qse_awk_t**)QSE_XTN(awk->parse.named) = awk; - qse_htb_setstyle (awk->parse.named, - qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER) - ); + awk->tree.funs = qse_htb_open (mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1); + awk->parse.funs = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1); + awk->parse.named = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1); awk->parse.gbls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 128); awk->parse.lcls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 64); awk->parse.params = qse_lda_open (mmgr, QSE_SIZEOF(awk), 32); - if (awk->parse.gbls == QSE_NULL || + awk->fnc.sys = QSE_NULL; + awk->fnc.user = qse_htb_open (mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1); + awk->modtab = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1); + + if (awk->tree.funs == QSE_NULL || + awk->parse.funs == QSE_NULL || + awk->parse.named == QSE_NULL || + awk->parse.gbls == QSE_NULL || awk->parse.lcls == QSE_NULL || - awk->parse.params == QSE_NULL) goto oops; + awk->parse.params == QSE_NULL || + awk->fnc.user == QSE_NULL || + awk->modtab == QSE_NULL) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); + goto oops; + } + + *(qse_awk_t**)QSE_XTN(awk->tree.funs) = awk; + qse_htb_setstyle (awk->tree.funs, &treefuncbs); + + *(qse_awk_t**)QSE_XTN(awk->parse.funs) = awk; + qse_htb_setstyle (awk->parse.funs, qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)); + + *(qse_awk_t**)QSE_XTN(awk->parse.named) = awk; + qse_htb_setstyle (awk->parse.named, qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)); *(qse_awk_t**)QSE_XTN(awk->parse.gbls) = awk; qse_lda_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t)); @@ -179,46 +230,18 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr qse_lda_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t)); qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE); - awk->opt.trait = QSE_AWK_MODERN; -#if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) - awk->opt.trait |= QSE_AWK_CRLF; -#endif - - awk->errinf.num = QSE_AWK_ENOERR; - awk->errinf.loc.line = 0; - awk->errinf.loc.colm = 0; - awk->errinf.loc.file = QSE_NULL; - awk->errstr = qse_awk_dflerrstr; - awk->stopall = 0; - - awk->tree.ngbls = 0; - awk->tree.ngbls_base = 0; - awk->tree.begin = QSE_NULL; - awk->tree.begin_tail = QSE_NULL; - awk->tree.end = QSE_NULL; - awk->tree.end_tail = QSE_NULL; - awk->tree.chain = QSE_NULL; - awk->tree.chain_tail = QSE_NULL; - awk->tree.chain_size = 0; - - awk->fnc.sys = QSE_NULL; - awk->fnc.user = qse_htb_open ( - mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1 - ); - if (awk->fnc.user == QSE_NULL) goto oops; *(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk; qse_htb_setstyle (awk->fnc.user, &fncusercbs); - awk->modtab = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1); - if (awk->modtab == QSE_NULL) goto oops; - qse_rbt_setstyle ( - awk->modtab, - qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS) - ); + qse_rbt_setstyle (awk->modtab, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS)); - if (qse_awk_initgbls (awk) <= -1) goto oops; + if (qse_awk_initgbls (awk) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); + goto oops; + } - return awk; + return 0; oops: if (awk->modtab) qse_rbt_close (awk->modtab); @@ -232,17 +255,16 @@ oops: fini_token (&awk->ntok); fini_token (&awk->tok); fini_token (&awk->ptok); - QSE_AWK_FREE (awk, awk); - return QSE_NULL; + return -1; } -int qse_awk_close (qse_awk_t* awk) +void qse_awk_fini (qse_awk_t* awk) { qse_awk_ecb_t* ecb; int i; - if (qse_awk_clear (awk) <= -1) return -1; + qse_awk_clear (awk); /*qse_awk_clrfnc (awk);*/ for (ecb = awk->ecb; ecb; ecb = ecb->next) @@ -268,14 +290,8 @@ int qse_awk_close (qse_awk_t* awk) /* destroy dynamically allocated options */ for (i = 0; i < QSE_COUNTOF(awk->opt.mod); i++) { - if (awk->opt.mod[i].ptr) - QSE_MMGR_FREE (awk->mmgr, awk->opt.mod[i].ptr); + if (awk->opt.mod[i].ptr) QSE_AWK_FREE (awk, awk->opt.mod[i].ptr); } - - /* QSE_AWK_ALLOC, QSE_AWK_FREE, etc can not be used - * from the next line onwards */ - QSE_AWK_FREE (awk, awk); - return 0; } static qse_rbt_walk_t unload_module (qse_rbt_t* rbt, qse_rbt_pair_t* pair, void* ctx) @@ -290,12 +306,12 @@ static qse_rbt_walk_t unload_module (qse_rbt_t* rbt, qse_rbt_pair_t* pair, void* return QSE_RBT_WALK_FORWARD; } -int qse_awk_clear (qse_awk_t* awk) +void qse_awk_clear (qse_awk_t* awk) { qse_awk_ecb_t* ecb; - for (ecb = awk->ecb; ecb; ecb = ecb->next) - if (ecb->clear) ecb->clear (awk); + for (ecb = awk->ecb; ecb; ecb = ecb->next) + if (ecb->clear) ecb->clear (awk); awk->stopall = 0; @@ -360,7 +376,7 @@ int qse_awk_clear (qse_awk_t* awk) awk->tree.chain = next; } - awk->tree.chain_tail = QSE_NULL; + awk->tree.chain_tail = QSE_NULL; awk->tree.chain_size = 0; /* this table must not be cleared here as there can be a reference @@ -368,7 +384,6 @@ int qse_awk_clear (qse_awk_t* awk) * failed. this table is cleared in qse_awk_parse(). * qse_awk_claersionames (awk); */ - return 0; } qse_mmgr_t* qse_awk_getmmgr (qse_awk_t* awk) @@ -429,8 +444,7 @@ int qse_awk_setopt (qse_awk_t* awk, qse_awk_opt_t id, const void* value) if (dup_str_opt (awk, value, &tmp) <= -1) return -1; idx = id - QSE_AWK_MODPREFIX; - if (awk->opt.mod[idx].ptr) - QSE_MMGR_FREE (awk->mmgr, awk->opt.mod[idx].ptr); + if (awk->opt.mod[idx].ptr) QSE_AWK_FREE (awk, awk->opt.mod[idx].ptr); awk->opt.mod[idx] = tmp; return 0; @@ -440,8 +454,7 @@ int qse_awk_setopt (qse_awk_t* awk, qse_awk_opt_t id, const void* value) { qse_cstr_t tmp; if (dup_str_opt (awk, value, &tmp) <= -1) return -1; - if (awk->opt.incldirs.ptr) - QSE_MMGR_FREE (awk->mmgr, awk->opt.incldirs.ptr); + if (awk->opt.incldirs.ptr) QSE_AWK_FREE (awk, awk->opt.incldirs.ptr); awk->opt.incldirs = tmp; return 0; } diff --git a/qse/lib/awk/awk.h b/qse/lib/awk/awk.h index d130dc58..f4455947 100644 --- a/qse/lib/awk/awk.h +++ b/qse/lib/awk/awk.h @@ -360,4 +360,16 @@ struct qse_awk_mod_data_t qse_awk_mod_t mod; }; + +#ifdef __cplusplus +extern "C" { +#endif + +int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm); +void qse_awk_fini (qse_awk_t* awk); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index a0d6576a..a8cc3dfe 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -619,7 +619,7 @@ oops: prev = awk->sio.inp->prev; QSE_ASSERT (awk->sio.inp->name != QSE_NULL); - QSE_MMGR_FREE (awk->mmgr, awk->sio.inp); + QSE_AWK_FREE (awk, awk->sio.inp); awk->sio.inp = prev; } @@ -660,7 +660,7 @@ void qse_awk_clearsionames (qse_awk_t* awk) { cur = awk->sio_names; awk->sio_names = cur->link; - QSE_MMGR_FREE (awk->mmgr, cur); + QSE_AWK_FREE (awk, cur); } } @@ -726,7 +726,7 @@ static int end_include (qse_awk_t* awk) awk->sio.inp = awk->sio.inp->prev; QSE_ASSERT (cur->name != QSE_NULL); - QSE_MMGR_FREE (awk->mmgr, cur); + QSE_AWK_FREE (awk, cur); awk->parse.depth.incl--; if (x != 0) @@ -822,7 +822,7 @@ static int begin_include (qse_awk_t* awk) oops: /* i don't need to free 'link' here since it's linked to awk->sio_names * that's freed at the beginning of qse_awk_parse() or by qse_awk_close(). */ - if (arg) QSE_MMGR_FREE (awk->mmgr, arg); + if (arg) QSE_AWK_FREE (awk, arg); return -1; } @@ -5135,7 +5135,7 @@ static qse_awk_nde_t* parse_primary_ident ( { /* the FNC node takes the full name but other * nodes don't. so i need to free it. i know it's ugly. */ - QSE_MMGR_FREE (awk->mmgr, full.ptr); + QSE_AWK_FREE (awk, full.ptr); } } else diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 81e0a335..b2e9ce43 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1653,7 +1653,7 @@ oops: { qse_awk_rtx_refdownval (rtx, v[--i]); } - QSE_MMGR_FREE (rtx->awk->mmgr, v); + QSE_AWK_FREE (rtx->awk, v); return ret; } diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 284e028a..22c291bc 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -379,9 +379,9 @@ static void* custom_awk_modsym (qse_awk_t* awk, void* handle, const qse_char_t* static int add_globals (qse_awk_t* awk); static int add_functions (qse_awk_t* awk); -qse_awk_t* qse_awk_openstd (qse_size_t xtnsize) +qse_awk_t* qse_awk_openstd (qse_size_t xtnsize, qse_awk_errnum_t* errnum) { - return qse_awk_openstdwithmmgr (QSE_MMGR_GETDFL(), xtnsize); + return qse_awk_openstdwithmmgr (QSE_MMGR_GETDFL(), xtnsize, errnum); } static void fini_xtn (qse_awk_t* awk) @@ -397,7 +397,7 @@ static void clear_xtn (qse_awk_t* awk) /* nothing to do */ } -qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) +qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_errnum_t* errnum) { qse_awk_t* awk; qse_awk_prm_t prm; @@ -411,7 +411,7 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) prm.modsym = custom_awk_modsym; /* create an object */ - awk = qse_awk_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize, &prm); + awk = qse_awk_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize, &prm, errnum); if (awk == QSE_NULL) return QSE_NULL; /* initialize extension */ diff --git a/qse/lib/cmn/dir.c b/qse/lib/cmn/dir.c index 7150e64a..76b2285b 100644 --- a/qse/lib/cmn/dir.c +++ b/qse/lib/cmn/dir.c @@ -102,10 +102,7 @@ qse_dir_t* qse_dir_open ( } else QSE_MEMSET (dir + 1, 0, xtnsize); } - else - { - if (errnum) *errnum = QSE_DIR_ENOMEM; - } + else if (errnum) *errnum = QSE_DIR_ENOMEM; return dir; } diff --git a/qse/lib/cmn/dll.c b/qse/lib/cmn/dll.c index 940205b4..d2a886eb 100644 --- a/qse/lib/cmn/dll.c +++ b/qse/lib/cmn/dll.c @@ -58,7 +58,7 @@ qse_dll_t* qse_dll_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) return QSE_NULL; } - QSE_MEMSET (dll + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(dll), 0, xtnsize); return dll; } diff --git a/qse/lib/cmn/env.c b/qse/lib/cmn/env.c index 43e8d49d..d9eddceb 100644 --- a/qse/lib/cmn/env.c +++ b/qse/lib/cmn/env.c @@ -45,15 +45,16 @@ qse_env_t* qse_env_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, int fromcurenv) qse_env_t* env; env = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_env_t) + xtnsize); - if (env == QSE_NULL) return QSE_NULL; - - if (qse_env_init (env, mmgr, fromcurenv) <= -1) + if (env) { - QSE_MMGR_FREE (mmgr, env); - return QSE_NULL; + if (qse_env_init (env, mmgr, fromcurenv) <= -1) + { + QSE_MMGR_FREE (mmgr, env); + return QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(env), 0, xtnsize); } - QSE_MEMSET (env + 1, 0, xtnsize); return env; } diff --git a/qse/lib/cmn/fio.c b/qse/lib/cmn/fio.c index 71ec7b80..70f46133 100644 --- a/qse/lib/cmn/fio.c +++ b/qse/lib/cmn/fio.c @@ -116,20 +116,21 @@ static dossetfilesizel_t dos_set_file_size_l = QSE_NULL; #endif qse_fio_t* qse_fio_open ( - qse_mmgr_t* mmgr, qse_size_t ext, + qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* path, int flags, int mode) { qse_fio_t* fio; - fio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_fio_t) + ext); - if (fio == QSE_NULL) return QSE_NULL; - - if (qse_fio_init (fio, mmgr, path, flags, mode) <= -1) + fio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_fio_t) + xtnsize); + if (fio) { - QSE_MMGR_FREE (mmgr, fio); - return QSE_NULL; + if (qse_fio_init (fio, mmgr, path, flags, mode) <= -1) + { + QSE_MMGR_FREE (mmgr, fio); + return QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(fio), 0, xtnsize); } - return fio; } diff --git a/qse/lib/cmn/htb.c b/qse/lib/cmn/htb.c index a554753e..017d127b 100644 --- a/qse/lib/cmn/htb.c +++ b/qse/lib/cmn/htb.c @@ -276,7 +276,7 @@ htb_t* qse_htb_open ( return QSE_NULL; } - QSE_MEMSET (htb + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(htb), 0, xtnsize); return htb; } diff --git a/qse/lib/cmn/lda.c b/qse/lib/cmn/lda.c index 7eab7c0e..f8183837 100644 --- a/qse/lib/cmn/lda.c +++ b/qse/lib/cmn/lda.c @@ -92,11 +92,11 @@ static QSE_INLINE slot_t* alloc_slot (lda_t* lda, void* dptr, size_t dlen) return n; } -lda_t* qse_lda_open (mmgr_t* mmgr, size_t ext, size_t capa) +lda_t* qse_lda_open (mmgr_t* mmgr, size_t xtnsize, size_t capa) { lda_t* lda; - lda = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(lda_t) + ext); + lda = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(lda_t) + xtnsize); if (lda == QSE_NULL) return QSE_NULL; if (qse_lda_init (lda, mmgr, capa) <= -1) @@ -105,6 +105,7 @@ lda_t* qse_lda_open (mmgr_t* mmgr, size_t ext, size_t capa) return QSE_NULL; } + QSE_MEMSET (QSE_XTN(lda), 0, xtnsize); return lda; } diff --git a/qse/lib/cmn/mux.c b/qse/lib/cmn/mux.c index 8d9efc33..52e9957d 100644 --- a/qse/lib/cmn/mux.c +++ b/qse/lib/cmn/mux.c @@ -249,8 +249,9 @@ qse_mux_t* qse_mux_open ( QSE_MMGR_FREE (mmgr, mux); mux = QSE_NULL; } - else QSE_MEMSET (mux + 1, 0, xtnsize); + else QSE_MEMSET (QSE_XTN(mux), 0, xtnsize); } + else if (errnum) *errnum = QSE_MUX_ENOMEM; return mux; } diff --git a/qse/lib/cmn/pio.c b/qse/lib/cmn/pio.c index 2e491767..8d4f580a 100644 --- a/qse/lib/cmn/pio.c +++ b/qse/lib/cmn/pio.c @@ -90,10 +90,7 @@ qse_pio_t* qse_pio_open ( QSE_MMGR_FREE (mmgr, pio); pio = QSE_NULL; } - else - { - QSE_MEMSET (pio + 1, 0, xtnsize); - } + else QSE_MEMSET (QSE_XTN(pio), 0, xtnsize); } return pio; diff --git a/qse/lib/cmn/pma.c b/qse/lib/cmn/pma.c index d3b7ba7d..268b0b71 100644 --- a/qse/lib/cmn/pma.c +++ b/qse/lib/cmn/pma.c @@ -60,7 +60,7 @@ qse_pma_t* qse_pma_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) return QSE_NULL; } - QSE_MEMSET (pma + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(pma), 0, xtnsize); return pma; } diff --git a/qse/lib/cmn/rex.c b/qse/lib/cmn/rex.c index 04503603..28045749 100644 --- a/qse/lib/cmn/rex.c +++ b/qse/lib/cmn/rex.c @@ -131,11 +131,11 @@ int qse_rex_init (qse_rex_t* rex, qse_mmgr_t* mmgr, qse_rex_node_t* code) return 0; } -qse_rex_t* qse_rex_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_rex_node_t* code) +qse_rex_t* qse_rex_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_rex_node_t* code) { qse_rex_t* rex; - rex = (qse_rex_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_rex_t) + xtn); + rex = (qse_rex_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_rex_t) + xtnsize); if (rex == QSE_NULL) return QSE_NULL; if (qse_rex_init (rex, mmgr, code) <= -1) @@ -144,6 +144,7 @@ qse_rex_t* qse_rex_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_rex_node_t* code) return QSE_NULL; } + QSE_MEMSET (QSE_XTN(rex), 0, xtnsize); return rex; } diff --git a/qse/lib/cmn/sio.c b/qse/lib/cmn/sio.c index bba55d32..7aa76010 100644 --- a/qse/lib/cmn/sio.c +++ b/qse/lib/cmn/sio.c @@ -103,15 +103,15 @@ qse_sio_t* qse_sio_open ( qse_sio_t* sio; sio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_sio_t) + xtnsize); - if (sio == QSE_NULL) return QSE_NULL; - - if (qse_sio_init (sio, mmgr, file, flags) <= -1) + if (sio) { - QSE_MMGR_FREE (mmgr, sio); - return QSE_NULL; + if (qse_sio_init (sio, mmgr, file, flags) <= -1) + { + QSE_MMGR_FREE (mmgr, sio); + return QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(sio), 0, xtnsize); } - - QSE_MEMSET (sio + 1, 0, xtnsize); return sio; } diff --git a/qse/lib/cmn/str-dyn.h b/qse/lib/cmn/str-dyn.h index 02ee4fe2..3dbfa4f2 100644 --- a/qse/lib/cmn/str-dyn.h +++ b/qse/lib/cmn/str-dyn.h @@ -37,7 +37,7 @@ str_t* str_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_size_t capa) } else { - QSE_MEMSET (str + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(str), 0, xtnsize); } } return str; diff --git a/qse/lib/cmn/tio.c b/qse/lib/cmn/tio.c index 3289c875..09ee291a 100644 --- a/qse/lib/cmn/tio.c +++ b/qse/lib/cmn/tio.c @@ -35,15 +35,16 @@ qse_tio_t* qse_tio_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, int flags) qse_tio_t* tio; tio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_tio_t) + xtnsize); - if (tio == QSE_NULL) return QSE_NULL; - - if (qse_tio_init (tio, mmgr, flags) <= -1) + if (tio) { - QSE_MMGR_FREE (mmgr, tio); - return QSE_NULL; - } + if (qse_tio_init (tio, mmgr, flags) <= -1) + { + QSE_MMGR_FREE (mmgr, tio); + return QSE_NULL; + } - QSE_MEMSET (tio + 1, 0, xtnsize); + else QSE_MEMSET (QSE_XTN(tio), 0, xtnsize); + } return tio; } diff --git a/qse/lib/cmn/tre.c b/qse/lib/cmn/tre.c index bdfeb1a6..30bafec2 100644 --- a/qse/lib/cmn/tre.c +++ b/qse/lib/cmn/tre.c @@ -35,7 +35,7 @@ qse_tre_t* qse_tre_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) return QSE_NULL; } - QSE_MEMSET (tre + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(tre), 0, xtnsize); return tre; } diff --git a/qse/lib/cmn/xma.c b/qse/lib/cmn/xma.c index cab3ab3a..56e08b47 100644 --- a/qse/lib/cmn/xma.c +++ b/qse/lib/cmn/xma.c @@ -122,7 +122,7 @@ qse_xma_t* qse_xma_open ( return QSE_NULL; } - QSE_MEMSET (xma + 1, 0, xtnsize); + QSE_MEMSET (QSE_XTN(xma), 0, xtnsize); return xma; } diff --git a/qse/lib/http/htrd.c b/qse/lib/http/htrd.c index 81f2ac97..62f0bb84 100644 --- a/qse/lib/http/htrd.c +++ b/qse/lib/http/htrd.c @@ -127,17 +127,16 @@ qse_htrd_t* qse_htrd_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) { qse_htrd_t* htrd; - htrd = (qse_htrd_t*) QSE_MMGR_ALLOC ( - mmgr, QSE_SIZEOF(qse_htrd_t) + xtnsize - ); - if (htrd == QSE_NULL) return QSE_NULL; - - if (qse_htrd_init (htrd, mmgr) <= -1) + htrd = (qse_htrd_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_htrd_t) + xtnsize); + if (htrd) { - QSE_MMGR_FREE (htrd->mmgr, htrd); - return QSE_NULL; + if (qse_htrd_init (htrd, mmgr) <= -1) + { + QSE_MMGR_FREE (mmgr, htrd); + return QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(htrd), 0, xtnsize); } - return htrd; } diff --git a/qse/lib/http/httpd.c b/qse/lib/http/httpd.c index 7f2cfb17..6442a684 100644 --- a/qse/lib/http/httpd.c +++ b/qse/lib/http/httpd.c @@ -43,18 +43,18 @@ qse_httpd_t* qse_httpd_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) { qse_httpd_t* httpd; - httpd = (qse_httpd_t*) QSE_MMGR_ALLOC ( - mmgr, QSE_SIZEOF(*httpd) + xtnsize - ); - if (httpd == QSE_NULL) return QSE_NULL; - - if (qse_httpd_init (httpd, mmgr) <= -1) + httpd = (qse_httpd_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_httpd_t) + xtnsize); + if (httpd) { - QSE_MMGR_FREE (httpd->mmgr, httpd); - return QSE_NULL; + + if (qse_httpd_init (httpd, mmgr) <= -1) + { + QSE_MMGR_FREE (mmgr, httpd); + return QSE_NULL; + } + else QSE_MEMSET (QSE_XTN(httpd), 0, xtnsize); } - QSE_MEMSET (httpd + 1, 0, xtnsize); return httpd; } diff --git a/qse/lib/http/upxd.c b/qse/lib/http/upxd.c index f25aa91c..fe9f500c 100644 --- a/qse/lib/http/upxd.c +++ b/qse/lib/http/upxd.c @@ -40,7 +40,7 @@ qse_upxd_t* qse_upxd_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) if (qse_upxd_init (upxd, mmgr) <= -1) { - QSE_MMGR_FREE (upxd->mmgr, upxd); + QSE_MMGR_FREE (mmgr, upxd); return QSE_NULL; } diff --git a/qse/lib/sed/sed.c b/qse/lib/sed/sed.c index b0faa950..7c02b94f 100644 --- a/qse/lib/sed/sed.c +++ b/qse/lib/sed/sed.c @@ -66,7 +66,7 @@ qse_sed_t* qse_sed_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) { if (qse_sed_init (sed, mmgr) <= -1) { - QSE_MMGR_FREE (sed->mmgr, sed); + QSE_MMGR_FREE (mmgr, sed); return QSE_NULL; } else QSE_MEMSET (QSE_XTN(sed), 0, xtnsize); diff --git a/qse/lib/xli/xli.c b/qse/lib/xli/xli.c index b2093641..e4c4ce00 100644 --- a/qse/lib/xli/xli.c +++ b/qse/lib/xli/xli.c @@ -35,7 +35,7 @@ qse_xli_t* qse_xli_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_size_t rootxt { if (qse_xli_init (xli, mmgr, rootxtnsize) <= -1) { - QSE_MMGR_FREE (xli->mmgr, xli); + QSE_MMGR_FREE (mmgr, xli); return QSE_NULL; } else QSE_MEMSET (QSE_XTN(xli), 0, xtnsize); @@ -78,11 +78,11 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr, qse_size_t rootxtnsize) return 0; oops: - qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); if (xli->root) QSE_MMGR_FREE (mmgr, xli->root); if (xli->schema) qse_rbt_close (xli->schema); if (xli->tok.name) qse_str_close (xli->tok.name); if (xli->dotted_curkey) qse_str_close (xli->dotted_curkey); + qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); return -1; } diff --git a/qse/samples/awk/awk01.c b/qse/samples/awk/awk01.c index b6b9e546..1eb3fa24 100644 --- a/qse/samples/awk/awk01.c +++ b/qse/samples/awk/awk01.c @@ -14,7 +14,7 @@ int main () qse_openstdsios (); /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk02.c b/qse/samples/awk/awk02.c index 9a22afe3..12d76bee 100644 --- a/qse/samples/awk/awk02.c +++ b/qse/samples/awk/awk02.c @@ -85,7 +85,7 @@ static int awk_main (int argc, qse_char_t* argv[]) int ret = -1; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk03.c b/qse/samples/awk/awk03.c index 9deabe22..5d80dac8 100644 --- a/qse/samples/awk/awk03.c +++ b/qse/samples/awk/awk03.c @@ -93,7 +93,7 @@ static int awk_main (int argc, qse_char_t* argv[]) console_t* con; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk04.c b/qse/samples/awk/awk04.c index f0f440fa..abb775fc 100644 --- a/qse/samples/awk/awk04.c +++ b/qse/samples/awk/awk04.c @@ -27,7 +27,7 @@ static int awk_main (int argc, qse_char_t* argv[]) int ret = -1, i, opt; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk05.c b/qse/samples/awk/awk05.c index 40098864..7ee024c5 100644 --- a/qse/samples/awk/awk05.c +++ b/qse/samples/awk/awk05.c @@ -19,7 +19,7 @@ static int awk_main (int argc, qse_char_t* argv[]) int ret = -1, i, opt; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk06.c b/qse/samples/awk/awk06.c index a2a35f17..4f28db56 100644 --- a/qse/samples/awk/awk06.c +++ b/qse/samples/awk/awk06.c @@ -20,7 +20,7 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_fun_t* fun; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk07.c b/qse/samples/awk/awk07.c index 06839fef..b740eb56 100644 --- a/qse/samples/awk/awk07.c +++ b/qse/samples/awk/awk07.c @@ -26,7 +26,7 @@ static int awk_main (int argc, qse_char_t* argv[]) }; /* create a standard awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk08.c b/qse/samples/awk/awk08.c index 1157a207..54e558c0 100644 --- a/qse/samples/awk/awk08.c +++ b/qse/samples/awk/awk08.c @@ -26,7 +26,7 @@ static int awk_main (int argc, qse_char_t* argv[]) ginfo_t* ginfo; /* create an awk object */ - awk = qse_awk_openstd (QSE_SIZEOF(*ginfo)); + awk = qse_awk_openstd (QSE_SIZEOF(*ginfo), QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk09.c b/qse/samples/awk/awk09.c index 0f43c322..b2f07f2b 100644 --- a/qse/samples/awk/awk09.c +++ b/qse/samples/awk/awk09.c @@ -62,7 +62,7 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_fnc_spec_t spec; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk10.c b/qse/samples/awk/awk10.c index 3bbd0beb..b4521549 100644 --- a/qse/samples/awk/awk10.c +++ b/qse/samples/awk/awk10.c @@ -74,7 +74,7 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_fnc_spec_t spec; /* create an awk object */ - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk11.c b/qse/samples/awk/awk11.c index a2f24403..d803a053 100644 --- a/qse/samples/awk/awk11.c +++ b/qse/samples/awk/awk11.c @@ -74,7 +74,7 @@ int main () qse_openstdsios (); - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk12.c b/qse/samples/awk/awk12.c index 04e1bde3..3ccbb060 100644 --- a/qse/samples/awk/awk12.c +++ b/qse/samples/awk/awk12.c @@ -38,7 +38,7 @@ int main () qse_openstdsios (); - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); diff --git a/qse/samples/awk/awk15.c b/qse/samples/awk/awk15.c index 6acefffd..0a2cfb74 100644 --- a/qse/samples/awk/awk15.c +++ b/qse/samples/awk/awk15.c @@ -47,7 +47,7 @@ int main () qse_openstdsios (); - awk = qse_awk_openstd (0); + awk = qse_awk_openstd (0, QSE_NULL); if (awk == QSE_NULL) { qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n"));