*** empty log message ***
This commit is contained in:
parent
84494c2615
commit
12468e6d64
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: Awk.java,v 1.12 2006-11-27 04:33:21 bacon Exp $
|
* $Id: Awk.java,v 1.13 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ase.awk;
|
package ase.awk;
|
||||||
@ -39,15 +39,25 @@ public abstract class Awk
|
|||||||
if (handle != 0) close ();
|
if (handle != 0) close ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* == methods to provide major functionalities */
|
/* == native methods == */
|
||||||
public native void close ();
|
|
||||||
public native void parse () throws Exception;
|
|
||||||
public native void run () throws Exception;
|
|
||||||
|
|
||||||
private native void open () throws Exception;
|
private native void open () throws Exception;
|
||||||
|
public native void close ();
|
||||||
|
public native void parse () throws Exception;
|
||||||
|
public native void run () throws Exception;
|
||||||
|
|
||||||
|
private native void addbfn (String name, int min_args, int max_args);
|
||||||
|
//private native int delbfn (String name);
|
||||||
|
|
||||||
private native int setfilename (long run_id, String name);
|
private native int setfilename (long run_id, String name);
|
||||||
private native int setofilename (long run_id, String name);
|
private native int setofilename (long run_id, String name);
|
||||||
|
|
||||||
|
/* == builtin functions == */
|
||||||
|
public void addBuiltinFunction (
|
||||||
|
String name, int min_args, int max_args) throws Exception
|
||||||
|
{
|
||||||
|
addbfn (name, min_args, max_args);
|
||||||
|
}
|
||||||
|
|
||||||
/* == console name setters == */
|
/* == console name setters == */
|
||||||
public void setInputConsoleName (Extio extio, String name) //throws Exception
|
public void setInputConsoleName (Extio extio, String name) //throws Exception
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.91 2006-11-25 15:51:30 bacon Exp $
|
* $Id: awk.c,v 1.92 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__BORLANDC__)
|
#if defined(__BORLANDC__)
|
||||||
@ -227,6 +227,8 @@ int ase_awk_clear (ase_awk_t* awk)
|
|||||||
|
|
||||||
awk->tree.chain_tail = ASE_NULL;
|
awk->tree.chain_tail = ASE_NULL;
|
||||||
awk->tree.chain_size = 0;
|
awk->tree.chain_size = 0;
|
||||||
|
|
||||||
|
ase_awk_clrbfn (awk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
160
ase/awk/func.c
160
ase/awk/func.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: func.c,v 1.77 2006-11-18 15:36:57 bacon Exp $
|
* $Id: func.c,v 1.78 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk_i.h>
|
#include <ase/awk/awk_i.h>
|
||||||
@ -24,22 +24,22 @@ static int __bfn_sprintf (ase_awk_run_t* run);
|
|||||||
static ase_awk_bfn_t __sys_bfn[] =
|
static ase_awk_bfn_t __sys_bfn[] =
|
||||||
{
|
{
|
||||||
/* io functions */
|
/* io functions */
|
||||||
{ASE_T("close"), 5, ASE_AWK_EXTIO, 1, 1, ASE_NULL, __bfn_close},
|
{ {ASE_T("close"), 5}, ASE_AWK_EXTIO, 1, 1, ASE_NULL, __bfn_close},
|
||||||
{ASE_T("fflush"), 6, ASE_AWK_EXTIO, 0, 1, ASE_NULL, __bfn_fflush},
|
{ {ASE_T("fflush"), 6}, ASE_AWK_EXTIO, 0, 1, ASE_NULL, __bfn_fflush},
|
||||||
|
|
||||||
/* string functions */
|
/* string functions */
|
||||||
{ASE_T("index"), 5, 0, 2, 2, ASE_NULL, __bfn_index},
|
{ {ASE_T("index"), 5}, 0, 2, 2, ASE_NULL, __bfn_index},
|
||||||
{ASE_T("substr"), 6, 0, 2, 3, ASE_NULL, __bfn_substr},
|
{ {ASE_T("substr"), 6}, 0, 2, 3, ASE_NULL, __bfn_substr},
|
||||||
{ASE_T("length"), 6, 0, 1, 1, ASE_NULL, __bfn_length},
|
{ {ASE_T("length"), 6}, 0, 1, 1, ASE_NULL, __bfn_length},
|
||||||
{ASE_T("split"), 5, 0, 2, 3, ASE_T("vrv"), __bfn_split},
|
{ {ASE_T("split"), 5}, 0, 2, 3, ASE_T("vrv"), __bfn_split},
|
||||||
{ASE_T("tolower"), 7, 0, 1, 1, ASE_NULL, __bfn_tolower},
|
{ {ASE_T("tolower"), 7}, 0, 1, 1, ASE_NULL, __bfn_tolower},
|
||||||
{ASE_T("toupper"), 7, 0, 1, 1, ASE_NULL, __bfn_toupper},
|
{ {ASE_T("toupper"), 7}, 0, 1, 1, ASE_NULL, __bfn_toupper},
|
||||||
{ASE_T("gsub"), 4, 0, 2, 3, ASE_T("xvr"), __bfn_gsub},
|
{ {ASE_T("gsub"), 4}, 0, 2, 3, ASE_T("xvr"), __bfn_gsub},
|
||||||
{ASE_T("sub"), 3, 0, 2, 3, ASE_T("xvr"), __bfn_sub},
|
{ {ASE_T("sub"), 3}, 0, 2, 3, ASE_T("xvr"), __bfn_sub},
|
||||||
{ASE_T("match"), 5, 0, 2, 2, ASE_T("vx"), __bfn_match},
|
{ {ASE_T("match"), 5}, 0, 2, 2, ASE_T("vx"), __bfn_match},
|
||||||
{ASE_T("sprintf"), 7, 0, 1, MAX, ASE_NULL, __bfn_sprintf},
|
{ {ASE_T("sprintf"), 7}, 0, 1, MAX, ASE_NULL, __bfn_sprintf},
|
||||||
|
|
||||||
{ASE_NULL, 0, 0, 0, 0, ASE_NULL, ASE_NULL}
|
{ {ASE_NULL, 0}, 0, 0, 0, ASE_NULL, ASE_NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
ase_awk_bfn_t* ase_awk_addbfn (
|
ase_awk_bfn_t* ase_awk_addbfn (
|
||||||
@ -49,18 +49,36 @@ ase_awk_bfn_t* ase_awk_addbfn (
|
|||||||
{
|
{
|
||||||
ase_awk_bfn_t* p;
|
ase_awk_bfn_t* p;
|
||||||
|
|
||||||
/* TODO: complete this function??? */
|
|
||||||
|
|
||||||
p = (ase_awk_bfn_t*) ASE_AWK_MALLOC (awk, ase_sizeof(ase_awk_bfn_t));
|
p = (ase_awk_bfn_t*) ASE_AWK_MALLOC (awk, ase_sizeof(ase_awk_bfn_t));
|
||||||
if (p == ASE_NULL) return ASE_NULL;
|
if (p == ASE_NULL)
|
||||||
|
{
|
||||||
|
awk->errnum = ASE_AWK_ENOMEM;
|
||||||
|
return ASE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* NOTE: make sure that name is a constant string */
|
p->name.ptr = ase_awk_strxdup (awk, name, name_len);
|
||||||
p->name = name;
|
if (p->name.ptr == ASE_NULL)
|
||||||
p->name_len = name_len;
|
{
|
||||||
|
ASE_AWK_FREE (awk, p);
|
||||||
|
awk->errnum = ASE_AWK_ENOMEM;
|
||||||
|
return ASE_NULL;
|
||||||
|
}
|
||||||
|
p->name.len = name_len;
|
||||||
p->valid = when_valid;
|
p->valid = when_valid;
|
||||||
p->min_args = min_args;
|
p->arg.min = min_args;
|
||||||
p->max_args = max_args;
|
p->arg.max = max_args;
|
||||||
p->arg_spec = arg_spec;
|
if (arg_spec == ASE_NULL) p->arg.spec = ASE_NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->arg.spec = ase_awk_strdup (awk, arg_spec);
|
||||||
|
if (p->arg.spec == ASE_NULL)
|
||||||
|
{
|
||||||
|
ASE_AWK_FREE (awk, p->name.ptr);
|
||||||
|
ASE_AWK_FREE (awk, p);
|
||||||
|
awk->errnum = ASE_AWK_ENOMEM;
|
||||||
|
return ASE_NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
p->handler = handler;
|
p->handler = handler;
|
||||||
|
|
||||||
p->next = awk->bfn.user;
|
p->next = awk->bfn.user;
|
||||||
@ -75,12 +93,16 @@ int ase_awk_delbfn (ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len)
|
|||||||
|
|
||||||
for (p = awk->bfn.user; p != ASE_NULL; p++)
|
for (p = awk->bfn.user; p != ASE_NULL; p++)
|
||||||
{
|
{
|
||||||
if (ase_awk_strxncmp(p->name, p->name_len, name, name_len) == 0)
|
if (ase_awk_strxncmp (
|
||||||
|
p->name.ptr, p->name.len, name, name_len) == 0)
|
||||||
{
|
{
|
||||||
if (pp == ASE_NULL)
|
if (pp == ASE_NULL)
|
||||||
awk->bfn.user = p->next;
|
awk->bfn.user = p->next;
|
||||||
else pp->next = p->next;
|
else pp->next = p->next;
|
||||||
|
|
||||||
|
if (p->arg.spec != ASE_NULL)
|
||||||
|
ASE_AWK_FREE (awk, p->arg.spec);
|
||||||
|
ASE_AWK_FREE (awk, p->name.ptr);
|
||||||
ASE_AWK_FREE (awk, p);
|
ASE_AWK_FREE (awk, p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -98,7 +120,10 @@ void ase_awk_clrbfn (ase_awk_t* awk)
|
|||||||
p = awk->bfn.user;
|
p = awk->bfn.user;
|
||||||
while (p != ASE_NULL)
|
while (p != ASE_NULL)
|
||||||
{
|
{
|
||||||
np = p;
|
np = p->next;
|
||||||
|
if (p->arg.spec != ASE_NULL)
|
||||||
|
ASE_AWK_FREE (awk, p->arg.spec);
|
||||||
|
ASE_AWK_FREE (awk, p->name.ptr);
|
||||||
ASE_AWK_FREE (awk, p);
|
ASE_AWK_FREE (awk, p);
|
||||||
p = np;
|
p = np;
|
||||||
}
|
}
|
||||||
@ -111,23 +136,24 @@ ase_awk_bfn_t* ase_awk_getbfn (
|
|||||||
{
|
{
|
||||||
ase_awk_bfn_t* p;
|
ase_awk_bfn_t* p;
|
||||||
|
|
||||||
for (p = __sys_bfn; p->name != ASE_NULL; p++)
|
for (p = __sys_bfn; p->name.ptr != ASE_NULL; p++)
|
||||||
{
|
{
|
||||||
if (p->valid != 0 &&
|
if (p->valid != 0 &&
|
||||||
(awk->option & p->valid) == 0) continue;
|
(awk->option & p->valid) == 0) continue;
|
||||||
|
|
||||||
if (ase_awk_strxncmp (
|
if (ase_awk_strxncmp (
|
||||||
p->name, p->name_len, name, name_len) == 0) return p;
|
p->name.ptr, p->name.len,
|
||||||
|
name, name_len) == 0) return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: user-added builtin functions... */
|
|
||||||
for (p = awk->bfn.user; p != ASE_NULL; p = p->next)
|
for (p = awk->bfn.user; p != ASE_NULL; p = p->next)
|
||||||
{
|
{
|
||||||
if (p->valid != 0 &&
|
if (p->valid != 0 &&
|
||||||
(awk->option & p->valid) == 0) continue;
|
(awk->option & p->valid) == 0) continue;
|
||||||
|
|
||||||
if (ase_awk_strxncmp (
|
if (ase_awk_strxncmp (
|
||||||
p->name, p->name_len, name, name_len) == 0) return p;
|
p->name.ptr, p->name.len,
|
||||||
|
name, name_len) == 0) return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
@ -1307,79 +1333,3 @@ static int __bfn_sprintf (ase_awk_run_t* run)
|
|||||||
ase_awk_setretval (run, a0);
|
ase_awk_setretval (run, a0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int __bfn_system (ase_awk_run_t* run)
|
|
||||||
{
|
|
||||||
ase_size_t nargs;
|
|
||||||
ase_char_t* cmd;
|
|
||||||
ase_awk_val_t* v;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
nargs = ase_awk_getnargs (run);
|
|
||||||
ASE_AWK_ASSERT (run->awk, nargs == 1);
|
|
||||||
|
|
||||||
cmd = ase_awk_valtostr (
|
|
||||||
run, ase_awk_getarg(run, 0),
|
|
||||||
ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, ASE_NULL);
|
|
||||||
if (cmd == ASE_NULL) return -1;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
n = _tsystem (cmd);
|
|
||||||
#else
|
|
||||||
/* TODO: support system on other platforms that win32 */
|
|
||||||
n = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASE_AWK_FREE (run->awk, cmd);
|
|
||||||
|
|
||||||
v = ase_awk_makeintval (run, n);
|
|
||||||
if (v == ASE_NULL)
|
|
||||||
{
|
|
||||||
ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ase_awk_setretval (run, v);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* math functions */
|
|
||||||
static int __bfn_sin (ase_awk_run_t* run)
|
|
||||||
{
|
|
||||||
ase_size_t nargs;
|
|
||||||
ase_awk_val_t* v;
|
|
||||||
int n;
|
|
||||||
ase_long_t lv;
|
|
||||||
ase_real_t rv;
|
|
||||||
|
|
||||||
nargs = ase_awk_getnargs (run);
|
|
||||||
ASE_AWK_ASSERT (run->awk, nargs == 1);
|
|
||||||
|
|
||||||
n = ase_awk_valtonum (run, ase_awk_getarg(run, 0), &lv, &rv);
|
|
||||||
if (n == -1)
|
|
||||||
{
|
|
||||||
/* wrong value */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n == 0) rv = (ase_real_t)lv;
|
|
||||||
|
|
||||||
#if (ASE_SIZEOF_REAL == ASE_SIZEOF_LONG_DOUBLE)
|
|
||||||
v = ase_awk_makerealval (run, (ase_real_t)sinl(rv));
|
|
||||||
#elif (ASE_SIZEOF_REAL == ASE_SIZEOF_DOUBLE)
|
|
||||||
v = ase_awk_makerealval (run, (ase_real_t)sin(rv));
|
|
||||||
#else
|
|
||||||
#error unsupported floating-point data type
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (v == ASE_NULL)
|
|
||||||
{
|
|
||||||
ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ase_awk_setretval (run, v);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: func.h,v 1.15 2006-11-13 09:37:00 bacon Exp $
|
* $Id: func.h,v 1.16 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASE_AWK_FUNC_H_
|
#ifndef _ASE_AWK_FUNC_H_
|
||||||
@ -13,13 +13,26 @@ typedef struct ase_awk_bfn_t ase_awk_bfn_t;
|
|||||||
|
|
||||||
struct ase_awk_bfn_t
|
struct ase_awk_bfn_t
|
||||||
{
|
{
|
||||||
const ase_char_t* name;
|
struct
|
||||||
ase_size_t name_len;
|
{
|
||||||
|
ase_char_t* ptr;
|
||||||
|
ase_size_t len;
|
||||||
|
} name;
|
||||||
|
|
||||||
int valid; /* the entry is valid when this option is set */
|
int valid; /* the entry is valid when this option is set */
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ase_size_t min;
|
||||||
|
ase_size_t max;
|
||||||
|
ase_char_t* spec;
|
||||||
|
} arg;
|
||||||
|
/*
|
||||||
ase_size_t min_args;
|
ase_size_t min_args;
|
||||||
ase_size_t max_args;
|
ase_size_t max_args;
|
||||||
const ase_char_t* arg_spec;
|
ase_char_t* arg_spec;
|
||||||
|
*/
|
||||||
|
|
||||||
int (*handler) (ase_awk_run_t* run);
|
int (*handler) (ase_awk_run_t* run);
|
||||||
|
|
||||||
ase_awk_bfn_t* next;
|
ase_awk_bfn_t* next;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: jni.c,v 1.27 2006-11-27 04:33:22 bacon Exp $
|
* $Id: jni.c,v 1.28 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/jni.h>
|
#include <ase/awk/jni.h>
|
||||||
@ -882,7 +882,8 @@ static ase_ssize_t __process_extio (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (JNIEnv* env, jobject obj, jlong run_id, jstring name)
|
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (
|
||||||
|
JNIEnv* env, jobject obj, jlong run_id, jstring name)
|
||||||
{
|
{
|
||||||
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
|
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
|
||||||
const jchar* str;
|
const jchar* str;
|
||||||
@ -895,7 +896,8 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (JNIEnv* env, jobject obj, j
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setofilename (JNIEnv* env, jobject obj, jlong run_id, jstring name)
|
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setofilename (
|
||||||
|
JNIEnv* env, jobject obj, jlong run_id, jstring name)
|
||||||
{
|
{
|
||||||
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
|
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
|
||||||
const jchar* str;
|
const jchar* str;
|
||||||
@ -913,6 +915,7 @@ static int __handle_bfn (ase_awk_run_t* run)
|
|||||||
jclass class;
|
jclass class;
|
||||||
jmethodID mid;
|
jmethodID mid;
|
||||||
|
|
||||||
|
printf ("BFN CALLED.....\n");
|
||||||
/*
|
/*
|
||||||
class = (*env)->GetObjectClass(env, obj);
|
class = (*env)->GetObjectClass(env, obj);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: jni.h,v 1.10 2006-11-27 04:33:22 bacon Exp $
|
* $Id: jni.h,v 1.11 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASE_AWK_JNI_H_
|
#ifndef _ASE_AWK_JNI_H_
|
||||||
@ -11,12 +11,17 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv*, jobject);
|
JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj);
|
||||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv*, jobject);
|
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj);
|
||||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv*, jobject);
|
JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj);
|
||||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv*, jobject);
|
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj);
|
||||||
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (JNIEnv*, jobject, jlong, jstring);
|
|
||||||
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setofilename (JNIEnv*, jobject, jlong, jstring);
|
JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
|
||||||
|
JNIEnv* env, jobject obj, jstring name, jint min_args, jint max_args);
|
||||||
|
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (
|
||||||
|
JNIEnv* env, jobject obj, jlong run_id, jstring name);
|
||||||
|
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setofilename (
|
||||||
|
JNIEnv* env, jobject obj, jlong run_id, jstring name);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parse.c,v 1.211 2006-11-27 04:33:22 bacon Exp $
|
* $Id: parse.c,v 1.212 2006-11-27 15:10:34 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk_i.h>
|
#include <ase/awk/awk_i.h>
|
||||||
@ -2801,11 +2801,11 @@ static ase_awk_nde_t* __parse_fncall (
|
|||||||
call->next = ASE_NULL;
|
call->next = ASE_NULL;
|
||||||
|
|
||||||
/*call->what.bfn = bfn; */
|
/*call->what.bfn = bfn; */
|
||||||
call->what.bfn.name = bfn->name;
|
call->what.bfn.name.ptr = bfn->name.ptr;
|
||||||
call->what.bfn.name_len = bfn->name_len;
|
call->what.bfn.name.len = bfn->name.len;
|
||||||
call->what.bfn.min_args = bfn->min_args;
|
call->what.bfn.arg.min = bfn->arg.min;
|
||||||
call->what.bfn.max_args = bfn->max_args;
|
call->what.bfn.arg.max = bfn->arg.max;
|
||||||
call->what.bfn.arg_spec = bfn->arg_spec;
|
call->what.bfn.arg.spec = bfn->arg.spec;
|
||||||
call->what.bfn.handler = bfn->handler;
|
call->what.bfn.handler = bfn->handler;
|
||||||
|
|
||||||
call->args = head;
|
call->args = head;
|
||||||
@ -2815,8 +2815,8 @@ static ase_awk_nde_t* __parse_fncall (
|
|||||||
{
|
{
|
||||||
call->type = ASE_AWK_NDE_AFN;
|
call->type = ASE_AWK_NDE_AFN;
|
||||||
call->next = ASE_NULL;
|
call->next = ASE_NULL;
|
||||||
call->what.afn.name = name;
|
call->what.afn.name.ptr = name;
|
||||||
call->what.afn.name_len = name_len;
|
call->what.afn.name.len = name_len;
|
||||||
call->args = head;
|
call->args = head;
|
||||||
call->nargs = nargs;
|
call->nargs = nargs;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.284 2006-11-24 13:20:49 bacon Exp $
|
* $Id: run.c,v 1.285 2006-11-27 15:10:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk_i.h>
|
#include <ase/awk/awk_i.h>
|
||||||
@ -1147,8 +1147,8 @@ static int __run_main (
|
|||||||
|
|
||||||
nde.type = ASE_AWK_NDE_AFN;
|
nde.type = ASE_AWK_NDE_AFN;
|
||||||
nde.next = ASE_NULL;
|
nde.next = ASE_NULL;
|
||||||
nde.what.afn.name = (ase_char_t*)main;
|
nde.what.afn.name.ptr = (ase_char_t*)main;
|
||||||
nde.what.afn.name_len = ase_awk_strlen(main);
|
nde.what.afn.name.len = ase_awk_strlen(main);
|
||||||
nde.args = ASE_NULL;
|
nde.args = ASE_NULL;
|
||||||
nde.nargs = 0;
|
nde.nargs = 0;
|
||||||
|
|
||||||
@ -4573,17 +4573,17 @@ static ase_awk_val_t* __eval_bfn (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
|||||||
ase_awk_nde_call_t* call = (ase_awk_nde_call_t*)nde;
|
ase_awk_nde_call_t* call = (ase_awk_nde_call_t*)nde;
|
||||||
|
|
||||||
/* built-in function */
|
/* built-in function */
|
||||||
if (call->nargs < call->what.bfn.min_args)
|
if (call->nargs < call->what.bfn.arg.min)
|
||||||
{
|
{
|
||||||
PANIC (run, ASE_AWK_ETOOFEWARGS);
|
PANIC (run, ASE_AWK_ETOOFEWARGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (call->nargs > call->what.bfn.max_args)
|
if (call->nargs > call->what.bfn.arg.max)
|
||||||
{
|
{
|
||||||
PANIC (run, ASE_AWK_ETOOMANYARGS);
|
PANIC (run, ASE_AWK_ETOOMANYARGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return __eval_call (run, nde, call->what.bfn.arg_spec, ASE_NULL);
|
return __eval_call (run, nde, call->what.bfn.arg.spec, ASE_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ase_awk_val_t* __eval_afn (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
static ase_awk_val_t* __eval_afn (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
||||||
@ -4593,7 +4593,7 @@ static ase_awk_val_t* __eval_afn (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
|||||||
ase_awk_pair_t* pair;
|
ase_awk_pair_t* pair;
|
||||||
|
|
||||||
pair = ase_awk_map_get (&run->awk->tree.afns,
|
pair = ase_awk_map_get (&run->awk->tree.afns,
|
||||||
call->what.afn.name, call->what.afn.name_len);
|
call->what.afn.name.ptr, call->what.afn.name.len);
|
||||||
if (pair == ASE_NULL) PANIC (run, ASE_AWK_ENOSUCHFUNC);
|
if (pair == ASE_NULL) PANIC (run, ASE_AWK_ENOSUCHFUNC);
|
||||||
|
|
||||||
afn = (ase_awk_afn_t*)pair->val;
|
afn = (ase_awk_afn_t*)pair->val;
|
||||||
@ -4844,8 +4844,8 @@ static ase_awk_val_t* __eval_call (
|
|||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
/* built-in function */
|
/* built-in function */
|
||||||
ASE_AWK_ASSERT (run->awk, call->nargs >= call->what.bfn.min_args &&
|
ASE_AWK_ASSERT (run->awk, call->nargs >= call->what.bfn.arg.min &&
|
||||||
call->nargs <= call->what.bfn.max_args);
|
call->nargs <= call->what.bfn.arg.max);
|
||||||
|
|
||||||
if (call->what.bfn.handler != ASE_NULL)
|
if (call->what.bfn.handler != ASE_NULL)
|
||||||
n = call->what.bfn.handler (run);
|
n = call->what.bfn.handler (run);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.c,v 1.90 2006-11-21 15:06:15 bacon Exp $
|
* $Id: tree.c,v 1.91 2006-11-27 15:10:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk_i.h>
|
#include <ase/awk/awk_i.h>
|
||||||
@ -479,7 +479,7 @@ static int __print_expression (ase_awk_t* awk, ase_awk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)nde;
|
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)nde;
|
||||||
PUT_SRCSTRX (awk,
|
PUT_SRCSTRX (awk,
|
||||||
px->what.bfn.name, px->what.bfn.name_len);
|
px->what.bfn.name.ptr, px->what.bfn.name.len);
|
||||||
PUT_SRCSTR (awk, ASE_T(" ("));
|
PUT_SRCSTR (awk, ASE_T(" ("));
|
||||||
PRINT_EXPRESSION_LIST (awk, px->args);
|
PRINT_EXPRESSION_LIST (awk, px->args);
|
||||||
PUT_SRCSTR (awk, ASE_T(")"));
|
PUT_SRCSTR (awk, ASE_T(")"));
|
||||||
@ -490,7 +490,7 @@ static int __print_expression (ase_awk_t* awk, ase_awk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)nde;
|
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)nde;
|
||||||
PUT_SRCSTRX (awk,
|
PUT_SRCSTRX (awk,
|
||||||
px->what.afn.name, px->what.afn.name_len);
|
px->what.afn.name.ptr, px->what.afn.name.len);
|
||||||
PUT_SRCSTR (awk, ASE_T(" ("));
|
PUT_SRCSTR (awk, ASE_T(" ("));
|
||||||
PRINT_EXPRESSION_LIST (awk, px->args);
|
PRINT_EXPRESSION_LIST (awk, px->args);
|
||||||
PUT_SRCSTR (awk, ASE_T(")"));
|
PUT_SRCSTR (awk, ASE_T(")"));
|
||||||
@ -1110,7 +1110,7 @@ void ase_awk_clrpt (ase_awk_t* awk, ase_awk_nde_t* tree)
|
|||||||
case ASE_AWK_NDE_AFN:
|
case ASE_AWK_NDE_AFN:
|
||||||
{
|
{
|
||||||
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)p;
|
ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)p;
|
||||||
ASE_AWK_FREE (awk, px->what.afn.name);
|
ASE_AWK_FREE (awk, px->what.afn.name.ptr);
|
||||||
ase_awk_clrpt (awk, px->args);
|
ase_awk_clrpt (awk, px->args);
|
||||||
ASE_AWK_FREE (awk, p);
|
ASE_AWK_FREE (awk, p);
|
||||||
break;
|
break;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.h,v 1.81 2006-11-23 03:31:36 bacon Exp $
|
* $Id: tree.h,v 1.82 2006-11-27 15:10:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASE_AWK_TREE_H_
|
#ifndef _ASE_AWK_TREE_H_
|
||||||
@ -246,19 +246,30 @@ struct ase_awk_nde_call_t
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
ase_char_t* name;
|
struct
|
||||||
ase_size_t name_len;
|
{
|
||||||
|
ase_char_t* ptr;
|
||||||
|
ase_size_t len;
|
||||||
|
} name;
|
||||||
} afn;
|
} afn;
|
||||||
|
|
||||||
/* minimum information of a built-in function
|
/* minimum information of a built-in function
|
||||||
* needed during run-time. */
|
* needed during run-time. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
const ase_char_t* name;
|
struct
|
||||||
ase_size_t name_len;
|
{
|
||||||
ase_size_t min_args;
|
const ase_char_t* ptr;
|
||||||
ase_size_t max_args;
|
ase_size_t len;
|
||||||
const ase_char_t* arg_spec;
|
} name;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ase_size_t min;
|
||||||
|
ase_size_t max;
|
||||||
|
const ase_char_t* spec;
|
||||||
|
} arg;
|
||||||
|
|
||||||
int (*handler) (ase_awk_run_t* awk);
|
int (*handler) (ase_awk_run_t* awk);
|
||||||
} bfn;
|
} bfn;
|
||||||
/* ase_awk_bfn_t* bfn; */
|
/* ase_awk_bfn_t* bfn; */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: Awk.java,v 1.12 2006-11-27 04:33:22 bacon Exp $
|
* $Id: Awk.java,v 1.13 2006-11-27 15:11:14 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ase.test.awk;
|
package ase.test.awk;
|
||||||
@ -16,7 +16,7 @@ public class Awk extends ase.awk.StdAwk
|
|||||||
{
|
{
|
||||||
super ();
|
super ();
|
||||||
|
|
||||||
addbfn (bfn_sin, 1, 3);
|
addBuiltinFunction ("sin", 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bfn_sin ()
|
public void bfn_sin ()
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.127 2006-11-27 04:33:22 bacon Exp $
|
* $Id: awk.c,v 1.128 2006-11-27 15:11:14 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk.h>
|
#include <ase/awk/awk.h>
|
||||||
@ -734,6 +734,11 @@ static void __awk_free (void* ptr, void* custom_data)
|
|||||||
#define __awk_tolower towlower
|
#define __awk_tolower towlower
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int __handle_bfn (ase_awk_run_t* run)
|
||||||
|
{
|
||||||
|
xp_printf (ASE_T("__handle_bfn\n"));
|
||||||
|
}
|
||||||
|
|
||||||
static int __main (int argc, ase_char_t* argv[])
|
static int __main (int argc, ase_char_t* argv[])
|
||||||
{
|
{
|
||||||
ase_awk_t* awk;
|
ase_awk_t* awk;
|
||||||
@ -848,6 +853,11 @@ static int __main (int argc, ase_char_t* argv[])
|
|||||||
srcios.out = dump_source;
|
srcios.out = dump_source;
|
||||||
srcios.custom_data = &src_io;
|
srcios.custom_data = &src_io;
|
||||||
|
|
||||||
|
|
||||||
|
ase_awk_addbfn (awk, ASE_T("bufa"), 4, 0,
|
||||||
|
1, 1, ASE_NULL, __handle_bfn);
|
||||||
|
|
||||||
|
|
||||||
ase_awk_setmaxparsedepth (
|
ase_awk_setmaxparsedepth (
|
||||||
awk, ASE_AWK_DEPTH_BLOCK | ASE_AWK_DEPTH_EXPR, 20);
|
awk, ASE_AWK_DEPTH_BLOCK | ASE_AWK_DEPTH_EXPR, 20);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user