*** empty log message ***

This commit is contained in:
hyung-hwan 2006-11-23 03:31:58 +00:00
parent 2de8c5f69e
commit 244c5062d9
10 changed files with 262 additions and 90 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.java,v 1.6 2006-11-22 15:12:03 bacon Exp $
* $Id: Awk.java,v 1.7 2006-11-23 03:31:35 bacon Exp $
*/
package ase.awk;
@ -30,14 +30,19 @@ public abstract class Awk
private native void open () throws Exception;
private native int setconsolename (long run_id, String name);
public void setConsoleName (long run_id, String name) //throws Exception
public void setConsoleName (Extio extio, String name) //throws Exception
{
/* TODO: setconsolename is not safe. for example, it can
* crash the program if run_id is invalid. so this wrapper
* needs to do some sanity check. */
//if (setconsolename (run_id, name) == -1)
// throw new Exception ("cannot set the consle name");
setconsolename (run_id, name);
setconsolename (extio.getRunId(), name);
}
public void setOutputConsoleName (Extio extio, String name)
{
// TODO:
}
/* abstrace methods */
@ -68,6 +73,12 @@ public abstract class Awk
protected int read_extio (Extio extio, char[] buf, int len)
{
// this check is needed because 0 is used to indicate
// the end of the stream. java streams can return 0
// if the data given is 0 bytes and it didn't reach
// the end of the stream.
if (len <= 0) return -1;
int type = extio.getType ();
if (type == Extio.TYPE_CONSOLE)
return read_console (extio, buf, len);
@ -82,6 +93,8 @@ public abstract class Awk
protected int write_extio (Extio extio, char[] buf, int len)
{
if (len <= 0) return -1;
int type = extio.getType ();
if (type == Extio.TYPE_CONSOLE)
return write_console (extio, buf, len);

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.h,v 1.148 2006-11-21 15:06:14 bacon Exp $
* $Id: awk.h,v 1.149 2006-11-23 03:31:35 bacon Exp $
*/
#ifndef _ASE_AWK_AWK_H_
@ -131,25 +131,6 @@ enum
ASE_AWK_IO_NEXT = 5
};
enum
{
ASE_AWK_EXTIO_PIPE_READ = 0,
ASE_AWK_EXTIO_PIPE_WRITE = 1,
/*
ASE_AWK_EXTIO_COPROC_READ = 0,
ASE_AWK_EXTIO_COPROC_WRITE = 1,
ASE_AWK_EXTIO_COPROC_RDWR = 2,
*/
ASE_AWK_EXTIO_FILE_READ = 0,
ASE_AWK_EXTIO_FILE_WRITE = 1,
ASE_AWK_EXTIO_FILE_APPEND = 2,
ASE_AWK_EXTIO_CONSOLE_READ = 0,
ASE_AWK_EXTIO_CONSOLE_WRITE = 1
};
/* various options */
enum
{
@ -208,8 +189,11 @@ enum
*/
ASE_AWK_STRIPSPACES = (1 << 12),
/* enable the nextoutfile keyword */
ASE_AWK_NEXTOUTFILE = (1 << 13),
/* a newline terminates a statement */
ASE_AWK_NEWLINE = (1 << 13)
ASE_AWK_NEWLINE = (1 << 14)
};
/* error code */
@ -336,6 +320,25 @@ enum ase_awk_extio_type_t
ASE_AWK_EXTIO_NUM
};
enum
{
ASE_AWK_EXTIO_PIPE_READ = 0,
ASE_AWK_EXTIO_PIPE_WRITE = 1,
/*
ASE_AWK_EXTIO_COPROC_READ = 0,
ASE_AWK_EXTIO_COPROC_WRITE = 1,
ASE_AWK_EXTIO_COPROC_RDWR = 2,
*/
ASE_AWK_EXTIO_FILE_READ = 0,
ASE_AWK_EXTIO_FILE_WRITE = 1,
ASE_AWK_EXTIO_FILE_APPEND = 2,
ASE_AWK_EXTIO_CONSOLE_READ = 0,
ASE_AWK_EXTIO_CONSOLE_WRITE = 1
};
/* assertion statement */
#ifdef NDEBUG
#define ASE_AWK_ASSERT(awk,expr) ((void)0)

View File

@ -1,5 +1,5 @@
/*
* $Id: extio.c,v 1.62 2006-11-22 15:12:04 bacon Exp $
* $Id: extio.c,v 1.63 2006-11-23 03:31:35 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -648,6 +648,8 @@ int ase_awk_nextextio_read (
if (p == ASE_NULL)
{
/* something is totally wrong */
ASE_AWK_ASSERT (run->awk,
!"should never happen - cannot find the relevant extio entry");
run->errnum = ASE_AWK_EINTERNAL;
return -1;
}
@ -687,6 +689,81 @@ int ase_awk_nextextio_read (
return n;
}
int ase_awk_nextextio_write (
ase_awk_run_t* run, int out_type, const ase_char_t* name)
{
ase_awk_extio_t* p = run->extio.chain;
ase_awk_io_t handler;
int extio_type, /*extio_mode,*/ extio_mask, n;
ASE_AWK_ASSERT (run->awk,
out_type >= 0 && out_type <= ase_countof(__out_type_map));
ASE_AWK_ASSERT (run->awk,
out_type >= 0 && out_type <= ase_countof(__out_mode_map));
ASE_AWK_ASSERT (run->awk,
out_type >= 0 && out_type <= ase_countof(__out_mask_map));
/* translate the out_type into the relevant extio type and mode */
extio_type = __out_type_map[out_type];
/*extio_mode = __out_mode_map[out_type];*/
extio_mask = __out_mask_map[out_type];
handler = run->extio.handler[extio_type];
if (handler == ASE_NULL)
{
/* no io handler provided */
run->errnum = ASE_AWK_EIOIMPL; /* TODO: change the error code */
return -1;
}
while (p != ASE_NULL)
{
if (p->type == (extio_type | extio_mask) &&
ase_awk_strcmp (p->name,name) == 0) break;
p = p->next;
}
if (p == ASE_NULL)
{
/* something is totally wrong */
ASE_AWK_ASSERT (run->awk,
!"should never happen - cannot find the relevant extio entry");
run->errnum = ASE_AWK_EINTERNAL;
return -1;
}
if (p->out.eos)
{
/* no more streams. */
return 0;
}
n = handler (ASE_AWK_IO_NEXT, p, ASE_NULL, 0);
if (n == -1)
{
/* TODO: is this errnum correct? */
run->errnum = ASE_AWK_EIOHANDLER;
return -1;
}
if (n == 0)
{
/* the next stream cannot be opened.
* set the eos flags so that the next call to nextextio_write
* will return 0 without executing the handler */
p->out.eos = ase_true;
}
else
{
/* as the next stream has been opened successfully,
* the eof flag should be cleared if set */
p->out.eof = ase_false;
}
return n;
}
int ase_awk_closeextio_read (
ase_awk_run_t* run, int in_type, const ase_char_t* name)
{

View File

@ -1,5 +1,5 @@
/*
* $Id: extio.h,v 1.15 2006-10-24 04:10:12 bacon Exp $
* $Id: extio.h,v 1.16 2006-11-23 03:31:36 bacon Exp $
*/
#ifndef _ASE_AWK_EXTIO_H_
@ -31,10 +31,8 @@ int ase_awk_flushextio (
int ase_awk_nextextio_read (
ase_awk_run_t* run, int in_type, const ase_char_t* name);
/* TODO:
int ase_awk_nextextio_write (
ase_awk_run_t* run, int out_type, const ase_char_t* name);
*/
int ase_awk_closeextio_read (
ase_awk_run_t* run, int in_type, const ase_char_t* name);

View File

@ -1,5 +1,5 @@
/*
* $Id: jni.c,v 1.20 2006-11-22 15:12:04 bacon Exp $
* $Id: jni.c,v 1.21 2006-11-23 03:31:36 bacon Exp $
*/
#include <ase/awk/jni.h>
@ -196,7 +196,8 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj)
opt = ASE_AWK_EXPLICIT | ASE_AWK_UNIQUE | ASE_AWK_DBLSLASHES |
ASE_AWK_SHADING | ASE_AWK_IMPLICIT | ASE_AWK_SHIFT |
ASE_AWK_EXTIO | ASE_AWK_BLOCKLESS | ASE_AWK_HASHSIGN;
ASE_AWK_EXTIO | ASE_AWK_BLOCKLESS | ASE_AWK_HASHSIGN |
ASE_AWK_NEXTOUTFILE;
ase_awk_setopt (awk, opt);
printf ("__awk(native) done => %u, 0x%X\n", awk, awk);
@ -574,7 +575,6 @@ static ase_ssize_t __call_java_read_extio (
jint ret, i;
jthrowable thrown;
printf ("java_read_extio>>>\n");
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c,v 1.204 2006-11-19 11:21:06 bacon Exp $
* $Id: parse.c,v 1.205 2006-11-23 03:31:36 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -78,6 +78,8 @@ enum
TOKEN_EXIT,
TOKEN_NEXT,
TOKEN_NEXTFILE,
TOKEN_NEXTINFILE,
TOKEN_NEXTOUTFILE,
TOKEN_DELETE,
TOKEN_PRINT,
TOKEN_PRINTF,
@ -182,7 +184,7 @@ static ase_awk_nde_t* __parse_continue (ase_awk_t* awk);
static ase_awk_nde_t* __parse_return (ase_awk_t* awk);
static ase_awk_nde_t* __parse_exit (ase_awk_t* awk);
static ase_awk_nde_t* __parse_next (ase_awk_t* awk);
static ase_awk_nde_t* __parse_nextfile (ase_awk_t* awk);
static ase_awk_nde_t* __parse_nextfile (ase_awk_t* awk, int out);
static ase_awk_nde_t* __parse_delete (ase_awk_t* awk);
static ase_awk_nde_t* __parse_print (ase_awk_t* awk, int type);
@ -243,6 +245,7 @@ static struct __kwent __kwtab[] =
{ ASE_T("exit"), 4, TOKEN_EXIT, 0 },
{ ASE_T("next"), 4, TOKEN_NEXT, 0 },
{ ASE_T("nextfile"), 8, TOKEN_NEXTFILE, 0 },
{ ASE_T("nextoutfile"), 11, TOKEN_NEXTOUTFILE, ASE_AWK_NEXTOUTFILE },
{ ASE_T("delete"), 6, TOKEN_DELETE, 0 },
{ ASE_T("print"), 5, TOKEN_PRINT, ASE_AWK_EXTIO },
{ ASE_T("printf"), 6, TOKEN_PRINTF, ASE_AWK_EXTIO },
@ -250,7 +253,7 @@ static struct __kwent __kwtab[] =
/* keywords that can start an expression */
{ ASE_T("getline"), 7, TOKEN_GETLINE, ASE_AWK_EXTIO },
{ ASE_NULL, 0, 0 }
{ ASE_NULL, 0, 0, 0 }
};
struct __bvent
@ -1256,7 +1259,12 @@ awk->parse.nl_semicolon = 1;
else if (MATCH(awk,TOKEN_NEXTFILE))
{
if (__get_token(awk) == -1) return ASE_NULL;
nde = __parse_nextfile (awk);
nde = __parse_nextfile (awk, 0);
}
else if (MATCH(awk,TOKEN_NEXTOUTFILE))
{
if (__get_token(awk) == -1) return ASE_NULL;
nde = __parse_nextfile (awk, 1);
}
else if (MATCH(awk,TOKEN_DELETE))
{
@ -3353,9 +3361,10 @@ static ase_awk_nde_t* __parse_next (ase_awk_t* awk)
return (ase_awk_nde_t*)nde;
}
static ase_awk_nde_t* __parse_nextfile (ase_awk_t* awk)
static ase_awk_nde_t* __parse_nextfile (ase_awk_t* awk, int out)
{
ase_awk_nde_nextfile_t* nde;
int stream = 1;
if (awk->parse.id.block == PARSE_BEGIN_BLOCK ||
awk->parse.id.block == PARSE_END_BLOCK)
@ -3368,6 +3377,7 @@ static ase_awk_nde_t* __parse_nextfile (ase_awk_t* awk)
if (nde == ASE_NULL) PANIC (awk, ASE_AWK_ENOMEM);
nde->type = ASE_AWK_NDE_NEXTFILE;
nde->next = ASE_NULL;
nde->out = out;
return (ase_awk_nde_t*)nde;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c,v 1.280 2006-11-21 15:06:15 bacon Exp $
* $Id: run.c,v 1.281 2006-11-23 03:31:36 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -1118,7 +1118,7 @@ static int __run_main (
nde.type = ASE_AWK_NDE_AFN;
nde.next = ASE_NULL;
nde.what.afn.name = main;
nde.what.afn.name = (ase_char_t*)main;
nde.what.afn.name_len = ase_awk_strlen(main);
nde.args = ASE_NULL;
nde.nargs = 0;
@ -1260,7 +1260,7 @@ static int __run_main (
static int __run_pattern_blocks (ase_awk_run_t* run)
{
ase_ssize_t n;
// ase_ssize_t n;
ase_bool_t need_to_close = ase_false;
run->inrec.buf_pos = 0;
@ -1995,13 +1995,11 @@ static int __run_next (ase_awk_run_t* run, ase_awk_nde_next_t* nde)
return 0;
}
static int __run_nextfile (ase_awk_run_t* run, ase_awk_nde_nextfile_t* nde)
static int __run_nextinfile (ase_awk_run_t* run)
{
/* TODO: some extentions such as nextfile "in/out";
* what about awk -i in1,in2,in3 -o out1,out2,out3 ?
*/
int n;
/* normal nextfile statement */
if (run->active_block == (ase_awk_nde_blk_t*)run->awk->tree.begin ||
run->active_block == (ase_awk_nde_blk_t*)run->awk->tree.end)
{
@ -2019,16 +2017,45 @@ static int __run_nextfile (ase_awk_run_t* run, ase_awk_nde_nextfile_t* nde)
if (n == 0)
{
/* no more input file */
/* no more input console */
run->exit_level = EXIT_GLOBAL;
return 0;
}
if (__update_fnr (run, 0) == -1) return -1;
/* TODO: Consider using FILENAME_IN and FILENAME_OUT to accomplish nextfile in/out */
run->exit_level = EXIT_NEXT;
return 0;
}
static int __run_nextoutfile (ase_awk_run_t* run)
{
int n;
n = ase_awk_nextextio_write (run, ASE_AWK_OUT_CONSOLE, ASE_T(""));
if (n == -1)
{
if (run->errnum == ASE_AWK_EIOHANDLER)
run->errnum = ASE_AWK_ECONOUTNEXT;
return -1;
}
if (n == 0)
{
/* TODO: should it terminate the program
* when there is no more output console? */
/*run->exit_level = EXIT_GLOBAL;*/
return 0;
}
/* TODO: update_ofnr */
return 0;
}
static int __run_nextfile (ase_awk_run_t* run, ase_awk_nde_nextfile_t* nde)
{
return (nde->out)? __run_nextoutfile (run): __run_nextinfile (run);
}
static int __run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde)
@ -6088,7 +6115,6 @@ ase_char_t* ase_awk_format (
return ASE_NULL;
}
if (prec == -1 || prec == 0 || prec > ch_len) prec = ch_len;
if (prec > width) width = prec;
@ -6134,7 +6160,7 @@ ase_char_t* ase_awk_format (
}
else if (fmt[i] == ASE_T('s'))
{
ase_char_t* str;
ase_char_t* str, * str_free = ASE_NULL;
ase_size_t str_len, k;
ase_awk_val_t* v;
@ -6192,6 +6218,8 @@ ase_char_t* ase_awk_format (
ase_awk_refdownval (run, v);
return ASE_NULL;
}
str_free = str;
}
if (prec == -1 || prec > str_len ) prec = str_len;
@ -6203,6 +6231,8 @@ ase_char_t* ase_awk_format (
{
if (ase_awk_str_ccat (out, ASE_T(' ')) == -1)
{
if (str_free != ASE_NULL)
ASE_AWK_FREE (awk, str_free);
ase_awk_refdownval (run, v);
run->errnum = ASE_AWK_ENOMEM;
return ASE_NULL;
@ -6215,12 +6245,16 @@ ase_char_t* ase_awk_format (
{
if (ase_awk_str_ccat (out, str[k]) == -1)
{
if (str_free != ASE_NULL)
ASE_AWK_FREE (awk, str_free);
ase_awk_refdownval (run, v);
run->errnum = ASE_AWK_ENOMEM;
return ASE_NULL;
}
}
if (str_free != ASE_NULL) ASE_AWK_FREE (awk, str_free);
if (minus)
{
while (width > prec)

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.h,v 1.80 2006-11-19 14:52:30 bacon Exp $
* $Id: tree.h,v 1.81 2006-11-23 03:31:36 bacon Exp $
*/
#ifndef _ASE_AWK_TREE_H_
@ -347,6 +347,7 @@ struct ase_awk_nde_next_t
struct ase_awk_nde_nextfile_t
{
ASE_AWK_NDE_HDR;
int out;
};
/* ASE_AWK_NDE_DELETE */

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.java,v 1.5 2006-11-22 15:11:36 bacon Exp $
* $Id: Awk.java,v 1.6 2006-11-23 03:31:58 bacon Exp $
*/
package ase.test.awk;
@ -27,8 +27,10 @@ public class Awk extends ase.awk.Awk
cin[2] = "c3.txt";
cin_no = 0;
cout = new String[1];
cout[0] = "";
cout = new String[3];
cout[0] = "c4.txt";
cout[1] = "c5.txt";
cout[2] = "";
cout_no = 0;
}
@ -96,7 +98,7 @@ public class Awk extends ase.awk.Awk
if (isr == null) return -1;
extio.setHandle (isr);
setConsoleName (extio.getRunId(), cin[cin_no]);
setConsoleName (extio, cin[cin_no]);
cin_no++;
return 1;
@ -106,20 +108,13 @@ public class Awk extends ase.awk.Awk
OutputStreamWriter osw;
if (cout_no >= cout.length) return 0;
if (cout[cout_no].length() == 0)
{
osw = new OutputStreamWriter (System.out);
}
else
{
FileOutputStream fos;
try { fos = new FileOutputStream (cout[cout_no]); }
catch (IOException e) { return -1; }
osw = new OutputStreamWriter (fos);
}
osw = get_output_stream (cout[cout_no]);
if (osw == null) return -1;
extio.setHandle (osw);
setOutputConsoleName (extio, cout[cout_no]);
cout_no++;
extio.setHandle (osw);
return 1;
}
@ -174,7 +169,7 @@ public class Awk extends ase.awk.Awk
catch (IOException e) { /* ignore */ }
extio.setHandle (tmp);
setConsoleName (extio.getRunId(), cin[cin_no]);
setConsoleName (extio, cin[cin_no]);
isr = (InputStreamReader)extio.getHandle ();
cin_no++;
@ -195,6 +190,9 @@ public class Awk extends ase.awk.Awk
if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
{
OutputStreamWriter osw = (OutputStreamWriter)extio.getHandle ();
// as the write operation below doesn't indicate
// if it has reached the end, console can't be
// switched here unlike read_console.
try { osw.write (buf, 0, len); osw.flush (); }
catch (IOException e) { return -1; }
@ -222,11 +220,30 @@ public class Awk extends ase.awk.Awk
catch (IOException e) { /* ignore */ }
extio.setHandle (tmp);
setConsoleName (extio.getRunId(), cin[cin_no]);
setConsoleName (extio, cin[cin_no]);
cin_no++;
return 1;
}
else if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
{
OutputStreamWriter osw, tmp;
osw = (OutputStreamWriter)extio.getHandle ();
if (cout_no >= cout.length) return 0;
tmp = get_output_stream (cout[cout_no]);
if (tmp == null) return -1;
try { osw.close (); }
catch (IOException e) { /* ignore */ }
extio.setHandle (tmp);
setOutputConsoleName (extio, cout[cout_no]);
cout_no++;
return 1;
}
return -1;
}
@ -250,6 +267,25 @@ public class Awk extends ase.awk.Awk
return isr;
}
private OutputStreamWriter get_output_stream (String name)
{
OutputStreamWriter osw;
if (name == null || name.length() == 0)
{
osw = new OutputStreamWriter (System.out);
}
else
{
FileOutputStream fos;
try { fos = new FileOutputStream (name); }
catch (IOException e) { return null; }
osw = new OutputStreamWriter (fos);
}
return osw;
}
/* ===== file ===== */
public int open_file (ase.awk.Extio extio)
{

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c,v 1.122 2006-11-22 15:11:37 bacon Exp $
* $Id: awk.c,v 1.123 2006-11-23 03:31:58 bacon Exp $
*/
#include <ase/awk/awk.h>
@ -753,7 +753,7 @@ static int __main (int argc, ase_char_t* argv[])
/*ASE_AWK_DBLSLASHES |*/
ASE_AWK_SHADING | ASE_AWK_SHIFT |
ASE_AWK_EXTIO | ASE_AWK_BLOCKLESS | ASE_AWK_STRINDEXONE |
ASE_AWK_STRIPSPACES /*| ASE_AWK_NEWLINE*/;
ASE_AWK_STRIPSPACES | ASE_AWK_NEXTOUTFILE /*| ASE_AWK_NEWLINE*/;
if (argc <= 1)
{