From 41b324b7a7ca16a9bf4ac229330b58dfda231d4d Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 7 Feb 2009 22:06:16 +0000 Subject: [PATCH] updated qse_sed_t a little --- qse/include/qse/utl/tgp.h | 22 ++++++++-- qse/lib/utl/Makefile.am | 2 +- qse/lib/utl/Makefile.in | 2 +- qse/lib/utl/sed.c | 76 ++++++++++++++++++++++++++++++++-- qse/lib/utl/tgp.c | 87 +++++++++++---------------------------- qse/lib/utl/tgp.h | 73 ++++++++++++++++++++++++++++++++ 6 files changed, 189 insertions(+), 73 deletions(-) create mode 100644 qse/lib/utl/tgp.h diff --git a/qse/include/qse/utl/tgp.h b/qse/include/qse/utl/tgp.h index 8179819f..28c626c6 100644 --- a/qse/include/qse/utl/tgp.h +++ b/qse/include/qse/utl/tgp.h @@ -39,11 +39,25 @@ typedef qse_ssize_t (*qse_tgp_io_t) ( extern "C" { #endif -qse_tgp_t* qse_tgp_open (qse_mmgr_t* mmgr); -void qse_tgp_close (qse_tgp_t* tgp); +QSE_DEFINE_COMMON_FUNCTIONS (tgp) -void qse_tgp_setassocdata (qse_tgp_t* tgp, void* data); -void* qse_tgp_getassocdata (qse_tgp_t* tgp); +qse_tgp_t* qse_tgp_open ( + qse_mmgr_t* mmgr, + qse_size_t xtn +); + +void qse_tgp_close ( + qse_tgp_t* tgp +); + +qse_tgp_t* qse_tgp_init ( + qse_tgp_t* tgp, + qse_mmgr_t* mmgr +); + +void qse_tgp_fini ( + qse_tgp_t* tgp +); #ifdef __cplusplus } diff --git a/qse/lib/utl/Makefile.am b/qse/lib/utl/Makefile.am index b09372d3..3dde868d 100644 --- a/qse/lib/utl/Makefile.am +++ b/qse/lib/utl/Makefile.am @@ -5,6 +5,6 @@ lib_LTLIBRARIES = libqseutl.la libqseutl_la_SOURCES = \ assert.c http.c main.c stdio.c \ sed.c tgp.c \ - sed.h + sed.h tgp.h libqseutl_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn libqseutl_la_LIBADD = -lqsecmn diff --git a/qse/lib/utl/Makefile.in b/qse/lib/utl/Makefile.in index c91c0925..e1d222fd 100644 --- a/qse/lib/utl/Makefile.in +++ b/qse/lib/utl/Makefile.in @@ -200,7 +200,7 @@ lib_LTLIBRARIES = libqseutl.la libqseutl_la_SOURCES = \ assert.c http.c main.c stdio.c \ sed.c tgp.c \ - sed.h + sed.h tgp.h libqseutl_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn libqseutl_la_LIBADD = -lqsecmn diff --git a/qse/lib/utl/sed.c b/qse/lib/utl/sed.c index 800dca68..d52f8143 100644 --- a/qse/lib/utl/sed.c +++ b/qse/lib/utl/sed.c @@ -65,20 +65,88 @@ void qse_sed_fini (qse_sed_t* sed) { } -static const qse_char_t* address (const qse_char_t* cp, qse_sed_a_t* a) +static void compile (qse_sed_t* sed, const qse_char_t* cp, qse_char_t seof) { qse_char_t c; - if ((c = *cp++) == QSE_T('$')) + if ((c = *cp++) == seof) return QSE_NULL; /* // */ + + do + { + if (c == QSE_T('\0') || c == QSE_T('\n')) + { + /* premature end of text */ + return QSE_NULL; /* TODO: return an error..*/ + } + + if (c == QSE_T('\\') + { + if (ep >= end) + { + /* too many characters */ + return QSE_NULL; /* TODO: return an error..*/ + } + + *ep++ = c; + + /* TODO: more escaped characters */ + if ((c = *cp++) == QSE_T('n') c = QSE_T('n'); + } + + if (ep >= end) + { + /* too many characters */ + return QSE_NULL; /* TODO: return an error..*/ + } + + *ep++ = c; + } + while ((c = *cp++) != seof); + + *ep = QSE_T('\0'); + regcomp (expbuf); +} + +static const qse_char_t* address ( + qse_sed_t* sed, const qse_char_t* cp, qse_sed_a_t* a) +{ + qse_char_t c; + + if ((c = *cp) == QSE_T('$')) + { a->type = QSE_SED_A_DOL; + cp++; + } else if (c == QSE_T('/')) { + cp++; + a->type = (a->u.rex = compile(sed, c))? A_RE: A_LAST; + } + else if (c >= QSE_T('0') && c <= QSE_T('9')) + { + qse_sed_line_t lno = 0; + do + { + lno = lno * 10 + c - QSE_T('0'); + cp++; + } + while ((c = *cp) >= QSE_T('0') && c <= QSE_T('9')) + + /* line number 0 is illegal */ + if (lno == 0) return QSE_NULL; + + a->type = QSE_SED_A_LINE; + a->u.line = lno; + } + else + { + a->type = QSE_SED_A_NONE; } return cp; } -static void compile (const qse_char_t* str) +static void fcomp (const qse_char_t* str) { const qse_char_t* cp = str; @@ -98,7 +166,7 @@ static void compile (const qse_char_t* str) continue; } - cp = address (cp/*, &rep->ad1*/); + cp = address (sed, cp/*, &rep->ad1*/); } } diff --git a/qse/lib/utl/tgp.c b/qse/lib/utl/tgp.c index 838d4ea2..bdd98ac8 100644 --- a/qse/lib/utl/tgp.c +++ b/qse/lib/utl/tgp.c @@ -18,91 +18,52 @@ #include #include "../cmn/mem.h" +#include "tgp.h" -struct qse_tgp_t -{ - qse_mmgr_t mmgr; - void* assoc_data; - int errnum; +QSE_IMPLEMENT_COMMON_FUNCTIONS (tgp) - struct - { - qse_tgp_io_t func; - void* arg; - } ih; - - struct - { - qse_tgp_io_t func; - void* arg; - } oh; - - struct - { - qse_tgp_io_t func; - void* arg; - } rh; - - struct - { - qse_size_t pos; - qse_size_t len; - qse_char_t ptr[512]; - } ib; - - struct - { - qse_size_t len; - qse_char_t ptr[512]; - } ob; - - struct - { - qse_size_t len; - qse_char_t ptr[512]; - } rb; - - int (*read) (qse_tgp_t* tgp, qse_char_t* buf, int len); - int (*write) (qse_tgp_t* tgp, const qse_char_t* buf, int len); - int (*run) (qse_tgp_t* tgp, const qse_char_t* buf, int len); -}; - -qse_tgp_t* qse_tgp_open (qse_mmgr_t* mmgr) +qse_tgp_t* qse_tgp_open (qse_mmgr_t* mmgr, qse_size_t xtn) { qse_tgp_t* tgp; - /* - if (mmgr == QSE_NULL) mmgr = QSE_GETMMGR(); if (mmgr == QSE_NULL) { - QSE_ASSERTX (mmgr != QSE_NULL, - "Provide the memory manager or set the global memory manager with QSE_SETMMGR()"); - return QSE_NULL; - } - */ + mmgr = QSE_MMGR_GETDFL(); - tgp = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*tgp)); + QSE_ASSERTX (mmgr != QSE_NULL, + "Set the memory manager with QSE_MMGR_SETDFL()"); + + if (mmgr == QSE_NULL) return QSE_NULL; + } + + tgp = (qse_tgp_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_tgp_t) + xtn); if (tgp == QSE_NULL) return QSE_NULL; - QSE_MEMSET (tgp, 0, QSE_SIZEOF(*tgp)); - QSE_MEMCPY (&tgp->mmgr, mmgr, QSE_SIZEOF(*mmgr)); + if (qse_tgp_init (tgp, mmgr) == QSE_NULL) + { + QSE_MMGR_FREE (tgp->mmgr, tgp); + return QSE_NULL; + } return tgp; } void qse_tgp_close (qse_tgp_t* tgp) { - QSE_MMGR_FREE (&tgp->mmgr, tgp); + qse_tgp_fini (tgp); + QSE_MMGR_FREE (tgp->mmgr, tgp); } -void qse_tgp_setassocdata (qse_tgp_t* tgp, void* data) +qse_tgp_t* qse_tgp_init (qse_tgp_t* tgp, qse_mmgr_t* mmgr) { - tgp->assoc_data = data; + QSE_MEMSET (tgp, 0, sizeof(*tgp)); + tgp->mmgr = mmgr; + + return tgp; } -void* qse_tgp_getassocdata (qse_tgp_t* tgp) +void qse_tgp_fini (qse_tgp_t* tgp) { - return tgp->assoc_data; } int qse_tgp_geterrnum (qse_tgp_t* tgp) diff --git a/qse/lib/utl/tgp.h b/qse/lib/utl/tgp.h new file mode 100644 index 00000000..5d13b839 --- /dev/null +++ b/qse/lib/utl/tgp.h @@ -0,0 +1,73 @@ +/* + * $Id$ + * + Copyright 2006-2009 Chung, Hyung-Hwan. + + Licentgp under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef _QSE_LIB_UTL_TGP_H_ +#define _QSE_LIB_UTL_TGP_H_ + +#include + +struct qse_tgp_t +{ + QSE_DEFINE_COMMON_FIELDS (tgp) + + void* assoc_data; + int errnum; + + struct + { + qse_tgp_io_t func; + void* arg; + } ih; + + struct + { + qse_tgp_io_t func; + void* arg; + } oh; + + struct + { + qse_tgp_io_t func; + void* arg; + } rh; + + struct + { + qse_size_t pos; + qse_size_t len; + qse_char_t ptr[512]; + } ib; + + struct + { + qse_size_t len; + qse_char_t ptr[512]; + } ob; + + struct + { + qse_size_t len; + qse_char_t ptr[512]; + } rb; + + int (*read) (qse_tgp_t* tgp, qse_char_t* buf, int len); + int (*write) (qse_tgp_t* tgp, const qse_char_t* buf, int len); + int (*run) (qse_tgp_t* tgp, const qse_char_t* buf, int len); +}; + +#endif