enhanced Awk::Awk to utilize Awk::Value
This commit is contained in:
parent
356e4c0792
commit
814ed89e53
20
qse/configure
vendored
20
qse/configure
vendored
@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.63 for qse 0.5.1.
|
||||
# Generated by GNU Autoconf 2.63 for qse 0.5.2.
|
||||
#
|
||||
# Report bugs to <bacon@abiyo.net>.
|
||||
#
|
||||
@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='qse'
|
||||
PACKAGE_TARNAME='qse'
|
||||
PACKAGE_VERSION='0.5.1'
|
||||
PACKAGE_STRING='qse 0.5.1'
|
||||
PACKAGE_VERSION='0.5.2'
|
||||
PACKAGE_STRING='qse 0.5.2'
|
||||
PACKAGE_BUGREPORT='bacon@abiyo.net'
|
||||
|
||||
# Factoring default headers for most tests.
|
||||
@ -1511,7 +1511,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures qse 0.5.1 to adapt to many kinds of systems.
|
||||
\`configure' configures qse 0.5.2 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@ -1581,7 +1581,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of qse 0.5.1:";;
|
||||
short | recursive ) echo "Configuration of qse 0.5.2:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@ -1695,7 +1695,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
qse configure 0.5.1
|
||||
qse configure 0.5.2
|
||||
generated by GNU Autoconf 2.63
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
||||
@ -1709,7 +1709,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by qse $as_me 0.5.1, which was
|
||||
It was created by qse $as_me 0.5.2, which was
|
||||
generated by GNU Autoconf 2.63. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
@ -2436,7 +2436,7 @@ fi
|
||||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='qse'
|
||||
VERSION='0.5.1'
|
||||
VERSION='0.5.2'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
@ -26126,7 +26126,7 @@ exec 6>&1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by qse $as_me 0.5.1, which was
|
||||
This file was extended by qse $as_me 0.5.2, which was
|
||||
generated by GNU Autoconf 2.63. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@ -26189,7 +26189,7 @@ Report bugs to <bug-autoconf@gnu.org>."
|
||||
_ACEOF
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_version="\\
|
||||
qse config.status 0.5.1
|
||||
qse config.status 0.5.2
|
||||
configured by $0, generated by GNU Autoconf 2.63,
|
||||
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
dnl AC_PREREQ(2.59)
|
||||
AC_INIT([qse],[0.5.1],[bacon@abiyo.net])
|
||||
AC_INIT([qse],[0.5.2],[bacon@abiyo.net])
|
||||
AC_CONFIG_HEADER([include/qse/config.h])
|
||||
AC_CONFIG_AUX_DIR([ac/au])
|
||||
AC_CONFIG_MACRO_DIR([ac/m4])
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: Awk.hpp 228 2009-07-11 03:01:36Z hyunghwan.chung $
|
||||
* $Id: Awk.hpp 229 2009-07-12 13:06:01Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -55,6 +55,9 @@ public:
|
||||
|
||||
typedef qse_awk_rio_cmd_t rio_cmd_t;
|
||||
|
||||
class Run;
|
||||
friend class Run;
|
||||
|
||||
class Source
|
||||
{
|
||||
public:
|
||||
@ -118,10 +121,10 @@ public:
|
||||
Source& operator= (const Source&);
|
||||
};
|
||||
|
||||
class Run;
|
||||
|
||||
/**
|
||||
* RIO class
|
||||
* The RIOBase class is a base class to represent runtime I/O context.
|
||||
* The Console, File, Pipe classes inherit this class to implement
|
||||
* an actual I/O context.
|
||||
*/
|
||||
class RIOBase
|
||||
{
|
||||
@ -219,74 +222,116 @@ public:
|
||||
char_t* filename;
|
||||
};
|
||||
|
||||
class Argument;
|
||||
class Return;
|
||||
|
||||
friend class Run;
|
||||
friend class Argument;
|
||||
friend class Return;
|
||||
|
||||
class Value
|
||||
{
|
||||
public:
|
||||
Value (): run (QSE_NULL), val (qse_awk_val_nil) {}
|
||||
Value (Run& run): run (&run), val (qse_awk_val_nil) {}
|
||||
Value (Run* run): run (run), val (qse_awk_val_nil) {}
|
||||
// initialization
|
||||
void* operator new (size_t n, Run* run) throw ();
|
||||
void* operator new[] (size_t n, Run* run) throw ();
|
||||
|
||||
#if !defined(__BORLANDC__)
|
||||
// deletion when initialization fails
|
||||
void operator delete (void* p, Run* run) throw ();
|
||||
void operator delete[] (void* p, Run* run) throw ();
|
||||
#endif
|
||||
|
||||
// normal deletion
|
||||
void operator delete (void* p) throw ();
|
||||
void operator delete[] (void* p) throw ();
|
||||
|
||||
Value ();
|
||||
Value (Run& run);
|
||||
Value (Run* run);
|
||||
|
||||
Value (const Value& v);
|
||||
~Value ();
|
||||
|
||||
Value& operator= (const Value& v);
|
||||
|
||||
void clear ();
|
||||
|
||||
operator val_t* () const { return val; }
|
||||
operator long_t () const;
|
||||
operator real_t () const;
|
||||
operator const char_t* () const;
|
||||
|
||||
void clear ();
|
||||
val_t* toVal () const
|
||||
{
|
||||
return operator val_t* ();
|
||||
}
|
||||
|
||||
int get (long_t* v) const;
|
||||
int get (real_t* v) const;
|
||||
int get (const char_t** str, size_t* len) const;
|
||||
long_t toInt () const
|
||||
{
|
||||
return operator long_t ();
|
||||
}
|
||||
|
||||
int set (val_t* v);
|
||||
int set (Run* r, val_t* v);
|
||||
real_t toReal () const
|
||||
{
|
||||
return operator real_t ();
|
||||
}
|
||||
|
||||
int set (long_t v);
|
||||
int set (Run* r, long_t v);
|
||||
int set (real_t v);
|
||||
int set (Run* r, real_t v);
|
||||
int set (const char_t* str, size_t len);
|
||||
int set (Run* r, const char_t* str, size_t len);
|
||||
int set (const char_t* str);
|
||||
int set (Run* r, const char_t* str);
|
||||
const char_t* toStr (size_t* len) const
|
||||
{
|
||||
const char_t* p;
|
||||
size_t l;
|
||||
|
||||
int setIndexed (const char_t* idx, size_t isz, val_t* v);
|
||||
int setIndexed (Run* r, const char_t* idx, size_t isz, val_t* v);
|
||||
if (getStr (&p, &l) == -1)
|
||||
{
|
||||
p = EMPTY_STRING;
|
||||
l = 0;
|
||||
}
|
||||
|
||||
if (len != QSE_NULL) *len = l;
|
||||
return p;
|
||||
}
|
||||
|
||||
int setIndexed (const char_t* idx, size_t isz, long_t v);
|
||||
int setIndexed (Run* r, const char_t* idx, size_t isz, long_t v);
|
||||
int setIndexed (
|
||||
int getInt (long_t* v) const;
|
||||
int getReal (real_t* v) const;
|
||||
int getStr (const char_t** str, size_t* len) const;
|
||||
|
||||
int setVal (val_t* v);
|
||||
int setVal (Run* r, val_t* v);
|
||||
|
||||
int setInt (long_t v);
|
||||
int setInt (Run* r, long_t v);
|
||||
int setReal (real_t v);
|
||||
int setReal (Run* r, real_t v);
|
||||
int setStr (const char_t* str, size_t len);
|
||||
int setStr (Run* r, const char_t* str, size_t len);
|
||||
int setStr (const char_t* str);
|
||||
int setStr (Run* r, const char_t* str);
|
||||
|
||||
int setIndexedVal (
|
||||
const char_t* idx, size_t isz, val_t* v);
|
||||
int setIndexedVal (
|
||||
Run* r, const char_t* idx, size_t isz, val_t* v);
|
||||
|
||||
int setIndexedInt (
|
||||
const char_t* idx, size_t isz, long_t v);
|
||||
int setIndexedInt (
|
||||
Run* r, const char_t* idx, size_t isz, long_t v);
|
||||
|
||||
int setIndexedReal (
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
real_t v
|
||||
);
|
||||
|
||||
int setIndexed (
|
||||
int setIndexedReal (
|
||||
Run* r,
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
real_t v
|
||||
);
|
||||
|
||||
int setIndexed (
|
||||
int setIndexedStr (
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
const char_t* str,
|
||||
size_t len
|
||||
);
|
||||
|
||||
int setIndexed (
|
||||
int setIndexedStr (
|
||||
Run* r,
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
@ -294,6 +339,19 @@ public:
|
||||
size_t len
|
||||
);
|
||||
|
||||
int setIndexedStr (
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
const char_t* str
|
||||
);
|
||||
|
||||
int setIndexedStr (
|
||||
Run* r,
|
||||
const char_t* idx,
|
||||
size_t isz,
|
||||
const char_t* str
|
||||
);
|
||||
|
||||
bool isIndexed () const;
|
||||
|
||||
int getIndexed (
|
||||
@ -305,111 +363,13 @@ public:
|
||||
protected:
|
||||
Run* run;
|
||||
val_t* val;
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents an argument to an intrinsic function
|
||||
*/
|
||||
class Argument
|
||||
{
|
||||
public:
|
||||
friend class Awk;
|
||||
friend class Run;
|
||||
mutable struct
|
||||
{
|
||||
qse_xstr_t str;
|
||||
} cached;
|
||||
|
||||
Argument (Run& run);
|
||||
Argument (Run* run);
|
||||
~Argument ();
|
||||
|
||||
protected:
|
||||
Argument ();
|
||||
void clear ();
|
||||
|
||||
public:
|
||||
// initialization
|
||||
void* operator new (size_t n, awk_t* awk) throw ();
|
||||
void* operator new[] (size_t n, awk_t* awk) throw ();
|
||||
|
||||
#if !defined(__BORLANDC__)
|
||||
// deletion when initialization fails
|
||||
void operator delete (void* p, awk_t* awk);
|
||||
void operator delete[] (void* p, awk_t* awk);
|
||||
#endif
|
||||
|
||||
// normal deletion
|
||||
void operator delete (void* p);
|
||||
void operator delete[] (void* p);
|
||||
|
||||
private:
|
||||
Argument (const Argument&);
|
||||
Argument& operator= (const Argument&);
|
||||
|
||||
protected:
|
||||
int init (val_t* v);
|
||||
int init (const char_t* str, size_t len);
|
||||
|
||||
public:
|
||||
long_t toInt () const;
|
||||
real_t toReal () const;
|
||||
const char_t* toStr (size_t* len) const;
|
||||
|
||||
bool isIndexed () const;
|
||||
|
||||
int getIndexed (const char_t* idxptr, Argument& val) const;
|
||||
int getIndexed (const char_t* idxptr, size_t idxlen, Argument& val) const;
|
||||
int getIndexed (long_t idx, Argument& val) const;
|
||||
|
||||
int getFirstIndex (Argument& val) const;
|
||||
int getNextIndex (Argument& val) const;
|
||||
|
||||
protected:
|
||||
Run* run;
|
||||
val_t* val;
|
||||
|
||||
qse_long_t inum;
|
||||
qse_real_t rnum;
|
||||
mutable qse_str_t str;
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents a return value of an intrinsic function
|
||||
*/
|
||||
class Return
|
||||
{
|
||||
public:
|
||||
friend class Awk;
|
||||
friend class Run;
|
||||
|
||||
Return (Run& run);
|
||||
Return (Run* run);
|
||||
~Return ();
|
||||
|
||||
private:
|
||||
Return (const Return&);
|
||||
Return& operator= (const Return&);
|
||||
|
||||
protected:
|
||||
val_t* toVal () const;
|
||||
operator val_t* () const;
|
||||
|
||||
public:
|
||||
int set (long_t v);
|
||||
int set (real_t v);
|
||||
int set (const char_t* ptr, size_t len);
|
||||
|
||||
bool isIndexed () const;
|
||||
|
||||
int setIndexed (const char_t* idx, size_t iln, long_t v);
|
||||
int setIndexed (const char_t* idx, size_t iln, real_t v);
|
||||
int setIndexed (const char_t* idx, size_t iln, const char_t* str, size_t sln);
|
||||
int setIndexed (long_t idx, long_t v);
|
||||
int setIndexed (long_t idx, real_t v);
|
||||
int setIndexed (long_t idx, const char_t* str, size_t sln);
|
||||
|
||||
void clear ();
|
||||
|
||||
protected:
|
||||
Run* run;
|
||||
val_t* val;
|
||||
static const char_t* EMPTY_STRING;
|
||||
};
|
||||
|
||||
// generated by generrcode.awk
|
||||
@ -608,9 +568,7 @@ public:
|
||||
{
|
||||
protected:
|
||||
friend class Awk;
|
||||
friend class Argument;
|
||||
friend class Return;
|
||||
friend class RIO;
|
||||
friend class Value;
|
||||
|
||||
Run (Awk* awk);
|
||||
Run (Awk* awk, rtx_t* run);
|
||||
@ -702,7 +660,7 @@ public:
|
||||
* On success, 0 is returned.
|
||||
* On failure, -1 is returned.
|
||||
*/
|
||||
int setGlobal (int id, const Return& global);
|
||||
int setGlobal (int id, const Value& global);
|
||||
|
||||
/**
|
||||
* Gets the value of a global variable.
|
||||
@ -720,7 +678,7 @@ public:
|
||||
* On success, 0 is returned.
|
||||
* On failure, -1 is returned.
|
||||
*/
|
||||
int getGlobal (int id, Argument& global) const;
|
||||
int getGlobal (int id, Value& global) const;
|
||||
|
||||
void* alloc (size_t size);
|
||||
void free (void* ptr);
|
||||
@ -847,8 +805,9 @@ public:
|
||||
*/
|
||||
virtual int call (
|
||||
const char_t* name,
|
||||
const Return* args,
|
||||
size_t nargs
|
||||
Value* ret,
|
||||
const Value* args,
|
||||
size_t nargs
|
||||
);
|
||||
|
||||
/**
|
||||
@ -887,7 +846,7 @@ public:
|
||||
* Represents a user-defined intrinsic function.
|
||||
*/
|
||||
typedef int (Awk::*FunctionHandler) (
|
||||
Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
|
||||
/**
|
||||
@ -953,7 +912,7 @@ protected:
|
||||
|
||||
// run-time callbacks
|
||||
virtual bool onLoopEnter (Run& run);
|
||||
virtual void onLoopExit (Run& run, const Argument& ret);
|
||||
virtual void onLoopExit (Run& run, const Value& ret);
|
||||
virtual void onStatement (Run& run, size_t line);
|
||||
|
||||
// primitive handlers
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: StdAwk.hpp 226 2009-07-09 12:46:14Z hyunghwan.chung $
|
||||
* $Id: StdAwk.hpp 229 2009-07-12 13:06:01Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -78,29 +78,29 @@ public:
|
||||
|
||||
protected:
|
||||
// intrinsic functions
|
||||
int sin (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int sin (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int cos (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int cos (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int tan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int tan (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int atan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int atan (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int atan2 (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int atan2 (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int log (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int log (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int exp (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int exp (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int sqrt (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int sqrt (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int fnint (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int fnint (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int rand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int rand (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int srand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int srand (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
int system (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int system (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len);
|
||||
|
||||
// pipe io handlers
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: StdAwk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $
|
||||
* $Id: StdAwk.cpp 229 2009-07-12 13:06:01Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -81,10 +81,10 @@ void StdAwk::close ()
|
||||
Awk::close ();
|
||||
}
|
||||
|
||||
int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::sin (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_SINL)
|
||||
(real_t)::sinl(args[0].toReal())
|
||||
#elif defined(HAVE_SIN)
|
||||
@ -97,10 +97,10 @@ int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::cos (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::cos (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_COSL)
|
||||
(real_t)::cosl(args[0].toReal())
|
||||
#elif defined(HAVE_COS)
|
||||
@ -113,10 +113,10 @@ int StdAwk::cos (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::tan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::tan (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_TANL)
|
||||
(real_t)::tanl(args[0].toReal())
|
||||
#elif defined(HAVE_TAN)
|
||||
@ -129,10 +129,10 @@ int StdAwk::tan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::atan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::atan (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_ATANL)
|
||||
(real_t)::atanl(args[0].toReal())
|
||||
#elif defined(HAVE_ATAN)
|
||||
@ -145,10 +145,10 @@ int StdAwk::atan (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::atan2 (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::atan2 (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_ATAN2L)
|
||||
(real_t)::atan2l(args[0].toReal(), args[1].toReal())
|
||||
#elif defined(HAVE_ATAN2)
|
||||
@ -161,10 +161,10 @@ int StdAwk::atan2 (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::log (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::log (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_LOGL)
|
||||
(real_t)::logl(args[0].toReal())
|
||||
#elif defined(HAVE_LOG)
|
||||
@ -177,10 +177,10 @@ int StdAwk::log (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::exp (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::exp (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_EXPL)
|
||||
(real_t)::expl(args[0].toReal())
|
||||
#elif defined(HAVE_EXP)
|
||||
@ -193,10 +193,10 @@ int StdAwk::exp (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::sqrt (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::sqrt (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (
|
||||
return ret.setReal (
|
||||
#if defined(HAVE_SQRTL)
|
||||
(real_t)::sqrtl(args[0].toReal())
|
||||
#elif defined(HAVE_SQRT)
|
||||
@ -209,19 +209,19 @@ int StdAwk::sqrt (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
);
|
||||
}
|
||||
|
||||
int StdAwk::fnint (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::fnint (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set (args[0].toInt());
|
||||
return ret.setInt (args[0].toInt());
|
||||
}
|
||||
|
||||
int StdAwk::rand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::rand (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
return ret.set ((real_t)(::rand() % RAND_MAX) / RAND_MAX);
|
||||
return ret.setReal ((real_t)(::rand() % RAND_MAX) / RAND_MAX);
|
||||
}
|
||||
|
||||
int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::srand (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
unsigned int prevSeed = this->seed;
|
||||
@ -240,19 +240,19 @@ int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
}
|
||||
|
||||
::srand (this->seed);
|
||||
return ret.set ((long_t)prevSeed);
|
||||
return ret.setInt ((long_t)prevSeed);
|
||||
}
|
||||
|
||||
int StdAwk::system (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
size_t l;
|
||||
const char_t* ptr = args[0].toStr(&l);
|
||||
|
||||
#ifdef _WIN32
|
||||
return ret.set ((long_t)::_tsystem(ptr));
|
||||
return ret.setInt ((long_t)::_tsystem(ptr));
|
||||
#elif defined(QSE_CHAR_IS_MCHAR)
|
||||
return ret.set ((long_t)::system(ptr));
|
||||
return ret.setInt ((long_t)::system(ptr));
|
||||
#else
|
||||
char* mbs = (char*) qse_awk_alloc ((awk_t*)(Awk*)run, l*5+1);
|
||||
if (mbs == QSE_NULL) return -1;
|
||||
@ -271,7 +271,7 @@ int StdAwk::system (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
}
|
||||
|
||||
mbs[mbl] = '\0';
|
||||
int n = ret.set ((long_t)::system(mbs));
|
||||
int n = ret.setInt ((long_t)::system(mbs));
|
||||
|
||||
qse_awk_free ((awk_t*)(Awk*)run, mbs);
|
||||
return n;
|
||||
|
@ -34,33 +34,13 @@ static void print_error (const qse_char_t* msg)
|
||||
print_error (0, msg);
|
||||
}
|
||||
|
||||
static int awk_main (int argc, qse_char_t* argv[])
|
||||
static int run_awk (QSE::StdAwk& awk)
|
||||
{
|
||||
QSE::StdAwk awk;
|
||||
QSE::StdAwk::Run* run;
|
||||
|
||||
// initialize awk
|
||||
if (awk.open() <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ARGV[0]
|
||||
if (awk.addArgument (QSE_T("awk05")) <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
if (awk.addArgument (QSE_T("awk05")) <= -1) return -1;
|
||||
|
||||
// ARGV[1] and/or the first console input file
|
||||
if (awk.addArgument (QSE_T("awk05.cpp")) <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
if (awk.addArgument (QSE_T("awk05.cpp")) <= -1) return -1;
|
||||
|
||||
const qse_char_t* script = QSE_T(
|
||||
"BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n"
|
||||
@ -72,24 +52,23 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
QSE::StdAwk::SourceFile out (QSE_T("awk05.out"));
|
||||
|
||||
// parse the script string and deparse it to awk05.out.
|
||||
run = awk.parse (&in, &out);
|
||||
if (run == QSE_NULL)
|
||||
{
|
||||
print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
if (awk.parse (&in, &out) == QSE_NULL) return -1;
|
||||
|
||||
// execute the BEGIN, pattern-action, END blocks.
|
||||
if (awk.loop () <= -1)
|
||||
{
|
||||
print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
return awk.loop ();
|
||||
}
|
||||
|
||||
static int awk_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
QSE::StdAwk awk;
|
||||
|
||||
int ret = awk.open ();
|
||||
if (ret >= 0) ret = run_awk (awk);
|
||||
|
||||
if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
|
||||
awk.close ();
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
|
@ -29,67 +29,59 @@ static void print_error (unsigned long line, const qse_char_t* msg)
|
||||
|
||||
}
|
||||
|
||||
static void print_error (const qse_char_t* msg)
|
||||
static int run_awk (QSE::StdAwk& awk)
|
||||
{
|
||||
print_error (0, msg);
|
||||
QSE::StdAwk::Run* run;
|
||||
|
||||
const qse_char_t* script = QSE_T(
|
||||
"function add (a, b) { return a + b }\n"
|
||||
"function mul (a, b) { return a * b }\n"
|
||||
"function div (a, b) { return a / b }\n"
|
||||
);
|
||||
|
||||
QSE::StdAwk::SourceString in (script);
|
||||
QSE::StdAwk::SourceFile out (QSE_T("awk06.out"));
|
||||
|
||||
// parse the script and deparse it to awk06.out
|
||||
run = awk.parse (&in, &out);
|
||||
if (run == QSE_NULL) return -1;
|
||||
|
||||
QSE::StdAwk::Value arg[2];
|
||||
if (arg[0].setInt (run, -20) <= -1) return -1;
|
||||
if (arg[1].setStr (run, QSE_T("51")) <= -1) return -1;
|
||||
|
||||
// ret = add (-20, 51)
|
||||
QSE::StdAwk::Value ret;
|
||||
if (awk.call (QSE_T("add"), &ret, arg, 2) <= -1) return -1;
|
||||
|
||||
// ret = mul (ret, 51);
|
||||
arg[0] = ret;
|
||||
if (awk.call (QSE_T("mul"), &ret, arg, 2) <= -1) return -1;
|
||||
|
||||
// ret = div (ret, 2);
|
||||
arg[0] = ret;
|
||||
if (arg[1].setReal (run, 2) <= -1) return -1;
|
||||
if (awk.call (QSE_T("div"), &ret, arg, 2) <= -1) return -1;
|
||||
|
||||
// output the result in various types
|
||||
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
|
||||
qse_printf (QSE_T(" (real) [%Lf]\n"), (long double)ret.toReal());
|
||||
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int awk_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
QSE::StdAwk awk;
|
||||
QSE::StdAwk::Run* run;
|
||||
|
||||
// initialize awk
|
||||
if (awk.open() <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
return -1;
|
||||
}
|
||||
int ret = awk.open();
|
||||
|
||||
// ARGV[0]
|
||||
if (awk.addArgument (QSE_T("awk05")) <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ARGV[1] and/or the first console input file
|
||||
if (awk.addArgument (QSE_T("awk05.cpp")) <= -1)
|
||||
{
|
||||
print_error (awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
|
||||
const qse_char_t* script = QSE_T(
|
||||
"BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n"
|
||||
"length($0) > 0 { print $0; count++; }\n"
|
||||
"END { print \">> TOTAL\", count, \"LINES\"; }\n"
|
||||
);
|
||||
|
||||
QSE::StdAwk::SourceString in (script);
|
||||
QSE::StdAwk::SourceFile out (QSE_T("awk05.out"));
|
||||
|
||||
// parse the script string and deparse it to awk05.out.
|
||||
run = awk.parse (&in, &out);
|
||||
if (run == QSE_NULL)
|
||||
{
|
||||
print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// execute the BEGIN, pattern-action, END blocks.
|
||||
if (awk.loop () <= -1)
|
||||
{
|
||||
print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
awk.close ();
|
||||
return -1;
|
||||
}
|
||||
if (ret >= 0) ret = run_awk (awk);
|
||||
if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage());
|
||||
|
||||
awk.close ();
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
|
Loading…
Reference in New Issue
Block a user