updated hak_open()/hak_openstd()/etc to accept the pointer to hak_errinf_t to convey an error message upon instantiation failure.

added hak_errbint_t and hak_erruinf_t and related functions
enhanced the wchar_t detection for wide_char yes:4w
This commit is contained in:
2025-10-06 00:59:20 +09:00
parent 78f43c8b4f
commit 56dfb3630e
13 changed files with 298 additions and 143 deletions

102
lib/err.c
View File

@ -251,7 +251,7 @@ const hak_bch_t* hak_geterrbmsg (hak_t* hak)
msg = (hak->errmsg.len <= 0)? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf;
mbslen = HAK_COUNTOF(hak->errmsg.xerrmsg);
hak_conv_ucstr_to_bcstr_with_cmgr (msg, &wcslen, hak->errmsg.xerrmsg, &mbslen, HAK_CMGR(hak));
hak_conv_ucstr_to_bcstr_with_cmgr(msg, &wcslen, hak->errmsg.xerrmsg, &mbslen, HAK_CMGR(hak));
return hak->errmsg.xerrmsg;
#endif
@ -266,7 +266,7 @@ const hak_uch_t* hak_geterrumsg (hak_t* hak)
msg = (hak->errmsg.len <= 0)? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf;
wcslen = HAK_COUNTOF(hak->errmsg.xerrmsg);
hak_conv_bcstr_to_ucstr_with_cmgr (msg, &mbslen, hak->errmsg.xerrmsg, &wcslen, HAK_CMGR(hak), 1);
hak_conv_bcstr_to_ucstr_with_cmgr(msg, &mbslen, hak->errmsg.xerrmsg, &wcslen, HAK_CMGR(hak), 1);
return hak->errmsg.xerrmsg;
#else
@ -274,6 +274,60 @@ const hak_uch_t* hak_geterrumsg (hak_t* hak)
#endif
}
void hak_geterrbinf (hak_t* hak, hak_errbinf_t* errinf)
{
#if defined(HAK_OOCH_IS_BCH)
errinf->num = hak->errnum;
errinf->loc = hak->errloc;
hak_copy_oocstr(errinf->msg, HAK_COUNTOF(errinf->msg), (hak->errmsg[0] == '\0'? hak_errnum_to_errstr(hak->errnum): hak->errmsg));
#else
const hak_ooch_t* msg;
hak_oow_t wcslen, mbslen;
/*errinf->num = hak->errnum;*/
errinf->loc.line = hak->errloc.line;
errinf->loc.colm = hak->errloc.colm;
if (!hak->errloc.file) errinf->loc.file = HAK_NULL;
else
{
mbslen = HAK_COUNTOF(hak->errmsg.xerrlocfile);
hak_conv_ucstr_to_bcstr_with_cmgr(hak->errloc.file, &wcslen, hak->errmsg.xerrlocfile, &mbslen, hak->_cmgr);
errinf->loc.file = hak->errmsg.xerrlocfile; /* this can be truncated and is transient */
}
msg = (hak->errmsg.buf[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf;
mbslen = HAK_COUNTOF(errinf->msg);
hak_conv_ucstr_to_bcstr_with_cmgr(msg, &wcslen, errinf->msg, &mbslen, hak->_cmgr);
#endif
}
void hak_geterruinf (hak_t* hak, hak_erruinf_t* errinf)
{
#if defined(HAK_OOCH_IS_BCH)
const hak_ooch_t* msg;
hak_oow_t wcslen, mbslen;
/*errinf->num = hak->errnum;*/
errinf->loc.line = hak->errloc.line;
errinf->loc.colm = hak->errloc.colm;
if (!hak->errloc.file) errinf->loc.file = HAK_NULL;
else
{
wcslen = HAK_COUNTOF(hak->xerrlocfile);
hak_conv_bcstr_to_ucstr_with_cmgr(hak->errloc.file, &mbslen, hak->xerrlocfile, &wcslen, hak->_cmgr, 1);
errinf->loc.file = hak->xerrlocfile; /* this can be truncated and is transient */
}
msg = (hak->errmsg[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg;
wcslen = HAK_COUNTOF(errinf->msg);
hak_conv_bcstr_to_ucstr_with_cmgr(msg, &mbslen, errinf->msg, &wcslen, hak->_cmgr, 1);
#else
errinf->num = hak->errnum;
errinf->loc = hak->errloc;
hak_copy_oocstr(errinf->msg, HAK_COUNTOF(errinf->msg), (hak->errmsg.buf[0] == '\0'? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf));
#endif
}
hak_oow_t hak_copyerrbmsg (hak_t* hak, hak_bch_t* buf, hak_oow_t len)
{
return hak_copy_bcstr(buf, len, hak_geterrbmsg(hak));
@ -326,7 +380,7 @@ static int err_bcs (hak_t* hak, hak_fmtout_t* fmtout, const hak_bch_t* ptr, hak_
#if defined(HAK_OOCH_IS_UCH)
if (max <= 0) return 1;
hak_conv_bchars_to_uchars_with_cmgr (ptr, &len, &hak->errmsg.buf[hak->errmsg.len], &max, HAK_CMGR(hak), 1);
hak_conv_bchars_to_uchars_with_cmgr(ptr, &len, &hak->errmsg.buf[hak->errmsg.len], &max, HAK_CMGR(hak), 1);
hak->errmsg.len += max;
#else
if (len > max) len = max;
@ -353,7 +407,7 @@ static int err_ucs (hak_t* hak, hak_fmtout_t* fmtout, const hak_uch_t* ptr, hak_
hak->errmsg.len += len;
#else
if (max <= 0) return 1;
hak_conv_uchars_to_bchars_with_cmgr (ptr, &len, &hak->errmsg.buf[hak->errmsg.len], &max, HAK_CMGR(hak));
hak_conv_uchars_to_bchars_with_cmgr(ptr, &len, &hak->errmsg.buf[hak->errmsg.len], &max, HAK_CMGR(hak));
hak->errmsg.len += max;
#endif
hak->errmsg.buf[hak->errmsg.len] = '\0';
@ -373,9 +427,9 @@ void hak_seterrbfmt (hak_t* hak, hak_errnum_t errnum, const hak_bch_t* fmt, ...)
fo.putuchars = err_ucs;
fo.putobj = hak_fmt_object;
va_start (ap, fmt);
va_start(ap, fmt);
hak_bfmt_outv(hak, &fo, fmt, ap);
va_end (ap);
va_end(ap);
hak->errnum = errnum;
HAK_MEMSET(&hak->errloc, 0, HAK_SIZEOF(hak->errloc));
@ -394,9 +448,9 @@ void hak_seterrufmt (hak_t* hak, hak_errnum_t errnum, const hak_uch_t* fmt, ...)
fo.putuchars = err_ucs;
fo.putobj = hak_fmt_object;
va_start (ap, fmt);
va_start(ap, fmt);
hak_ufmt_outv(hak, &fo, fmt, ap);
va_end (ap);
va_end(ap);
hak->errnum = errnum;
HAK_MEMSET(&hak->errloc, 0, HAK_SIZEOF(hak->errloc));
@ -442,18 +496,18 @@ void hak_seterrufmtv (hak_t* hak, hak_errnum_t errnum, const hak_uch_t* fmt, va_
void hak_seterrbfmtloc (hak_t* hak, hak_errnum_t errnum, const hak_loc_t* loc, const hak_bch_t* fmt, ...)
{
va_list ap;
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrbfmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
hak->errloc = *loc;
}
void hak_seterrufmtloc (hak_t* hak, hak_errnum_t errnum, const hak_loc_t* loc, const hak_uch_t* fmt, ...)
{
va_list ap;
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrufmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
hak->errloc = *loc;
}
@ -488,9 +542,9 @@ void hak_seterrbfmtwithsyserr (hak_t* hak, int syserr_type, int syserr_code, con
{
errnum = hak->vmprim.syserrstrb(hak, syserr_type, syserr_code, hak->errmsg.tmpbuf.bch, HAK_COUNTOF(hak->errmsg.tmpbuf.bch));
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrbfmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
if (HAK_COUNTOF(hak->errmsg.buf) - hak->errmsg.len >= 5)
{
@ -512,9 +566,9 @@ void hak_seterrbfmtwithsyserr (hak_t* hak, int syserr_type, int syserr_code, con
HAK_ASSERT(hak, hak->vmprim.syserrstru != HAK_NULL);
errnum = hak->vmprim.syserrstru(hak, syserr_type, syserr_code, hak->errmsg.tmpbuf.uch, HAK_COUNTOF(hak->errmsg.tmpbuf.uch));
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrbfmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
if (HAK_COUNTOF(hak->errmsg.buf) - hak->errmsg.len >= 5)
{
@ -545,9 +599,9 @@ void hak_seterrufmtwithsyserr (hak_t* hak, int syserr_type, int syserr_code, con
{
errnum = hak->vmprim.syserrstrb(hak, syserr_type, syserr_code, hak->errmsg.tmpbuf.bch, HAK_COUNTOF(hak->errmsg.tmpbuf.bch));
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrufmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
if (HAK_COUNTOF(hak->errmsg.buf) - hak->errmsg.len >= 5)
{
@ -569,9 +623,9 @@ void hak_seterrufmtwithsyserr (hak_t* hak, int syserr_type, int syserr_code, con
HAK_ASSERT(hak, hak->vmprim.syserrstru != HAK_NULL);
errnum = hak->vmprim.syserrstru(hak, syserr_type, syserr_code, hak->errmsg.tmpbuf.uch, HAK_COUNTOF(hak->errmsg.tmpbuf.uch));
va_start (ap, fmt);
va_start(ap, fmt);
hak_seterrufmtv(hak, errnum, fmt, ap);
va_end (ap);
va_end(ap);
if (HAK_COUNTOF(hak->errmsg.buf) - hak->errmsg.len >= 5)
{
@ -617,9 +671,9 @@ void hak_setsynerrbfmt (hak_t* hak, hak_synerrnum_t num, const hak_loc_t* loc, c
va_list ap;
int i, selen;
va_start (ap, msgfmt);
va_start(ap, msgfmt);
hak_seterrbfmtv(hak, HAK_ESYNERR, msgfmt, ap);
va_end (ap);
va_end(ap);
selen = HAK_COUNTOF(syntax_error) - 1;
HAK_MEMMOVE(&hak->errmsg.buf[selen], &hak->errmsg.buf[0], HAK_SIZEOF(hak->errmsg.buf[0]) * (HAK_COUNTOF(hak->errmsg.buf) - selen));
@ -676,9 +730,9 @@ void hak_setsynerrufmt (hak_t* hak, hak_synerrnum_t num, const hak_loc_t* loc, c
va_list ap;
int i, selen;
va_start (ap, msgfmt);
va_start(ap, msgfmt);
hak_seterrufmtv(hak, HAK_ESYNERR, msgfmt, ap);
va_end (ap);
va_end(ap);
selen = HAK_COUNTOF(syntax_error) - 1;
HAK_MEMMOVE(&hak->errmsg.buf[selen], &hak->errmsg.buf[0], HAK_SIZEOF(hak->errmsg.buf[0]) * (HAK_COUNTOF(hak->errmsg.buf) - selen));