Recovered from cvs revision 2007-05-19 04:43:00

This commit is contained in:
2007-05-20 01:45:00 +00:00
parent 314b089f0d
commit c29572a781
7 changed files with 170 additions and 36 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.cpp,v 1.14 2007/05/16 14:44:13 bacon Exp $
* $Id: StdAwk.cpp,v 1.15 2007/05/18 15:36:02 bacon Exp $
*/
#include <ase/awk/StdAwk.hpp>
@ -26,44 +26,49 @@ namespace ASE
::srand (seed);
}
#define ADD_FUNC(name,min,max,impl) \
do { \
if (addFunction (name, min, max, \
(FunctionHandler)impl) == -1) return -1; \
} while (0)
int StdAwk::open ()
{
int n = Awk::open ();
if (n == 0)
{
int opt =
ASE_AWK_IMPLICIT |
ASE_AWK_EXPLICIT |
ASE_AWK_UNIQUEFN |
ASE_AWK_IDIV |
ASE_AWK_SHADING |
ASE_AWK_SHIFT |
ASE_AWK_EXTIO |
ASE_AWK_BLOCKLESS |
ASE_AWK_STRBASEONE |
ASE_AWK_STRIPSPACES |
ASE_AWK_NEXTOFILE |
ASE_AWK_ARGSTOMAIN;
ase_awk_setoption (awk, opt);
if (n == -1) return n;
int opt =
ASE_AWK_IMPLICIT |
ASE_AWK_EXPLICIT |
ASE_AWK_UNIQUEFN |
ASE_AWK_IDIV |
ASE_AWK_SHADING |
ASE_AWK_SHIFT |
ASE_AWK_EXTIO |
ASE_AWK_BLOCKLESS |
ASE_AWK_STRBASEONE |
ASE_AWK_STRIPSPACES |
ASE_AWK_NEXTOFILE |
ASE_AWK_ARGSTOMAIN;
ase_awk_setoption (awk, opt);
addFunction (ASE_T("sin"), 1, 1, (FunctionHandler)&StdAwk::sin);
addFunction (ASE_T("cos"), 1, 1, (FunctionHandler)&StdAwk::cos);
addFunction (ASE_T("tan"), 1, 1, (FunctionHandler)&StdAwk::tan);
addFunction (ASE_T("atan2"), 2, 2, (FunctionHandler)&StdAwk::atan2);
addFunction (ASE_T("log"), 1, 1, (FunctionHandler)&StdAwk::log);
addFunction (ASE_T("exp"), 1, 1, (FunctionHandler)&StdAwk::exp);
addFunction (ASE_T("sqrt"), 1, 1, (FunctionHandler)&StdAwk::sqrt);
addFunction (ASE_T("int"), 1, 1, (FunctionHandler)&StdAwk::fnint);
addFunction (ASE_T("rand"), 0, 0, (FunctionHandler)&StdAwk::rand);
addFunction (ASE_T("srand"), 1, 1, (FunctionHandler)&StdAwk::srand);
addFunction (ASE_T("systime"), 0, 0, (FunctionHandler)&StdAwk::systime);
addFunction (ASE_T("strftime"), 0, 2, (FunctionHandler)&StdAwk::strftime);
addFunction (ASE_T("strfgmtime"), 0, 2, (FunctionHandler)&StdAwk::strfgmtime);
addFunction (ASE_T("system"), 1, 1, (FunctionHandler)&StdAwk::system);
}
ADD_FUNC (ASE_T("sin"), 1, 1, &StdAwk::sin);
ADD_FUNC (ASE_T("cos"), 1, 1, &StdAwk::cos);
ADD_FUNC (ASE_T("tan"), 1, 1, &StdAwk::tan);
ADD_FUNC (ASE_T("atan2"), 2, 2, &StdAwk::atan2);
ADD_FUNC (ASE_T("log"), 1, 1, &StdAwk::log);
ADD_FUNC (ASE_T("exp"), 1, 1, &StdAwk::exp);
ADD_FUNC (ASE_T("sqrt"), 1, 1, &StdAwk::sqrt);
ADD_FUNC (ASE_T("int"), 1, 1, &StdAwk::fnint);
ADD_FUNC (ASE_T("rand"), 0, 0, &StdAwk::rand);
ADD_FUNC (ASE_T("srand"), 1, 1, &StdAwk::srand);
ADD_FUNC (ASE_T("systime"), 0, 0, &StdAwk::systime);
ADD_FUNC (ASE_T("strftime"), 0, 2, &StdAwk::strftime);
ADD_FUNC (ASE_T("strfgmtime"), 0, 2, &StdAwk::strfgmtime);
ADD_FUNC (ASE_T("system"), 1, 1, &StdAwk::system);
return n;
return 0;
}
int StdAwk::sin (Return* ret, const Argument* args, size_t nargs)
@ -228,8 +233,20 @@ namespace ASE
StdAwk::ssize_t StdAwk::readPipe (Pipe& io, char_t* buf, size_t len)
{
// TODO: change this implementation...
FILE* fp = (FILE*)io.getHandle();
ssize_t n = 0;
while (n < len)
{
ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) break;
buf[n++] = c;
if (c == ASE_T('\n')) break;
}
return n;
/*
if (ase_fgets (buf, len, fp) == ASE_NULL)
{
if (ferror(fp)) return -1;
@ -237,6 +254,7 @@ namespace ASE
}
return ase_strlen(buf);
*/
}
@ -326,8 +344,21 @@ namespace ASE
StdAwk::ssize_t StdAwk::readFile (File& io, char_t* buf, size_t len)
{
// TODO: replace ase_fgets by something else
FILE* fp = (FILE*)io.getHandle();
ssize_t n = 0;
while (n < len)
{
ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) break;
buf[n++] = c;
if (c == ASE_T('\n')) break;
}
return n;
/*
if (ase_fgets (buf, len, fp) == ASE_NULL)
{
if (ferror(fp)) return -1;
@ -335,6 +366,7 @@ namespace ASE
}
return ase_strlen(buf);
*/
}
StdAwk::ssize_t StdAwk::writeFile (File& io, char_t* buf, size_t len)

View File

@ -1,5 +1,5 @@
/*
* $Id: extio.c,v 1.3 2007/04/30 05:47:33 bacon Exp $
* $Id: extio.c,v 1.4 2007/05/18 16:19:20 bacon Exp $
*
* {License}
*/
@ -247,7 +247,44 @@ int ase_awk_readextio (
if (n == 0)
{
p->in.eof = ase_true;
if (ASE_STR_LEN(buf) == 0) ret = 0;
else if (rs_len >= 2)
{
/* when RS is multiple characters, it needs to check
* for the match at the end of the input stream as
* the buffer has been appened with the last character
* after the previous matchrex has failed */
const ase_char_t* match_ptr;
ase_size_t match_len;
ASE_ASSERT (run->global.rs != ASE_NULL);
n = ase_awk_matchrex (
run->awk, run->global.rs,
((run->global.ignorecase)? ASE_AWK_REX_IGNORECASE: 0),
ASE_STR_BUF(buf), ASE_STR_LEN(buf),
&match_ptr, &match_len, &run->errnum);
if (n == -1)
{
ret = -1;
break;
}
if (n == 1)
{
/* the match should be found at the end of
* the current buffer */
ASE_ASSERT (
ASE_STR_BUF(buf) + ASE_STR_LEN(buf) ==
match_ptr + match_len);
ASE_STR_LEN(buf) -= match_len;
break;
}
}
break;
}
@ -320,6 +357,7 @@ int ase_awk_readextio (
if (n == -1)
{
ret = -1;
p->in.pos--; /* unread the character in c */
break;
}
@ -332,6 +370,7 @@ int ase_awk_readextio (
match_ptr + match_len);
ASE_STR_LEN(buf) -= match_len;
p->in.pos--; /* unread the character in c */
break;
}
}