*** empty log message ***

This commit is contained in:
hyung-hwan 2006-10-13 10:18:39 +00:00
parent 85a2b9c33b
commit 0d671f78a7
7 changed files with 437 additions and 117 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.126 2006-10-12 04:17:30 bacon Exp $ * $Id: awk.h,v 1.127 2006-10-13 10:18:10 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -25,10 +25,11 @@ typedef xp_ssize_t (*xp_awk_io_t) (
struct xp_awk_extio_t struct xp_awk_extio_t
{ {
int type; /* [IN] console, file, coproc, pipe */ int type; /* [IN] console, file, coproc, pipe */
int mode; /* [IN] read, write, etc */ int mode; /* [IN] read, write, etc */
xp_char_t* name; /* [IN] */ xp_char_t* name; /* [IN] */
void* handle; /* [OUT] */ void* custom_data; /* [IN] */
void* handle; /* [OUT] */
/* input buffer */ /* input buffer */
struct struct
@ -92,6 +93,7 @@ struct xp_awk_runios_t
xp_awk_io_t coproc; xp_awk_io_t coproc;
xp_awk_io_t file; xp_awk_io_t file;
xp_awk_io_t console; xp_awk_io_t console;
void* custom_data;
}; };
struct xp_awk_runcbs_t struct xp_awk_runcbs_t

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.65 2006-10-12 14:36:25 bacon Exp $ * $Id: awk_i.h,v 1.66 2006-10-13 10:18:10 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
@ -260,6 +260,7 @@ struct xp_awk_run_t
struct struct
{ {
xp_awk_io_t handler[XP_AWK_EXTIO_NUM]; xp_awk_io_t handler[XP_AWK_EXTIO_NUM];
void* custom_data;
xp_awk_extio_t* chain; xp_awk_extio_t* chain;
} extio; } extio;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.52 2006-10-12 04:17:30 bacon Exp $ * $Id: extio.c,v 1.53 2006-10-13 10:18:10 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -132,14 +132,14 @@ int xp_awk_readextio (
p->type = (extio_type | extio_mask); p->type = (extio_type | extio_mask);
p->mode = extio_mode; p->mode = extio_mode;
p->handle = XP_NULL; p->handle = XP_NULL;
p->next = XP_NULL;
p->custom_data = run->extio.custom_data;
p->in.buf[0] = XP_T('\0'); p->in.buf[0] = XP_T('\0');
p->in.pos = 0; p->in.pos = 0;
p->in.len = 0; p->in.len = 0;
p->in.eof = xp_false; p->in.eof = xp_false;
p->next = XP_NULL;
n = handler (XP_AWK_IO_OPEN, p, XP_NULL, 0); n = handler (XP_AWK_IO_OPEN, p, XP_NULL, 0);
if (n == -1) if (n == -1)
{ {
@ -159,11 +159,11 @@ int xp_awk_readextio (
p->next = run->extio.chain; p->next = run->extio.chain;
run->extio.chain = p; run->extio.chain = p;
/* n == 0 indicates that it has reached the end of input. /* usually, n == 0 indicates that it has reached the end
* the user io handler can return 0 for the open request * of the input. the user io handler can return 0 for the
* if it doesn't have any files to open. One advantage * open request if it doesn't have any files to open. One
* of doing this would be that you can skip the entire * advantage of doing this would be that you can skip the
* pattern-block matching and exeuction. */ * entire pattern-block matching and exeuction. */
if (n == 0) return 0; if (n == 0) return 0;
} }
@ -457,6 +457,7 @@ int xp_awk_writeextio_str (
p->mode = extio_mode; p->mode = extio_mode;
p->handle = XP_NULL; p->handle = XP_NULL;
p->next = XP_NULL; p->next = XP_NULL;
p->custom_data = run->extio.custom_data;
n = handler (XP_AWK_IO_OPEN, p, XP_NULL, 0); n = handler (XP_AWK_IO_OPEN, p, XP_NULL, 0);
if (n == -1) if (n == -1)
@ -477,7 +478,11 @@ int xp_awk_writeextio_str (
p->next = run->extio.chain; p->next = run->extio.chain;
run->extio.chain = p; run->extio.chain = p;
/* read the comment in xp_awk_readextio */ /* usually, n == 0 indicates that it has reached the end
* of the input. the user io handler can return 0 for the
* open request if it doesn't have any files to open. One
* advantage of doing this would be that you can skip the
* entire pattern-block matching and exeuction. */
if (n == 0) return 0; if (n == 0) return 0;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: jni.c,v 1.5 2006-10-12 14:36:25 bacon Exp $ * $Id: jni.c,v 1.6 2006-10-13 10:18:10 bacon Exp $
*/ */
#include <xp/awk/jni.h> #include <xp/awk/jni.h>
@ -13,17 +13,23 @@
#define EXCEPTION_AWK "xpkit/xpj/awk/AwkException" #define EXCEPTION_AWK "xpkit/xpj/awk/AwkException"
#define FIELD_AWK "__awk" #define FIELD_AWK "__awk"
enum
{
SOURCE_READ = 1,
SOURCE_WRITE = 2
};
/* TODO: what if xp_char_t is xp_mchar_t??? */
static xp_ssize_t __read_source ( static xp_ssize_t __read_source (
int cmd, void* arg, xp_char_t* data, xp_size_t count); int cmd, void* arg, xp_char_t* data, xp_size_t count);
static xp_ssize_t __write_source ( static xp_ssize_t __write_source (
int cmd, void* arg, xp_char_t* data, xp_size_t count); int cmd, void* arg, xp_char_t* data, xp_size_t count);
static xp_ssize_t __process_extio_console (
static xp_ssize_t __call_java_read_source ( int cmd, void* arg, xp_char_t* data, xp_size_t count);
JNIEnv* env, jobject obj, xp_char_t* buf, xp_size_t size);
static xp_ssize_t __call_java_write_source (
JNIEnv* env, jobject obj, xp_char_t* buf, xp_size_t size);
typedef struct srcio_data_t srcio_data_t; typedef struct srcio_data_t srcio_data_t;
typedef struct runio_data_t runio_data_t;
struct srcio_data_t struct srcio_data_t
{ {
@ -31,6 +37,12 @@ struct srcio_data_t
jobject obj; jobject obj;
}; };
struct runio_data_t
{
JNIEnv* env;
jobject obj;
};
static void* __awk_malloc (xp_size_t n, void* custom_data) static void* __awk_malloc (xp_size_t n, void* custom_data)
{ {
return malloc (n); return malloc (n);
@ -78,10 +90,16 @@ JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_open (JNIEnv* env, jobject obj)
syscas.memcpy = memcpy; syscas.memcpy = memcpy;
syscas.memset = memset; syscas.memset = memset;
/* TODO: */ #ifdef _WIN32
syscas.sprintf = _snwprintf; syscas.sprintf = _snwprintf;
syscas.dprintf = wprintf; syscas.dprintf = wprintf;
syscas.abort = abort; syscas.abort = abort;
#else
/* TODO: */
syscas.sprintf = XXXXX;
syscas.dprintf = XXXXX;
syscas.abort = abort;
#endif
awk = xp_awk_open (&syscas); awk = xp_awk_open (&syscas);
if (awk == NULL) if (awk == NULL)
@ -145,13 +163,12 @@ JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_parse (JNIEnv* env, jobject obj)
srcios.out = __write_source; srcios.out = __write_source;
srcios.custom_data = &srcio_data; srcios.custom_data = &srcio_data;
printf ("OK.......\n");
if (xp_awk_parse (awk, &srcios) == -1) if (xp_awk_parse (awk, &srcios) == -1)
{ {
printf ("parse error.......\n"); printf ("parse error.......\n");
except = (*env)->FindClass (env, EXCEPTION_AWK); except = (*env)->FindClass (env, EXCEPTION_AWK);
if (except == 0) return; if (except == 0) return;
(*env)->ThrowNew (env, except, "ERROR ...."); (*env)->ThrowNew (env, except, "Parse Error ...");
printf ("parse error -> line [%d] %S\n", xp_awk_getsrcline(awk), xp_awk_geterrstr(xp_awk_geterrnum(awk))); printf ("parse error -> line [%d] %S\n", xp_awk_getsrcline(awk), xp_awk_geterrstr(xp_awk_geterrnum(awk)));
return; return;
} }
@ -159,41 +176,83 @@ printf ("parse error -> line [%d] %S\n", xp_awk_getsrcline(awk), xp_awk_geterrst
JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_run (JNIEnv* env, jobject obj) JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_run (JNIEnv* env, jobject obj)
{ {
jclass class;
jfieldID fid;
jthrowable except;
xp_awk_t* awk;
xp_awk_runios_t runios;
runio_data_t runio_data;
class = (*env)->GetObjectClass (env, obj);
fid = (*env)->GetFieldID (env, class, FIELD_AWK, "J");
if (fid == 0) return;
awk = (xp_awk_t*) (*env)->GetLongField (env, obj, fid);
runio_data.env = env;
runio_data.obj = obj;
runios.pipe = XP_NULL;
runios.coproc = XP_NULL;
runios.file = XP_NULL;
runios.console = __process_extio_console;
runios.custom_data = &runio_data;
if (xp_awk_run (awk, &runios, XP_NULL, XP_NULL) == -1)
{
except = (*env)->FindClass (env, EXCEPTION_AWK);
if (except == 0) return;
(*env)->ThrowNew (env, except, "Run Error ...");
return;
}
} }
static xp_ssize_t __read_source ( static xp_ssize_t __call_java_open_source (JNIEnv* env, jobject obj, int mode)
int cmd, void* arg, xp_char_t* data, xp_size_t count)
{ {
srcio_data_t* srcio_data; jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
srcio_data = (srcio_data_t*)arg; class = (*env)->GetObjectClass(env, obj);
if (cmd == XP_AWK_IO_OPEN || cmd == XP_AWK_IO_CLOSE) return 0; mid = (*env)->GetMethodID (env, class, "open_source", "(I)I");
if (mid == 0) return -1;
if (cmd == XP_AWK_IO_READ) ret = (*env)->CallIntMethod (env, obj, mid, mode);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{ {
return __call_java_read_source ( (*env)->ExceptionClear (env);
srcio_data->env, srcio_data->obj, data, count); ret = -1;
} }
return -1; return ret;
} }
static xp_ssize_t __write_source ( static xp_ssize_t __call_java_close_source (JNIEnv* env, jobject obj, int mode)
int cmd, void* arg, xp_char_t* data, xp_size_t count)
{ {
srcio_data_t* srcio_data; jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
srcio_data = (srcio_data_t*)arg; class = (*env)->GetObjectClass(env, obj);
if (cmd == XP_AWK_IO_OPEN || cmd == XP_AWK_IO_CLOSE) return 0; mid = (*env)->GetMethodID (env, class, "close_source", "(I)I");
if (cmd == XP_AWK_IO_WRITE) if (mid == 0) return -1;
ret = (*env)->CallIntMethod (env, obj, mid, mode);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{ {
return __call_java_write_source ( (*env)->ExceptionClear (env);
srcio_data->env, srcio_data->obj, data, count); ret = -1;
} }
return -1; return ret;
} }
static xp_ssize_t __call_java_read_source ( static xp_ssize_t __call_java_read_source (
@ -202,23 +261,28 @@ static xp_ssize_t __call_java_read_source (
jclass class; jclass class;
jmethodID mid; jmethodID mid;
jcharArray array; jcharArray array;
xp_ssize_t i, n;
jchar* tmp; jchar* tmp;
jint ret, i;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, "read_source", "([CI)I"); mid = (*env)->GetMethodID (env, class, "read_source", "([CI)I");
if (mid == 0) return -1; if (mid == 0) return -1;
array = (*env)->NewCharArray (env, 1024); array = (*env)->NewCharArray (env, size);
if (array == NULL) return -1; if (array == NULL) return -1;
n = (*env)->CallIntMethod (env, obj, mid, array, 1024); ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
// TODO: how to handle error..
// TODO: what is xp_char_t is xp_mchar_t? use UTF8 ???
tmp = (*env)->GetCharArrayElements (env, array, 0); tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < n && i < size; i++) buf[i] = (xp_char_t)tmp[i]; for (i = 0; i < ret; i++) buf[i] = (xp_char_t)tmp[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0); (*env)->ReleaseCharArrayElements (env, array, tmp, 0);
return i; return i;
@ -230,8 +294,9 @@ static xp_ssize_t __call_java_write_source (
jclass class; jclass class;
jmethodID mid; jmethodID mid;
jcharArray array; jcharArray array;
xp_ssize_t i;
jchar* tmp; jchar* tmp;
jint ret, i;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
@ -241,11 +306,224 @@ static xp_ssize_t __call_java_write_source (
array = (*env)->NewCharArray (env, size); array = (*env)->NewCharArray (env, size);
if (array == NULL) return -1; if (array == NULL) return -1;
// TODO: how to handle error..
// TODO: what is xp_char_t is xp_mchar_t? use UTF8 ???
tmp = (*env)->GetCharArrayElements (env, array, 0); tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < size; i++) tmp[i] = (jchar)buf[i]; for (i = 0; i < size; i++) tmp[i] = (jchar)buf[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0); (*env)->ReleaseCharArrayElements (env, array, tmp, 0);
return (*env)->CallIntMethod (env, obj, mid, array, size); ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
return ret;
}
static xp_ssize_t __call_java_open_extio (JNIEnv* env, jobject obj, char* name)
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, name, "()I");
if (mid == 0) return -1;
ret = (*env)->CallIntMethod (env, obj, mid);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
return ret;
}
static xp_ssize_t __call_java_close_extio (JNIEnv* env, jobject obj, char* name)
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, name, "()I");
if (mid == 0) return -1;
ret = (*env)->CallIntMethod (env, obj, mid);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
return ret;
}
static xp_ssize_t __call_java_read_extio (
JNIEnv* env, jobject obj, char* name, xp_char_t* buf, xp_size_t size)
{
jclass class;
jmethodID mid;
jcharArray array;
jchar* tmp;
jint ret, i;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, name, "([CI)I");
if (mid == 0) return -1;
array = (*env)->NewCharArray (env, size);
if (array == NULL) return -1;
ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < ret; i++) buf[i] = (xp_char_t)tmp[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
return ret;
}
static xp_ssize_t __call_java_write_extio (
JNIEnv* env, jobject obj, char* name, xp_char_t* data, xp_size_t size)
{
jclass class;
jmethodID mid;
jcharArray array;
xp_ssize_t i;
jchar* tmp;
jint ret;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, name, "([CI)I");
if (mid == 0) return -1;
array = (*env)->NewCharArray (env, size);
if (array == NULL) return -1;
tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < size; i++) tmp[i] = (jchar)data[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
return ret;
}
static xp_ssize_t __read_source (
int cmd, void* arg, xp_char_t* data, xp_size_t count)
{
srcio_data_t* srcio_data = (srcio_data_t*)arg;
if (cmd == XP_AWK_IO_OPEN)
{
return __call_java_open_source (
srcio_data->env, srcio_data->obj, SOURCE_READ);
}
else if (cmd == XP_AWK_IO_CLOSE)
{
return __call_java_close_source (
srcio_data->env, srcio_data->obj, SOURCE_READ);
}
else if (cmd == XP_AWK_IO_READ)
{
return __call_java_read_source (
srcio_data->env, srcio_data->obj, data, count);
}
return -1;
}
static xp_ssize_t __write_source (
int cmd, void* arg, xp_char_t* data, xp_size_t count)
{
srcio_data_t* srcio_data = (srcio_data_t*)arg;
if (cmd == XP_AWK_IO_OPEN)
{
return __call_java_open_source (
srcio_data->env, srcio_data->obj, SOURCE_WRITE);
}
else if (cmd == XP_AWK_IO_CLOSE)
{
return __call_java_close_source (
srcio_data->env, srcio_data->obj, SOURCE_WRITE);
}
else if (cmd == XP_AWK_IO_WRITE)
{
return __call_java_write_source (
srcio_data->env, srcio_data->obj, data, count);
}
return -1;
}
static xp_ssize_t __process_extio_console (
int cmd, void* arg, xp_char_t* data, xp_size_t size)
{
xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
runio_data_t* runio_data = (runio_data_t*)epa->custom_data;
if (cmd == XP_AWK_IO_OPEN)
{
return __call_java_open_extio (
runio_data->env, runio_data->obj, "open_console");
}
else if (cmd == XP_AWK_IO_CLOSE)
{
return __call_java_close_extio (
runio_data->env, runio_data->obj, "close_console");
}
else if (cmd == XP_AWK_IO_READ)
{
return __call_java_read_extio (
runio_data->env, runio_data->obj, "read_console",
data, size);
}
else if (cmd == XP_AWK_IO_WRITE)
{
/* epa->handle not used at all */
/* TODO: error handling */
return __call_java_write_extio (
runio_data->env, runio_data->obj, "write_console",
data, size);
}
#if 0
else if (cmd == XP_AWK_IO_FLUSH)
{
if (fflush ((FILE*)epa->handle) == EOF) return -1;
return 0;
}
else if (cmd == XP_AWK_IO_NEXT)
{
return next_extio_console (epa);
}
#endif
return -1;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.188 2006-10-12 04:17:31 bacon Exp $ * $Id: parse.c,v 1.189 2006-10-13 10:18:10 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -318,16 +318,19 @@ static struct __bvent __bvtab[] =
int xp_awk_parse (xp_awk_t* awk, xp_awk_srcios_t* srcios) int xp_awk_parse (xp_awk_t* awk, xp_awk_srcios_t* srcios)
{ {
int n = 0; int n = 0, op;
xp_awk_assert (awk, srcios != XP_NULL && srcios->in != XP_NULL); xp_awk_assert (awk, srcios != XP_NULL && srcios->in != XP_NULL);
xp_awk_clear (awk); xp_awk_clear (awk);
awk->src.ios = srcios; awk->src.ios = srcios;
if (awk->src.ios->in ( op = awk->src.ios->in (
XP_AWK_IO_OPEN, awk->src.ios->custom_data, XP_NULL, 0) == -1) XP_AWK_IO_OPEN, awk->src.ios->custom_data, XP_NULL, 0);
if (op == -1)
{ {
/* cannot open the source file.
* it doesn't even have to call CLOSE */
awk->errnum = XP_AWK_ESRCINOPEN; awk->errnum = XP_AWK_ESRCINOPEN;
return -1; return -1;
} }
@ -338,30 +341,37 @@ int xp_awk_parse (xp_awk_t* awk, xp_awk_srcios_t* srcios)
goto exit_parse; goto exit_parse;
} }
/* get the first character */ /* the user io handler for the source code input returns 0 when
if (__get_char(awk) == -1) * it doesn't have any files to open. this is the same condition
* as the source code file is empty. so it will perform the parsing
* when op is positive, which means there are something to parse */
if (op > 0)
{ {
n = -1; /* get the first character */
goto exit_parse; if (__get_char(awk) == -1)
}
/* get the first token */
if (__get_token(awk) == -1)
{
n = -1;
goto exit_parse;
}
while (1)
{
if (MATCH(awk,TOKEN_EOF)) break;
if (MATCH(awk,TOKEN_NEWLINE)) continue;
if (__parse_progunit (awk) == XP_NULL)
{ {
n = -1; n = -1;
goto exit_parse; goto exit_parse;
} }
/* get the first token */
if (__get_token(awk) == -1)
{
n = -1;
goto exit_parse;
}
while (1)
{
if (MATCH(awk,TOKEN_EOF)) break;
if (MATCH(awk,TOKEN_NEWLINE)) continue;
if (__parse_progunit (awk) == XP_NULL)
{
n = -1;
goto exit_parse;
}
}
} }
awk->tree.nglobals = xp_awk_tab_getsize(&awk->parse.globals); awk->tree.nglobals = xp_awk_tab_getsize(&awk->parse.globals);
@ -379,7 +389,7 @@ exit_parse:
if (awk->src.ios->in ( if (awk->src.ios->in (
XP_AWK_IO_CLOSE, awk->src.ios->custom_data, XP_NULL, 0) == -1) XP_AWK_IO_CLOSE, awk->src.ios->custom_data, XP_NULL, 0) == -1)
{ {
if (n == 0) if (n != -1)
{ {
/* this is to keep the earlier error above /* this is to keep the earlier error above
* that might be more critical than this */ * that might be more critical than this */
@ -4121,27 +4131,44 @@ static int __deparse (xp_awk_t* awk)
xp_awk_chain_t* chain; xp_awk_chain_t* chain;
xp_char_t tmp[xp_sizeof(xp_size_t)*8 + 32]; xp_char_t tmp[xp_sizeof(xp_size_t)*8 + 32];
struct __deparse_func_t df; struct __deparse_func_t df;
int n; int n = 0, op;
xp_awk_assert (awk, awk->src.ios->out != XP_NULL); xp_awk_assert (awk, awk->src.ios->out != XP_NULL);
awk->src.shared.buf_len = 0; awk->src.shared.buf_len = 0;
awk->src.shared.buf_pos = 0; awk->src.shared.buf_pos = 0;
/* TODO: more error handling */ op = awk->src.ios->out (
if (awk->src.ios->out ( XP_AWK_IO_OPEN, awk->src.ios->custom_data, XP_NULL, 0);
XP_AWK_IO_OPEN, awk->src.ios->custom_data, XP_NULL, 0) == -1) if (op == -1)
{ {
awk->errnum = XP_AWK_ESRCOUTOPEN; awk->errnum = XP_AWK_ESRCOUTOPEN;
return -1; return -1;
} }
if (op == 0)
{
/* the result of the open operation indicates that the
* file has been open but reached the end. so it has to
* skip the entire deparsing procedure as it can't write
* any single characters on such an io handler. but note
* that this is not really an error for the parse and deparser.
*
* in fact, there are two ways to skip deparsing.
* 1. set awk->src.ios.out to NULL.
* 2. set awk->src.ios.out to a normal handler but
* make it return 0 on the OPEN request.
*/
n = 0;
goto exit_deparse;
}
#define EXIT_DEPARSE(num) \ #define EXIT_DEPARSE(num) \
do { n = -1; awk->errnum = num ; goto exit_deparse; } while(0) do { n = -1; awk->errnum = num ; goto exit_deparse; } while(0)
if (awk->tree.nglobals > awk->tree.nbglobals) if (awk->tree.nglobals > awk->tree.nbglobals)
{ {
xp_size_t i, n; xp_size_t i, len;
xp_awk_assert (awk, awk->tree.nglobals > 0); xp_awk_assert (awk, awk->tree.nglobals > 0);
if (xp_awk_putsrcstr (awk, XP_T("global ")) == -1) if (xp_awk_putsrcstr (awk, XP_T("global ")) == -1)
@ -4149,19 +4176,19 @@ static int __deparse (xp_awk_t* awk)
for (i = awk->tree.nbglobals; i < awk->tree.nglobals - 1; i++) for (i = awk->tree.nbglobals; i < awk->tree.nglobals - 1; i++)
{ {
n = xp_awk_longtostr ((xp_long_t)i, len = xp_awk_longtostr ((xp_long_t)i,
10, XP_T("__global"), tmp, xp_countof(tmp)); 10, XP_T("__global"), tmp, xp_countof(tmp));
xp_awk_assert (awk, n != (xp_size_t)-1); xp_awk_assert (awk, len != (xp_size_t)-1);
if (xp_awk_putsrcstrx (awk, tmp, n) == -1) if (xp_awk_putsrcstrx (awk, tmp, len) == -1)
EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE); EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE);
if (xp_awk_putsrcstr (awk, XP_T(", ")) == -1) if (xp_awk_putsrcstr (awk, XP_T(", ")) == -1)
EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE); EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE);
} }
n = xp_awk_longtostr ((xp_long_t)i, len = xp_awk_longtostr ((xp_long_t)i,
10, XP_T("__global"), tmp, xp_countof(tmp)); 10, XP_T("__global"), tmp, xp_countof(tmp));
xp_awk_assert (awk, n != (xp_size_t)-1); xp_awk_assert (awk, len != (xp_size_t)-1);
if (xp_awk_putsrcstrx (awk, tmp, n) == -1) if (xp_awk_putsrcstrx (awk, tmp, len) == -1)
EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE); EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE);
if (xp_awk_putsrcstr (awk, XP_T(";\n\n")) == -1) if (xp_awk_putsrcstr (awk, XP_T(";\n\n")) == -1)
EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE); EXIT_DEPARSE (XP_AWK_ESRCOUTWRITE);
@ -4231,7 +4258,7 @@ exit_deparse:
{ {
if (n != -1) if (n != -1)
{ {
awk->errnum = XP_AWK_ESRCOUTOPEN; awk->errnum = XP_AWK_ESRCOUTCLOSE;
n = -1; n = -1;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.234 2006-10-12 14:36:25 bacon Exp $ * $Id: run.c,v 1.235 2006-10-13 10:18:10 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -645,6 +645,7 @@ static int __init_run (xp_awk_run_t* run, xp_awk_runios_t* runios, int* errnum)
run->extio.handler[XP_AWK_EXTIO_COPROC] = runios->coproc; run->extio.handler[XP_AWK_EXTIO_COPROC] = runios->coproc;
run->extio.handler[XP_AWK_EXTIO_FILE] = runios->file; run->extio.handler[XP_AWK_EXTIO_FILE] = runios->file;
run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console; run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console;
run->extio.custom_data = runios->custom_data;
run->extio.chain = XP_NULL; run->extio.chain = XP_NULL;
run->global.rs = XP_NULL; run->global.rs = XP_NULL;
@ -789,38 +790,42 @@ static int __build_runarg (xp_awk_run_t* run, xp_awk_runarg_t* runarg)
} }
xp_awk_refupval (v_argv); xp_awk_refupval (v_argv);
for (argc = 0, p = runarg; p->ptr != XP_NULL; argc++, p++) if (runarg == XP_NULL) argc = 0;
else
{ {
v_tmp = xp_awk_makestrval (run, p->ptr, p->len); for (argc = 0, p = runarg; p->ptr != XP_NULL; argc++, p++)
if (v_tmp == XP_NULL)
{ {
xp_awk_refdownval (run, v_argv); v_tmp = xp_awk_makestrval (run, p->ptr, p->len);
run->errnum = XP_AWK_ENOMEM; if (v_tmp == XP_NULL)
return -1; {
} xp_awk_refdownval (run, v_argv);
run->errnum = XP_AWK_ENOMEM;
return -1;
}
key_len = xp_awk_longtostr ( key_len = xp_awk_longtostr (
argc, 10, XP_NULL, key, xp_countof(key)); argc, 10, XP_NULL, key, xp_countof(key));
xp_awk_assert (run->awk, key_len != (xp_size_t)-1); xp_awk_assert (run->awk, key_len != (xp_size_t)-1);
/* increment reference count of v_tmp in advance as if /* increment reference count of v_tmp in advance as if
* it has successfully been assigned into the ARGV map */ * it has successfully been assigned into ARGV. */
xp_awk_refupval (v_tmp); xp_awk_refupval (v_tmp);
if (xp_awk_map_putx ( if (xp_awk_map_putx (
((xp_awk_val_map_t*)v_argv)->map, ((xp_awk_val_map_t*)v_argv)->map,
key, key_len, v_tmp, XP_NULL) == -1) key, key_len, v_tmp, XP_NULL) == -1)
{ {
/* if the assignment operation fails, decrements /* if the assignment operation fails, decrements
* the reference of v_tmp to free it */ * the reference of v_tmp to free it */
xp_awk_refdownval (run, v_tmp); xp_awk_refdownval (run, v_tmp);
/* the other values previously assigned into the map /* the values previously assigned into the
* will be freeed when v_argv is freed */ * map will be freeed when v_argv is freed */
xp_awk_refdownval (run, v_argv); xp_awk_refdownval (run, v_argv);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
}
} }
} }
@ -2105,6 +2110,7 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
return -1; return -1;
} }
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.c,v 1.95 2006-10-12 04:17:58 bacon Exp $ * $Id: awk.c,v 1.96 2006-10-13 10:18:39 bacon Exp $
*/ */
#include <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -187,7 +187,8 @@ static xp_ssize_t dump_source (
{ {
/*struct src_io* src_io = (struct src_io*)arg;*/ /*struct src_io* src_io = (struct src_io*)arg;*/
if (cmd == XP_AWK_IO_OPEN || cmd == XP_AWK_IO_CLOSE) return 0; if (cmd == XP_AWK_IO_OPEN) return 1;
else if (cmd == XP_AWK_IO_CLOSE) return 0;
else if (cmd == XP_AWK_IO_WRITE) else if (cmd == XP_AWK_IO_WRITE)
{ {
xp_size_t i; xp_size_t i;