updated qse_sed_t a little
This commit is contained in:
parent
4536d7308f
commit
41b324b7a7
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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*/);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,91 +18,52 @@
|
||||
|
||||
#include <qse/utl/tgp.h>
|
||||
#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)
|
||||
|
73
qse/lib/utl/tgp.h
Normal file
73
qse/lib/utl/tgp.h
Normal file
@ -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 <qse/utl/tgp.h>
|
||||
|
||||
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
|
Loading…
Reference in New Issue
Block a user