added code for the StdSed class
This commit is contained in:
parent
822c681691
commit
502bab8e4e
@ -40,19 +40,51 @@ public:
|
|||||||
|
|
||||||
int open () throw ();
|
int open () throw ();
|
||||||
void close () throw ();
|
void close () throw ();
|
||||||
|
|
||||||
|
int compile (const char_t* sptr) throw ();
|
||||||
int compile (const char_t* sptr, size_t slen) throw ();
|
int compile (const char_t* sptr, size_t slen) throw ();
|
||||||
|
|
||||||
int execute () throw ();
|
int execute () throw ();
|
||||||
|
|
||||||
|
class IO
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
friend class Sed;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
IO (sed_io_arg_t* arg): arg(arg) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
const char_t* getPath () const
|
||||||
|
{
|
||||||
|
return arg->path;
|
||||||
|
}
|
||||||
|
|
||||||
|
const void* getHandle () const
|
||||||
|
{
|
||||||
|
return arg->handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHandle (void* handle)
|
||||||
|
{
|
||||||
|
arg->handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
sed_io_arg_t* arg;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
sed_t* sed;
|
sed_t* sed;
|
||||||
|
|
||||||
virtual int openIn (const char_t* path) = 0;
|
virtual int openInput (IO& io) = 0;
|
||||||
virtual int closeIn () = 0;
|
virtual int closeInput (IO& io) = 0;
|
||||||
virtual ssize_t readIn (char_t* buf, size_t len) = 0;
|
virtual ssize_t readInput (IO& io, char_t* buf, size_t len) = 0;
|
||||||
|
|
||||||
virtual int openOut (const char_t* path) = 0;
|
virtual int openOutput (IO& io) = 0;
|
||||||
virtual int closeOut () = 0;
|
virtual int closeOutput (IO& io) = 0;
|
||||||
virtual ssize_t writeOut (const char_t* buf, size_t len) = 0;
|
virtual ssize_t writeOutput (
|
||||||
|
IO& io, const char_t* data, size_t len) = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static int xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg);
|
static int xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg);
|
||||||
|
@ -27,12 +27,18 @@ QSE_BEGIN_NAMESPACE(QSE)
|
|||||||
|
|
||||||
class StdSed: public Sed
|
class StdSed: public Sed
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void* allocMem (qse_size_t n) throw ();
|
void* allocMem (qse_size_t n) throw ();
|
||||||
void* reallocMem (void* ptr, qse_size_t n) throw ();
|
void* reallocMem (void* ptr, qse_size_t n) throw ();
|
||||||
void freeMem (void* ptr) throw ();
|
void freeMem (void* ptr) throw ();
|
||||||
|
|
||||||
|
int openInput (IO& io);
|
||||||
|
int closeInput (IO& io);
|
||||||
|
ssize_t readInput (IO& io, char_t* buf, size_t len);
|
||||||
|
|
||||||
|
int openOutput (IO& io);
|
||||||
|
int closeOutput (IO& io);
|
||||||
|
ssize_t writeOutput (IO& io, const char_t* data, size_t len);
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
@ -122,34 +122,27 @@ typedef enum qse_sed_io_cmd_t qse_sed_io_cmd_t;
|
|||||||
/**
|
/**
|
||||||
* The qse_sed_io_arg_t type defines a data structure required by an IO handler.
|
* The qse_sed_io_arg_t type defines a data structure required by an IO handler.
|
||||||
*/
|
*/
|
||||||
union qse_sed_io_arg_t
|
struct qse_sed_io_arg_t
|
||||||
{
|
{
|
||||||
struct
|
void* handle;
|
||||||
{
|
const qse_char_t* path;
|
||||||
void* handle; /* out */
|
|
||||||
const qse_char_t* path; /* in */
|
|
||||||
} open;
|
|
||||||
|
|
||||||
struct
|
union
|
||||||
{
|
{
|
||||||
void* handle; /* in */
|
struct
|
||||||
qse_char_t* buf; /* out */
|
{
|
||||||
qse_size_t len; /* in */
|
qse_char_t* buf;
|
||||||
} read;
|
qse_size_t len;
|
||||||
|
} r;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void* handle; /* in */
|
const qse_char_t* data;
|
||||||
const qse_char_t* data; /* in */
|
qse_size_t len;
|
||||||
qse_size_t len; /* in */
|
} w;
|
||||||
} write;
|
} u;
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
void* handle; /* in */
|
|
||||||
} close;
|
|
||||||
};
|
};
|
||||||
typedef union qse_sed_io_arg_t qse_sed_io_arg_t;
|
typedef struct qse_sed_io_arg_t qse_sed_io_arg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_sed_io_fun_t type defines an IO handler. An IO handler is called by
|
* The qse_sed_io_fun_t type defines an IO handler. An IO handler is called by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: StdAwk.cpp 148 2009-05-20 10:44:47Z hyunghwan.chung $
|
* $Id: StdAwk.cpp 158 2009-05-26 13:29:47Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -343,16 +343,16 @@ int StdAwk::openFile (File& io)
|
|||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case Awk::File::READ:
|
case Awk::File::READ:
|
||||||
flags = QSE_SIO_READ;
|
flags = QSE_FIO_READ;
|
||||||
break;
|
break;
|
||||||
case Awk::File::WRITE:
|
case Awk::File::WRITE:
|
||||||
flags = QSE_SIO_WRITE |
|
flags = QSE_FIO_WRITE |
|
||||||
QSE_SIO_CREATE |
|
QSE_FIO_CREATE |
|
||||||
QSE_SIO_TRUNCATE;
|
QSE_FIO_TRUNCATE;
|
||||||
break;
|
break;
|
||||||
case Awk::File::APPEND:
|
case Awk::File::APPEND:
|
||||||
flags = QSE_SIO_APPEND |
|
flags = QSE_FIO_APPEND |
|
||||||
QSE_SIO_CREATE;
|
QSE_FIO_CREATE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,7 +360,7 @@ int StdAwk::openFile (File& io)
|
|||||||
((Awk*)io)->getMmgr(),
|
((Awk*)io)->getMmgr(),
|
||||||
0,
|
0,
|
||||||
io.getName(),
|
io.getName(),
|
||||||
flags,
|
flags | QSE_FIO_TEXT,
|
||||||
QSE_FIO_RUSR | QSE_FIO_WUSR |
|
QSE_FIO_RUSR | QSE_FIO_WUSR |
|
||||||
QSE_FIO_RGRP | QSE_FIO_ROTH
|
QSE_FIO_RGRP | QSE_FIO_ROTH
|
||||||
);
|
);
|
||||||
|
@ -48,6 +48,12 @@ void Sed::close () throw()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Sed::compile (const char_t* sptr) throw ()
|
||||||
|
{
|
||||||
|
QSE_ASSERT (sed != QSE_NULL);
|
||||||
|
return qse_sed_comp (sed, sptr, qse_strlen(sptr));
|
||||||
|
}
|
||||||
|
|
||||||
int Sed::compile (const char_t* sptr, size_t slen) throw ()
|
int Sed::compile (const char_t* sptr, size_t slen) throw ()
|
||||||
{
|
{
|
||||||
QSE_ASSERT (sed != QSE_NULL);
|
QSE_ASSERT (sed != QSE_NULL);
|
||||||
@ -63,17 +69,19 @@ int Sed::execute () throw ()
|
|||||||
int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg)
|
int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg)
|
||||||
{
|
{
|
||||||
Sed* sed = *(Sed**)QSE_XTN(s);
|
Sed* sed = *(Sed**)QSE_XTN(s);
|
||||||
|
IO io (arg);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case QSE_SED_IO_OPEN:
|
case QSE_SED_IO_OPEN:
|
||||||
return sed->openIn (arg->open.path);
|
return sed->openInput (io);
|
||||||
case QSE_SED_IO_CLOSE:
|
case QSE_SED_IO_CLOSE:
|
||||||
return sed->closeIn ();
|
return sed->closeInput (io);
|
||||||
case QSE_SED_IO_READ:
|
case QSE_SED_IO_READ:
|
||||||
return sed->readIn (arg->read.buf, arg->read.len);
|
return sed->readInput (
|
||||||
|
io, arg->u.r.buf, arg->u.w.len);
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -87,17 +95,19 @@ int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg)
|
|||||||
int Sed::xout (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg)
|
int Sed::xout (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg)
|
||||||
{
|
{
|
||||||
Sed* sed = *(Sed**)QSE_XTN(s);
|
Sed* sed = *(Sed**)QSE_XTN(s);
|
||||||
|
IO io (arg);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case QSE_SED_IO_OPEN:
|
case QSE_SED_IO_OPEN:
|
||||||
return sed->openOut (arg->open.path);
|
return sed->openOutput (io);
|
||||||
case QSE_SED_IO_CLOSE:
|
case QSE_SED_IO_CLOSE:
|
||||||
return sed->closeOut ();
|
return sed->closeOutput (io);
|
||||||
case QSE_SED_IO_READ:
|
case QSE_SED_IO_READ:
|
||||||
return sed->writeOut (arg->write.data, arg->write.len);
|
return sed->writeOutput (
|
||||||
|
io, arg->u.w.data, arg->u.w.len);
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <qse/sed/StdSed.hpp>
|
#include <qse/sed/StdSed.hpp>
|
||||||
|
#include <qse/cmn/fio.h>
|
||||||
|
#include <qse/cmn/sio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
@ -38,7 +40,83 @@ void StdSed::freeMem (void* ptr) throw ()
|
|||||||
::free (ptr);
|
::free (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int StdSed::openInput (IO& io)
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
const qse_char_t* path = io.getPath ();
|
||||||
|
|
||||||
|
if (path == QSE_NULL) io.setHandle (qse_sio_in);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qse_fio_t* fio;
|
||||||
|
fio = qse_fio_open (
|
||||||
|
this, 0, path,
|
||||||
|
QSE_FIO_READ | QSE_FIO_TEXT,
|
||||||
|
QSE_FIO_RUSR | QSE_FIO_WUSR |
|
||||||
|
QSE_FIO_RGRP | QSE_FIO_ROTH
|
||||||
|
);
|
||||||
|
if (fio == NULL) return -1;
|
||||||
|
|
||||||
|
io.setHandle (fio);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StdSed::closeInput (IO& io)
|
||||||
|
{
|
||||||
|
if (io.getPath() != QSE_NULL)
|
||||||
|
qse_fio_close ((qse_fio_t*)io.getHandle());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t StdSed::readInput (IO& io, char_t* buf, size_t len)
|
||||||
|
{
|
||||||
|
if (io.getPath() == QSE_NULL)
|
||||||
|
return qse_sio_getsn ((qse_sio_t*)io.getHandle(), buf, len);
|
||||||
|
else
|
||||||
|
return qse_fio_read ((qse_fio_t*)io.getHandle(), buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
int StdSed::openOutput (IO& io)
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
const qse_char_t* path = io.getPath ();
|
||||||
|
|
||||||
|
if (path == QSE_NULL) io.setHandle (qse_sio_out);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qse_fio_t* fio;
|
||||||
|
fio = qse_fio_open (
|
||||||
|
this, 0, path,
|
||||||
|
QSE_FIO_WRITE | QSE_FIO_CREATE |
|
||||||
|
QSE_FIO_TRUNCATE | QSE_FIO_TEXT,
|
||||||
|
QSE_FIO_RUSR | QSE_FIO_WUSR |
|
||||||
|
QSE_FIO_RGRP | QSE_FIO_ROTH
|
||||||
|
);
|
||||||
|
if (fio == NULL) return -1;
|
||||||
|
|
||||||
|
io.setHandle (fio);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StdSed::closeOutput (IO& io)
|
||||||
|
{
|
||||||
|
if (io.getPath() != QSE_NULL)
|
||||||
|
qse_fio_close ((qse_fio_t*)io.getHandle());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t StdSed::writeOutput (IO& io, const char_t* data, size_t len)
|
||||||
|
{
|
||||||
|
if (io.getPath() == QSE_NULL)
|
||||||
|
return qse_sio_putsn ((qse_sio_t*)io.getHandle(), data, len);
|
||||||
|
else
|
||||||
|
return qse_fio_write ((qse_fio_t*)io.getHandle(), data, len);
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
QSE_END_NAMESPACE(QSE)
|
QSE_END_NAMESPACE(QSE)
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|
||||||
|
@ -1295,8 +1295,8 @@ static int read_char (qse_sed_t* sed, qse_char_t* c)
|
|||||||
if (sed->e.in.pos >= sed->e.in.len)
|
if (sed->e.in.pos >= sed->e.in.len)
|
||||||
{
|
{
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
sed->e.in.arg.read.buf = sed->e.in.buf;
|
sed->e.in.arg.u.r.buf = sed->e.in.buf;
|
||||||
sed->e.in.arg.read.len = QSE_COUNTOF(sed->e.in.buf);
|
sed->e.in.arg.u.r.len = QSE_COUNTOF(sed->e.in.buf);
|
||||||
n = sed->e.in.fun (
|
n = sed->e.in.fun (
|
||||||
sed, QSE_SED_IO_READ, &sed->e.in.arg
|
sed, QSE_SED_IO_READ, &sed->e.in.arg
|
||||||
);
|
);
|
||||||
@ -1337,7 +1337,7 @@ static int read_file (
|
|||||||
qse_sed_io_arg_t arg;
|
qse_sed_io_arg_t arg;
|
||||||
qse_char_t buf[256];
|
qse_char_t buf[256];
|
||||||
|
|
||||||
arg.open.path = path;
|
arg.path = path;
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &arg);
|
n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &arg);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
@ -1356,8 +1356,8 @@ static int read_file (
|
|||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
arg.read.buf = buf;
|
arg.u.r.buf = buf;
|
||||||
arg.read.len = QSE_COUNTOF(buf);
|
arg.u.r.len = QSE_COUNTOF(buf);
|
||||||
|
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
n = sed->e.in.fun (sed, QSE_SED_IO_READ, &arg);
|
n = sed->e.in.fun (sed, QSE_SED_IO_READ, &arg);
|
||||||
@ -1459,8 +1459,8 @@ static int flush (qse_sed_t* sed)
|
|||||||
while (sed->e.out.len > 0)
|
while (sed->e.out.len > 0)
|
||||||
{
|
{
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
sed->e.out.arg.write.data = &sed->e.out.buf[pos];
|
sed->e.out.arg.u.w.data = &sed->e.out.buf[pos];
|
||||||
sed->e.out.arg.write.len = sed->e.out.len;
|
sed->e.out.arg.u.w.len = sed->e.out.len;
|
||||||
n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, &sed->e.out.arg);
|
n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, &sed->e.out.arg);
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
@ -1670,10 +1670,10 @@ static int write_str_to_file (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ap = QSE_MAP_VPTR(pair);
|
ap = QSE_MAP_VPTR(pair);
|
||||||
if (ap->open.handle == QSE_NULL)
|
if (ap->handle == QSE_NULL)
|
||||||
{
|
{
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
ap->open.path = path;
|
ap->path = path;
|
||||||
n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, ap);
|
n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, ap);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
@ -1687,7 +1687,7 @@ static int write_str_to_file (
|
|||||||
/* EOF is returned upon opening a write stream.
|
/* EOF is returned upon opening a write stream.
|
||||||
* it is also an error as it can't write any more */
|
* it is also an error as it can't write any more */
|
||||||
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
||||||
ap->close.handle = QSE_NULL;
|
ap->handle = QSE_NULL;
|
||||||
SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen);
|
SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1696,13 +1696,13 @@ static int write_str_to_file (
|
|||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
ap->write.data = str;
|
ap->u.w.data = str;
|
||||||
ap->write.len = len;
|
ap->u.w.len = len;
|
||||||
n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, ap);
|
n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, ap);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
||||||
ap->close.handle = QSE_NULL;
|
ap->handle = QSE_NULL;
|
||||||
if (sed->errnum == QSE_SED_ENOERR)
|
if (sed->errnum == QSE_SED_ENOERR)
|
||||||
SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen);
|
SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen);
|
||||||
sed->errlin = cmd->lnum;
|
sed->errlin = cmd->lnum;
|
||||||
@ -1714,7 +1714,7 @@ static int write_str_to_file (
|
|||||||
/* eof is returned on the write stream.
|
/* eof is returned on the write stream.
|
||||||
* it is also an error as it can't write any more */
|
* it is also an error as it can't write any more */
|
||||||
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
|
||||||
ap->close.handle = QSE_NULL;
|
ap->handle = QSE_NULL;
|
||||||
SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen);
|
SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -2357,11 +2357,11 @@ static void close_outfile (qse_map_t* map, void* dptr, qse_size_t dlen)
|
|||||||
qse_sed_io_arg_t* arg = dptr;
|
qse_sed_io_arg_t* arg = dptr;
|
||||||
QSE_ASSERT (dlen == QSE_SIZEOF(*arg));
|
QSE_ASSERT (dlen == QSE_SIZEOF(*arg));
|
||||||
|
|
||||||
if (arg->close.handle != QSE_NULL)
|
if (arg->handle != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_sed_t* sed = *(qse_sed_t**)QSE_XTN(map);
|
qse_sed_t* sed = *(qse_sed_t**)QSE_XTN(map);
|
||||||
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, arg);
|
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, arg);
|
||||||
arg->close.handle = QSE_NULL;
|
arg->handle = QSE_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2413,7 +2413,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
sed->e.in.arg.open.path = QSE_NULL;
|
sed->e.in.arg.path = QSE_NULL;
|
||||||
n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &sed->e.in.arg);
|
n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &sed->e.in.arg);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
@ -2430,7 +2430,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sed->errnum = QSE_SED_ENOERR;
|
sed->errnum = QSE_SED_ENOERR;
|
||||||
sed->e.out.arg.open.path = QSE_NULL;
|
sed->e.out.arg.path = QSE_NULL;
|
||||||
n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, &sed->e.out.arg);
|
n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, &sed->e.out.arg);
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
|
@ -30,13 +30,13 @@ static qse_ssize_t in (
|
|||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case QSE_SED_IO_OPEN:
|
case QSE_SED_IO_OPEN:
|
||||||
if (arg->open.path == QSE_NULL ||
|
if (arg->path == QSE_NULL ||
|
||||||
arg->open.path[0] == QSE_T('\0'))
|
arg->path[0] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
if (instream)
|
if (instream)
|
||||||
{
|
{
|
||||||
arg->open.handle = qse_fopen (instream, QSE_T("r"));
|
arg->handle = qse_fopen (instream, QSE_T("r"));
|
||||||
if (arg->open.handle == QSE_NULL)
|
if (arg->handle == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_cstr_t errarg;
|
qse_cstr_t errarg;
|
||||||
errarg.ptr = instream;
|
errarg.ptr = instream;
|
||||||
@ -45,26 +45,26 @@ static qse_ssize_t in (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else arg->open.handle = QSE_STDIN;
|
else arg->handle = QSE_STDIN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
arg->open.handle = qse_fopen (arg->open.path, QSE_T("r"));
|
arg->handle = qse_fopen (arg->path, QSE_T("r"));
|
||||||
if (arg->open.handle == QSE_NULL) return -1;
|
if (arg->handle == QSE_NULL) return -1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case QSE_SED_IO_CLOSE:
|
case QSE_SED_IO_CLOSE:
|
||||||
if (arg->close.handle != QSE_STDIN)
|
if (arg->handle != QSE_STDIN)
|
||||||
qse_fclose (arg->close.handle);
|
qse_fclose (arg->handle);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case QSE_SED_IO_READ:
|
case QSE_SED_IO_READ:
|
||||||
{
|
{
|
||||||
qse_cint_t c;
|
qse_cint_t c;
|
||||||
c = qse_fgetc (arg->read.handle);
|
c = qse_fgetc (arg->handle);
|
||||||
if (c == QSE_CHAR_EOF) return 0;
|
if (c == QSE_CHAR_EOF) return 0;
|
||||||
arg->read.buf[0] = c;
|
arg->u.r.buf[0] = c;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,29 +79,29 @@ static qse_ssize_t out (
|
|||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case QSE_SED_IO_OPEN:
|
case QSE_SED_IO_OPEN:
|
||||||
if (arg->open.path == QSE_NULL ||
|
if (arg->path == QSE_NULL ||
|
||||||
arg->open.path[0] == QSE_T('\0'))
|
arg->path[0] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
arg->open.handle = QSE_STDOUT;
|
arg->handle = QSE_STDOUT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
arg->open.handle = qse_fopen (arg->open.path, QSE_T("w"));
|
arg->handle = qse_fopen (arg->path, QSE_T("w"));
|
||||||
if (arg->open.handle == QSE_NULL) return -1;
|
if (arg->handle == QSE_NULL) return -1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case QSE_SED_IO_CLOSE:
|
case QSE_SED_IO_CLOSE:
|
||||||
if (arg->close.handle != QSE_STDOUT)
|
if (arg->handle != QSE_STDOUT)
|
||||||
qse_fclose (arg->close.handle);
|
qse_fclose (arg->handle);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case QSE_SED_IO_WRITE:
|
case QSE_SED_IO_WRITE:
|
||||||
{
|
{
|
||||||
qse_size_t i = 0;
|
qse_size_t i = 0;
|
||||||
for (i = 0; i < arg->write.len; i++)
|
for (i = 0; i < arg->u.w.len; i++)
|
||||||
qse_fputc (arg->write.data[i], arg->write.handle);
|
qse_fputc (arg->u.w.data[i], arg->handle);
|
||||||
return arg->write.len;
|
return arg->u.w.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -30,6 +30,19 @@ int sed_main (int argc, qse_char_t* argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sed.compile (argv[1]) == -1)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("cannot compile\n"));
|
||||||
|
sed.close ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sed.execute () == -1)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("cannot execute\n"));
|
||||||
|
sed.close ();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
sed.close ();
|
sed.close ();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user