*** 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;
|
||||
@ -39,15 +39,25 @@ public abstract class Awk
|
||||
if (handle != 0) close ();
|
||||
}
|
||||
|
||||
/* == methods to provide major functionalities */
|
||||
public native void close ();
|
||||
public native void parse () throws Exception;
|
||||
public native void run () throws Exception;
|
||||
|
||||
/* == native methods == */
|
||||
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 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 == */
|
||||
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__)
|
||||
@ -227,6 +227,8 @@ int ase_awk_clear (ase_awk_t* awk)
|
||||
|
||||
awk->tree.chain_tail = ASE_NULL;
|
||||
awk->tree.chain_size = 0;
|
||||
|
||||
ase_awk_clrbfn (awk);
|
||||
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>
|
||||
@ -24,22 +24,22 @@ static int __bfn_sprintf (ase_awk_run_t* run);
|
||||
static ase_awk_bfn_t __sys_bfn[] =
|
||||
{
|
||||
/* io functions */
|
||||
{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("close"), 5}, ASE_AWK_EXTIO, 1, 1, ASE_NULL, __bfn_close},
|
||||
{ {ASE_T("fflush"), 6}, ASE_AWK_EXTIO, 0, 1, ASE_NULL, __bfn_fflush},
|
||||
|
||||
/* string functions */
|
||||
{ASE_T("index"), 5, 0, 2, 2, ASE_NULL, __bfn_index},
|
||||
{ASE_T("substr"), 6, 0, 2, 3, ASE_NULL, __bfn_substr},
|
||||
{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("tolower"), 7, 0, 1, 1, ASE_NULL, __bfn_tolower},
|
||||
{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("sub"), 3, 0, 2, 3, ASE_T("xvr"), __bfn_sub},
|
||||
{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("index"), 5}, 0, 2, 2, ASE_NULL, __bfn_index},
|
||||
{ {ASE_T("substr"), 6}, 0, 2, 3, ASE_NULL, __bfn_substr},
|
||||
{ {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("tolower"), 7}, 0, 1, 1, ASE_NULL, __bfn_tolower},
|
||||
{ {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("sub"), 3}, 0, 2, 3, ASE_T("xvr"), __bfn_sub},
|
||||
{ {ASE_T("match"), 5}, 0, 2, 2, ASE_T("vx"), __bfn_match},
|
||||
{ {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 (
|
||||
@ -49,18 +49,36 @@ ase_awk_bfn_t* ase_awk_addbfn (
|
||||
{
|
||||
ase_awk_bfn_t* p;
|
||||
|
||||
/* TODO: complete this function??? */
|
||||
|
||||
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 = name;
|
||||
p->name_len = name_len;
|
||||
p->name.ptr = ase_awk_strxdup (awk, name, name_len);
|
||||
if (p->name.ptr == ASE_NULL)
|
||||
{
|
||||
ASE_AWK_FREE (awk, p);
|
||||
awk->errnum = ASE_AWK_ENOMEM;
|
||||
return ASE_NULL;
|
||||
}
|
||||
p->name.len = name_len;
|
||||
p->valid = when_valid;
|
||||
p->min_args = min_args;
|
||||
p->max_args = max_args;
|
||||
p->arg_spec = arg_spec;
|
||||
p->arg.min = min_args;
|
||||
p->arg.max = max_args;
|
||||
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->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++)
|
||||
{
|
||||
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)
|
||||
awk->bfn.user = 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);
|
||||
return 0;
|
||||
}
|
||||
@ -98,7 +120,10 @@ void ase_awk_clrbfn (ase_awk_t* awk)
|
||||
p = awk->bfn.user;
|
||||
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);
|
||||
p = np;
|
||||
}
|
||||
@ -111,23 +136,24 @@ ase_awk_bfn_t* ase_awk_getbfn (
|
||||
{
|
||||
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 &&
|
||||
(awk->option & p->valid) == 0) continue;
|
||||
|
||||
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)
|
||||
{
|
||||
if (p->valid != 0 &&
|
||||
(awk->option & p->valid) == 0) continue;
|
||||
|
||||
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;
|
||||
@ -1307,79 +1333,3 @@ static int __bfn_sprintf (ase_awk_run_t* run)
|
||||
ase_awk_setretval (run, a0);
|
||||
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_
|
||||
@ -13,13 +13,26 @@ typedef struct ase_awk_bfn_t ase_awk_bfn_t;
|
||||
|
||||
struct ase_awk_bfn_t
|
||||
{
|
||||
const ase_char_t* name;
|
||||
ase_size_t name_len;
|
||||
struct
|
||||
{
|
||||
ase_char_t* ptr;
|
||||
ase_size_t len;
|
||||
} name;
|
||||
|
||||
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 max_args;
|
||||
const ase_char_t* arg_spec;
|
||||
ase_char_t* arg_spec;
|
||||
*/
|
||||
|
||||
int (*handler) (ase_awk_run_t* run);
|
||||
|
||||
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>
|
||||
@ -882,7 +882,8 @@ static ase_ssize_t __process_extio (
|
||||
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;
|
||||
const jchar* str;
|
||||
@ -895,7 +896,8 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (JNIEnv* env, jobject obj, j
|
||||
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;
|
||||
const jchar* str;
|
||||
@ -913,6 +915,7 @@ static int __handle_bfn (ase_awk_run_t* run)
|
||||
jclass class;
|
||||
jmethodID mid;
|
||||
|
||||
printf ("BFN CALLED.....\n");
|
||||
/*
|
||||
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_
|
||||
@ -11,12 +11,17 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv*, jobject);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv*, jobject);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv*, jobject);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv*, jobject);
|
||||
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_open (JNIEnv* env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj);
|
||||
|
||||
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
|
||||
}
|
||||
|
@ -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>
|
||||
@ -2801,11 +2801,11 @@ static ase_awk_nde_t* __parse_fncall (
|
||||
call->next = ASE_NULL;
|
||||
|
||||
/*call->what.bfn = bfn; */
|
||||
call->what.bfn.name = bfn->name;
|
||||
call->what.bfn.name_len = bfn->name_len;
|
||||
call->what.bfn.min_args = bfn->min_args;
|
||||
call->what.bfn.max_args = bfn->max_args;
|
||||
call->what.bfn.arg_spec = bfn->arg_spec;
|
||||
call->what.bfn.name.ptr = bfn->name.ptr;
|
||||
call->what.bfn.name.len = bfn->name.len;
|
||||
call->what.bfn.arg.min = bfn->arg.min;
|
||||
call->what.bfn.arg.max = bfn->arg.max;
|
||||
call->what.bfn.arg.spec = bfn->arg.spec;
|
||||
call->what.bfn.handler = bfn->handler;
|
||||
|
||||
call->args = head;
|
||||
@ -2815,8 +2815,8 @@ static ase_awk_nde_t* __parse_fncall (
|
||||
{
|
||||
call->type = ASE_AWK_NDE_AFN;
|
||||
call->next = ASE_NULL;
|
||||
call->what.afn.name = name;
|
||||
call->what.afn.name_len = name_len;
|
||||
call->what.afn.name.ptr = name;
|
||||
call->what.afn.name.len = name_len;
|
||||
call->args = head;
|
||||
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>
|
||||
@ -1147,8 +1147,8 @@ static int __run_main (
|
||||
|
||||
nde.type = ASE_AWK_NDE_AFN;
|
||||
nde.next = ASE_NULL;
|
||||
nde.what.afn.name = (ase_char_t*)main;
|
||||
nde.what.afn.name_len = ase_awk_strlen(main);
|
||||
nde.what.afn.name.ptr = (ase_char_t*)main;
|
||||
nde.what.afn.name.len = ase_awk_strlen(main);
|
||||
nde.args = ASE_NULL;
|
||||
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;
|
||||
|
||||
/* built-in function */
|
||||
if (call->nargs < call->what.bfn.min_args)
|
||||
if (call->nargs < call->what.bfn.arg.min)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
@ -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;
|
||||
|
||||
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);
|
||||
|
||||
afn = (ase_awk_afn_t*)pair->val;
|
||||
@ -4844,8 +4844,8 @@ static ase_awk_val_t* __eval_call (
|
||||
n = 0;
|
||||
|
||||
/* built-in function */
|
||||
ASE_AWK_ASSERT (run->awk, call->nargs >= call->what.bfn.min_args &&
|
||||
call->nargs <= call->what.bfn.max_args);
|
||||
ASE_AWK_ASSERT (run->awk, call->nargs >= call->what.bfn.arg.min &&
|
||||
call->nargs <= call->what.bfn.arg.max);
|
||||
|
||||
if (call->what.bfn.handler != ASE_NULL)
|
||||
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>
|
||||
@ -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;
|
||||
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(" ("));
|
||||
PRINT_EXPRESSION_LIST (awk, px->args);
|
||||
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;
|
||||
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(" ("));
|
||||
PRINT_EXPRESSION_LIST (awk, px->args);
|
||||
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:
|
||||
{
|
||||
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_FREE (awk, p);
|
||||
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_
|
||||
@ -246,19 +246,30 @@ struct ase_awk_nde_call_t
|
||||
{
|
||||
struct
|
||||
{
|
||||
ase_char_t* name;
|
||||
ase_size_t name_len;
|
||||
struct
|
||||
{
|
||||
ase_char_t* ptr;
|
||||
ase_size_t len;
|
||||
} name;
|
||||
} afn;
|
||||
|
||||
/* minimum information of a built-in function
|
||||
* needed during run-time. */
|
||||
struct
|
||||
{
|
||||
const ase_char_t* name;
|
||||
ase_size_t name_len;
|
||||
ase_size_t min_args;
|
||||
ase_size_t max_args;
|
||||
const ase_char_t* arg_spec;
|
||||
struct
|
||||
{
|
||||
const ase_char_t* ptr;
|
||||
ase_size_t len;
|
||||
} name;
|
||||
|
||||
struct
|
||||
{
|
||||
ase_size_t min;
|
||||
ase_size_t max;
|
||||
const ase_char_t* spec;
|
||||
} arg;
|
||||
|
||||
int (*handler) (ase_awk_run_t* awk);
|
||||
} 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;
|
||||
@ -16,7 +16,7 @@ public class Awk extends ase.awk.StdAwk
|
||||
{
|
||||
super ();
|
||||
|
||||
addbfn (bfn_sin, 1, 3);
|
||||
addBuiltinFunction ("sin", 1, 1);
|
||||
}
|
||||
|
||||
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>
|
||||
@ -734,6 +734,11 @@ static void __awk_free (void* ptr, void* custom_data)
|
||||
#define __awk_tolower towlower
|
||||
#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[])
|
||||
{
|
||||
ase_awk_t* awk;
|
||||
@ -848,6 +853,11 @@ static int __main (int argc, ase_char_t* argv[])
|
||||
srcios.out = dump_source;
|
||||
srcios.custom_data = &src_io;
|
||||
|
||||
|
||||
ase_awk_addbfn (awk, ASE_T("bufa"), 4, 0,
|
||||
1, 1, ASE_NULL, __handle_bfn);
|
||||
|
||||
|
||||
ase_awk_setmaxparsedepth (
|
||||
awk, ASE_AWK_DEPTH_BLOCK | ASE_AWK_DEPTH_EXPR, 20);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user