enhanced eval_getline() in awk.
fixed a bug in awk's printf(). fixed a bug of not incrementing NR and FNR in awk's getline(). added some MPI stuffs
This commit is contained in:
parent
efcccc05e7
commit
9cc8d6f76d
@ -1191,6 +1191,16 @@ struct qse_awk_rtx_valtostr_out_t
|
|||||||
};
|
};
|
||||||
typedef struct qse_awk_rtx_valtostr_out_t qse_awk_rtx_valtostr_out_t;
|
typedef struct qse_awk_rtx_valtostr_out_t qse_awk_rtx_valtostr_out_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* record filter using NR */
|
||||||
|
struct qse_awk_nrflt_t
|
||||||
|
{
|
||||||
|
qse_long_t limit;
|
||||||
|
qse_long_t size;
|
||||||
|
qse_long_t rank;
|
||||||
|
};
|
||||||
|
typedef struct qse_awk_nrflt_t qse_awk_nrflt_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -2369,6 +2379,26 @@ int qse_awk_rtx_strtonum (
|
|||||||
qse_flt_t* r /**< stores a converted floating-poing number */
|
qse_flt_t* r /**< stores a converted floating-poing number */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The qse_awk_rtx_hashval() functions hashes a simple value
|
||||||
|
* to a positive integer. It returns -1 for a inhashable value.
|
||||||
|
*/
|
||||||
|
qse_long_t qse_awk_rtx_hashval (
|
||||||
|
qse_awk_rtx_t* rtx,
|
||||||
|
qse_awk_val_t* v
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
void qse_awk_rtx_setnrflt (
|
||||||
|
qse_awk_rtx_t* rtx,
|
||||||
|
const qse_awk_nrflt_t* nrflt
|
||||||
|
);
|
||||||
|
|
||||||
|
void qse_awk_rtx_getnrflt (
|
||||||
|
qse_awk_rtx_t* rtx,
|
||||||
|
qse_awk_nrflt_t* nrflt
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_allocmem() function allocats a memory block of @a size bytes
|
* The qse_awk_rtx_allocmem() function allocats a memory block of @a size bytes
|
||||||
* using the memory manager associated with a runtime context @a rtx.
|
* using the memory manager associated with a runtime context @a rtx.
|
||||||
|
@ -285,6 +285,7 @@ struct qse_awk_rtx_t
|
|||||||
|
|
||||||
qse_str_t line; /* entire line */
|
qse_str_t line; /* entire line */
|
||||||
qse_str_t linew; /* line for manipulation, if necessary */
|
qse_str_t linew; /* line for manipulation, if necessary */
|
||||||
|
qse_str_t lineg; /* line buffer for getline */
|
||||||
|
|
||||||
qse_awk_val_t* d0; /* $0 */
|
qse_awk_val_t* d0; /* $0 */
|
||||||
|
|
||||||
@ -298,6 +299,8 @@ struct qse_awk_rtx_t
|
|||||||
}* flds;
|
}* flds;
|
||||||
} inrec;
|
} inrec;
|
||||||
|
|
||||||
|
qse_awk_nrflt_t nrflt;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void* rs;
|
void* rs;
|
||||||
|
@ -34,7 +34,9 @@ struct xtn_t
|
|||||||
typedef struct rxtn_t rxtn_t;
|
typedef struct rxtn_t rxtn_t;
|
||||||
struct rxtn_t
|
struct rxtn_t
|
||||||
{
|
{
|
||||||
int dummy;
|
MPI_Comm comm;
|
||||||
|
int size;
|
||||||
|
int rank;
|
||||||
};
|
};
|
||||||
|
|
||||||
qse_awk_t* qse_awk_openmpi (qse_size_t xtnsize)
|
qse_awk_t* qse_awk_openmpi (qse_size_t xtnsize)
|
||||||
@ -60,9 +62,8 @@ qse_awk_t* qse_awk_openmpiwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
|||||||
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
|
||||||
xtn->gbl_mpi[0] = qse_awk_addgbl (awk, QSE_T("MPI_HOST"), 8);
|
xtn->gbl_mpi[0] = qse_awk_addgbl (awk, QSE_T("MPI_HOST"), 8);
|
||||||
|
xtn->gbl_mpi[1] = qse_awk_addgbl (awk, QSE_T("MPI_SIZE"), 8);
|
||||||
xtn->gbl_mpi[1] = qse_awk_addgbl (awk, QSE_T("MPI_RANK"), 8);
|
xtn->gbl_mpi[2] = qse_awk_addgbl (awk, QSE_T("MPI_RANK"), 8);
|
||||||
xtn->gbl_mpi[2] = qse_awk_addgbl (awk, QSE_T("MPI_SIZE"), 8);
|
|
||||||
|
|
||||||
xtn->gbl_mpi[3] = qse_awk_addgbl (awk, QSE_T("MPI_REDUCE_MIN"), 14);
|
xtn->gbl_mpi[3] = qse_awk_addgbl (awk, QSE_T("MPI_REDUCE_MIN"), 14);
|
||||||
xtn->gbl_mpi[4] = qse_awk_addgbl (awk, QSE_T("MPI_REDUCE_MAX"), 14);
|
xtn->gbl_mpi[4] = qse_awk_addgbl (awk, QSE_T("MPI_REDUCE_MAX"), 14);
|
||||||
@ -123,6 +124,7 @@ qse_awk_rtx_t* qse_awk_rtx_openmpi (
|
|||||||
rxtn = (rxtn_t*) qse_awk_rtx_getxtnstd (rtx);
|
rxtn = (rxtn_t*) qse_awk_rtx_getxtnstd (rtx);
|
||||||
|
|
||||||
QSE_MEMSET (rxtn, 0, QSE_SIZEOF(*rxtn));
|
QSE_MEMSET (rxtn, 0, QSE_SIZEOF(*rxtn));
|
||||||
|
rxtn->comm = MPI_COMM_WORLD;
|
||||||
|
|
||||||
/* set the value of some MPI constants */
|
/* set the value of some MPI constants */
|
||||||
for (i = 0; i < QSE_COUNTOF(xtn->gbl_mpi); i++)
|
for (i = 0; i < QSE_COUNTOF(xtn->gbl_mpi); i++)
|
||||||
@ -142,7 +144,6 @@ qse_awk_rtx_t* qse_awk_rtx_openmpi (
|
|||||||
qse_mmgr_t* mmgr;
|
qse_mmgr_t* mmgr;
|
||||||
qse_char_t* tmp;
|
qse_char_t* tmp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (MPI_Get_processor_name(buf, &len) != MPI_SUCCESS)
|
if (MPI_Get_processor_name(buf, &len) != MPI_SUCCESS)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_close (rtx);
|
qse_awk_rtx_close (rtx);
|
||||||
@ -168,24 +169,24 @@ qse_awk_rtx_t* qse_awk_rtx_openmpi (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: /* MPI_RANK */
|
case 1: /* MPI_SIZE */
|
||||||
if (MPI_Comm_rank (MPI_COMM_WORLD, &iv) != MPI_SUCCESS)
|
if (MPI_Comm_size (rxtn->comm, &rxtn->size) != MPI_SUCCESS)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_close (rtx);
|
qse_awk_rtx_close (rtx);
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ESYSERR, QSE_NULL);
|
qse_awk_seterrnum (awk, QSE_AWK_ESYSERR, QSE_NULL);
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
v_tmp = qse_awk_rtx_makeintval (rtx, iv);
|
v_tmp = qse_awk_rtx_makeintval (rtx, rxtn->size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: /* MPI_SIZE */
|
case 2: /* MPI_RANK */
|
||||||
if (MPI_Comm_size (MPI_COMM_WORLD, &iv) != MPI_SUCCESS)
|
if (MPI_Comm_rank (rxtn->comm, &rxtn->rank) != MPI_SUCCESS)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_close (rtx);
|
qse_awk_rtx_close (rtx);
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ESYSERR, QSE_NULL);
|
qse_awk_seterrnum (awk, QSE_AWK_ESYSERR, QSE_NULL);
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
v_tmp = qse_awk_rtx_makeintval (rtx, iv);
|
v_tmp = qse_awk_rtx_makeintval (rtx, rxtn->rank);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* MPI_REDUCE_XXXX */
|
default: /* MPI_REDUCE_XXXX */
|
||||||
@ -219,6 +220,57 @@ qse_cmgr_t* qse_awk_rtx_getcmgrmpi (
|
|||||||
return qse_awk_rtx_getcmgrstd (rtx, ioname);
|
return qse_awk_rtx_getcmgrstd (rtx, ioname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fnc_hash (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
|
{
|
||||||
|
qse_size_t nargs;
|
||||||
|
qse_awk_val_t* tmp, * a0;
|
||||||
|
qse_long_t hv;
|
||||||
|
|
||||||
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
|
QSE_ASSERT (nargs == 1);
|
||||||
|
|
||||||
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
|
|
||||||
|
hv = qse_awk_rtx_hashval (rtx, a0);
|
||||||
|
|
||||||
|
tmp = qse_awk_rtx_makeintval (rtx, hv);
|
||||||
|
|
||||||
|
if (tmp == QSE_NULL) return -1;
|
||||||
|
qse_awk_rtx_setretval (rtx, tmp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fnc_assign (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
|
{
|
||||||
|
qse_size_t nargs;
|
||||||
|
qse_awk_val_t* tmp, * a0;
|
||||||
|
qse_long_t lv;
|
||||||
|
rxtn_t* rxtn;
|
||||||
|
qse_awk_nrflt_t nrflt;
|
||||||
|
|
||||||
|
rxtn = (rxtn_t*) qse_awk_rtx_getxtnstd (rtx);
|
||||||
|
|
||||||
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
|
QSE_ASSERT (nargs == 1);
|
||||||
|
|
||||||
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
|
|
||||||
|
if (qse_awk_rtx_valtolong (rtx, a0, &lv) <= -1) return -1;
|
||||||
|
|
||||||
|
tmp = qse_awk_rtx_makeintval (rtx, lv);
|
||||||
|
|
||||||
|
nrflt.limit = lv;
|
||||||
|
nrflt.size = rxtn->size;
|
||||||
|
nrflt.rank = rxtn->rank;
|
||||||
|
qse_awk_rtx_setnrflt (rtx, &nrflt);
|
||||||
|
|
||||||
|
if (tmp == QSE_NULL) return -1;
|
||||||
|
qse_awk_rtx_setretval (rtx, tmp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
{
|
{
|
||||||
qse_size_t nargs;
|
qse_size_t nargs;
|
||||||
@ -226,6 +278,7 @@ static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
qse_long_t opidx, lv;
|
qse_long_t opidx, lv;
|
||||||
qse_flt_t rv;
|
qse_flt_t rv;
|
||||||
int n;
|
int n;
|
||||||
|
rxtn_t* rxtn;
|
||||||
|
|
||||||
static MPI_Op optab[] =
|
static MPI_Op optab[] =
|
||||||
{
|
{
|
||||||
@ -237,28 +290,30 @@ static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
MPI_LOR
|
MPI_LOR
|
||||||
};
|
};
|
||||||
|
|
||||||
|
rxtn = (rxtn_t*) qse_awk_rtx_getxtnstd (rtx);
|
||||||
|
|
||||||
nargs = qse_awk_rtx_getnargs (rtx);
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
QSE_ASSERT (nargs == 2);
|
QSE_ASSERT (nargs == 2);
|
||||||
|
|
||||||
a0 = qse_awk_rtx_getarg (rtx, 0);
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
a1 = qse_awk_rtx_getarg (rtx, 1);
|
a1 = qse_awk_rtx_getarg (rtx, 1);
|
||||||
|
|
||||||
if (qse_awk_rtx_valtolong (rtx, a1, &opidx) <= -1 ||
|
if (qse_awk_rtx_valtolong (rtx, a1, &opidx) <= -1) return -1;
|
||||||
(opidx < 0 || opidx >= QSE_COUNTOF(optab)) ||
|
if (opidx < 0 || opidx >= QSE_COUNTOF(optab)) goto softfail;
|
||||||
(n = qse_awk_rtx_valtonum (rtx, a0, &lv, &rv)) <= -1) return -1;
|
if ((n = qse_awk_rtx_valtonum (rtx, a0, &lv, &rv)) <= -1) return -1;
|
||||||
|
|
||||||
/* TODO: determine it to be MPI_LONG or MPI_INT, OR MPI_LONG_LONG_INT depending on the size of qse_long_t */
|
/* TODO: determine it to be MPI_LONG or MPI_INT, OR MPI_LONG_LONG_INT depending on the size of qse_long_t */
|
||||||
/* TODO: how to tell normal -1 from the soft failure??? */
|
/* TODO: how to tell normal -1 from the soft failure??? */
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
{
|
{
|
||||||
qse_long_t lout;
|
qse_long_t lout;
|
||||||
if (MPI_Allreduce (&lv, &lout, 1, MPI_LONG_LONG_INT, optab[opidx], MPI_COMM_WORLD) != MPI_SUCCESS) goto softfail;
|
if (MPI_Allreduce (&lv, &lout, 1, MPI_LONG_LONG_INT, optab[opidx], rxtn->comm) != MPI_SUCCESS) goto softfail;
|
||||||
tmp = qse_awk_rtx_makeintval (rtx, lout);
|
tmp = qse_awk_rtx_makeintval (rtx, lout);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qse_flt_t fout;
|
qse_flt_t fout;
|
||||||
if (MPI_Allreduce (&rv, &fout, 1, MPI_LONG_DOUBLE, optab[opidx], MPI_COMM_WORLD) != MPI_SUCCESS) goto softfail;
|
if (MPI_Allreduce (&rv, &fout, 1, MPI_LONG_DOUBLE, optab[opidx], rxtn->comm) != MPI_SUCCESS) goto softfail;
|
||||||
tmp = qse_awk_rtx_makefltval (rtx, fout);
|
tmp = qse_awk_rtx_makefltval (rtx, fout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,8 +333,11 @@ static int fnc_barrier (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
qse_awk_val_t* tmp;
|
qse_awk_val_t* tmp;
|
||||||
|
rxtn_t* rxtn;
|
||||||
|
|
||||||
x = (MPI_Barrier (MPI_COMM_WORLD) == MPI_SUCCESS)? 0: -1;
|
rxtn = (rxtn_t*) qse_awk_rtx_getxtnstd (rtx);
|
||||||
|
|
||||||
|
x = (MPI_Barrier (rxtn->comm) == MPI_SUCCESS)? 0: -1;
|
||||||
|
|
||||||
tmp = qse_awk_rtx_makeintval (rtx, x);
|
tmp = qse_awk_rtx_makeintval (rtx, x);
|
||||||
if (tmp == QSE_NULL) return -1;
|
if (tmp == QSE_NULL) return -1;
|
||||||
@ -289,6 +347,8 @@ static int fnc_barrier (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
|
|
||||||
static int add_functions (qse_awk_t* awk)
|
static int add_functions (qse_awk_t* awk)
|
||||||
{
|
{
|
||||||
|
if (qse_awk_addfnc (awk, QSE_T("mpi_hash"), 8, 0, 1, 1, QSE_NULL, fnc_hash) == QSE_NULL) return -1;
|
||||||
|
if (qse_awk_addfnc (awk, QSE_T("mpi_assign"), 10, 0, 1, 1, QSE_NULL, fnc_assign) == QSE_NULL) return -1;
|
||||||
if (qse_awk_addfnc (awk, QSE_T("mpi_reduce"), 10, 0, 2, 2, QSE_NULL, fnc_reduce) == QSE_NULL) return -1;
|
if (qse_awk_addfnc (awk, QSE_T("mpi_reduce"), 10, 0, 2, 2, QSE_NULL, fnc_reduce) == QSE_NULL) return -1;
|
||||||
if (qse_awk_addfnc (awk, QSE_T("mpi_barrier"), 11, 0, 0, 0, QSE_NULL, fnc_barrier) == QSE_NULL) return -1;
|
if (qse_awk_addfnc (awk, QSE_T("mpi_barrier"), 11, 0, 0, 0, QSE_NULL, fnc_barrier) == QSE_NULL) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -198,7 +198,7 @@ static int find_rio_in (
|
|||||||
}
|
}
|
||||||
|
|
||||||
static QSE_INLINE int resolve_rs (
|
static QSE_INLINE int resolve_rs (
|
||||||
qse_awk_rtx_t* run, qse_awk_val_t* rs, qse_xstr_t* rrs)
|
qse_awk_rtx_t* rtx, qse_awk_val_t* rs, qse_xstr_t* rrs)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -215,7 +215,7 @@ static QSE_INLINE int resolve_rs (
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rrs->ptr = qse_awk_rtx_valtocpldup (run, rs, &rrs->len);
|
rrs->ptr = qse_awk_rtx_valtocpldup (rtx, rs, &rrs->len);
|
||||||
if (rrs->ptr == QSE_NULL) ret = -1;
|
if (rrs->ptr == QSE_NULL) ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -374,7 +374,7 @@ int qse_awk_rtx_readio (
|
|||||||
* is empty */
|
* is empty */
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
else if (rrs.ptr != QSE_NULL && rrs.len == 0)
|
else if (rrs.ptr && rrs.len == 0)
|
||||||
{
|
{
|
||||||
/* TODO: handle different line terminator */
|
/* TODO: handle different line terminator */
|
||||||
/* drop the line terminator from the record
|
/* drop the line terminator from the record
|
||||||
@ -630,8 +630,8 @@ int qse_awk_rtx_readio (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rrs.ptr != QSE_NULL &&
|
if (rrs.ptr && rs->type != QSE_AWK_VAL_STR)
|
||||||
rs->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, rrs.ptr);
|
QSE_AWK_FREE (run->awk, rrs.ptr);
|
||||||
qse_awk_rtx_refdownval (run, rs);
|
qse_awk_rtx_refdownval (run, rs);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -559,6 +559,12 @@ static int set_global (
|
|||||||
rss = out.u.cpldup;
|
rss = out.u.cpldup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rtx->gbl.rs)
|
||||||
|
{
|
||||||
|
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.rs);
|
||||||
|
rtx->gbl.rs = QSE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (rss.len > 1)
|
if (rss.len > 1)
|
||||||
{
|
{
|
||||||
void* rex;
|
void* rex;
|
||||||
@ -575,9 +581,6 @@ static int set_global (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtx->gbl.rs != QSE_NULL)
|
|
||||||
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.rs);
|
|
||||||
|
|
||||||
rtx->gbl.rs = rex;
|
rtx->gbl.rs = rex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -852,65 +855,21 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
|
|||||||
rtx->inrec.nflds = 0;
|
rtx->inrec.nflds = 0;
|
||||||
rtx->inrec.maxflds = 0;
|
rtx->inrec.maxflds = 0;
|
||||||
rtx->inrec.d0 = qse_awk_val_nil;
|
rtx->inrec.d0 = qse_awk_val_nil;
|
||||||
if (qse_str_init (
|
|
||||||
&rtx->inrec.line, MMGR(rtx), DEF_BUF_CAPA) <= -1)
|
|
||||||
{
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qse_str_init (
|
if (qse_str_init (&rtx->inrec.line, MMGR(rtx), DEF_BUF_CAPA) <= -1) goto oops_0;
|
||||||
&rtx->inrec.linew, MMGR(rtx), DEF_BUF_CAPA) <= -1)
|
if (qse_str_init (&rtx->inrec.linew, MMGR(rtx), DEF_BUF_CAPA) <= -1) goto oops_1;
|
||||||
{
|
if (qse_str_init (&rtx->inrec.lineg, MMGR(rtx), DEF_BUF_CAPA) <= -1) goto oops_2;
|
||||||
qse_str_fini (&rtx->inrec.line);
|
if (qse_str_init (&rtx->format.out, MMGR(rtx), 256) <= -1) goto oops_3;
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
if (qse_str_init (&rtx->format.fmt, MMGR(rtx), 256) <= -1) goto oops_4;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qse_str_init (&rtx->format.out, MMGR(rtx), 256) <= -1)
|
rtx->named = qse_htb_open (MMGR(rtx), QSE_SIZEOF(rtx), 1024, 70, QSE_SIZEOF(qse_char_t), 1);
|
||||||
{
|
if (rtx->named == QSE_NULL) goto oops_5;
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
|
||||||
qse_str_fini (&rtx->inrec.line);
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qse_str_init (&rtx->format.fmt, MMGR(rtx), 256) <= -1)
|
|
||||||
{
|
|
||||||
qse_str_fini (&rtx->format.out);
|
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
|
||||||
qse_str_fini (&rtx->inrec.line);
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtx->named = qse_htb_open (
|
|
||||||
MMGR(rtx), QSE_SIZEOF(rtx), 1024, 70, QSE_SIZEOF(qse_char_t), 1
|
|
||||||
);
|
|
||||||
if (rtx->named == QSE_NULL)
|
|
||||||
{
|
|
||||||
qse_str_fini (&rtx->format.fmt);
|
|
||||||
qse_str_fini (&rtx->format.out);
|
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
|
||||||
qse_str_fini (&rtx->inrec.line);
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*(qse_awk_rtx_t**)QSE_XTN(rtx->named) = rtx;
|
*(qse_awk_rtx_t**)QSE_XTN(rtx->named) = rtx;
|
||||||
qse_htb_setmancbs (rtx->named, &mancbs_for_named);
|
qse_htb_setmancbs (rtx->named, &mancbs_for_named);
|
||||||
|
|
||||||
rtx->format.tmp.ptr = (qse_char_t*)
|
rtx->format.tmp.ptr = (qse_char_t*)
|
||||||
QSE_AWK_ALLOC (rtx->awk, 4096*QSE_SIZEOF(qse_char_t*));
|
QSE_AWK_ALLOC (rtx->awk, 4096*QSE_SIZEOF(qse_char_t*));
|
||||||
if (rtx->format.tmp.ptr == QSE_NULL)
|
if (rtx->format.tmp.ptr == QSE_NULL) goto oops_6;
|
||||||
{
|
|
||||||
qse_htb_close (rtx->named);
|
|
||||||
qse_str_fini (&rtx->format.fmt);
|
|
||||||
qse_str_fini (&rtx->format.out);
|
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
|
||||||
qse_str_fini (&rtx->inrec.line);
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
rtx->format.tmp.len = 4096;
|
rtx->format.tmp.len = 4096;
|
||||||
rtx->format.tmp.inc = 4096*2;
|
rtx->format.tmp.inc = 4096*2;
|
||||||
|
|
||||||
@ -918,17 +877,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
|
|||||||
{
|
{
|
||||||
rtx->pattern_range_state = (qse_byte_t*) QSE_AWK_ALLOC (
|
rtx->pattern_range_state = (qse_byte_t*) QSE_AWK_ALLOC (
|
||||||
rtx->awk, rtx->awk->tree.chain_size*QSE_SIZEOF(qse_byte_t));
|
rtx->awk, rtx->awk->tree.chain_size*QSE_SIZEOF(qse_byte_t));
|
||||||
if (rtx->pattern_range_state == QSE_NULL)
|
if (rtx->pattern_range_state == QSE_NULL) goto oops_7;
|
||||||
{
|
|
||||||
QSE_AWK_FREE (rtx->awk, rtx->format.tmp.ptr);
|
|
||||||
qse_htb_close (rtx->named);
|
|
||||||
qse_str_fini (&rtx->format.fmt);
|
|
||||||
qse_str_fini (&rtx->format.out);
|
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
|
||||||
qse_str_fini (&rtx->inrec.line);
|
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSE_MEMSET (
|
QSE_MEMSET (
|
||||||
rtx->pattern_range_state, 0,
|
rtx->pattern_range_state, 0,
|
||||||
@ -954,6 +903,24 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
|
|||||||
rtx->depth.cur.expr = 0;
|
rtx->depth.cur.expr = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
oops_7:
|
||||||
|
QSE_AWK_FREE (rtx->awk, rtx->format.tmp.ptr);
|
||||||
|
oops_6:
|
||||||
|
qse_htb_close (rtx->named);
|
||||||
|
oops_5:
|
||||||
|
qse_str_fini (&rtx->format.fmt);
|
||||||
|
oops_4:
|
||||||
|
qse_str_fini (&rtx->format.out);
|
||||||
|
oops_3:
|
||||||
|
qse_str_fini (&rtx->inrec.lineg);
|
||||||
|
oops_2:
|
||||||
|
qse_str_fini (&rtx->inrec.linew);
|
||||||
|
oops_1:
|
||||||
|
qse_str_fini (&rtx->inrec.line);
|
||||||
|
oops_0:
|
||||||
|
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
|
static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
|
||||||
@ -966,12 +933,12 @@ static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
|
|||||||
qse_awk_rtx_cleario (rtx);
|
qse_awk_rtx_cleario (rtx);
|
||||||
QSE_ASSERT (rtx->rio.chain == QSE_NULL);
|
QSE_ASSERT (rtx->rio.chain == QSE_NULL);
|
||||||
|
|
||||||
if (rtx->gbl.rs != QSE_NULL)
|
if (rtx->gbl.rs)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.rs);
|
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.rs);
|
||||||
rtx->gbl.rs = QSE_NULL;
|
rtx->gbl.rs = QSE_NULL;
|
||||||
}
|
}
|
||||||
if (rtx->gbl.fs != QSE_NULL)
|
if (rtx->gbl.fs)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.fs);
|
QSE_AWK_FREEREX (rtx->awk, rtx->gbl.fs);
|
||||||
rtx->gbl.fs = QSE_NULL;
|
rtx->gbl.fs = QSE_NULL;
|
||||||
@ -1028,19 +995,20 @@ static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
|
|||||||
* before the stack has been destroyed because it may try
|
* before the stack has been destroyed because it may try
|
||||||
* to change the value to QSE_AWK_GBL_NF. */
|
* to change the value to QSE_AWK_GBL_NF. */
|
||||||
qse_awk_rtx_clrrec (rtx, QSE_FALSE);
|
qse_awk_rtx_clrrec (rtx, QSE_FALSE);
|
||||||
if (rtx->inrec.flds != QSE_NULL)
|
if (rtx->inrec.flds)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (rtx->awk, rtx->inrec.flds);
|
QSE_AWK_FREE (rtx->awk, rtx->inrec.flds);
|
||||||
rtx->inrec.flds = QSE_NULL;
|
rtx->inrec.flds = QSE_NULL;
|
||||||
rtx->inrec.maxflds = 0;
|
rtx->inrec.maxflds = 0;
|
||||||
}
|
}
|
||||||
|
qse_str_fini (&rtx->inrec.lineg);
|
||||||
qse_str_fini (&rtx->inrec.linew);
|
qse_str_fini (&rtx->inrec.linew);
|
||||||
qse_str_fini (&rtx->inrec.line);
|
qse_str_fini (&rtx->inrec.line);
|
||||||
|
|
||||||
if (fini_globals) refdown_globals (rtx, 1);
|
if (fini_globals) refdown_globals (rtx, 1);
|
||||||
|
|
||||||
/* destroy the stack if necessary */
|
/* destroy the stack if necessary */
|
||||||
if (rtx->stack != QSE_NULL)
|
if (rtx->stack)
|
||||||
{
|
{
|
||||||
QSE_ASSERT (rtx->stack_top == 0);
|
QSE_ASSERT (rtx->stack_top == 0);
|
||||||
|
|
||||||
@ -1584,12 +1552,6 @@ static int run_pblocks (qse_awk_rtx_t* run)
|
|||||||
}
|
}
|
||||||
if (n == 0) break; /* end of input */
|
if (n == 0) break; /* end of input */
|
||||||
|
|
||||||
if (update_fnr (run, run->gbl.fnr+1, run->gbl.nr+1) == -1)
|
|
||||||
{
|
|
||||||
ADJUST_ERROR (run);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (run->awk->tree.chain != QSE_NULL)
|
if (run->awk->tree.chain != QSE_NULL)
|
||||||
{
|
{
|
||||||
if (run_pblock_chain (
|
if (run_pblock_chain (
|
||||||
@ -6227,14 +6189,13 @@ static qse_awk_val_t* eval_pos (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
|
static qse_awk_val_t* eval_getline (qse_awk_rtx_t* rtx, qse_awk_nde_t* nde)
|
||||||
{
|
{
|
||||||
qse_awk_nde_getline_t* p;
|
qse_awk_nde_getline_t* p;
|
||||||
qse_awk_val_t* v, * res;
|
qse_awk_val_t* v, * tmp;
|
||||||
qse_char_t* in = QSE_NULL;
|
qse_char_t* dst;
|
||||||
const qse_char_t* dst;
|
qse_str_t* buf;
|
||||||
qse_str_t buf;
|
int n, x;
|
||||||
int n;
|
|
||||||
|
|
||||||
p = (qse_awk_nde_getline_t*)nde;
|
p = (qse_awk_nde_getline_t*)nde;
|
||||||
|
|
||||||
@ -6244,121 +6205,132 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
|
|||||||
(p->in_type == QSE_AWK_IN_FILE && p->in != QSE_NULL) ||
|
(p->in_type == QSE_AWK_IN_FILE && p->in != QSE_NULL) ||
|
||||||
(p->in_type == QSE_AWK_IN_CONSOLE && p->in == QSE_NULL));
|
(p->in_type == QSE_AWK_IN_CONSOLE && p->in == QSE_NULL));
|
||||||
|
|
||||||
if (p->in != QSE_NULL)
|
if (p->in)
|
||||||
{
|
{
|
||||||
qse_size_t len;
|
qse_size_t len;
|
||||||
qse_awk_rtx_valtostr_out_t out;
|
qse_awk_rtx_valtostr_out_t out;
|
||||||
|
|
||||||
v = eval_expression (run, p->in);
|
v = eval_expression (rtx, p->in);
|
||||||
if (v == QSE_NULL) return QSE_NULL;
|
if (v == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
/* TODO: distinction between v->type == QSE_AWK_VAL_STR
|
qse_awk_rtx_refupval (rtx, v);
|
||||||
* and v->type != QSE_AWK_VAL_STR
|
if (v->type == QSE_AWK_VAL_STR)
|
||||||
* if you use the buffer the v directly when
|
|
||||||
* v->type == QSE_AWK_VAL_STR, qse_awk_rtx_refdownval(v)
|
|
||||||
* should not be called immediately below */
|
|
||||||
qse_awk_rtx_refupval (run, v);
|
|
||||||
|
|
||||||
out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP;
|
|
||||||
if (qse_awk_rtx_valtostr (run, v, &out) <= -1)
|
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run, v);
|
dst = ((qse_awk_val_str_t*)v)->val.ptr;
|
||||||
return QSE_NULL;
|
len = ((qse_awk_val_str_t*)v)->val.len;
|
||||||
}
|
}
|
||||||
qse_awk_rtx_refdownval (run, v);
|
else
|
||||||
|
{
|
||||||
|
out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP;
|
||||||
|
x = qse_awk_rtx_valtostr (rtx, v, &out);
|
||||||
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
|
if (x <= -1) return QSE_NULL;
|
||||||
|
|
||||||
in = out.u.cpldup.ptr;
|
dst = out.u.cpldup.ptr;
|
||||||
len = out.u.cpldup.len;
|
len = out.u.cpldup.len;
|
||||||
|
}
|
||||||
|
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
/* the input source name is empty.
|
/* the input source name is empty.
|
||||||
* make getline return -1 */
|
* make getline return -1 */
|
||||||
QSE_AWK_FREE (run->awk, in);
|
if (v->type == QSE_AWK_VAL_STR)
|
||||||
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
|
else QSE_AWK_FREE (rtx->awk, dst);
|
||||||
|
|
||||||
n = -1;
|
n = -1;
|
||||||
goto skip_read;
|
goto skip_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
if (in[--len] == QSE_T('\0'))
|
if (dst[--len] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
/* the input source name contains a null
|
/* the input source name contains a null
|
||||||
* character. make getline return -1.
|
* character. make getline return -1.
|
||||||
* unlike print & printf, it is not a hard
|
* unlike print & printf, it is not a hard
|
||||||
* error */
|
* error */
|
||||||
QSE_AWK_FREE (run->awk, in);
|
if (v->type == QSE_AWK_VAL_STR)
|
||||||
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
|
else QSE_AWK_FREE (rtx->awk, dst);
|
||||||
|
|
||||||
n = -1;
|
n = -1;
|
||||||
goto skip_read;
|
goto skip_read;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else dst = (qse_char_t*)QSE_T("");
|
||||||
|
|
||||||
dst = (in == QSE_NULL)? QSE_T(""): in;
|
buf = &rtx->inrec.lineg;
|
||||||
|
read_console_again:
|
||||||
|
qse_str_clear (&rtx->inrec.lineg);
|
||||||
|
|
||||||
/* TODO: optimize the line buffer management */
|
n = qse_awk_rtx_readio (rtx, p->in_type, dst, buf);
|
||||||
if (qse_str_init (&buf, MMGR(run), DEF_BUF_CAPA) <= -1)
|
|
||||||
|
if (p->in)
|
||||||
{
|
{
|
||||||
if (in != QSE_NULL) QSE_AWK_FREE (run->awk, in);
|
if (v->type == QSE_AWK_VAL_STR)
|
||||||
SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc);
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
return QSE_NULL;
|
else QSE_AWK_FREE (rtx->awk, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
n = qse_awk_rtx_readio (run, p->in_type, dst, &buf);
|
|
||||||
if (in != QSE_NULL) QSE_AWK_FREE (run->awk, in);
|
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
/* make getline return -1 */
|
/* make getline return -1 */
|
||||||
n = -1;
|
n = -1;
|
||||||
}
|
}
|
||||||
|
else if (n > 0)
|
||||||
if (n > 0)
|
|
||||||
{
|
{
|
||||||
|
if (p->in_type == QSE_AWK_IN_CONSOLE)
|
||||||
|
{
|
||||||
|
QSE_ASSERT (p->in == QSE_NULL);
|
||||||
|
if (rtx->nrflt.limit > 0)
|
||||||
|
{
|
||||||
|
if (((rtx->gbl.nr / rtx->nrflt.limit) % rtx->nrflt.size) != rtx->nrflt.rank)
|
||||||
|
{
|
||||||
|
if (update_fnr (rtx, rtx->gbl.fnr + 1, rtx->gbl.nr + 1) <= -1) return QSE_NULL;
|
||||||
|
/* this jump is a bit dirty. the 'if' block below qse_awk_rtx_readion()
|
||||||
|
* will never be true. but this makes code confusing */
|
||||||
|
goto read_console_again;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (p->var == QSE_NULL)
|
if (p->var == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* set $0 with the input value */
|
/* set $0 with the input value */
|
||||||
if (qse_awk_rtx_setrec (run, 0,
|
x = qse_awk_rtx_setrec (rtx, 0, QSE_STR_PTR(buf), QSE_STR_LEN(buf));
|
||||||
QSE_STR_PTR(&buf),
|
if (x <= -1) return QSE_NULL;
|
||||||
QSE_STR_LEN(&buf)) <= -1)
|
|
||||||
{
|
|
||||||
qse_str_fini (&buf);
|
|
||||||
return QSE_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
qse_str_fini (&buf);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qse_awk_val_t* v;
|
qse_awk_val_t* v;
|
||||||
|
|
||||||
v = qse_awk_rtx_makestrval (run,
|
v = qse_awk_rtx_makestrval (rtx, QSE_STR_PTR(buf), QSE_STR_LEN(buf));
|
||||||
QSE_STR_PTR(&buf), QSE_STR_LEN(&buf));
|
|
||||||
qse_str_fini (&buf);
|
|
||||||
if (v == QSE_NULL)
|
if (v == QSE_NULL)
|
||||||
{
|
{
|
||||||
ADJERR_LOC (run, &nde->loc);
|
ADJERR_LOC (rtx, &nde->loc);
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_refupval (run, v);
|
qse_awk_rtx_refupval (rtx, v);
|
||||||
if (do_assignment(run, p->var, v) == QSE_NULL)
|
tmp = do_assignment(rtx, p->var, v);
|
||||||
{
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
qse_awk_rtx_refdownval (run, v);
|
if (tmp == QSE_NULL) return QSE_NULL;
|
||||||
return QSE_NULL;
|
}
|
||||||
}
|
|
||||||
qse_awk_rtx_refdownval (run, v);
|
/* update FNR & NR if reading from console */
|
||||||
|
if (p->in_type == QSE_AWK_IN_CONSOLE &&
|
||||||
|
update_fnr (rtx, rtx->gbl.fnr + 1, rtx->gbl.nr + 1) <= -1)
|
||||||
|
{
|
||||||
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qse_str_fini (&buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_read:
|
skip_read:
|
||||||
res = qse_awk_rtx_makeintval (run, n);
|
tmp = qse_awk_rtx_makeintval (rtx, n);
|
||||||
if (res == QSE_NULL) ADJERR_LOC (run, &nde->loc);
|
if (tmp == QSE_NULL) ADJERR_LOC (rtx, &nde->loc);
|
||||||
return res;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qse_awk_val_t* eval_print (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
|
static qse_awk_val_t* eval_print (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
|
||||||
@ -6398,35 +6370,44 @@ static int __raw_push (qse_awk_rtx_t* run, void* val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_record (qse_awk_rtx_t* run)
|
static int read_record (qse_awk_rtx_t* rtx)
|
||||||
{
|
{
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
|
qse_str_t* buf;
|
||||||
|
qse_awk_rtx_ecb_t* ecb;
|
||||||
|
|
||||||
if (qse_awk_rtx_clrrec (run, QSE_FALSE) == -1) return -1;
|
read_again:
|
||||||
|
if (qse_awk_rtx_clrrec (rtx, QSE_FALSE) == -1) return -1;
|
||||||
|
|
||||||
n = qse_awk_rtx_readio (
|
buf = &rtx->inrec.line;
|
||||||
run, QSE_AWK_IN_CONSOLE, QSE_T(""), &run->inrec.line);
|
n = qse_awk_rtx_readio (rtx, QSE_AWK_IN_CONSOLE, QSE_T(""), buf);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_clrrec (run, QSE_FALSE);
|
qse_awk_rtx_clrrec (rtx, QSE_FALSE);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_RUN
|
#ifdef DEBUG_RUN
|
||||||
qse_dprintf (QSE_T("record len = %d str=[%.*s]\n"),
|
qse_dprintf (QSE_T("record len = %d str=[%.*s]\n"),
|
||||||
(int)QSE_STR_LEN(&run->inrec.line),
|
(int)QSE_STR_LEN(buf), (int)QSE_STR_LEN(buf), QSE_STR_PTR(buf));
|
||||||
(int)QSE_STR_LEN(&run->inrec.line),
|
|
||||||
QSE_STR_PTR(&run->inrec.line));
|
|
||||||
#endif
|
#endif
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
{
|
{
|
||||||
QSE_ASSERT (QSE_STR_LEN(&run->inrec.line) == 0);
|
QSE_ASSERT (QSE_STR_LEN(buf) == 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qse_awk_rtx_setrec (run, 0,
|
if (rtx->nrflt.limit > 0)
|
||||||
QSE_STR_PTR(&run->inrec.line),
|
{
|
||||||
QSE_STR_LEN(&run->inrec.line)) <= -1) return -1;
|
if (((rtx->gbl.nr / rtx->nrflt.limit) % rtx->nrflt.size) != rtx->nrflt.rank)
|
||||||
|
{
|
||||||
|
if (update_fnr (rtx, rtx->gbl.fnr + 1, rtx->gbl.nr + 1) <= -1) return -1;
|
||||||
|
goto read_again;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qse_awk_rtx_setrec (rtx, 0, QSE_STR_PTR(buf), QSE_STR_LEN(buf)) <= -1 ||
|
||||||
|
update_fnr (rtx, rtx->gbl.fnr + 1, rtx->gbl.nr + 1) <= -1) return -1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -6820,7 +6801,7 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (val != QSE_NULL)
|
if (val)
|
||||||
{
|
{
|
||||||
if (stack_arg_idx >= nargs_on_stack)
|
if (stack_arg_idx >= nargs_on_stack)
|
||||||
{
|
{
|
||||||
@ -7309,7 +7290,7 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (val != QSE_NULL)
|
if (val)
|
||||||
{
|
{
|
||||||
if (stack_arg_idx >= nargs_on_stack)
|
if (stack_arg_idx >= nargs_on_stack)
|
||||||
{
|
{
|
||||||
@ -7409,15 +7390,19 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_refdownval (rtx, v);
|
qse_awk_rtx_refdownval (rtx, v);
|
||||||
|
|
||||||
}
|
}
|
||||||
else /*if (fmt[i] == QSE_T('%'))*/
|
else
|
||||||
{
|
{
|
||||||
OUT_STR (QSE_STR_PTR(fbu), QSE_STR_LEN(fbu));
|
if (fmt[i] != QSE_T('%'))
|
||||||
|
OUT_STR (QSE_STR_PTR(fbu), QSE_STR_LEN(fbu));
|
||||||
OUT_CHAR (fmt[i]);
|
OUT_CHAR (fmt[i]);
|
||||||
|
goto skip_taking_arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args == QSE_NULL || val != QSE_NULL) stack_arg_idx++;
|
if (args == QSE_NULL || val != QSE_NULL) stack_arg_idx++;
|
||||||
else args = args->next;
|
else args = args->next;
|
||||||
|
skip_taking_arg:
|
||||||
qse_str_clear (fbu);
|
qse_str_clear (fbu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7428,3 +7413,12 @@ wp_mod_main:
|
|||||||
return QSE_STR_PTR(out);
|
return QSE_STR_PTR(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qse_awk_rtx_setnrflt (qse_awk_rtx_t* rtx, const qse_awk_nrflt_t* nrflt)
|
||||||
|
{
|
||||||
|
rtx->nrflt = *nrflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void qse_awk_rtx_getnrflt (qse_awk_rtx_t* rtx, qse_awk_nrflt_t* nrflt)
|
||||||
|
{
|
||||||
|
*nrflt = rtx->nrflt;
|
||||||
|
}
|
||||||
|
@ -1165,7 +1165,7 @@ int qse_awk_rtx_valtonum (
|
|||||||
|
|
||||||
#ifdef DEBUG_VAL
|
#ifdef DEBUG_VAL
|
||||||
qse_dprintf (
|
qse_dprintf (
|
||||||
QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_valtonum\n"),
|
QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_valtonum()\n"),
|
||||||
v->type
|
v->type
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
@ -1225,6 +1225,52 @@ int qse_awk_rtx_strtonum (
|
|||||||
return 0; /* long */
|
return 0; /* long */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static qse_ulong_t hash (qse_uint8_t* ptr, qse_size_t len)
|
||||||
|
{
|
||||||
|
qse_ulong_t h = 5381;
|
||||||
|
while (len > 0) h = ((h << 5) + h) + ptr[--len];
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_long_t qse_awk_rtx_hashval (qse_awk_rtx_t* rtx, qse_awk_val_t* v)
|
||||||
|
{
|
||||||
|
qse_long_t hv;
|
||||||
|
|
||||||
|
switch (v->type)
|
||||||
|
{
|
||||||
|
case QSE_AWK_VAL_NIL:
|
||||||
|
hv = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QSE_AWK_VAL_INT:
|
||||||
|
/*hv = ((qse_awk_val_int_t*)v)->val;*/
|
||||||
|
hv = (qse_long_t)hash (&((qse_awk_val_int_t*)v)->val, QSE_SIZEOF(((qse_awk_val_int_t*)v)->val));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QSE_AWK_VAL_FLT:
|
||||||
|
hv = (qse_long_t)hash (&((qse_awk_val_flt_t*)v)->val, QSE_SIZEOF(((qse_awk_val_flt_t*)v)->val));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QSE_AWK_VAL_STR:
|
||||||
|
hv = (qse_long_t)hash (((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len * QSE_SIZEOF(qse_char_t));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
#ifdef DEBUG_VAL
|
||||||
|
qse_dprintf (
|
||||||
|
QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_hashval()\n"),
|
||||||
|
v->type
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EVALTYPE, QSE_NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hv & ~(((qse_ulong_t)1) << ((QSE_SIZEOF(qse_ulong_t) * 8) - 1));
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
#define DPRINTF run->awk->prmfns->dprintf
|
#define DPRINTF run->awk->prmfns->dprintf
|
||||||
|
@ -342,7 +342,6 @@ static void fini_xtn_ssl (httpd_xtn_t* xtn)
|
|||||||
TODO: CRYPTO_set_locking_callback (QSE_NULL); */
|
TODO: CRYPTO_set_locking_callback (QSE_NULL); */
|
||||||
SSL_CTX_free (xtn->ssl_ctx);
|
SSL_CTX_free (xtn->ssl_ctx);
|
||||||
|
|
||||||
|
|
||||||
/*ERR_remove_state ();*/
|
/*ERR_remove_state ();*/
|
||||||
ENGINE_cleanup ();
|
ENGINE_cleanup ();
|
||||||
|
|
||||||
|
@ -2479,12 +2479,12 @@ postfix x 119 126 /var/spo
|
|||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Result Ra Rb Connect Error
|
Result Ra Rb Connect Error
|
||||||
|
|
||||||
88800.00 82000 6800 series -0.22%%
|
88800.00 82000 6800 series -0.22%
|
||||||
89000.00 56000 33000 series
|
89000.00 56000 33000 series
|
||||||
89000.00 62000 27000 series
|
89000.00 62000 27000 series
|
||||||
89130.43 820000 100000 parallel +0.15%%
|
89130.43 820000 100000 parallel +0.15%
|
||||||
89137.93 470000 110000 parallel +0.15%%
|
89137.93 470000 110000 parallel +0.15%
|
||||||
89189.19 220000 150000 parallel +0.21%%
|
89189.19 220000 150000 parallel +0.21%
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
[CMD] qseawk -f quicksort.awk quicksort.dat </dev/stdin 2>&1
|
[CMD] qseawk -f quicksort.awk quicksort.dat </dev/stdin 2>&1
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -2479,12 +2479,12 @@ postfix x 119 126 /var/spo
|
|||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Result Ra Rb Connect Error
|
Result Ra Rb Connect Error
|
||||||
|
|
||||||
88800.00 82000 6800 series -0.22%%
|
88800.00 82000 6800 series -0.22%
|
||||||
89000.00 56000 33000 series
|
89000.00 56000 33000 series
|
||||||
89000.00 62000 27000 series
|
89000.00 62000 27000 series
|
||||||
89130.43 820000 100000 parallel +0.15%%
|
89130.43 820000 100000 parallel +0.15%
|
||||||
89137.93 470000 110000 parallel +0.15%%
|
89137.93 470000 110000 parallel +0.15%
|
||||||
89189.19 220000 150000 parallel +0.21%%
|
89189.19 220000 150000 parallel +0.21%
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
[CMD] qseawk -m 500000 -f quicksort.awk quicksort.dat </dev/stdin 2>&1
|
[CMD] qseawk -m 500000 -f quicksort.awk quicksort.dat </dev/stdin 2>&1
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user