fixed wrong declarations of qse_awk_rtx_valtowcsdupwithcmgr() and qse_awk_rtx_valtombsdupwithcmgr() which caused segfault when the returned pointer is greater than UINT_MAX
This commit is contained in:
parent
88d5820dbb
commit
8d98111202
@ -287,8 +287,7 @@ struct qse_awk_val_ref_t
|
|||||||
QSE_AWK_VAL_REF_GBLIDX, /**< member of global map variable */
|
QSE_AWK_VAL_REF_GBLIDX, /**< member of global map variable */
|
||||||
QSE_AWK_VAL_REF_LCLIDX, /**< member of local map variable */
|
QSE_AWK_VAL_REF_LCLIDX, /**< member of local map variable */
|
||||||
QSE_AWK_VAL_REF_ARGIDX, /**< member of map argument */
|
QSE_AWK_VAL_REF_ARGIDX, /**< member of map argument */
|
||||||
QSE_AWK_VAL_REF_POS, /**< positional variable */
|
QSE_AWK_VAL_REF_POS /**< positional variable */
|
||||||
/*QSE_AWK_VAL_REF_ADDR*/ /**< arbitrary address to a value. the value pointer that resides outside the awk realm. */
|
|
||||||
} id;
|
} id;
|
||||||
|
|
||||||
/* if id is QSE_AWK_VAL_REF_POS, adr holds the index of a
|
/* if id is QSE_AWK_VAL_REF_POS, adr holds the index of a
|
||||||
@ -2833,39 +2832,32 @@ QSE_EXPORT int qse_awk_rtx_valtostr (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_valtostrdup() function provides a shortcut to the
|
* The qse_awk_rtx_valtostrdupwithcmgr() function duplicates a string value and returns
|
||||||
* qse_awk_rtx_valtostr() function with the #QSE_AWK_RTX_VALTOSTR_CPLDUP type.
|
* the pointer to it. If the given value is not a string, it converts the non-string
|
||||||
* It returns the pointer to a string converted from \a val and stores its
|
* value to a string and duplicates it. It stores the length of the resulting
|
||||||
* length to memory pointed to by \a len. You should free the returned
|
* string in memory pointed to by \a len.
|
||||||
* memory block after use. See the code snippet below for a simple usage.
|
* You should free the returned memory block after use. See the code snippet below
|
||||||
|
* for a simple usage.
|
||||||
*
|
*
|
||||||
* \code
|
* \code
|
||||||
* ptr = qse_awk_rtx_valtostrdup (rtx, v, &len);
|
* ptr = qse_awk_rtx_valtowcsdupwithcmgr(rtx, v, &len, qse_awk_rtx_getcmgr(rtx));
|
||||||
* if (str == QSE_NULL) handle_error();
|
* if (!str) handle_error();
|
||||||
* qse_printf (QSE_T("%.*s\n"), (int)len, ptr);
|
* qse_printf (QSE_T("%.*ls\n"), (int)len, ptr);
|
||||||
* qse_awk_rtx_free (rtx, ptr);
|
* qse_awk_rtx_free (rtx, ptr);
|
||||||
* \endcode
|
* \endcode
|
||||||
*
|
*
|
||||||
* \return character pointer to a string converted on success,
|
* \return character pointer to a duplicated string on success,
|
||||||
* #QSE_NULL on failure
|
* #QSE_NULL on failure
|
||||||
*/
|
*/
|
||||||
#if 0
|
|
||||||
QSE_EXPORT qse_char_t* qse_awk_rtx_valtostrdupwithcmgr (
|
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
|
||||||
qse_size_t* len, /**< result length */
|
|
||||||
qse_cmgr_t* cmgr
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QSE_EXPORT qse_mchar_t* qse_awk_rtx_valtombsdup (
|
QSE_EXPORT qse_mchar_t* qse_awk_rtx_valtombsdupwithcmgr (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len, /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
qse_cmgr_t* cmgr
|
qse_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup (
|
QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdupwithcmgr (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len, /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
|
@ -94,10 +94,10 @@ static int out_mask_map[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int find_rio_in (
|
static int find_rio_in (
|
||||||
qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
qse_awk_rtx_t* rtx, int in_type, const qse_char_t* name,
|
||||||
qse_awk_rio_arg_t** rio, qse_awk_rio_impl_t* fun)
|
qse_awk_rio_arg_t** rio, qse_awk_rio_impl_t* fun)
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain;
|
qse_awk_rio_arg_t* p = rtx->rio.chain;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, io_mode, io_mask;
|
int io_type, io_mode, io_mask;
|
||||||
|
|
||||||
@ -111,11 +111,11 @@ static int find_rio_in (
|
|||||||
io_mask = in_mask_map[in_type];
|
io_mask = in_mask_map[in_type];
|
||||||
|
|
||||||
/* get the I/O handler provided by a user */
|
/* get the I/O handler provided by a user */
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (handler == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* no I/O handler provided */
|
/* no I/O handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,21 +133,20 @@ static int find_rio_in (
|
|||||||
|
|
||||||
/* if the name doesn't exist in the chain, create an entry
|
/* if the name doesn't exist in the chain, create an entry
|
||||||
* to the chain */
|
* to the chain */
|
||||||
p = (qse_awk_rio_arg_t*) QSE_AWK_ALLOC (
|
p = (qse_awk_rio_arg_t*)qse_awk_rtx_allocmem(rtx, QSE_SIZEOF(qse_awk_rio_arg_t));
|
||||||
run->awk, QSE_SIZEOF(qse_awk_rio_arg_t));
|
|
||||||
if (p == QSE_NULL)
|
if (p == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSE_MEMSET (p, 0, QSE_SIZEOF(*p));
|
QSE_MEMSET (p, 0, QSE_SIZEOF(*p));
|
||||||
|
|
||||||
p->name = QSE_AWK_STRDUP (run->awk, name);
|
p->name = QSE_AWK_STRDUP (rtx->awk, name);
|
||||||
if (p->name == QSE_NULL)
|
if (p->name == QSE_NULL)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (run->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,28 +165,28 @@ static int find_rio_in (
|
|||||||
p->in.eos = 0;
|
p->in.eos = 0;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
|
|
||||||
/* request to open the stream */
|
/* request to open the stream */
|
||||||
x = handler (run, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0);
|
x = handler (rtx, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0);
|
||||||
if (x <= -1)
|
if (x <= -1)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (run->awk, p->name);
|
qse_awk_rtx_freemem (rtx, p->name);
|
||||||
QSE_AWK_FREE (run->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
|
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
{
|
{
|
||||||
/* if the error number has not been
|
/* if the error number has not been
|
||||||
* set by the user handler */
|
* set by the user handler */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* chain it */
|
/* chain it */
|
||||||
p->next = run->rio.chain;
|
p->next = rtx->rio.chain;
|
||||||
run->rio.chain = p;
|
rtx->rio.chain = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
*rio = p;
|
*rio = p;
|
||||||
@ -293,7 +292,7 @@ static QSE_INLINE int match_long_rs (qse_awk_rtx_t* run, qse_str_t* buf, qse_awk
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name, qse_str_t* buf)
|
int qse_awk_rtx_readio (qse_awk_rtx_t* rtx, int in_type, const qse_char_t* name, qse_str_t* buf)
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p;
|
qse_awk_rio_arg_t* p;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
@ -305,19 +304,19 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
qse_size_t line_len = 0;
|
qse_size_t line_len = 0;
|
||||||
qse_char_t c = QSE_T('\0'), pc;
|
qse_char_t c = QSE_T('\0'), pc;
|
||||||
|
|
||||||
if (find_rio_in (run, in_type, name, &p, &handler) <= -1) return -1;
|
if (find_rio_in(rtx, in_type, name, &p, &handler) <= -1) return -1;
|
||||||
if (p->in.eos) return 0; /* no more streams left */
|
if (p->in.eos) return 0; /* no more streams left */
|
||||||
|
|
||||||
/* ready to read a record(typically a line). clear the buffer. */
|
/* ready to read a record(typically a line). clear the buffer. */
|
||||||
qse_str_clear (buf);
|
qse_str_clear (buf);
|
||||||
|
|
||||||
/* get the record separator */
|
/* get the record separator */
|
||||||
rs = qse_awk_rtx_getgbl (run, QSE_AWK_GBL_RS);
|
rs = qse_awk_rtx_getgbl(rtx, QSE_AWK_GBL_RS);
|
||||||
qse_awk_rtx_refupval (run, rs);
|
qse_awk_rtx_refupval (rtx, rs);
|
||||||
|
|
||||||
if (resolve_rs (run, rs, &rrs) <= -1)
|
if (resolve_rs(rtx, rs, &rrs) <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run, rs);
|
qse_awk_rtx_refdownval (rtx, rs);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,18 +343,16 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
|
x = handler(rtx, QSE_AWK_RIO_READ, p, p->in.buf, QSE_COUNTOF(p->in.buf));
|
||||||
x = handler (run, QSE_AWK_RIO_READ,
|
|
||||||
p, p->in.buf, QSE_COUNTOF(p->in.buf));
|
|
||||||
if (x <= -1)
|
if (x <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
{
|
{
|
||||||
/* if the error number has not been
|
/* if the error number has not been
|
||||||
* set by the user handler, we set
|
* set by the user handler, we set
|
||||||
* it here to QSE_AWK_EIOIMPL. */
|
* it here to QSE_AWK_EIOIMPL. */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
@ -381,12 +378,10 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
if (QSE_STR_LASTCHAR(buf) == QSE_T('\n'))
|
if (QSE_STR_LASTCHAR(buf) == QSE_T('\n'))
|
||||||
{
|
{
|
||||||
QSE_STR_LEN(buf) -= 1;
|
QSE_STR_LEN(buf) -= 1;
|
||||||
if (run->awk->opt.trait & QSE_AWK_CRLF)
|
if (rtx->awk->opt.trait & QSE_AWK_CRLF)
|
||||||
{
|
{
|
||||||
/* drop preceding CR */
|
/* drop preceding CR */
|
||||||
if (QSE_STR_LEN(buf) > 0 &&
|
if (QSE_STR_LEN(buf) > 0 && QSE_STR_LASTCHAR(buf) == QSE_T('\r')) QSE_STR_LEN(buf) -= 1;
|
||||||
QSE_STR_LASTCHAR(buf) == QSE_T('\r'))
|
|
||||||
QSE_STR_LEN(buf) -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -400,7 +395,7 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
* At EOF, the match at the end is considered
|
* At EOF, the match at the end is considered
|
||||||
* the longest as there are no more characters
|
* the longest as there are no more characters
|
||||||
* left */
|
* left */
|
||||||
int n = match_long_rs (run, buf, p);
|
int n = match_long_rs(rtx, buf, p);
|
||||||
if (n != 0)
|
if (n != 0)
|
||||||
{
|
{
|
||||||
if (n <= -1) ret = -1;
|
if (n <= -1) ret = -1;
|
||||||
@ -456,14 +451,10 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
}
|
}
|
||||||
while (p->in.pos < p->in.len);
|
while (p->in.pos < p->in.len);
|
||||||
|
|
||||||
tmp = qse_str_ncat (
|
tmp = qse_str_ncat(buf, &p->in.buf[start_pos], end_pos - start_pos);
|
||||||
buf,
|
|
||||||
&p->in.buf[start_pos],
|
|
||||||
end_pos - start_pos
|
|
||||||
);
|
|
||||||
if (tmp == (qse_size_t)-1)
|
if (tmp == (qse_size_t)-1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -483,8 +474,7 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
/* separate by a blank line */
|
/* separate by a blank line */
|
||||||
if (c == QSE_T('\n'))
|
if (c == QSE_T('\n'))
|
||||||
{
|
{
|
||||||
if (pc == QSE_T('\r') &&
|
if (pc == QSE_T('\r') && QSE_STR_LEN(buf) > 0)
|
||||||
QSE_STR_LEN(buf) > 0)
|
|
||||||
{
|
{
|
||||||
/* shrink the line length and the record
|
/* shrink the line length and the record
|
||||||
* by dropping of CR before NL */
|
* by dropping of CR before NL */
|
||||||
@ -493,7 +483,7 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
|
|
||||||
/* we don't drop CR from the record buffer
|
/* we don't drop CR from the record buffer
|
||||||
* if we're in CRLF mode. POINT-X */
|
* if we're in CRLF mode. POINT-X */
|
||||||
if (!(run->awk->opt.trait & QSE_AWK_CRLF))
|
if (!(rtx->awk->opt.trait & QSE_AWK_CRLF))
|
||||||
QSE_STR_LEN(buf) -= 1;
|
QSE_STR_LEN(buf) -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -501,10 +491,9 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
{
|
{
|
||||||
/* we got a blank line */
|
/* we got a blank line */
|
||||||
|
|
||||||
if (run->awk->opt.trait & QSE_AWK_CRLF)
|
if (rtx->awk->opt.trait & QSE_AWK_CRLF)
|
||||||
{
|
{
|
||||||
if (QSE_STR_LEN(buf) > 0 &&
|
if (QSE_STR_LEN(buf) > 0 && QSE_STR_LASTCHAR(buf) == QSE_T('\r'))
|
||||||
QSE_STR_LASTCHAR(buf) == QSE_T('\r'))
|
|
||||||
{
|
{
|
||||||
/* drop CR not dropped in POINT-X above */
|
/* drop CR not dropped in POINT-X above */
|
||||||
QSE_STR_LEN(buf) -= 1;
|
QSE_STR_LEN(buf) -= 1;
|
||||||
@ -523,9 +512,7 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
QSE_STR_LEN(buf) -= 1;
|
QSE_STR_LEN(buf) -= 1;
|
||||||
|
|
||||||
/* drop preceding CR */
|
/* drop preceding CR */
|
||||||
if (QSE_STR_LEN(buf) > 0 &&
|
if (QSE_STR_LEN(buf) > 0 && QSE_STR_LASTCHAR(buf) == QSE_T('\r')) QSE_STR_LEN(buf) -= 1;
|
||||||
QSE_STR_LASTCHAR(buf) == QSE_T('\r'))
|
|
||||||
QSE_STR_LEN(buf) -= 1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -552,7 +539,7 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
|
|
||||||
if (qse_str_ccat(buf, c) == (qse_size_t)-1)
|
if (qse_str_ccat(buf, c) == (qse_size_t)-1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
done = 1;
|
done = 1;
|
||||||
break;
|
break;
|
||||||
@ -579,14 +566,10 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
}
|
}
|
||||||
while (p->in.pos < p->in.len);
|
while (p->in.pos < p->in.len);
|
||||||
|
|
||||||
tmp = qse_str_ncat (
|
tmp = qse_str_ncat(buf, &p->in.buf[start_pos], end_pos - start_pos);
|
||||||
buf,
|
|
||||||
&p->in.buf[start_pos],
|
|
||||||
end_pos - start_pos
|
|
||||||
);
|
|
||||||
if (tmp == (qse_size_t)-1)
|
if (tmp == (qse_size_t)-1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -606,21 +589,17 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
* to the buffer, it is the longest match.
|
* to the buffer, it is the longest match.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tmp = qse_str_ncat (
|
tmp = qse_str_ncat(buf, &p->in.buf[p->in.pos], p->in.len - p->in.pos);
|
||||||
buf,
|
|
||||||
&p->in.buf[p->in.pos],
|
|
||||||
p->in.len - p->in.pos
|
|
||||||
);
|
|
||||||
if (tmp == (qse_size_t)-1)
|
if (tmp == (qse_size_t)-1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->in.pos = p->in.len;
|
p->in.pos = p->in.len;
|
||||||
|
|
||||||
n = match_long_rs (run, buf, p);
|
n = match_long_rs(rtx, buf, p);
|
||||||
if (n != 0)
|
if (n != 0)
|
||||||
{
|
{
|
||||||
if (n <= -1) ret = -1;
|
if (n <= -1) ret = -1;
|
||||||
@ -629,25 +608,24 @@ int qse_awk_rtx_readio (qse_awk_rtx_t* run, int in_type, const qse_char_t* name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rrs.ptr && QSE_AWK_RTX_GETVALTYPE (rtx, rs) != QSE_AWK_VAL_STR)
|
if (rrs.ptr && QSE_AWK_RTX_GETVALTYPE (rtx, rs) != QSE_AWK_VAL_STR) qse_awk_rtx_freemem (rtx, rrs.ptr);
|
||||||
QSE_AWK_FREE (run->awk, rrs.ptr);
|
qse_awk_rtx_refdownval (rtx, rs);
|
||||||
qse_awk_rtx_refdownval (run, rs);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_writeioval (qse_awk_rtx_t* run, int out_type, const qse_char_t* name, qse_awk_val_t* v)
|
int qse_awk_rtx_writeioval (qse_awk_rtx_t* rtx, int out_type, const qse_char_t* name, qse_awk_val_t* v)
|
||||||
{
|
{
|
||||||
qse_awk_val_type_t vtype;
|
qse_awk_val_type_t vtype;
|
||||||
vtype = QSE_AWK_RTX_GETVALTYPE (run, v);
|
vtype = QSE_AWK_RTX_GETVALTYPE (rtx, v);
|
||||||
|
|
||||||
switch (vtype)
|
switch (vtype)
|
||||||
{
|
{
|
||||||
case QSE_AWK_VAL_STR:
|
case QSE_AWK_VAL_STR:
|
||||||
return qse_awk_rtx_writeiostr(run, out_type, name, ((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len);
|
return qse_awk_rtx_writeiostr(rtx, out_type, name, ((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len);
|
||||||
|
|
||||||
case QSE_AWK_VAL_MBS:
|
case QSE_AWK_VAL_MBS:
|
||||||
return qse_awk_rtx_writeiobytes(run, out_type, name, ((qse_awk_val_mbs_t*)v)->val.ptr, ((qse_awk_val_mbs_t*)v)->val.len);
|
return qse_awk_rtx_writeiobytes(rtx, out_type, name, ((qse_awk_val_mbs_t*)v)->val.ptr, ((qse_awk_val_mbs_t*)v)->val.len);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@ -655,9 +633,9 @@ int qse_awk_rtx_writeioval (qse_awk_rtx_t* run, int out_type, const qse_char_t*
|
|||||||
int n;
|
int n;
|
||||||
|
|
||||||
out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP | QSE_AWK_RTX_VALTOSTR_PRINT;
|
out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP | QSE_AWK_RTX_VALTOSTR_PRINT;
|
||||||
if (qse_awk_rtx_valtostr(run, v, &out) <= -1) return -1;
|
if (qse_awk_rtx_valtostr(rtx, v, &out) <= -1) return -1;
|
||||||
n = qse_awk_rtx_writeiostr(run, out_type, name, out.u.cpldup.ptr, out.u.cpldup.len);
|
n = qse_awk_rtx_writeiostr(rtx, out_type, name, out.u.cpldup.ptr, out.u.cpldup.len);
|
||||||
QSE_AWK_FREE (run->awk, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -713,7 +691,7 @@ static int prepare_for_write_io_data (qse_awk_rtx_t* rtx, int out_type, const qs
|
|||||||
/* if there is not corresponding rio for name, create one */
|
/* if there is not corresponding rio for name, create one */
|
||||||
if (p == QSE_NULL)
|
if (p == QSE_NULL)
|
||||||
{
|
{
|
||||||
p = (qse_awk_rio_arg_t*)QSE_AWK_ALLOC(rtx->awk, QSE_SIZEOF(qse_awk_rio_arg_t));
|
p = (qse_awk_rio_arg_t*)qse_awk_rtx_allocmem(rtx, QSE_SIZEOF(qse_awk_rio_arg_t));
|
||||||
if (p == QSE_NULL)
|
if (p == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
@ -725,7 +703,7 @@ static int prepare_for_write_io_data (qse_awk_rtx_t* rtx, int out_type, const qs
|
|||||||
p->name = QSE_AWK_STRDUP(rtx->awk, name);
|
p->name = QSE_AWK_STRDUP(rtx->awk, name);
|
||||||
if (p->name == QSE_NULL)
|
if (p->name == QSE_NULL)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (rtx->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -746,8 +724,8 @@ static int prepare_for_write_io_data (qse_awk_rtx_t* rtx, int out_type, const qs
|
|||||||
n = handler(rtx, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0);
|
n = handler(rtx, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (rtx->awk, p->name);
|
qse_awk_rtx_freemem (rtx, p->name);
|
||||||
QSE_AWK_FREE (rtx->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
|
|
||||||
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
@ -834,9 +812,9 @@ int qse_awk_rtx_writeiobytes (qse_awk_rtx_t* rtx, int out_type, const qse_char_t
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_flushio (qse_awk_rtx_t* run, int out_type, const qse_char_t* name)
|
int qse_awk_rtx_flushio (qse_awk_rtx_t* rtx, int out_type, const qse_char_t* name)
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain;
|
qse_awk_rio_arg_t* p = rtx->rio.chain;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, io_mode, io_mask;
|
int io_type, io_mode, io_mask;
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
@ -851,11 +829,11 @@ int qse_awk_rtx_flushio (qse_awk_rtx_t* run, int out_type, const qse_char_t* nam
|
|||||||
io_mode = out_mode_map[out_type];
|
io_mode = out_mode_map[out_type];
|
||||||
io_mask = out_mask_map[out_type];
|
io_mask = out_mask_map[out_type];
|
||||||
|
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (!handler)
|
||||||
{
|
{
|
||||||
/* no I/O handler provided */
|
/* no I/O handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -869,13 +847,12 @@ int qse_awk_rtx_flushio (qse_awk_rtx_t* run, int out_type, const qse_char_t* nam
|
|||||||
if (p->type == (io_type | io_mask) && p->mode == io_mode &&
|
if (p->type == (io_type | io_mask) && p->mode == io_mode &&
|
||||||
(name == QSE_NULL || qse_strcmp(p->name,name) == 0))
|
(name == QSE_NULL || qse_strcmp(p->name,name) == 0))
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
n = handler(run, QSE_AWK_RIO_FLUSH, p, QSE_NULL, 0);
|
n = handler(rtx, QSE_AWK_RIO_FLUSH, p, QSE_NULL, 0);
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -888,14 +865,13 @@ int qse_awk_rtx_flushio (qse_awk_rtx_t* run, int out_type, const qse_char_t* nam
|
|||||||
if (ok) return 0;
|
if (ok) return 0;
|
||||||
|
|
||||||
/* there is no corresponding rio for name */
|
/* there is no corresponding rio for name */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIONMNF, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIONMNF, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_nextio_read (
|
int qse_awk_rtx_nextio_read (qse_awk_rtx_t* rtx, int in_type, const qse_char_t* name)
|
||||||
qse_awk_rtx_t* run, int in_type, const qse_char_t* name)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain;
|
qse_awk_rio_arg_t* p = rtx->rio.chain;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, /*io_mode,*/ io_mask;
|
int io_type, /*io_mode,*/ io_mask;
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
@ -909,27 +885,25 @@ int qse_awk_rtx_nextio_read (
|
|||||||
/*io_mode = in_mode_map[in_type];*/
|
/*io_mode = in_mode_map[in_type];*/
|
||||||
io_mask = in_mask_map[in_type];
|
io_mask = in_mask_map[in_type];
|
||||||
|
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (!handler)
|
||||||
{
|
{
|
||||||
/* no I/O handler provided */
|
/* no I/O handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p != QSE_NULL)
|
while (p)
|
||||||
{
|
{
|
||||||
if (p->type == (io_type | io_mask) &&
|
if (p->type == (io_type | io_mask) && qse_strcmp(p->name,name) == 0) break;
|
||||||
qse_strcmp (p->name,name) == 0) break;
|
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p == QSE_NULL)
|
if (!p)
|
||||||
{
|
{
|
||||||
/* something is totally wrong */
|
/* something is totally wrong */
|
||||||
QSE_ASSERT (
|
QSE_ASSERT (!"should never happen - cannot find the relevant rio entry");
|
||||||
!"should never happen - cannot find the relevant rio entry");
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EINTERN, QSE_NULL);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -939,12 +913,12 @@ int qse_awk_rtx_nextio_read (
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0);
|
n = handler(rtx, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,10 +944,9 @@ int qse_awk_rtx_nextio_read (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_nextio_write (
|
int qse_awk_rtx_nextio_write (qse_awk_rtx_t* rtx, int out_type, const qse_char_t* name)
|
||||||
qse_awk_rtx_t* run, int out_type, const qse_char_t* name)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain;
|
qse_awk_rio_arg_t* p = rtx->rio.chain;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, /*io_mode,*/ io_mask;
|
int io_type, /*io_mode,*/ io_mask;
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
@ -987,27 +960,26 @@ int qse_awk_rtx_nextio_write (
|
|||||||
/*io_mode = out_mode_map[out_type];*/
|
/*io_mode = out_mode_map[out_type];*/
|
||||||
io_mask = out_mask_map[out_type];
|
io_mask = out_mask_map[out_type];
|
||||||
|
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (!handler)
|
||||||
{
|
{
|
||||||
/* no I/O handler provided */
|
/* no I/O handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p != QSE_NULL)
|
while (p)
|
||||||
{
|
{
|
||||||
if (p->type == (io_type | io_mask) &&
|
if (p->type == (io_type | io_mask) && qse_strcmp(p->name,name) == 0) break;
|
||||||
qse_strcmp (p->name,name) == 0) break;
|
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p == QSE_NULL)
|
if (!p)
|
||||||
{
|
{
|
||||||
/* something is totally wrong */
|
/* something is totally wrong */
|
||||||
QSE_ASSERT (!"should never happen - cannot find the relevant rio entry");
|
QSE_ASSERT (!"should never happen - cannot find the relevant rio entry");
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EINTERN, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1017,12 +989,12 @@ int qse_awk_rtx_nextio_write (
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0);
|
n = handler(rtx, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1043,10 +1015,9 @@ int qse_awk_rtx_nextio_write (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_closio_read (
|
int qse_awk_rtx_closio_read (qse_awk_rtx_t* rtx, int in_type, const qse_char_t* name)
|
||||||
qse_awk_rtx_t* run, int in_type, const qse_char_t* name)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain, * px = QSE_NULL;
|
qse_awk_rio_arg_t* p = rtx->rio.chain, * px = QSE_NULL;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, /*io_mode,*/ io_mask;
|
int io_type, /*io_mode,*/ io_mask;
|
||||||
|
|
||||||
@ -1059,37 +1030,36 @@ int qse_awk_rtx_closio_read (
|
|||||||
/*io_mode = in_mode_map[in_type];*/
|
/*io_mode = in_mode_map[in_type];*/
|
||||||
io_mask = in_mask_map[in_type];
|
io_mask = in_mask_map[in_type];
|
||||||
|
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (!handler)
|
||||||
{
|
{
|
||||||
/* no I/O handler provided */
|
/* no I/O handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p != QSE_NULL)
|
while (p)
|
||||||
{
|
{
|
||||||
if (p->type == (io_type | io_mask) &&
|
if (p->type == (io_type | io_mask) && qse_strcmp(p->name, name) == 0)
|
||||||
qse_strcmp (p->name, name) == 0)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
|
|
||||||
handler = run->rio.handler[p->type & IO_MASK_CLEAR];
|
handler = rtx->rio.handler[p->type & IO_MASK_CLEAR];
|
||||||
if (handler != QSE_NULL)
|
if (handler)
|
||||||
{
|
{
|
||||||
if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1)
|
if (handler (rtx, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1)
|
||||||
{
|
{
|
||||||
/* this is not a run-time error.*/
|
/* this is not a rtx-time error.*/
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (px != QSE_NULL) px->next = p->next;
|
if (px) px->next = p->next;
|
||||||
else run->rio.chain = p->next;
|
else rtx->rio.chain = p->next;
|
||||||
|
|
||||||
QSE_AWK_FREE (run->awk, p->name);
|
qse_awk_rtx_freemem (rtx, p->name);
|
||||||
QSE_AWK_FREE (run->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1098,14 +1068,13 @@ int qse_awk_rtx_closio_read (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* the name given is not found */
|
/* the name given is not found */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIONMNF, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIONMNF, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_closio_write (
|
int qse_awk_rtx_closio_write (qse_awk_rtx_t* rtx, int out_type, const qse_char_t* name)
|
||||||
qse_awk_rtx_t* run, int out_type, const qse_char_t* name)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = run->rio.chain, * px = QSE_NULL;
|
qse_awk_rio_arg_t* p = rtx->rio.chain, * px = QSE_NULL;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
int io_type, /*io_mode,*/ io_mask;
|
int io_type, /*io_mode,*/ io_mask;
|
||||||
|
|
||||||
@ -1118,38 +1087,37 @@ int qse_awk_rtx_closio_write (
|
|||||||
/*io_mode = out_mode_map[out_type];*/
|
/*io_mode = out_mode_map[out_type];*/
|
||||||
io_mask = out_mask_map[out_type];
|
io_mask = out_mask_map[out_type];
|
||||||
|
|
||||||
handler = run->rio.handler[io_type];
|
handler = rtx->rio.handler[io_type];
|
||||||
if (handler == QSE_NULL)
|
if (!handler)
|
||||||
{
|
{
|
||||||
/* no io handler provided */
|
/* no io handler provided */
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOUSER, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p != QSE_NULL)
|
while (p)
|
||||||
{
|
{
|
||||||
if (p->type == (io_type | io_mask) &&
|
if (p->type == (io_type | io_mask) && qse_strcmp(p->name, name) == 0)
|
||||||
qse_strcmp (p->name, name) == 0)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
|
|
||||||
handler = run->rio.handler[p->type & IO_MASK_CLEAR];
|
handler = rtx->rio.handler[p->type & IO_MASK_CLEAR];
|
||||||
if (handler != QSE_NULL)
|
if (handler)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1)
|
if (handler (rtx, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (px != QSE_NULL) px->next = p->next;
|
if (px) px->next = p->next;
|
||||||
else run->rio.chain = p->next;
|
else rtx->rio.chain = p->next;
|
||||||
|
|
||||||
QSE_AWK_FREE (run->awk, p->name);
|
qse_awk_rtx_freemem (rtx, p->name);
|
||||||
QSE_AWK_FREE (run->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,12 +1125,11 @@ int qse_awk_rtx_closio_write (
|
|||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIONMNF, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIONMNF, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_awk_rtx_closeio (
|
int qse_awk_rtx_closeio (qse_awk_rtx_t* rtx, const qse_char_t* name, const qse_char_t* opt)
|
||||||
qse_awk_rtx_t* rtx, const qse_char_t* name, const qse_char_t* opt)
|
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* p = rtx->rio.chain, * px = QSE_NULL;
|
qse_awk_rio_arg_t* p = rtx->rio.chain, * px = QSE_NULL;
|
||||||
|
|
||||||
@ -1209,7 +1176,7 @@ int qse_awk_rtx_closeio (
|
|||||||
}
|
}
|
||||||
|
|
||||||
handler = rtx->rio.handler[p->type & IO_MASK_CLEAR];
|
handler = rtx->rio.handler[p->type & IO_MASK_CLEAR];
|
||||||
if (handler != QSE_NULL)
|
if (handler)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
p->rwcmode = rwcmode;
|
p->rwcmode = rwcmode;
|
||||||
@ -1239,8 +1206,8 @@ int qse_awk_rtx_closeio (
|
|||||||
if (px != QSE_NULL) px->next = p->next;
|
if (px != QSE_NULL) px->next = p->next;
|
||||||
else rtx->rio.chain = p->next;
|
else rtx->rio.chain = p->next;
|
||||||
|
|
||||||
QSE_AWK_FREE (rtx->awk, p->name);
|
qse_awk_rtx_freemem (rtx, p->name);
|
||||||
QSE_AWK_FREE (rtx->awk, p);
|
qse_awk_rtx_freemem (rtx, p);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1254,34 +1221,33 @@ int qse_awk_rtx_closeio (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_awk_rtx_cleario (qse_awk_rtx_t* run)
|
void qse_awk_rtx_cleario (qse_awk_rtx_t* rtx)
|
||||||
{
|
{
|
||||||
qse_awk_rio_arg_t* next;
|
qse_awk_rio_arg_t* next;
|
||||||
qse_awk_rio_impl_t handler;
|
qse_awk_rio_impl_t handler;
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
|
|
||||||
while (run->rio.chain != QSE_NULL)
|
while (rtx->rio.chain)
|
||||||
{
|
{
|
||||||
handler = run->rio.handler[
|
handler = rtx->rio.handler[rtx->rio.chain->type & IO_MASK_CLEAR];
|
||||||
run->rio.chain->type & IO_MASK_CLEAR];
|
next = rtx->rio.chain->next;
|
||||||
next = run->rio.chain->next;
|
|
||||||
|
|
||||||
if (handler != QSE_NULL)
|
if (handler)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
|
||||||
run->rio.chain->rwcmode = 0;
|
rtx->rio.chain->rwcmode = 0;
|
||||||
n = handler (run, QSE_AWK_RIO_CLOSE, run->rio.chain, QSE_NULL, 0);
|
n = handler(rtx, QSE_AWK_RIO_CLOSE, rtx->rio.chain, QSE_NULL, 0);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
if (run->errinf.num == QSE_AWK_ENOERR)
|
if (rtx->errinf.num == QSE_AWK_ENOERR)
|
||||||
qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIOIMPL, QSE_NULL);
|
||||||
/* TODO: some warnings need to be shown??? */
|
/* TODO: some warnings need to be shown??? */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QSE_AWK_FREE (run->awk, run->rio.chain->name);
|
qse_awk_rtx_freemem (rtx, rtx->rio.chain->name);
|
||||||
QSE_AWK_FREE (run->awk, run->rio.chain);
|
qse_awk_rtx_freemem (rtx, rtx->rio.chain);
|
||||||
|
|
||||||
run->rio.chain = next;
|
rtx->rio.chain = next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1647,44 +1647,43 @@ oops:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_pblocks (qse_awk_rtx_t* run)
|
static int run_pblocks (qse_awk_rtx_t* rtx)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
#define ADJUST_ERROR(run) \
|
#define ADJUST_ERROR(run) \
|
||||||
if (run->awk->tree.chain != QSE_NULL) \
|
if (rtx->awk->tree.chain != QSE_NULL) \
|
||||||
{ \
|
{ \
|
||||||
if (run->awk->tree.chain->pattern != QSE_NULL) \
|
if (rtx->awk->tree.chain->pattern != QSE_NULL) \
|
||||||
ADJERR_LOC (run, &run->awk->tree.chain->pattern->loc); \
|
ADJERR_LOC (rtx, &rtx->awk->tree.chain->pattern->loc); \
|
||||||
else if (run->awk->tree.chain->action != QSE_NULL) \
|
else if (rtx->awk->tree.chain->action != QSE_NULL) \
|
||||||
ADJERR_LOC (run, &run->awk->tree.chain->action->loc); \
|
ADJERR_LOC (rtx, &rtx->awk->tree.chain->action->loc); \
|
||||||
} \
|
} \
|
||||||
else if (run->awk->tree.end != QSE_NULL) \
|
else if (rtx->awk->tree.end != QSE_NULL) \
|
||||||
{ \
|
{ \
|
||||||
ADJERR_LOC (run, &run->awk->tree.end->loc); \
|
ADJERR_LOC (run, &rtx->awk->tree.end->loc); \
|
||||||
}
|
}
|
||||||
|
|
||||||
run->inrec.buf_pos = 0;
|
rtx->inrec.buf_pos = 0;
|
||||||
run->inrec.buf_len = 0;
|
rtx->inrec.buf_len = 0;
|
||||||
run->inrec.eof = 0;
|
rtx->inrec.eof = 0;
|
||||||
|
|
||||||
/* run each pattern block */
|
/* run each pattern block */
|
||||||
while (run->exit_level < EXIT_GLOBAL)
|
while (rtx->exit_level < EXIT_GLOBAL)
|
||||||
{
|
{
|
||||||
run->exit_level = EXIT_NONE;
|
rtx->exit_level = EXIT_NONE;
|
||||||
|
|
||||||
n = read_record (run);
|
n = read_record(rtx);
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
ADJUST_ERROR (run);
|
ADJUST_ERROR (rtx);
|
||||||
return -1; /* error */
|
return -1; /* error */
|
||||||
}
|
}
|
||||||
if (n == 0) break; /* end of input */
|
if (n == 0) break; /* end of input */
|
||||||
|
|
||||||
if (run->awk->tree.chain != QSE_NULL)
|
if (rtx->awk->tree.chain)
|
||||||
{
|
{
|
||||||
if (run_pblock_chain (
|
if (run_pblock_chain(rtx, rtx->awk->tree.chain) == -1) return -1;
|
||||||
run, run->awk->tree.chain) == -1) return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1692,21 +1691,21 @@ static int run_pblocks (qse_awk_rtx_t* run)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_pblock_chain (qse_awk_rtx_t* run, qse_awk_chain_t* cha)
|
static int run_pblock_chain (qse_awk_rtx_t* rtx, qse_awk_chain_t* chain)
|
||||||
{
|
{
|
||||||
qse_size_t bno = 0;
|
qse_size_t bno = 0;
|
||||||
|
|
||||||
while (run->exit_level < EXIT_GLOBAL && cha != QSE_NULL)
|
while (rtx->exit_level < EXIT_GLOBAL && chain)
|
||||||
{
|
{
|
||||||
if (run->exit_level == EXIT_NEXT)
|
if (rtx->exit_level == EXIT_NEXT)
|
||||||
{
|
{
|
||||||
run->exit_level = EXIT_NONE;
|
rtx->exit_level = EXIT_NONE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (run_pblock (run, cha, bno) == -1) return -1;
|
if (run_pblock(rtx, chain, bno) <= -1) return -1;
|
||||||
|
|
||||||
cha = cha->next;
|
chain = chain->next;
|
||||||
bno++;
|
bno++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1721,28 +1720,28 @@ static int run_pblock (qse_awk_rtx_t* rtx, qse_awk_chain_t* cha, qse_size_t bno)
|
|||||||
ptn = cha->pattern;
|
ptn = cha->pattern;
|
||||||
blk = (qse_awk_nde_blk_t*)cha->action;
|
blk = (qse_awk_nde_blk_t*)cha->action;
|
||||||
|
|
||||||
if (ptn == QSE_NULL)
|
if (!ptn)
|
||||||
{
|
{
|
||||||
/* just execute the block */
|
/* just execute the block */
|
||||||
rtx->active_block = blk;
|
rtx->active_block = blk;
|
||||||
if (run_block (rtx, blk) == -1) return -1;
|
if (run_block(rtx, blk) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ptn->next == QSE_NULL)
|
if (!ptn->next)
|
||||||
{
|
{
|
||||||
/* pattern { ... } */
|
/* pattern { ... } */
|
||||||
qse_awk_val_t* v1;
|
qse_awk_val_t* v1;
|
||||||
|
|
||||||
v1 = eval_expression(rtx, ptn);
|
v1 = eval_expression(rtx, ptn);
|
||||||
if (v1 == QSE_NULL) return -1;
|
if (!v1) return -1;
|
||||||
|
|
||||||
qse_awk_rtx_refupval (rtx, v1);
|
qse_awk_rtx_refupval (rtx, v1);
|
||||||
|
|
||||||
if (qse_awk_rtx_valtobool(rtx, v1))
|
if (qse_awk_rtx_valtobool(rtx, v1))
|
||||||
{
|
{
|
||||||
rtx->active_block = blk;
|
rtx->active_block = blk;
|
||||||
if (run_block (rtx, blk) == -1)
|
if (run_block(rtx, blk) <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (rtx, v1);
|
qse_awk_rtx_refdownval (rtx, v1);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1762,13 +1761,13 @@ static int run_pblock (qse_awk_rtx_t* rtx, qse_awk_chain_t* cha, qse_size_t bno)
|
|||||||
qse_awk_val_t* v1;
|
qse_awk_val_t* v1;
|
||||||
|
|
||||||
v1 = eval_expression(rtx, ptn);
|
v1 = eval_expression(rtx, ptn);
|
||||||
if (v1 == QSE_NULL) return -1;
|
if (!v1) return -1;
|
||||||
qse_awk_rtx_refupval (rtx, v1);
|
qse_awk_rtx_refupval (rtx, v1);
|
||||||
|
|
||||||
if (qse_awk_rtx_valtobool(rtx, v1))
|
if (qse_awk_rtx_valtobool(rtx, v1))
|
||||||
{
|
{
|
||||||
rtx->active_block = blk;
|
rtx->active_block = blk;
|
||||||
if (run_block (rtx, blk) == -1)
|
if (run_block(rtx, blk) <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (rtx, v1);
|
qse_awk_rtx_refdownval (rtx, v1);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1784,18 +1783,17 @@ static int run_pblock (qse_awk_rtx_t* rtx, qse_awk_chain_t* cha, qse_size_t bno)
|
|||||||
qse_awk_val_t* v2;
|
qse_awk_val_t* v2;
|
||||||
|
|
||||||
v2 = eval_expression(rtx, ptn->next);
|
v2 = eval_expression(rtx, ptn->next);
|
||||||
if (v2 == QSE_NULL) return -1;
|
if (!v2) return -1;
|
||||||
qse_awk_rtx_refupval (rtx, v2);
|
qse_awk_rtx_refupval (rtx, v2);
|
||||||
|
|
||||||
rtx->active_block = blk;
|
rtx->active_block = blk;
|
||||||
if (run_block (rtx, blk) == -1)
|
if (run_block(rtx, blk) <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval(rtx, v2);
|
qse_awk_rtx_refdownval(rtx, v2);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qse_awk_rtx_valtobool (rtx, v2))
|
if (qse_awk_rtx_valtobool(rtx, v2)) rtx->pattern_range_state[bno] = 0;
|
||||||
rtx->pattern_range_state[bno] = 0;
|
|
||||||
|
|
||||||
qse_awk_rtx_refdownval (rtx, v2);
|
qse_awk_rtx_refdownval (rtx, v2);
|
||||||
}
|
}
|
||||||
@ -4229,7 +4227,7 @@ static QSE_INLINE int __cmp_int_str (qse_awk_rtx_t* rtx, qse_awk_val_t* left, qs
|
|||||||
int n;
|
int n;
|
||||||
|
|
||||||
/* SCO CC doesn't seem to handle right->nstr > 0 properly */
|
/* SCO CC doesn't seem to handle right->nstr > 0 properly */
|
||||||
if (rtx->awk->opt.trait & QSE_AWK_NCMPONSTR || right->nstr /*> 0*/)
|
if ((rtx->awk->opt.trait & QSE_AWK_NCMPONSTR) || right->nstr /*> 0*/)
|
||||||
{
|
{
|
||||||
qse_awk_int_t ll, v1;
|
qse_awk_int_t ll, v1;
|
||||||
qse_awk_flt_t rr;
|
qse_awk_flt_t rr;
|
||||||
@ -4277,7 +4275,7 @@ static QSE_INLINE int __cmp_int_mbs (qse_awk_rtx_t* rtx, qse_awk_val_t* left, qs
|
|||||||
qse_size_t len0;
|
qse_size_t len0;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (rtx->awk->opt.trait & QSE_AWK_NCMPONSTR || right->nstr /*> 0*/)
|
if ((rtx->awk->opt.trait & QSE_AWK_NCMPONSTR) || right->nstr /*> 0*/)
|
||||||
{
|
{
|
||||||
qse_awk_int_t ll, v1;
|
qse_awk_int_t ll, v1;
|
||||||
qse_awk_flt_t rr;
|
qse_awk_flt_t rr;
|
||||||
@ -6037,7 +6035,7 @@ static qse_awk_val_t* __eval_call (
|
|||||||
qse_errputstrf (QSE_T("block rtx complete nargs = %d\n"), (int)nargs);
|
qse_errputstrf (QSE_T("block rtx complete nargs = %d\n"), (int)nargs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (fun && fun->argspec && call->nargs > 0)
|
if (fun && fun->argspec && call->args && call->nargs > 0) /* qse_awk_rtx_callfun() sets up a fake call structure with nargs > 0 but args == QSE_NULL */
|
||||||
{
|
{
|
||||||
/* set back the values for pass-by-reference parameters of normal functions.
|
/* set back the values for pass-by-reference parameters of normal functions.
|
||||||
* the intrinsic functions are not handled here but their implementation would
|
* the intrinsic functions are not handled here but their implementation would
|
||||||
@ -6052,8 +6050,6 @@ static qse_awk_val_t* __eval_call (
|
|||||||
qse_size_t cur_stack_base = rtx->stack_base;
|
qse_size_t cur_stack_base = rtx->stack_base;
|
||||||
qse_size_t prev_stack_base = (qse_size_t)rtx->stack[rtx->stack_base + 0];
|
qse_size_t prev_stack_base = (qse_size_t)rtx->stack[rtx->stack_base + 0];
|
||||||
|
|
||||||
if (call->args) /* qse_awk_rtx_callfun() sets up a fake call structure with nargs > 0 but args == QSE_NULL */
|
|
||||||
{
|
|
||||||
qse_awk_nde_t* p = call->args;
|
qse_awk_nde_t* p = call->args;
|
||||||
for (i = 0; i < call->nargs; i++)
|
for (i = 0; i < call->nargs; i++)
|
||||||
{
|
{
|
||||||
@ -6079,16 +6075,8 @@ static qse_awk_val_t* __eval_call (
|
|||||||
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < call->nargs; i++)
|
|
||||||
{
|
|
||||||
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = call->nargs; i < nargs; i++)
|
for (; i < nargs; i++)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
||||||
}
|
}
|
||||||
@ -8751,8 +8739,7 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (fmt[i] != QSE_MT('%'))
|
if (fmt[i] != QSE_MT('%')) OUT_MBS (QSE_MBS_PTR(fbu), QSE_MBS_LEN(fbu));
|
||||||
OUT_MBS (QSE_MBS_PTR(fbu), QSE_MBS_LEN(fbu));
|
|
||||||
OUT_MCHAR (fmt[i]);
|
OUT_MCHAR (fmt[i]);
|
||||||
goto skip_taking_arg;
|
goto skip_taking_arg;
|
||||||
}
|
}
|
||||||
|
@ -180,9 +180,7 @@ int qse_wcsxcmp (const qse_wchar_t* s1, qse_size_t ln, const qse_wchar_t* s2)
|
|||||||
return (s1 < end)? 1: ((*s2 == QSE_WT('\0'))? 0: -1);
|
return (s1 < end)? 1: ((*s2 == QSE_WT('\0'))? 0: -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_wcsxncmp (
|
int qse_wcsxncmp (const qse_wchar_t* s1, qse_size_t ln1, const qse_wchar_t* s2, qse_size_t ln2)
|
||||||
const qse_wchar_t* s1, qse_size_t ln1,
|
|
||||||
const qse_wchar_t* s2, qse_size_t ln2)
|
|
||||||
{
|
{
|
||||||
qse_wchau_t c1, c2;
|
qse_wchau_t c1, c2;
|
||||||
const qse_wchar_t* end1 = s1 + ln1;
|
const qse_wchar_t* end1 = s1 + ln1;
|
||||||
@ -230,9 +228,7 @@ int qse_wcsxcasecmp (const qse_wchar_t* s1, qse_size_t ln, const qse_wchar_t* s2
|
|||||||
return (s1 < end)? 1: ((*s2 == QSE_WT('\0'))? 0: -1);
|
return (s1 < end)? 1: ((*s2 == QSE_WT('\0'))? 0: -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_wcsxncasecmp (
|
int qse_wcsxncasecmp (const qse_wchar_t* s1, qse_size_t ln1, const qse_wchar_t* s2, qse_size_t ln2)
|
||||||
const qse_wchar_t* s1, qse_size_t ln1,
|
|
||||||
const qse_wchar_t* s2, qse_size_t ln2)
|
|
||||||
{
|
{
|
||||||
qse_wchau_t c1, c2;
|
qse_wchau_t c1, c2;
|
||||||
const qse_wchar_t* end1 = s1 + ln1;
|
const qse_wchar_t* end1 = s1 + ln1;
|
||||||
|
Loading…
Reference in New Issue
Block a user