*** empty log message ***

This commit is contained in:
hyung-hwan 2006-11-27 15:11:14 +00:00
parent 84494c2615
commit 12468e6d64
12 changed files with 162 additions and 158 deletions

View File

@ -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
{

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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; */

View File

@ -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 ()

View File

@ -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);