diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index d8a83155..fcbfc9d4 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: awk.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -708,7 +708,7 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_parsestd_in_t psin; qse_awk_parsestd_out_t psout; - qse_memset (&arg, 0, QSE_SIZEOF(arg)); + memset (&arg, 0, QSE_SIZEOF(arg)); i = comparg (argc, argv, &arg); if (i <= 0) diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 0b7cd605..d2602dc8 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 288 2009-09-15 14:03:15Z hyunghwan.chung $ + * $Id: awk.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -31,9 +31,8 @@ * * @todo * - make enhancement to treat a function as a value - * - add RQ (right quote), LQ (left quote), ES (escaper) for more powerful - * record splitting * - improve performance of qse_awk_rtx_readio() if RS is logner than 2 chars. + * - consider something like ${1:3,5} => $1, $2, $3, and $5 concatenated */ /** diff --git a/qse/include/qse/cmn/tio.h b/qse/include/qse/cmn/tio.h index 12210bd7..40471a23 100644 --- a/qse/include/qse/cmn/tio.h +++ b/qse/include/qse/cmn/tio.h @@ -1,5 +1,5 @@ /* - * $Id: tio.h 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: tio.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -66,10 +66,8 @@ enum typedef struct qse_tio_t qse_tio_t; -/****t* Common/qse_tio_io_t - * NAME - * qse_tio_io_t - define a text IO handler type - * SYNOPSIS +/** + * The qse_tio_io_t types define a text I/O handler. */ typedef qse_ssize_t (*qse_tio_io_t) ( int cmd, @@ -77,16 +75,11 @@ typedef qse_ssize_t (*qse_tio_io_t) ( void* data, qse_size_t size ); -/******/ -/****s* Common/qse_tio_t - * NAME - * qse_tio_t - define a text IO type - * DESCRIPTION - * The qse_tio_t type defines a generic type for text IO. When qse_char_t is - * qse_mchar_t, it handles any byte streams. When qse_char_t is qse_wchar_t, - * it handles a multi-byte stream converted to a wide character stream. - * SYNOPSIS +/** + * The qse_tio_t type defines a generic type for text IO. If #qse_char_t is + * #qse_mchar_t, it handles any byte streams. If qse_char_t is #qse_wchar_t, + * it handles a multi-byte stream converted to a wide character stream. */ struct qse_tio_t { @@ -108,7 +101,6 @@ struct qse_tio_t qse_mchar_t inbuf[QSE_TIO_MAX_INBUF_LEN]; qse_mchar_t outbuf[QSE_TIO_MAX_OUTBUF_LEN]; }; -/******/ #ifdef __cplusplus extern "C" { @@ -116,26 +108,20 @@ extern "C" { QSE_DEFINE_COMMON_FUNCTIONS (tio) -/****f* Common/qse_tio_open - * NAME - * qse_tio_open - create an text IO processor - * SYNOPSIS +/** + * The qse_tio_open() function creates an text stream processoor. */ qse_tio_t* qse_tio_open ( qse_mmgr_t* mmgr, qse_size_t ext ); -/******/ -/****f* Common/qse_tio_close - * NAME - * qse_tio_close - destroy an text IO processor - * SYNOPSIS +/** + * The qse_tio_close() function destroys an text stream processor. */ int qse_tio_close ( qse_tio_t* tio ); -/******/ /****f* Common/qse_tio_init * NAME diff --git a/qse/lib/awk/awk.h b/qse/lib/awk/awk.h index 42d2d2e4..707eac59 100644 --- a/qse/lib/awk/awk.h +++ b/qse/lib/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 290 2009-09-19 04:28:49Z hyunghwan.chung $ + * $Id: awk.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -21,6 +21,7 @@ #ifndef _QSE_LIB_AWK_AWK_H_ #define _QSE_LIB_AWK_AWK_H_ +#define USE_STDC #include "../cmn/mem.h" #include #include @@ -287,7 +288,9 @@ struct qse_awk_rtx_t qse_size_t buf_len; qse_bool_t eof; - qse_str_t line; + qse_str_t line; /* entire line */ + qse_str_t linew; /* line for manipulation, if necessary */ + qse_awk_val_t* d0; /* $0 */ qse_size_t maxflds; diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c index 1e669fc6..2376c31b 100644 --- a/qse/lib/awk/misc.c +++ b/qse/lib/awk/misc.c @@ -1,5 +1,5 @@ /* - * $Id: misc.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: misc.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -796,7 +796,8 @@ qse_char_t* qse_awk_rtx_strxntok ( } for (d = delim; d < delim_end; d++) { - if (c == QSE_AWK_TOUPPER(rtx->awk,*d)) goto exit_loop; + if (c == QSE_AWK_TOUPPER(rtx->awk,*d)) + goto exit_loop; } if (sp == QSE_NULL) sp = p; ep = p++; @@ -834,7 +835,7 @@ exit_loop: *tok_len = ep - sp + 1; } - /* if QSE_NULL is returned, this function should not be called anymore */ + /* if QSE_NULL is returned, this function should not be called again */ if (p >= end) return QSE_NULL; if (delim_mode == __DELIM_EMPTY || delim_mode == __DELIM_SPACES) return (qse_char_t*)p; @@ -937,6 +938,15 @@ exit_loop: } } +qse_char_t* qse_awk_rtx_strxnfld ( + qse_awk_rtx_t* rtx, qse_char_t* str, qse_size_t len, + qse_char_t fs, qse_char_t lq, qse_char_t rq, qse_char_t ec, + qse_char_t** tok, qse_size_t* tok_len) +{ +/* TODO: */ + return QSE_NULL; +} + #define QSE_AWK_REXERRTOERR(err) \ ((err == QSE_REX_ENOERR)? QSE_AWK_ENOERR: \ (err == QSE_REX_ENOMEM)? QSE_AWK_ENOMEM: \ diff --git a/qse/lib/awk/misc.h b/qse/lib/awk/misc.h index 0db307c1..ccd10ea8 100644 --- a/qse/lib/awk/misc.h +++ b/qse/lib/awk/misc.h @@ -1,5 +1,5 @@ /* - * $Id: misc.h 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: misc.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -55,6 +55,18 @@ qse_char_t* qse_awk_rtx_strxntokbyrex ( qse_awk_errnum_t* errnum ); +qse_char_t* qse_awk_rtx_strxnfld ( + qse_awk_rtx_t* rtx, + qse_char_t* str, + qse_size_t len, + qse_char_t fs, + qse_char_t lq, + qse_char_t rq, + qse_char_t ec, + qse_char_t** tok, + qse_size_t* tok_len +); + void* qse_awk_buildrex ( qse_awk_t* awk, const qse_char_t* ptn, diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index fcf3dadc..b7a5eb2e 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: parse.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -326,6 +326,7 @@ static global_t gtab[] = { QSE_T("RLENGTH"), 7, 0 }, { QSE_T("RS"), 2, 0 }, + { QSE_T("RSTART"), 6, 0 }, { QSE_T("SUBSEP"), 6, 0 } }; diff --git a/qse/lib/awk/rec.c b/qse/lib/awk/rec.c index 5f4413d2..63a37aa5 100644 --- a/qse/lib/awk/rec.c +++ b/qse/lib/awk/rec.c @@ -1,5 +1,5 @@ /* - * $Id: rec.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: rec.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -96,7 +96,7 @@ int qse_awk_rtx_setrec ( return 0; } -static int split_record (qse_awk_rtx_t* run) +static int split_record (qse_awk_rtx_t* rtx) { qse_char_t* p, * tok; qse_size_t len, tok_len, nflds; @@ -104,12 +104,13 @@ static int split_record (qse_awk_rtx_t* run) qse_char_t* fs_ptr, * fs_free; qse_size_t fs_len; qse_awk_errnum_t errnum; + int how; /* inrec should be cleared before split_record is called */ - QSE_ASSERT (run->inrec.nflds == 0); + QSE_ASSERT (rtx->inrec.nflds == 0); /* get FS */ - fs = qse_awk_rtx_getgbl (run, QSE_AWK_GBL_FS); + fs = qse_awk_rtx_getgbl (rtx, QSE_AWK_GBL_FS); if (fs->type == QSE_AWK_VAL_NIL) { fs_ptr = QSE_T(" "); @@ -127,7 +128,7 @@ static int split_record (qse_awk_rtx_t* run) qse_awk_rtx_valtostr_out_t out; out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; - if (qse_awk_rtx_valtostr (run, fs, &out) == QSE_NULL) return -1; + if (qse_awk_rtx_valtostr (rtx, fs, &out) == QSE_NULL) return -1; fs_ptr = out.u.cpldup.ptr; fs_len = out.u.cpldup.len; @@ -135,135 +136,226 @@ static int split_record (qse_awk_rtx_t* run) } /* scan the input record to count the fields */ - p = QSE_STR_PTR(&run->inrec.line); - len = QSE_STR_LEN(&run->inrec.line); + len = QSE_STR_LEN(&rtx->inrec.line); + + if (fs_len == 5 && fs_ptr[0] == QSE_T('?')) + { + if (qse_str_ncpy ( + &rtx->inrec.linew, + QSE_STR_PTR(&rtx->inrec.line), + QSE_STR_LEN(&rtx->inrec.line)) == (qse_size_t)-1) + { + if (fs_free != QSE_NULL) + QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } + + p = QSE_STR_PTR(&rtx->inrec.linew); + how = 1; + } + else + { + p = QSE_STR_PTR(&rtx->inrec.line); + how = (fs_len <= 1)? 0: 2; + } + +#if 0 nflds = 0; while (p != QSE_NULL) { - if (fs_len <= 1) + switch (how) { - p = qse_awk_rtx_strxntok (run, - p, len, fs_ptr, fs_len, &tok, &tok_len); - } - else - { - p = qse_awk_rtx_strxntokbyrex ( - run, - QSE_STR_PTR(&run->inrec.line), - QSE_STR_LEN(&run->inrec.line), - p, len, - run->gbl.fs, &tok, &tok_len, &errnum - ); - if (p == QSE_NULL && errnum != QSE_AWK_ENOERR) - { - if (fs_free != QSE_NULL) - QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterrnum (run, errnum, QSE_NULL); - return -1; - } + case 0: + p = qse_awk_rtx_strxntok (rtx, + p, len, fs_ptr, fs_len, &tok, &tok_len); + break; + + case 1: + break; + + default: + p = qse_awk_rtx_strxntokbyrex ( + rtx, + QSE_STR_PTR(&rtx->inrec.line), + QSE_STR_LEN(&rtx->inrec.line), + p, len, + rtx->gbl.fs, &tok, &tok_len, &errnum + ); + if (p == QSE_NULL && errnum != QSE_AWK_ENOERR) + { + if (fs_free != QSE_NULL) + QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, errnum, QSE_NULL); + return -1; + } } if (nflds == 0 && p == QSE_NULL && tok_len == 0) { /* there are no fields. it can just return here * as qse_awk_rtx_clrrec has been called before this */ - if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); + if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free); return 0; } QSE_ASSERT ((tok != QSE_NULL && tok_len > 0) || tok_len == 0); nflds++; - len = QSE_STR_LEN(&run->inrec.line) - - (p - QSE_STR_PTR(&run->inrec.line)); + len = QSE_STR_LEN(&rtx->inrec.line) - + (p - QSE_STR_PTR(&rtx->inrec.line)); } /* allocate space */ - if (nflds > run->inrec.maxflds) + if (nflds > rtx->inrec.maxflds) { void* tmp = QSE_AWK_ALLOC ( - run->awk, QSE_SIZEOF(*run->inrec.flds) * nflds); + rtx->awk, QSE_SIZEOF(*rtx->inrec.flds) * nflds); if (tmp == QSE_NULL) { - if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL); + if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); return -1; } - if (run->inrec.flds != QSE_NULL) - QSE_AWK_FREE (run->awk, run->inrec.flds); - run->inrec.flds = tmp; - run->inrec.maxflds = nflds; + if (rtx->inrec.flds != QSE_NULL) + QSE_AWK_FREE (rtx->awk, rtx->inrec.flds); + rtx->inrec.flds = tmp; + rtx->inrec.maxflds = nflds; } /* scan again and split it */ - p = QSE_STR_PTR(&run->inrec.line); - len = QSE_STR_LEN(&run->inrec.line); + if (how == 1) + { + if (qse_str_ncpy ( + &rtx->inrec.linew, + QSE_STR_PTR(&rtx->inrec.line), + QSE_STR_LEN(&rtx->inrec.line)) == (qse_size_t)-1) + { + if (fs_free != QSE_NULL) + QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } + p = QSE_STR_PTR(&rtx->inrec.linew): + } + else + { + p = QSE_STR_PTR(&rtx->inrec.line); + } + len = QSE_STR_LEN(&rtx->inrec.line); +#endif while (p != QSE_NULL) { - if (fs_len <= 1) + switch (how) { - p = qse_awk_rtx_strxntok ( - run, p, len, fs_ptr, fs_len, &tok, &tok_len); + case 0: + p = qse_awk_rtx_strxntok ( + rtx, p, len, fs_ptr, fs_len, + &tok, &tok_len); + break; + + case 1: + p = qse_awk_rtx_strxnfld ( + rtx, p, len, + fs_ptr[1], fs_ptr[2], + fs_ptr[3], fs_ptr[4], + &tok, &tok_len); + break; + + default: + p = qse_awk_rtx_strxntokbyrex ( + rtx, + QSE_STR_PTR(&rtx->inrec.line), + QSE_STR_LEN(&rtx->inrec.line), + p, len, + rtx->gbl.fs, &tok, &tok_len, &errnum + ); + if (p == QSE_NULL && errnum != QSE_AWK_ENOERR) + { + if (fs_free != QSE_NULL) + QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, errnum, QSE_NULL); + return -1; + } } - else + +#if 1 + if (rtx->inrec.nflds == 0 && p == QSE_NULL && tok_len == 0) { - p = qse_awk_rtx_strxntokbyrex ( - run, - QSE_STR_PTR(&run->inrec.line), - QSE_STR_LEN(&run->inrec.line), - p, len, - run->gbl.fs, &tok, &tok_len, &errnum - ); - if (p == QSE_NULL && errnum != QSE_AWK_ENOERR) - { - if (fs_free != QSE_NULL) - QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterrnum (run, errnum, QSE_NULL); - return -1; - } + /* there are no fields. it can just return here + * as qse_awk_rtx_clrrec has been called before this */ + if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free); + return 0; } +#endif QSE_ASSERT ((tok != QSE_NULL && tok_len > 0) || tok_len == 0); - run->inrec.flds[run->inrec.nflds].ptr = tok; - run->inrec.flds[run->inrec.nflds].len = tok_len; +#if 1 + if (rtx->inrec.nflds >= rtx->inrec.maxflds) + { + if (rtx->inrec.nflds < 16) nflds = 32; + else nflds = rtx->inrec.nflds * 2; - run->inrec.flds[run->inrec.nflds].val = - qse_awk_rtx_makenstrval (run, tok, tok_len); + void* tmp = QSE_AWK_ALLOC ( + rtx->awk, QSE_SIZEOF(*rtx->inrec.flds) * nflds); + if (tmp == QSE_NULL) + { + if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free); + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } - if (run->inrec.flds[run->inrec.nflds].val == QSE_NULL) + if (rtx->inrec.flds != QSE_NULL) + { + QSE_MEMCPY (tmp, rtx->inrec.flds, + QSE_SIZEOF(*rtx->inrec.flds) * rtx->inrec.nflds); + QSE_AWK_FREE (rtx->awk, rtx->inrec.flds); + } + + rtx->inrec.flds = tmp; + rtx->inrec.maxflds = nflds; + } +#endif + + rtx->inrec.flds[rtx->inrec.nflds].ptr = tok; + rtx->inrec.flds[rtx->inrec.nflds].len = tok_len; + + rtx->inrec.flds[rtx->inrec.nflds].val = + qse_awk_rtx_makenstrval (rtx, tok, tok_len); + + if (rtx->inrec.flds[rtx->inrec.nflds].val == QSE_NULL) { if (fs_free != QSE_NULL) - QSE_AWK_FREE (run->awk, fs_free); + QSE_AWK_FREE (rtx->awk, fs_free); return -1; } qse_awk_rtx_refupval ( - run, run->inrec.flds[run->inrec.nflds].val); - run->inrec.nflds++; + rtx, rtx->inrec.flds[rtx->inrec.nflds].val); + rtx->inrec.nflds++; - len = QSE_STR_LEN(&run->inrec.line) - - (p - QSE_STR_PTR(&run->inrec.line)); + len = QSE_STR_LEN(&rtx->inrec.line) - + (p - QSE_STR_PTR(&rtx->inrec.line)); } - if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); + if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free); /* set the number of fields */ - v = qse_awk_rtx_makeintval (run, (qse_long_t)nflds); + v = qse_awk_rtx_makeintval (rtx, (qse_long_t)rtx->inrec.nflds); if (v == QSE_NULL) return -1; - qse_awk_rtx_refupval (run, v); - if (qse_awk_rtx_setgbl (run, QSE_AWK_GBL_NF, v) == -1) + qse_awk_rtx_refupval (rtx, v); + if (qse_awk_rtx_setgbl (rtx, QSE_AWK_GBL_NF, v) == -1) { - qse_awk_rtx_refdownval (run, v); + qse_awk_rtx_refdownval (rtx, v); return -1; } - qse_awk_rtx_refdownval (run, v); - QSE_ASSERT (nflds == run->inrec.nflds); + qse_awk_rtx_refdownval (rtx, v); return 0; } diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index ed2b57b5..16090fe5 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 290 2009-09-19 04:28:49Z hyunghwan.chung $ + * $Id: run.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -819,8 +819,17 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) return -1; } + if (qse_str_init ( + &rtx->inrec.linew, MMGR(rtx), DEF_BUF_CAPA) == QSE_NULL) + { + qse_str_fini (&rtx->inrec.line); + qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } + if (qse_str_init (&rtx->format.out, MMGR(rtx), 256) == QSE_NULL) { + qse_str_fini (&rtx->inrec.linew); qse_str_fini (&rtx->inrec.line); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); return -1; @@ -829,6 +838,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) if (qse_str_init (&rtx->format.fmt, MMGR(rtx), 256) == QSE_NULL) { 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; @@ -840,6 +850,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) { 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; @@ -857,6 +868,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_map_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; @@ -874,6 +886,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_map_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; @@ -907,7 +920,6 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals) { - if (rtx->pattern_range_state != QSE_NULL) QSE_AWK_FREE (rtx->awk, rtx->pattern_range_state); @@ -984,6 +996,7 @@ static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals) rtx->inrec.flds = QSE_NULL; rtx->inrec.maxflds = 0; } + qse_str_fini (&rtx->inrec.linew); qse_str_fini (&rtx->inrec.line); if (fini_globals) refdown_globals (rtx, 1); diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 9ebd7dc5..8cf3e4ef 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -1,5 +1,5 @@ /* - * $Id: std.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: std.c 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -66,7 +66,7 @@ typedef struct xtn_t qse_char_t* end; } cpl; } u; - qse_sio_t* handle; + qse_sio_t* handle; } out; } s; diff --git a/qse/lib/cmn/mem.h b/qse/lib/cmn/mem.h index 0e492f46..f3ad690f 100644 --- a/qse/lib/cmn/mem.h +++ b/qse/lib/cmn/mem.h @@ -1,5 +1,5 @@ /* - * $Id: mem.h 287 2009-09-15 10:01:02Z hyunghwan.chung $ + * $Id: mem.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -23,7 +23,17 @@ #include -#ifdef USE_STDC +#ifdef MINIMIZE_PLATFORM_DEPENDENCY + +#define QSE_MEMCPY(dst,src,len) qse_memcpy(dst,src,len) +#define QSE_MEMCMP(p1,p2,len) qse_memcmp(p1,p2,len) +#define QSE_MEMSET(dst,val,len) qse_memset(dst,val,len) +#define QSE_MEMBYTE(s,val,len) qse_membyte(s,val,len) +#define QSE_MEMRBYTE(s,val,len) qse_memrbyte(s,val,len) +#define QSE_MEMMEM(hs,hl,nd,nl) qse_memmem(hs,hl,nd,nl) +#define QSE_MEMRMEM(hs,hl,nd,nl) qse_memrmem(hs,hl,nd,nl) + +#else #include #define QSE_MEMCPY(dst,src,len) memcpy(dst,src,len) @@ -34,16 +44,6 @@ #define QSE_MEMMEM(hs,hl,nd,nl) memmem(hs,hl,nd,nl) #define QSE_MEMRMEM(hs,hl,nd,nl) memrmem(hs,hl,nd,nl) -#else - -#define QSE_MEMCPY(dst,src,len) qse_memcpy(dst,src,len) -#define QSE_MEMCMP(p1,p2,len) qse_memcmp(p1,p2,len) -#define QSE_MEMSET(dst,val,len) qse_memset(dst,val,len) -#define QSE_MEMBYTE(s,val,len) qse_membyte(s,val,len) -#define QSE_MEMRBYTE(s,val,len) qse_memrbyte(s,val,len) -#define QSE_MEMMEM(hs,hl,nd,nl) qse_memmem(hs,hl,nd,nl) -#define QSE_MEMRMEM(hs,hl,nd,nl) qse_memrmem(hs,hl,nd,nl) - #endif #define QSE_MALLOC(mmgr,size) QSE_MMGR_ALLOC(mmgr,size)