added hak_makesymbolwithuchars()/hak_makesymbolwithbchars()/hak_makestringwithuchars()/hak_makestirngwithbchars()

fixed some fpc code related to character type configured
This commit is contained in:
2025-10-08 23:38:24 +09:00
parent 56dfb3630e
commit 7504ec1a4c
20 changed files with 406 additions and 132 deletions

View File

@ -279,7 +279,7 @@ 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));
hak_copy_oocstr(errinf->msg, HAK_COUNTOF(errinf->msg), (hak->errmsg.buf[0] == '\0'? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf));
#else
const hak_ooch_t* msg;
hak_oow_t wcslen, mbslen;
@ -313,12 +313,12 @@ void hak_geterruinf (hak_t* hak, hak_erruinf_t* errinf)
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 */
wcslen = HAK_COUNTOF(hak->errmsg.xerrlocfile);
hak_conv_bcstr_to_ucstr_with_cmgr(hak->errloc.file, &mbslen, hak->errmsg.xerrlocfile, &wcslen, hak->_cmgr, 1);
errinf->loc.file = hak->errmsg.xerrlocfile; /* this can be truncated and is transient */
}
msg = (hak->errmsg[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg;
msg = (hak->errmsg.buf[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf;
wcslen = HAK_COUNTOF(errinf->msg);
hak_conv_bcstr_to_ucstr_with_cmgr(msg, &mbslen, errinf->msg, &wcslen, hak->_cmgr, 1);
#else

View File

@ -2660,7 +2660,7 @@ static HAK_INLINE int exec_syscmd (hak_t* hak, hak_ooi_t nargs)
if (HAK_LIKELY(argv))
{
argv[0] = cmd;
HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
//HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
for (i = 0; i < nargs;)
{
hak_oop_t ta = HAK_STACK_GETARG(hak, nargs, i);
@ -2669,17 +2669,21 @@ HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
{
/* TODO: rewrite this part */
hak_bch_t tmp[64];
snprintf (tmp, sizeof(tmp), "%ld", (long int)HAK_OOP_TO_SMOOI(ta));
snprintf(tmp, sizeof(tmp), "%ld", (long int)HAK_OOP_TO_SMOOI(ta));
argv[++i] = hak_dupbchars(hak, tmp, strlen(tmp));
}
else
{
#if defined(HAK_OOCH_IS_UCH)
argv[++i] = hak_dupootobchars(hak, HAK_OBJ_GET_CHAR_SLOT(ta), HAK_OBJ_GET_SIZE(ta), HAK_NULL);
#else
argv[++i] = hak_dupoochars(hak, HAK_OBJ_GET_CHAR_SLOT(ta), HAK_OBJ_GET_SIZE(ta));
#endif
}
/*HAK_DEBUG2 (hak, "ARG %d -> %hs\n", (int)i - 1, argv[i]);*/
}
argv[nargs + 1] = HAK_NULL;
execvp (xcmd, argv);
execvp(xcmd, argv);
}
if (cmd) hak_freemem(hak, cmd);

View File

@ -1599,11 +1599,23 @@ hak_oop_t hak_makesymbolwithbcstr (
const hak_bch_t* ptr
);
hak_oop_t hak_makesymbolwithbchars (
hak_t* hak,
const hak_bch_t* ptr,
hak_oow_t len
);
hak_oop_t hak_makesymbolwithucstr (
hak_t* hak,
const hak_uch_t* ptr
);
hak_oop_t hak_makesymbolwithuchars (
hak_t* hak,
const hak_uch_t* ptr,
hak_oow_t len
);
hak_oop_t hak_findsymbol (
hak_t* hak,
const hak_ooch_t* ptr,

View File

@ -213,7 +213,6 @@ typedef enum hak_synerrnum_t hak_synerrnum_t;
*/
struct hak_errbinf_t
{
hak_oow_t _instsize;
hak_errnum_t num; /**< error number */
hak_bch_t msg[HAK_ERRMSG_CAPA]; /**< error message */
hak_bloc_t loc; /**< error location */
@ -222,7 +221,6 @@ typedef struct hak_errbinf_t hak_errbinf_t;
struct hak_erruinf_t
{
hak_oow_t _instsize;
hak_errnum_t num; /**< error number */
hak_uch_t msg[HAK_ERRMSG_CAPA]; /**< error message */
hak_uloc_t loc; /**< error location */
@ -2972,6 +2970,18 @@ HAK_EXPORT hak_oop_t hak_makestring (
hak_oow_t len
);
HAK_EXPORT hak_oop_t hak_makestringwithuchars (
hak_t* hak,
const hak_uch_t* ptr,
hak_oow_t len
);
HAK_EXPORT hak_oop_t hak_makestringwithbchars (
hak_t* hak,
const hak_bch_t* ptr,
hak_oow_t len
);
HAK_EXPORT hak_oop_t hak_makefpdec (
hak_t* hak,
hak_oop_t value,
@ -3312,8 +3322,9 @@ HAK_EXPORT int hak_convutobcstr (
# define hak_dupootobcstr(hak,oocs,bcslen) hak_duputobcstr(hak,oocs,bcslen)
# define hak_dupbtooocstr(hak,bcs,oocslen) hak_dupbtoucstr(hak,bcs,oocslen)
# define hak_dupootoucstr(hak,oocs,ucslen) hak_dupucstr(hak,oocs,ucslen)
# define hak_duputooocstr(hak,ucs,oocslen) hak_dupucstr(hak,ucs,oocslen)
# define hak_dupootoucstr(hak,oocs,ucslen) hak_dupucstr(hak,oocs,ucslen)
# define hak_duputooocstr(hak,ucs,oocslen) hak_dupucstr(hak,ucs,oocslen)
#else
# define hak_dupootoucharswithheadroom(hak,hrb,oocs,oocslen,ucslen) hak_dupbtoucharswithheadroom(hak,hrb,oocs,oocslen,ucslen)
# define hak_duputooocharswithheadroom(hak,hrb,ucs,ucslen,oocslen) hak_duputobcharswithheadroom(hak,hrb,ucs,ucslen,oocslen)
@ -3393,7 +3404,7 @@ HAK_EXPORT hak_bch_t* hak_duputobcstr (
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupucstr(hak,oocs,oocslen)
#else
# define hak_dupoochars(hak,oocs,oocslen) hak_dupbchars(hak,oocs,oocslen)
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupbcstr(hak,oocs,oocslen)
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupbcstr(hak,oocs,oocslen)
#endif
HAK_EXPORT hak_uch_t* hak_dupuchars (

View File

@ -438,6 +438,66 @@ hak_oop_t hak_makestring (hak_t* hak, const hak_ooch_t* ptr, hak_oow_t len)
return v;
}
hak_oop_t hak_makestringwithuchars (hak_t* hak, const hak_uch_t* ptr, hak_oow_t len)
{
/* you must provide the payload when calling this variant. it can't figure out
* the actual number of hak_ooch_t characters */
if (!ptr)
{
hak_seterrbfmt(hak, HAK_EINVAL,
"unable to instantiate %O - null payload", hak->c_string->name);
return HAK_NULL;
}
#if defined(HAK_OOCH_IS_UCH)
return hak_makestring(hak, ptr, len);
#else
hak_oow_t xlen;
hak_ooch_t* xptr;
xptr = hak_duputooochars(hak, ptr, len, &xlen);
if (HAK_UNLIKELY(!xptr))
{
const hak_ooch_t* orgmsg = hak_backuperrmsg(hak);
hak_seterrbfmt(hak, HAK_ERRNUM(hak),
"unable to instantiate %O - %js", hak->c_string->name, orgmsg);
return HAK_NULL;
}
return hak_makestring(hak, xptr, xlen);
#endif
}
hak_oop_t hak_makestringwithbchars (hak_t* hak, const hak_bch_t* ptr, hak_oow_t len)
{
/* you must provide the payload when calling this variant. it can't figure out
* the actual number of hak_ooch_t characters */
if (!ptr)
{
hak_seterrbfmt(hak, HAK_EINVAL,
"unable to instantiate %O - null payload", hak->c_string->name);
return HAK_NULL;
}
#if defined(HAK_OOCH_IS_UCH)
hak_oow_t xlen;
hak_ooch_t* xptr;
xptr = hak_dupbtooochars(hak, ptr, len, &xlen);
if (HAK_UNLIKELY(!xptr))
{
const hak_ooch_t* orgmsg = hak_backuperrmsg(hak);
hak_seterrbfmt(hak, HAK_ERRNUM(hak),
"unable to instantiate %O - %js", hak->c_string->name, orgmsg);
return HAK_NULL;
}
return hak_makestring(hak, xptr, xlen);
#else
return hak_makestring(hak, ptr, len);
#endif
}
hak_oop_t hak_makefpdec (hak_t* hak, hak_oop_t value, hak_ooi_t scale)
{
hak_oop_fpdec_t f;

View File

@ -173,7 +173,7 @@ static HAK_INLINE int print_single_char (hak_t* hak, hak_fmtout_t* fmtout, hak_o
#if (HAK_SIZEOF_OOCH_T >= 4)
if (chu >= 0x10000u)
{
if (hak_bfmt_out(fmtout, "\\U%08X", chu) <= -1) return -1;
if (hak_bfmt_out(hak, fmtout, "\\U%08X", chu) <= -1) return -1;
}
else
#endif

View File

@ -3248,7 +3248,11 @@ static void* dlopen_pfmod (hak_t* hak, const hak_ooch_t* name, const hak_ooch_t*
{
xlen = dirlen;
dlen = bufcapa;
#if defined(HAK_OOCH_IS_UCH)
if (hak_convootobchars(hak, dirptr, &xlen, bufptr, &dlen) <= -1) return HAK_NULL;
#else
dlen = hak_copy_bchars_to_bcstr(bufptr, bufcapa, dirptr, dirlen);
#endif
if (dlen > 0 && bufptr[dlen - 1] != HAK_DFL_PATH_SEP)
{

View File

@ -202,12 +202,29 @@ hak_oop_t hak_makesymbolwithbcstr (hak_t* hak, const hak_bch_t* ptr)
#endif
}
hak_oop_t hak_makesymbolwithbchars (hak_t* hak, const hak_bch_t* ptr, hak_oow_t len)
{
#if defined(HAK_OOCH_IS_UCH)
hak_uch_t* ucsptr;
hak_oow_t ucslen;
hak_oop_t v;
/* TODO: no duplication? */
ucsptr = hak_dupbtouchars(hak, ptr, len, &ucslen);
if (HAK_UNLIKELY(!ucsptr)) return HAK_NULL;
v = hak_makesymbol(hak, ucsptr, ucslen);
hak_freemem(hak, ucsptr);
return v;
#else
return hak_makesymbol(hak, ptr, len);
#endif
}
hak_oop_t hak_makesymbolwithucstr (hak_t* hak, const hak_uch_t* ptr)
{
#if defined(HAK_OOCH_IS_UCH)
return hak_makesymbol(hak, ptr, hak_count_ucstr(ptr));
#else
hak_uch_t* bcsptr;
hak_bch_t* bcsptr;
hak_oow_t bcslen;
hak_oop_t v;
/* TODO: no duplication? */
@ -218,3 +235,20 @@ hak_oop_t hak_makesymbolwithucstr (hak_t* hak, const hak_uch_t* ptr)
return v;
#endif
}
hak_oop_t hak_makesymbolwithuchars (hak_t* hak, const hak_uch_t* ptr, hak_oow_t len)
{
#if defined(HAK_OOCH_IS_UCH)
return hak_makesymbol(hak, ptr, len);
#else
hak_bch_t* bcsptr;
hak_oow_t bcslen;
hak_oop_t v;
/* TODO: no duplication? */
bcsptr = hak_duputobchars(hak, ptr, len, &bcslen);
if (HAK_UNLIKELY(!bcsptr)) return HAK_NULL;
v = hak_makesymbol(hak, bcsptr, bcslen);
hak_freemem(hak, bcsptr);
return v;
#endif
}

View File

@ -375,22 +375,13 @@ int hak_unmarshalcode (hak_t* hak, hak_code_t* code, hak_xchg_reader_t rdr, void
}
nbytes = hak_leoowtoh(w);
if (b == HAK_XCHG_STRING_U)
if (nchars > usym_buf_capa)
{
ns = hak_makestring(hak, HAK_NULL, nchars);
if (HAK_UNLIKELY(!ns)) goto oops;
ucsptr = HAK_OBJ_GET_CHAR_PTR(ns, 0);
}
else
{
if (nchars > usym_buf_capa)
{
usym_buf_capa = nchars * HAK_SIZEOF(usym_buf[0]);
usym_buf = (hak_uch_t*)hak_allocmem(hak, usym_buf_capa);
if (HAK_UNLIKELY(!usym_buf)) goto oops;
}
ucsptr = usym_buf;
usym_buf_capa = nchars * HAK_SIZEOF(usym_buf[0]);
usym_buf = (hak_uch_t*)hak_allocmem(hak, usym_buf_capa);
if (HAK_UNLIKELY(!usym_buf)) goto oops;
}
ucsptr = usym_buf;
ucspos = 0;
bcsres = 0;
@ -420,14 +411,20 @@ int hak_unmarshalcode (hak_t* hak, hak_code_t* code, hak_xchg_reader_t rdr, void
HAK_ASSERT(hak, ucspos == nchars);
if (b != HAK_XCHG_STRING_U)
if (b == HAK_XCHG_STRING_U)
{
ns = hak_makesymbol(hak, usym_buf, nchars);
ns = hak_makestringwithuchars(hak, usym_buf, nchars);
if (HAK_UNLIKELY(!ns)) goto oops;
}
else
{
/* symlit or symbol */
ns = hak_makesymbolwithuchars(hak, usym_buf, nchars);
if (HAK_UNLIKELY(!ns)) goto oops;
if (b == HAK_XCHG_SYMBOL_U)
{
/* form a cons cell */
/* form a cons cell */
hak_oop_t nc;
hak_pushvolat(hak, &ns);
nc = hak_makecons(hak, ns, hak->_nil);