2007-05-02 01:07:00 +00:00
|
|
|
/*
|
2007-05-06 01:34:00 +00:00
|
|
|
* $Id: Awk.cpp,v 1.6 2007/05/04 10:25:14 bacon Exp $
|
2007-05-02 01:07:00 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <ase/awk/Awk.hpp>
|
|
|
|
|
|
|
|
namespace ASE
|
|
|
|
{
|
|
|
|
Awk::Awk (): awk (ASE_NULL)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::~Awk ()
|
|
|
|
{
|
2007-05-04 00:14:00 +00:00
|
|
|
close ();
|
2007-05-02 01:07:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int Awk::parse ()
|
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
if (awk == ASE_NULL && open() == -1) return -1;
|
2007-05-03 00:08:00 +00:00
|
|
|
|
2007-05-04 00:14:00 +00:00
|
|
|
ase_awk_srcios_t srcios;
|
|
|
|
|
|
|
|
srcios.in = sourceReader;
|
|
|
|
srcios.out = sourceWriter;
|
|
|
|
srcios.custom_data = this;
|
|
|
|
|
2007-05-02 01:07:00 +00:00
|
|
|
return ase_awk_parse (awk, ASE_NULL);
|
|
|
|
}
|
|
|
|
|
2007-05-04 20:30:00 +00:00
|
|
|
int Awk::run (const char_t* main, const char_t** args)
|
2007-05-02 01:07:00 +00:00
|
|
|
{
|
2007-05-04 00:14:00 +00:00
|
|
|
if (awk == ASE_NULL)
|
2007-05-03 00:08:00 +00:00
|
|
|
{
|
2007-05-04 00:14:00 +00:00
|
|
|
// TODO: SET ERROR INFO
|
|
|
|
return -1;
|
2007-05-03 00:08:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//return ase_awk_run (awk, main);
|
2007-05-02 01:07:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-05-04 20:30:00 +00:00
|
|
|
int Awk::open ()
|
|
|
|
{
|
|
|
|
ase_awk_prmfns_t prmfns;
|
|
|
|
|
|
|
|
prmfns.mmgr.malloc = malloc;
|
|
|
|
prmfns.mmgr.realloc = realloc;
|
|
|
|
prmfns.mmgr.free = free;
|
|
|
|
prmfns.mmgr.custom_data = this;
|
|
|
|
|
|
|
|
prmfns.ccls.is_upper = isUpper;
|
|
|
|
prmfns.ccls.is_lower = isLower;
|
|
|
|
prmfns.ccls.is_alpha = isAlpha;
|
|
|
|
prmfns.ccls.is_digit = isDigit;
|
|
|
|
prmfns.ccls.is_xdigit = isXdigit;
|
|
|
|
prmfns.ccls.is_alnum = isAlnum;
|
|
|
|
prmfns.ccls.is_space = isSpace;
|
|
|
|
prmfns.ccls.is_print = isPrint;
|
|
|
|
prmfns.ccls.is_graph = isGraph;
|
|
|
|
prmfns.ccls.is_cntrl = isCntrl;
|
|
|
|
prmfns.ccls.is_punct = isPunct;
|
|
|
|
prmfns.ccls.to_upper = toUpper;
|
|
|
|
prmfns.ccls.to_lower = toLower;
|
|
|
|
prmfns.ccls.custom_data = this;
|
|
|
|
|
2007-05-06 01:34:00 +00:00
|
|
|
/*
|
|
|
|
int (Awk::*ptr) (void*, ase_char_t*, ase_size_t, const ase_char_t*, ...) = &Awk::sprintf;
|
|
|
|
(this->*ptr) (ASE_NULL, ASE_NULL, 0, ASE_NULL);
|
|
|
|
*/
|
|
|
|
|
2007-05-04 20:30:00 +00:00
|
|
|
prmfns.misc.pow = pow;
|
|
|
|
prmfns.misc.sprintf = sprintf;
|
|
|
|
prmfns.misc.dprintf = dprintf;
|
|
|
|
prmfns.misc.custom_data = this;
|
|
|
|
|
|
|
|
awk = ase_awk_open (&prmfns, ASE_NULL);
|
|
|
|
if (awk == ASE_NULL)
|
|
|
|
{
|
|
|
|
// TODO: SET ERROR INFO
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-05-04 00:14:00 +00:00
|
|
|
void Awk::close ()
|
|
|
|
{
|
|
|
|
if (awk != ASE_NULL)
|
|
|
|
{
|
|
|
|
ase_awk_close (awk);
|
|
|
|
awk = ASE_NULL;
|
|
|
|
}
|
|
|
|
}
|
2007-05-02 01:07:00 +00:00
|
|
|
|
2007-05-04 20:30:00 +00:00
|
|
|
Awk::ssize_t Awk::sourceReader (
|
|
|
|
int cmd, void* arg, char_t* data, size_t count)
|
2007-05-04 00:14:00 +00:00
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
Awk* awk = (Awk*)arg;
|
2007-05-04 00:14:00 +00:00
|
|
|
|
|
|
|
if (cmd == ASE_AWK_IO_OPEN)
|
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
return awk->openSource (Awk::SOURCE_READ);
|
2007-05-04 00:14:00 +00:00
|
|
|
}
|
|
|
|
else if (cmd == ASE_AWK_IO_CLOSE)
|
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
return awk->closeSource (Awk::SOURCE_READ);
|
2007-05-04 00:14:00 +00:00
|
|
|
}
|
|
|
|
else if (cmd == ASE_AWK_IO_READ)
|
|
|
|
{
|
|
|
|
return awk->readSource (data, count);
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
2007-05-04 20:30:00 +00:00
|
|
|
|
|
|
|
Awk::ssize_t Awk::sourceWriter (
|
|
|
|
int cmd, void* arg, char_t* data, size_t count)
|
2007-05-04 00:14:00 +00:00
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
Awk* awk = (Awk*)arg;
|
2007-05-04 00:14:00 +00:00
|
|
|
|
|
|
|
if (cmd == ASE_AWK_IO_OPEN)
|
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
return awk->openSource (Awk::SOURCE_WRITE);
|
2007-05-04 00:14:00 +00:00
|
|
|
}
|
|
|
|
else if (cmd == ASE_AWK_IO_CLOSE)
|
|
|
|
{
|
2007-05-04 20:30:00 +00:00
|
|
|
return awk->closeSource (Awk::SOURCE_WRITE);
|
2007-05-04 00:14:00 +00:00
|
|
|
}
|
|
|
|
else if (cmd == ASE_AWK_IO_WRITE)
|
|
|
|
{
|
|
|
|
return awk->writeSource (data, count);
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-05-04 20:30:00 +00:00
|
|
|
void* Awk::malloc (void* custom, size_t n)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->malloc (n);
|
|
|
|
}
|
|
|
|
|
|
|
|
void* Awk::realloc (void* custom, void* ptr, size_t n)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->realloc (ptr, n);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Awk::free (void* custom, void* ptr)
|
|
|
|
{
|
|
|
|
((Awk*)custom)->free (ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isUpper (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isUpper (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isLower (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isLower (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isAlpha (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isAlpha (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isDigit (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isDigit (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isXdigit (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isXdigit (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isAlnum (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isAlnum (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isSpace (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isSpace (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isPrint (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isPrint (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isGraph (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isGraph (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isCntrl (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isCntrl (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::bool_t Awk::isPunct (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->isPunct (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::cint_t Awk::toUpper (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->toUpper (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::cint_t Awk::toLower (void* custom, cint_t c)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->toLower (c);
|
|
|
|
}
|
|
|
|
|
|
|
|
Awk::real_t Awk::pow (void* custom, real_t x, real_t y)
|
|
|
|
{
|
|
|
|
return ((Awk*)custom)->pow (x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Awk::sprintf (void* custom, char_t* buf, size_t size,
|
|
|
|
const char_t* fmt, ...)
|
|
|
|
{
|
2007-05-06 01:34:00 +00:00
|
|
|
va_list ap;
|
|
|
|
va_start (ap, fmt);
|
|
|
|
int n = ((Awk*)custom)->vsprintf (buf, size, fmt, ap);
|
|
|
|
va_end (ap);
|
|
|
|
return n;
|
2007-05-04 20:30:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Awk::dprintf (void* custom, const char_t* fmt, ...)
|
|
|
|
{
|
2007-05-06 01:34:00 +00:00
|
|
|
va_list ap;
|
|
|
|
va_start (ap, fmt);
|
|
|
|
((Awk*)custom)->vdprintf (fmt, ap);
|
|
|
|
va_end (ap);
|
2007-05-04 20:30:00 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 00:14:00 +00:00
|
|
|
}
|