*** empty log message ***
This commit is contained in:
		@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: Awk.java,v 1.3 2006-10-24 06:05:01 bacon Exp $
 | 
			
		||||
 * $Id: Awk.java,v 1.4 2006-11-21 15:06:14 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package ase.awk;
 | 
			
		||||
@ -29,23 +29,68 @@ public abstract class Awk
 | 
			
		||||
	public native void run () throws Exception;
 | 
			
		||||
	private native void open () throws Exception;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	protected native void set_extio (long extio, Object obj);
 | 
			
		||||
	protected native Object get_extio (long extio);
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	/* abstrace methods */
 | 
			
		||||
	protected abstract int open_source (int mode);
 | 
			
		||||
	protected abstract int close_source (int mode);
 | 
			
		||||
	protected abstract int read_source (char[] buf, int len);
 | 
			
		||||
	protected abstract int write_source (char[] buf, int len);
 | 
			
		||||
 | 
			
		||||
	protected abstract int open_console ();
 | 
			
		||||
	protected abstract int close_console ();
 | 
			
		||||
	protected abstract int read_console (char[] buf, int len);
 | 
			
		||||
	protected abstract int write_console (char[] buf, int len); 
 | 
			
		||||
	protected abstract int next_console (char[] buf, int len);
 | 
			
		||||
	protected int open_extio (Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		int type = extio.getType ();
 | 
			
		||||
		if (type == Extio.TYPE_CONSOLE) return open_console (extio);
 | 
			
		||||
		if (type == Extio.TYPE_FILE) return open_file (extio);
 | 
			
		||||
		/*if (type == Extio.TYPE_PIPE) return open_pipe (extio);
 | 
			
		||||
		if (type == Extio.TYPE_COPROC) return open_coproc (extio);*/
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int close_extio (Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		int type = extio.getType ();
 | 
			
		||||
		if (type == Extio.TYPE_CONSOLE) return close_console (extio);
 | 
			
		||||
		if (type == Extio.TYPE_FILE) return close_file (extio);
 | 
			
		||||
		/*if (type == Extio.TYPE_PIPE) return close_pipe (extio);
 | 
			
		||||
		if (type == Extio.TYPE_COPROC) return close_coproc (extio);*/
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int read_extio (Extio extio, char[] buf, int len)
 | 
			
		||||
	{
 | 
			
		||||
		int type = extio.getType ();
 | 
			
		||||
		if (type == Extio.TYPE_CONSOLE) 
 | 
			
		||||
			return read_console (extio, buf, len);
 | 
			
		||||
		if (type == Extio.TYPE_FILE) 
 | 
			
		||||
			return read_file (extio, buf, len);
 | 
			
		||||
		/*if (type == Extio.TYPE_PIPE)
 | 
			
		||||
		 * 	return read_pipe (extio, buf, len);
 | 
			
		||||
		if (type == Extio.TYPE_COPROC)
 | 
			
		||||
			return read_coproc (extio, buf, len);*/
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int write_extio (Extio extio, char[] buf, int len)
 | 
			
		||||
	{
 | 
			
		||||
		int type = extio.getType ();
 | 
			
		||||
		if (type == Extio.TYPE_CONSOLE) 
 | 
			
		||||
			return write_console (extio, buf, len);
 | 
			
		||||
		if (type == Extio.TYPE_FILE) 
 | 
			
		||||
			return write_file (extio, buf, len);
 | 
			
		||||
		/*if (type == Extio.TYPE_PIPE) 
 | 
			
		||||
		 *	return write_pipe (extio, buf, len);
 | 
			
		||||
		if (type == Extio.TYPE_COPROC)
 | 
			
		||||
			return write_coproc (extio, buf, len);*/
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected abstract int open_console (Extio extio);
 | 
			
		||||
	protected abstract int close_console (Extio extio);
 | 
			
		||||
	protected abstract int read_console (Extio extio, char[] buf, int len);
 | 
			
		||||
	protected abstract int write_console (Extio extio, char[] buf, int len); 
 | 
			
		||||
	protected abstract int next_console (Extio extio, char[] buf, int len);
 | 
			
		||||
 | 
			
		||||
	protected abstract int open_file (Extio extio);
 | 
			
		||||
	protected abstract int close_file (String name);
 | 
			
		||||
	protected abstract int close_file (Extio name);
 | 
			
		||||
	protected abstract int read_file (Extio extio, char[] buf, int len);
 | 
			
		||||
	protected abstract int write_file (Extio extio, char[] buf, int len); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,21 +2,61 @@ package ase.awk;
 | 
			
		||||
 | 
			
		||||
public class Extio
 | 
			
		||||
{
 | 
			
		||||
	private long extio;
 | 
			
		||||
	public static final int TYPE_PIPE = 0;
 | 
			
		||||
	public static final int TYPE_COPROC = 1;
 | 
			
		||||
	public static final int TYPE_FILE = 2;
 | 
			
		||||
	public static final int TYPE_CONSOLE = 3;
 | 
			
		||||
 | 
			
		||||
	protected Extio (long extio)
 | 
			
		||||
	public static final int MODE_PIPE_READ = 0;
 | 
			
		||||
	public static final int MODE_PIPE_WRITE = 1;
 | 
			
		||||
 | 
			
		||||
	public static final int MODE_FILE_READ = 0;
 | 
			
		||||
	public static final int MODE_FILE_WRITE = 1;
 | 
			
		||||
	public static final int MODE_FILE_APPEND = 2;
 | 
			
		||||
 | 
			
		||||
	public static final int MODE_CONSOLE_READ = 0;
 | 
			
		||||
	public static final int MODE_CONSOLE_WRITE = 1;
 | 
			
		||||
 | 
			
		||||
	private String name;
 | 
			
		||||
	private int type;
 | 
			
		||||
	private int mode;
 | 
			
		||||
	private Object handle;
 | 
			
		||||
 | 
			
		||||
	protected Extio (String name, int type, int mode)
 | 
			
		||||
	{
 | 
			
		||||
		this.name = name;
 | 
			
		||||
		this.type = type;
 | 
			
		||||
		this.mode = mode;
 | 
			
		||||
		this.handle = null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public native String name ();
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	void setHandle (Object obj)
 | 
			
		||||
	public String getName ()
 | 
			
		||||
	{
 | 
			
		||||
		return this.name;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Object getHandle ()
 | 
			
		||||
	public int getType ()
 | 
			
		||||
	{
 | 
			
		||||
		return this.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getMode ()
 | 
			
		||||
	{
 | 
			
		||||
		return this.mode;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setHandle (Object handle)
 | 
			
		||||
	{
 | 
			
		||||
		this.handle = handle;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object getHandle ()
 | 
			
		||||
	{
 | 
			
		||||
		return this.handle;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected void finalize ()
 | 
			
		||||
	{
 | 
			
		||||
		System.out.println ("Extio being finalized....");
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * $Id: awk.h,v 1.147 2006-11-19 15:24:20 bacon Exp $
 | 
			
		||||
 * $Id: awk.h,v 1.148 2006-11-21 15:06:14 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASE_AWK_AWK_H_
 | 
			
		||||
@ -30,18 +30,25 @@ struct ase_awk_extio_t
 | 
			
		||||
	int mode;           /* [IN] read, write, etc */
 | 
			
		||||
	ase_char_t* name;   /* [IN] */
 | 
			
		||||
	void* custom_data;  /* [IN] */
 | 
			
		||||
 | 
			
		||||
	void* handle;       /* [OUT] */
 | 
			
		||||
 | 
			
		||||
	/* input buffer */
 | 
			
		||||
	/* input */
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		ase_char_t buf[2048];
 | 
			
		||||
		ase_size_t pos;
 | 
			
		||||
		ase_size_t len;
 | 
			
		||||
		ase_bool_t eof;
 | 
			
		||||
		ase_bool_t eos;
 | 
			
		||||
	} in;
 | 
			
		||||
 | 
			
		||||
	/* output */
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		ase_bool_t eof;
 | 
			
		||||
		ase_bool_t eos;
 | 
			
		||||
	} out;
 | 
			
		||||
 | 
			
		||||
	ase_awk_extio_t* next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -126,15 +133,21 @@ enum
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	ASE_AWK_IO_PIPE_READ      = 0,
 | 
			
		||||
	ASE_AWK_IO_PIPE_WRITE     = 1,
 | 
			
		||||
	ASE_AWK_EXTIO_PIPE_READ      = 0,
 | 
			
		||||
	ASE_AWK_EXTIO_PIPE_WRITE     = 1,
 | 
			
		||||
 | 
			
		||||
	ASE_AWK_IO_FILE_READ      = 0,
 | 
			
		||||
	ASE_AWK_IO_FILE_WRITE     = 1,
 | 
			
		||||
	ASE_AWK_IO_FILE_APPEND    = 2,
 | 
			
		||||
	/*
 | 
			
		||||
	ASE_AWK_EXTIO_COPROC_READ    = 0,
 | 
			
		||||
	ASE_AWK_EXTIO_COPROC_WRITE   = 1,
 | 
			
		||||
	ASE_AWK_EXTIO_COPROC_RDWR    = 2,
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	ASE_AWK_IO_CONSOLE_READ   = 0,
 | 
			
		||||
	ASE_AWK_IO_CONSOLE_WRITE  = 1
 | 
			
		||||
	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 */
 | 
			
		||||
@ -311,7 +324,7 @@ enum
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* extio types */
 | 
			
		||||
enum
 | 
			
		||||
enum ase_awk_extio_type_t
 | 
			
		||||
{
 | 
			
		||||
	/* extio types available */
 | 
			
		||||
	ASE_AWK_EXTIO_PIPE,
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: extio.c,v 1.60 2006-11-17 07:26:15 bacon Exp $
 | 
			
		||||
 * $Id: extio.c,v 1.61 2006-11-21 15:06:14 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ase/awk/awk_i.h>
 | 
			
		||||
@ -27,10 +27,10 @@ static int __in_mode_map[] =
 | 
			
		||||
{
 | 
			
		||||
	/* the order should match the order of the 
 | 
			
		||||
	 * ASE_AWK_IN_XXX values in tree.h */
 | 
			
		||||
	ASE_AWK_IO_PIPE_READ,
 | 
			
		||||
	ASE_AWK_EXTIO_PIPE_READ,
 | 
			
		||||
	0,
 | 
			
		||||
	ASE_AWK_IO_FILE_READ,
 | 
			
		||||
	ASE_AWK_IO_CONSOLE_READ
 | 
			
		||||
	ASE_AWK_EXTIO_FILE_READ,
 | 
			
		||||
	ASE_AWK_EXTIO_CONSOLE_READ
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int __in_mask_map[] =
 | 
			
		||||
@ -56,11 +56,11 @@ static int __out_mode_map[] =
 | 
			
		||||
{
 | 
			
		||||
	/* the order should match the order of the 
 | 
			
		||||
	 * ASE_AWK_OUT_XXX values in tree.h */
 | 
			
		||||
	ASE_AWK_IO_PIPE_WRITE,
 | 
			
		||||
	ASE_AWK_EXTIO_PIPE_WRITE,
 | 
			
		||||
	0,
 | 
			
		||||
	ASE_AWK_IO_FILE_WRITE,
 | 
			
		||||
	ASE_AWK_IO_FILE_APPEND,
 | 
			
		||||
	ASE_AWK_IO_CONSOLE_WRITE
 | 
			
		||||
	ASE_AWK_EXTIO_FILE_WRITE,
 | 
			
		||||
	ASE_AWK_EXTIO_FILE_APPEND,
 | 
			
		||||
	ASE_AWK_EXTIO_CONSOLE_WRITE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int __out_mask_map[] =
 | 
			
		||||
@ -140,6 +140,7 @@ int ase_awk_readextio (
 | 
			
		||||
		p->in.pos = 0;
 | 
			
		||||
		p->in.len = 0;
 | 
			
		||||
		p->in.eof = ase_false;
 | 
			
		||||
		p->in.eos = ase_false;
 | 
			
		||||
 | 
			
		||||
		n = handler (ASE_AWK_IO_OPEN, p, ASE_NULL, 0);
 | 
			
		||||
		if (n == -1)
 | 
			
		||||
@ -165,7 +166,17 @@ int ase_awk_readextio (
 | 
			
		||||
		 * 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) 
 | 
			
		||||
		{
 | 
			
		||||
			p->in.eos = ase_true;
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p->in.eos) 
 | 
			
		||||
	{
 | 
			
		||||
		/* no more streams. */
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ready to read a line */
 | 
			
		||||
@ -323,7 +334,8 @@ int ase_awk_readextio (
 | 
			
		||||
		else line_len = line_len + 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (rs_ptr != ASE_NULL && rs->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, rs_ptr);
 | 
			
		||||
	if (rs_ptr != ASE_NULL && 
 | 
			
		||||
	    rs->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, rs_ptr);
 | 
			
		||||
	ase_awk_refdownval (run, rs);
 | 
			
		||||
 | 
			
		||||
	/* increment NR */
 | 
			
		||||
@ -460,6 +472,9 @@ int ase_awk_writeextio_str (
 | 
			
		||||
		p->next = ASE_NULL;
 | 
			
		||||
		p->custom_data = run->extio.custom_data;
 | 
			
		||||
 | 
			
		||||
		p->out.eof = ase_false;
 | 
			
		||||
		p->out.eos = ase_false;
 | 
			
		||||
 | 
			
		||||
		n = handler (ASE_AWK_IO_OPEN, p, ASE_NULL, 0);
 | 
			
		||||
		if (n == -1)
 | 
			
		||||
		{
 | 
			
		||||
@ -484,11 +499,27 @@ int ase_awk_writeextio_str (
 | 
			
		||||
		 * 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) 
 | 
			
		||||
		{
 | 
			
		||||
			p->out.eos = ase_true;
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/* TODO: if write handler returns less than the request, loop */
 | 
			
		||||
	if (len > 0)
 | 
			
		||||
	if (p->out.eos) 
 | 
			
		||||
	{
 | 
			
		||||
		/* no more streams */
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p->out.eof) 
 | 
			
		||||
	{
 | 
			
		||||
		/* it has reached the end of the stream but this function
 | 
			
		||||
		 * has been recalled */
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (len > 0)
 | 
			
		||||
	{
 | 
			
		||||
		n = handler (ASE_AWK_IO_WRITE, p, str, len);
 | 
			
		||||
 | 
			
		||||
@ -503,13 +534,19 @@ int ase_awk_writeextio_str (
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (n == 0) return 0;
 | 
			
		||||
		if (n == 0) 
 | 
			
		||||
		{
 | 
			
		||||
			p->out.eof = ase_true;
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		len -= n;
 | 
			
		||||
		str += n;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int ase_awk_flushextio (
 | 
			
		||||
	ase_awk_run_t* run, int out_type, const ase_char_t* name)
 | 
			
		||||
{
 | 
			
		||||
@ -615,6 +652,12 @@ int ase_awk_nextextio_read (
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p->in.eos) 
 | 
			
		||||
	{
 | 
			
		||||
		/* no more streams. */
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	n = handler (ASE_AWK_IO_NEXT, p, ASE_NULL, 0);
 | 
			
		||||
	if (n == -1)
 | 
			
		||||
	{
 | 
			
		||||
@ -623,6 +666,20 @@ int ase_awk_nextextio_read (
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (n == 0) 
 | 
			
		||||
	{
 | 
			
		||||
		/* the next stream cannot be opened. 
 | 
			
		||||
		 * set the eos flags so that the next call to nextextio_read
 | 
			
		||||
		 * will return 0 without executing the handler */
 | 
			
		||||
		p->in.eos = ase_true;
 | 
			
		||||
	}
 | 
			
		||||
	else 
 | 
			
		||||
	{
 | 
			
		||||
		/* as the next stream has been opened successfully,
 | 
			
		||||
		 * the eof flag should be cleared if set */
 | 
			
		||||
		p->in.eof = ase_false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										299
									
								
								ase/awk/jni.c
									
									
									
									
									
								
							
							
						
						
									
										299
									
								
								ase/awk/jni.c
									
									
									
									
									
								
							@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: jni.c,v 1.17 2006-11-19 15:33:39 bacon Exp $
 | 
			
		||||
 * $Id: jni.c,v 1.18 2006-11-21 15:06:15 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ase/awk/jni.h>
 | 
			
		||||
@ -10,13 +10,18 @@
 | 
			
		||||
#include <wchar.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <tchar.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define EXCEPTION_AWK "ase/awk/AwkException"
 | 
			
		||||
#ifndef ASE_CHAR_IS_WCHAR
 | 
			
		||||
	#error this module supports ASE_CHAR_IS_WCHAR only
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define EXCEPTION_AWK "ase/awk/Exception"
 | 
			
		||||
#define FIELD_AWK     "__awk"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
@ -31,9 +36,7 @@ static ase_ssize_t __read_source (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t count);
 | 
			
		||||
static ase_ssize_t __write_source (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t count);
 | 
			
		||||
static ase_ssize_t __process_extio_console (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t count);
 | 
			
		||||
static ase_ssize_t __process_extio_file (
 | 
			
		||||
static ase_ssize_t __process_extio (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t count);
 | 
			
		||||
 | 
			
		||||
typedef struct srcio_data_t srcio_data_t;
 | 
			
		||||
@ -66,6 +69,11 @@ static void __awk_free (void* ptr, void* custom_data)
 | 
			
		||||
	free (ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ase_real_t __awk_pow (ase_real_t x, ase_real_t y)
 | 
			
		||||
{
 | 
			
		||||
	return pow (x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __awk_sprintf (
 | 
			
		||||
	ase_char_t* buf, ase_size_t len, const ase_char_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
@ -166,6 +174,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj)
 | 
			
		||||
 | 
			
		||||
	syscas.memcpy = memcpy;
 | 
			
		||||
	syscas.memset = memset;
 | 
			
		||||
	syscas.pow = __awk_pow;
 | 
			
		||||
	syscas.sprintf = __awk_sprintf;
 | 
			
		||||
	syscas.aprintf = __awk_aprintf;
 | 
			
		||||
	syscas.dprintf = __awk_dprintf;
 | 
			
		||||
@ -187,7 +196,7 @@ 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_EXTIO | ASE_AWK_BLOCKLESS | ASE_AWK_HASHSIGN;
 | 
			
		||||
	ase_awk_setopt (awk, opt);
 | 
			
		||||
 | 
			
		||||
printf ("__awk(native) done => %u, 0x%X\n", awk, awk);
 | 
			
		||||
@ -266,15 +275,22 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj)
 | 
			
		||||
 | 
			
		||||
	runios.pipe = ASE_NULL;
 | 
			
		||||
	runios.coproc = ASE_NULL;
 | 
			
		||||
	runios.file = __process_extio_file;
 | 
			
		||||
	runios.console = __process_extio_console;
 | 
			
		||||
	runios.file = __process_extio;
 | 
			
		||||
	runios.console = __process_extio;
 | 
			
		||||
	runios.custom_data = &runio_data;
 | 
			
		||||
 | 
			
		||||
	if (ase_awk_run (awk, ASE_NULL, &runios, ASE_NULL, ASE_NULL) == -1)
 | 
			
		||||
	{
 | 
			
		||||
		char msg[256];
 | 
			
		||||
		int n;
 | 
			
		||||
 | 
			
		||||
		except = (*env)->FindClass (env, EXCEPTION_AWK);
 | 
			
		||||
		if (except == 0) return;
 | 
			
		||||
		(*env)->ThrowNew (env, except, "Run Error ...");
 | 
			
		||||
 | 
			
		||||
		snprintf (msg, sizeof(msg), "%S", 
 | 
			
		||||
			ase_awk_geterrstr(ase_awk_geterrnum(awk)));
 | 
			
		||||
		if (n < 0 || n >= sizeof(msg)) msg[sizeof(msg)-1] = '\0';
 | 
			
		||||
		(*env)->ThrowNew (env, except, msg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -303,7 +319,11 @@ static ase_ssize_t __call_java_open_source (JNIEnv* env, jobject obj, int mode)
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, "open_source", "(I)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, mode);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
@ -313,6 +333,7 @@ static ase_ssize_t __call_java_open_source (JNIEnv* env, jobject obj, int mode)
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -326,7 +347,11 @@ static ase_ssize_t __call_java_close_source (JNIEnv* env, jobject obj, int mode)
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, "close_source", "(I)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, mode);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
@ -336,6 +361,7 @@ static ase_ssize_t __call_java_close_source (JNIEnv* env, jobject obj, int mode)
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -352,10 +378,18 @@ static ase_ssize_t __call_java_read_source (
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, "read_source", "([CI)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	array = (*env)->NewCharArray (env, size);
 | 
			
		||||
	if (array == NULL) return -1;
 | 
			
		||||
	if (array == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, array, size);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
@ -370,6 +404,7 @@ static ase_ssize_t __call_java_read_source (
 | 
			
		||||
	(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, array);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -386,10 +421,18 @@ static ase_ssize_t __call_java_write_source (
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, "write_source", "([CI)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	array = (*env)->NewCharArray (env, size);
 | 
			
		||||
	if (array == NULL) return -1;
 | 
			
		||||
	if (array == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tmp = (*env)->GetCharArrayElements (env, array, 0);
 | 
			
		||||
	for (i = 0; i < size; i++) tmp[i] = (jchar)buf[i]; 
 | 
			
		||||
@ -404,6 +447,7 @@ static ase_ssize_t __call_java_write_source (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, array);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -413,63 +457,84 @@ static ase_ssize_t __call_java_open_extio (
 | 
			
		||||
	jclass class; 
 | 
			
		||||
	jmethodID mid;
 | 
			
		||||
	jthrowable thrown;
 | 
			
		||||
	jclass extio_class;
 | 
			
		||||
	jmethodID extio_cons;
 | 
			
		||||
	jobject extio_object;
 | 
			
		||||
	jstring extio_name;
 | 
			
		||||
	jint ret;
 | 
			
		||||
	
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	if (extio == ASE_NULL)
 | 
			
		||||
	{
 | 
			
		||||
		mid = (*env)->GetMethodID (env, class, meth, "()I");
 | 
			
		||||
		if (mid == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		ret = (*env)->CallIntMethod (env, obj, mid);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/*
 | 
			
		||||
		jstring name_str;
 | 
			
		||||
 | 
			
		||||
		mid = (*env)->GetMethodID (
 | 
			
		||||
			env, class, meth, "(Ljava/lang/String;)I");
 | 
			
		||||
		if (mid == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		name_str = (*env)->NewString (
 | 
			
		||||
			env, extio->name, ase_awk_strlen(extio->name));
 | 
			
		||||
		if (name_str == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		ret = (*env)->CallIntMethod (env, obj, mid, name_str);
 | 
			
		||||
 | 
			
		||||
		(*env)->DeleteLocalRef (env, name_str);
 | 
			
		||||
		*/
 | 
			
		||||
		jclass extio_class;
 | 
			
		||||
		jmethodID extio_cons;
 | 
			
		||||
		jobject extio_object;
 | 
			
		||||
 | 
			
		||||
	extio_class = (*env)->FindClass (env, "ase/awk/Extio");
 | 
			
		||||
		if (extio_class == NULL) return -1;
 | 
			
		||||
 | 
			
		||||
		extio_cons = (*env)->GetMethodID (
 | 
			
		||||
			env, extio_class, "<init>", "(J)V");
 | 
			
		||||
		if (extio_cons == NULL) return -1;
 | 
			
		||||
 | 
			
		||||
		mid = (*env)->GetMethodID (
 | 
			
		||||
			env, class, meth, "(Lase/awk/Extio;)I");
 | 
			
		||||
		if (mid == NULL) return -1;
 | 
			
		||||
 | 
			
		||||
		extio_object = (*env)->NewObject (
 | 
			
		||||
			env, extio_class, extio_cons, (jlong)extio);
 | 
			
		||||
		if (extio_object == NULL) return -1;
 | 
			
		||||
 | 
			
		||||
		ret = (*env)->CallIntMethod (env, obj, mid, extio_object);
 | 
			
		||||
	if (extio_class == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* get the constructor */
 | 
			
		||||
	extio_cons = (*env)->GetMethodID (
 | 
			
		||||
		env, extio_class, "<init>", "(Ljava/lang/String;II)V");
 | 
			
		||||
	if (extio_cons == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, extio_class);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* get the method - meth */
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, extio_class);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* construct the name */
 | 
			
		||||
	extio_name = (*env)->NewString (
 | 
			
		||||
		env, extio->name, ase_awk_strlen(extio->name));
 | 
			
		||||
	if (extio_name == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, extio_class);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* construct the extio object */
 | 
			
		||||
	extio_object = (*env)->NewObject (
 | 
			
		||||
		env, extio_class, extio_cons, 
 | 
			
		||||
		extio_name, extio->type & 0xFF, extio->mode);
 | 
			
		||||
	if (extio_object == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, extio_name);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, extio_class);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* execute the method */
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, extio_object);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
	if (thrown)
 | 
			
		||||
	{
 | 
			
		||||
(*env)->ExceptionDescribe (env);
 | 
			
		||||
		(*env)->ExceptionClear (env);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret != -1) 
 | 
			
		||||
	{
 | 
			
		||||
		/* ret == -1 failed to open the stream
 | 
			
		||||
		 * ret ==  0 opened the stream and reached its end 
 | 
			
		||||
		 * ret ==  1 opened the stream. */
 | 
			
		||||
		extio->handle = (*env)->NewGlobalRef (env, extio_object);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, extio_object);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, extio_name);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, extio_class);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -483,41 +548,38 @@ static ase_ssize_t __call_java_close_extio (
 | 
			
		||||
	
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	if (extio == ASE_NULL)
 | 
			
		||||
	{
 | 
			
		||||
		mid = (*env)->GetMethodID (env, class, meth, "()I");
 | 
			
		||||
		if (mid == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		ret = (*env)->CallIntMethod (env, obj, mid);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		jstring name_str;
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (
 | 
			
		||||
			env, class, meth, "(Ljava/lang/String;)I");
 | 
			
		||||
		if (mid == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		name_str = (*env)->NewString (
 | 
			
		||||
			env, extio->name, ase_awk_strlen(extio->name));
 | 
			
		||||
		if (name_str == 0) return -1;
 | 
			
		||||
 | 
			
		||||
		ret = (*env)->CallIntMethod (env, obj, mid, name_str);
 | 
			
		||||
		(*env)->DeleteLocalRef (env, name_str);
 | 
			
		||||
		env, class, meth, "(Lase/awk/Extio;)I");
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, extio->handle);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
	if (thrown)
 | 
			
		||||
	{
 | 
			
		||||
(*env)->ExceptionDescribe (env);
 | 
			
		||||
		(*env)->ExceptionClear (env);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret != -1) 
 | 
			
		||||
	{
 | 
			
		||||
		/* ret == -1  failed to close the stream
 | 
			
		||||
		 * ret ==  0  closed the stream */
 | 
			
		||||
		(*env)->DeleteGlobalRef (env, extio->handle);
 | 
			
		||||
		extio->handle = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ase_ssize_t __call_java_read_extio (
 | 
			
		||||
	JNIEnv* env, jobject obj, char* meth, ase_char_t* buf, ase_size_t size)
 | 
			
		||||
	JNIEnv* env, jobject obj, char* meth, 
 | 
			
		||||
	ase_awk_extio_t* extio, ase_char_t* buf, ase_size_t size)
 | 
			
		||||
{
 | 
			
		||||
	jclass class; 
 | 
			
		||||
	jmethodID mid;
 | 
			
		||||
@ -528,13 +590,21 @@ static ase_ssize_t __call_java_read_extio (
 | 
			
		||||
	
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, meth, "([CI)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	array = (*env)->NewCharArray (env, size);
 | 
			
		||||
	if (array == NULL) return -1;
 | 
			
		||||
	if (array == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, array, size);
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, extio->handle, array, size);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
	if (thrown)
 | 
			
		||||
	{
 | 
			
		||||
@ -542,16 +612,21 @@ static ase_ssize_t __call_java_read_extio (
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret > 0)
 | 
			
		||||
	{
 | 
			
		||||
		tmp = (*env)->GetCharArrayElements (env, array, 0);
 | 
			
		||||
		for (i = 0; i < ret; i++) buf[i] = (ase_char_t)tmp[i]; 
 | 
			
		||||
		(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, array);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ase_ssize_t __call_java_write_extio (
 | 
			
		||||
	JNIEnv* env, jobject obj, char* meth, ase_char_t* data, ase_size_t size)
 | 
			
		||||
	JNIEnv* env, jobject obj, char* meth,
 | 
			
		||||
	ase_awk_extio_t* extio, ase_char_t* data, ase_size_t size)
 | 
			
		||||
{
 | 
			
		||||
	jclass class; 
 | 
			
		||||
	jmethodID mid;
 | 
			
		||||
@ -563,17 +638,25 @@ static ase_ssize_t __call_java_write_extio (
 | 
			
		||||
	
 | 
			
		||||
	class = (*env)->GetObjectClass(env, obj);
 | 
			
		||||
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, meth, "([CI)I");
 | 
			
		||||
	if (mid == 0) return -1;
 | 
			
		||||
	mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
 | 
			
		||||
	if (mid == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	array = (*env)->NewCharArray (env, size);
 | 
			
		||||
	if (array == NULL) return -1;
 | 
			
		||||
	if (array == NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
		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);
 | 
			
		||||
	ret = (*env)->CallIntMethod (env, obj, mid, extio->handle, array, size);
 | 
			
		||||
	thrown = (*env)->ExceptionOccurred (env);
 | 
			
		||||
	if (thrown)
 | 
			
		||||
	{
 | 
			
		||||
@ -582,6 +665,7 @@ static ase_ssize_t __call_java_write_extio (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*env)->DeleteLocalRef (env, array);
 | 
			
		||||
	(*env)->DeleteLocalRef (env, class);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -633,7 +717,7 @@ static ase_ssize_t __write_source (
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ase_ssize_t __process_extio_console (
 | 
			
		||||
static ase_ssize_t __process_extio (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t size)
 | 
			
		||||
{
 | 
			
		||||
	ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
 | 
			
		||||
@ -643,26 +727,25 @@ static ase_ssize_t __process_extio_console (
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_open_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"open_console", ASE_NULL);
 | 
			
		||||
			"open_extio", epa);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cmd == ASE_AWK_IO_CLOSE)
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_close_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"close_console", ASE_NULL);
 | 
			
		||||
			"close_extio", epa);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	else if (cmd == ASE_AWK_IO_READ)
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_read_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, "read_console",
 | 
			
		||||
			data, size);
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"read_extio", epa, data, size);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cmd == ASE_AWK_IO_WRITE)
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_write_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, "write_console",
 | 
			
		||||
			data, size);
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"write_extio", epa, data, size);
 | 
			
		||||
	}
 | 
			
		||||
#if 0
 | 
			
		||||
	else if (cmd == ASE_AWK_IO_FLUSH)
 | 
			
		||||
@ -681,25 +764,3 @@ static ase_ssize_t __process_extio_console (
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ase_ssize_t __process_extio_file (
 | 
			
		||||
	int cmd, void* arg, ase_char_t* data, ase_size_t size)
 | 
			
		||||
{
 | 
			
		||||
	ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
 | 
			
		||||
	runio_data_t* runio_data = (runio_data_t*)epa->custom_data;
 | 
			
		||||
 | 
			
		||||
	if (cmd == ASE_AWK_IO_OPEN)
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_open_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"open_file", epa);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cmd == ASE_AWK_IO_CLOSE)
 | 
			
		||||
	{
 | 
			
		||||
		return __call_java_close_extio (
 | 
			
		||||
			runio_data->env, runio_data->obj, 
 | 
			
		||||
			"close_file", epa);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: run.c,v 1.279 2006-11-20 14:29:33 bacon Exp $
 | 
			
		||||
 * $Id: run.c,v 1.280 2006-11-21 15:06:15 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ase/awk/awk_i.h>
 | 
			
		||||
@ -562,6 +562,7 @@ int ase_awk_run (ase_awk_t* awk,
 | 
			
		||||
		n = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	__deinit_run (run);
 | 
			
		||||
	__del_run (awk, run);
 | 
			
		||||
	ASE_AWK_FREE (awk, run);
 | 
			
		||||
@ -758,7 +759,6 @@ static int __init_run (ase_awk_run_t* run, ase_awk_runios_t* runios, int* errnum
 | 
			
		||||
 | 
			
		||||
static void __deinit_run (ase_awk_run_t* run)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	if (run->pattern_range_state != ASE_NULL)
 | 
			
		||||
		ASE_AWK_FREE (run->awk, run->pattern_range_state);
 | 
			
		||||
 | 
			
		||||
@ -1281,8 +1281,8 @@ static int __run_pattern_blocks (ase_awk_run_t* run)
 | 
			
		||||
			int saved = run->errnum;
 | 
			
		||||
 | 
			
		||||
			/* don't care about the result of input close */
 | 
			
		||||
			ase_awk_closeextio_read (
 | 
			
		||||
				run, ASE_AWK_IN_CONSOLE, ASE_T(""));
 | 
			
		||||
//			ase_awk_closeextio_read (
 | 
			
		||||
//				run, ASE_AWK_IN_CONSOLE, ASE_T(""));
 | 
			
		||||
 | 
			
		||||
			run->errnum = saved;
 | 
			
		||||
			return -1;
 | 
			
		||||
@ -1300,8 +1300,8 @@ static int __run_pattern_blocks (ase_awk_run_t* run)
 | 
			
		||||
			{
 | 
			
		||||
				int saved = run->errnum;
 | 
			
		||||
 | 
			
		||||
				ase_awk_closeextio_read (
 | 
			
		||||
					run, ASE_AWK_IN_CONSOLE, ASE_T(""));
 | 
			
		||||
//				ase_awk_closeextio_read (
 | 
			
		||||
//					run, ASE_AWK_IN_CONSOLE, ASE_T(""));
 | 
			
		||||
 | 
			
		||||
				run->errnum = saved;
 | 
			
		||||
				return -1;
 | 
			
		||||
@ -1318,6 +1318,7 @@ static int __run_pattern_blocks (ase_awk_run_t* run)
 | 
			
		||||
	 * -1 regardless of the value of errnum.  */
 | 
			
		||||
	if (need_to_close)
 | 
			
		||||
	{
 | 
			
		||||
/* TODO: do i have to close exito here...
 | 
			
		||||
		n = ase_awk_closeextio_read (
 | 
			
		||||
			run, ASE_AWK_IN_CONSOLE, ASE_T(""));
 | 
			
		||||
		if (n == -1) 
 | 
			
		||||
@ -1326,6 +1327,7 @@ static int __run_pattern_blocks (ase_awk_run_t* run)
 | 
			
		||||
				PANIC_I (run, ASE_AWK_ECONINCLOSE);
 | 
			
		||||
			else return -1;
 | 
			
		||||
		}
 | 
			
		||||
*/
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: tree.c,v 1.89 2006-11-19 11:21:06 bacon Exp $
 | 
			
		||||
 * $Id: tree.c,v 1.90 2006-11-21 15:06:15 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ase/awk/awk_i.h>
 | 
			
		||||
@ -282,7 +282,7 @@ static int __print_expression (ase_awk_t* awk, ase_awk_nde_t* nde)
 | 
			
		||||
			len = ((ase_awk_nde_str_t*)nde)->len;
 | 
			
		||||
			for (i = 0; i < len; i++)
 | 
			
		||||
			{
 | 
			
		||||
				/* TODO: more deescaping  */
 | 
			
		||||
				/* TODO: maybe more de-escaping?? */
 | 
			
		||||
				if (ptr[i] == ASE_T('\n'))
 | 
			
		||||
					PUT_SRCSTR (awk, ASE_T("\\n"));
 | 
			
		||||
				else if (ptr[i] == ASE_T('\r'))
 | 
			
		||||
@ -304,7 +304,6 @@ static int __print_expression (ase_awk_t* awk, ase_awk_nde_t* nde)
 | 
			
		||||
 | 
			
		||||
		case ASE_AWK_NDE_REX:
 | 
			
		||||
		{
 | 
			
		||||
			/* TODO: buf, len */
 | 
			
		||||
			PUT_SRCSTR (awk, ASE_T("/"));
 | 
			
		||||
			PUT_SRCSTRX (awk,
 | 
			
		||||
				((ase_awk_nde_rex_t*)nde)->buf, 
 | 
			
		||||
@ -489,7 +488,6 @@ static int __print_expression (ase_awk_t* awk, ase_awk_nde_t* nde)
 | 
			
		||||
 | 
			
		||||
		case ASE_AWK_NDE_AFN:
 | 
			
		||||
		{
 | 
			
		||||
			/* TODO: use px->what.afn.name_len */
 | 
			
		||||
			ase_awk_nde_call_t* px = (ase_awk_nde_call_t*)nde;
 | 
			
		||||
			PUT_SRCSTRX (awk, 
 | 
			
		||||
				px->what.afn.name, px->what.afn.name_len);
 | 
			
		||||
@ -795,7 +793,6 @@ static int __print_statements (ase_awk_t* awk, ase_awk_nde_t* tree, int depth)
 | 
			
		||||
			{
 | 
			
		||||
				PRINT_TABS (awk, depth);
 | 
			
		||||
				PUT_SRCSTR (awk, ASE_T("delete "));
 | 
			
		||||
		/* TODO: can't use __print_expression??? */
 | 
			
		||||
				ase_awk_prnpt (awk, ((ase_awk_nde_delete_t*)p)->var);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: Awk.java,v 1.1 2006-10-24 06:03:14 bacon Exp $
 | 
			
		||||
 * $Id: Awk.java,v 1.2 2006-11-21 15:06:50 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package ase.test.awk;
 | 
			
		||||
@ -11,6 +11,8 @@ public class Awk extends ase.awk.Awk
 | 
			
		||||
	private FileReader insrc;
 | 
			
		||||
	private FileWriter outsrc;
 | 
			
		||||
 | 
			
		||||
	private InputStreamReader console_in = null;
 | 
			
		||||
 | 
			
		||||
	public Awk () throws ase.awk.Exception
 | 
			
		||||
	{
 | 
			
		||||
		super ();
 | 
			
		||||
@ -20,13 +22,13 @@ public class Awk extends ase.awk.Awk
 | 
			
		||||
	{
 | 
			
		||||
		if (mode == SOURCE_READ)
 | 
			
		||||
		{
 | 
			
		||||
			try { insrc = new FileReader ("test.awk"); }
 | 
			
		||||
			try { insrc = new FileReader ("t.awk"); }
 | 
			
		||||
			catch (IOException e) { return -1; }
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		else if (mode == SOURCE_WRITE)
 | 
			
		||||
		{
 | 
			
		||||
			try { outsrc = new FileWriter ("test.out"); }
 | 
			
		||||
			try { outsrc = new FileWriter ("t.out"); }
 | 
			
		||||
			catch (IOException e) { return -1; }
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
@ -65,39 +67,107 @@ public class Awk extends ase.awk.Awk
 | 
			
		||||
		return len;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int open_console ()
 | 
			
		||||
	protected int open_console (ase.awk.Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		System.err.println ("[open_console called....]");
 | 
			
		||||
		System.err.println ("[open_console called.... name: " + extio.getName() + " mode: " + extio.getMode());
 | 
			
		||||
 | 
			
		||||
		int mode = extio.getMode ();
 | 
			
		||||
 | 
			
		||||
		if (mode == ase.awk.Extio.MODE_CONSOLE_READ)
 | 
			
		||||
		{
 | 
			
		||||
			InputStreamReader isr = 
 | 
			
		||||
				new InputStreamReader (System.in);
 | 
			
		||||
			extio.setHandle (isr);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		else if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
 | 
			
		||||
		{
 | 
			
		||||
			OutputStreamWriter osw =
 | 
			
		||||
				new OutputStreamWriter (System.out);
 | 
			
		||||
			extio.setHandle (osw);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	protected int close_console ()
 | 
			
		||||
	{
 | 
			
		||||
		System.err.println ("[close_console called....]");
 | 
			
		||||
		return 1;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int read_console (char[] buf, int len)
 | 
			
		||||
	protected int close_console (ase.awk.Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		System.err.println ("[close_console called.... name: " + extio.getName() + " mode: " + extio.getMode());
 | 
			
		||||
 | 
			
		||||
		int mode = extio.getMode ();
 | 
			
		||||
 | 
			
		||||
		if (mode == ase.awk.Extio.MODE_CONSOLE_READ)
 | 
			
		||||
		{
 | 
			
		||||
			InputStreamReader isr = (InputStreamReader)extio.getHandle ();
 | 
			
		||||
			try { isr.close (); }
 | 
			
		||||
			catch (IOException e) { return -1; }
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
		else if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
 | 
			
		||||
		{
 | 
			
		||||
			OutputStreamWriter osw = (OutputStreamWriter)extio.getHandle ();
 | 
			
		||||
			//try { osw.close (); }
 | 
			
		||||
			//catch (IOException e) { return -1; }
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	protected int write_console (char[] buf, int len) 
 | 
			
		||||
	{
 | 
			
		||||
		System.out.print (new String (buf, 0, len));
 | 
			
		||||
		return len;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int next_console (char[] buf, int len)
 | 
			
		||||
	protected int read_console (ase.awk.Extio extio, char[] buf, int len)
 | 
			
		||||
	{
 | 
			
		||||
		int mode = extio.getMode ();
 | 
			
		||||
 | 
			
		||||
		if (mode == ase.awk.Extio.MODE_CONSOLE_READ)
 | 
			
		||||
		{
 | 
			
		||||
			InputStreamReader isr = (InputStreamReader)extio.getHandle ();
 | 
			
		||||
			try 
 | 
			
		||||
			{ 
 | 
			
		||||
				len = isr.read (buf, 0, len); 
 | 
			
		||||
				if (len == -1) len = 0;
 | 
			
		||||
			}
 | 
			
		||||
			catch (IOException e) { System.out.println ("EXCEPTIN---"+e.getMessage());return -1; }
 | 
			
		||||
 | 
			
		||||
			return len;
 | 
			
		||||
		}
 | 
			
		||||
		else if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
 | 
			
		||||
		{
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int write_console (ase.awk.Extio extio, char[] buf, int len) 
 | 
			
		||||
	{
 | 
			
		||||
		int mode = extio.getMode ();
 | 
			
		||||
 | 
			
		||||
		if (mode == ase.awk.Extio.MODE_CONSOLE_READ)
 | 
			
		||||
		{
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		else if (mode == ase.awk.Extio.MODE_CONSOLE_WRITE)
 | 
			
		||||
		{
 | 
			
		||||
			OutputStreamWriter osw = (OutputStreamWriter)extio.getHandle ();
 | 
			
		||||
			try { osw.write (buf, 0, len); osw.flush (); }
 | 
			
		||||
			catch (IOException e) { return -1; }
 | 
			
		||||
 | 
			
		||||
			return len;
 | 
			
		||||
		}
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int next_console (ase.awk.Extio extio, char[] buf, int len)
 | 
			
		||||
	{
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int open_file (ase.awk.Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		System.out.print ("opening file [");
 | 
			
		||||
		//System.out.print (extio.name());
 | 
			
		||||
		System.out.println ("]");
 | 
			
		||||
		/*System.out.print ("opening file [");
 | 
			
		||||
		System.out.print (extio.getName());
 | 
			
		||||
		System.out.println ("]");*/
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		FileInputStream f = new FileInputStream (extio.name());
 | 
			
		||||
@ -106,24 +176,23 @@ public class Awk extends ase.awk.Awk
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	public int open_file (String name)
 | 
			
		||||
	public int close_file (ase.awk.Extio extio)
 | 
			
		||||
	{
 | 
			
		||||
		System.out.print ("opening file [");
 | 
			
		||||
		System.out.print (name);
 | 
			
		||||
		System.out.println ("]");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	public int close_file (String name)
 | 
			
		||||
	{
 | 
			
		||||
		System.out.print ("closing file [");
 | 
			
		||||
		System.out.print (name);
 | 
			
		||||
		System.out.println ("]");
 | 
			
		||||
		/*System.out.print ("closing file [");
 | 
			
		||||
		System.out.print (extio.getName());
 | 
			
		||||
		System.out.println ("]");*/
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected int read_file (ase.awk.Extio extio, char[] buf, int len) 
 | 
			
		||||
	{
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	protected int write_file (ase.awk.Extio extio, char[] buf, int len) 
 | 
			
		||||
	{
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static void main (String[] args)
 | 
			
		||||
	{
 | 
			
		||||
		Awk awk = null;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: awk.c,v 1.120 2006-11-19 15:33:40 bacon Exp $
 | 
			
		||||
 * $Id: awk.c,v 1.121 2006-11-21 15:06:51 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ase/awk/awk.h>
 | 
			
		||||
@ -271,9 +271,9 @@ static ase_ssize_t process_extio_pipe (
 | 
			
		||||
			FILE* handle;
 | 
			
		||||
			const ase_char_t* mode;
 | 
			
		||||
 | 
			
		||||
			if (epa->mode == ASE_AWK_IO_PIPE_READ)
 | 
			
		||||
			if (epa->mode == ASE_AWK_EXTIO_PIPE_READ)
 | 
			
		||||
				mode = ASE_T("r");
 | 
			
		||||
			else if (epa->mode == ASE_AWK_IO_PIPE_WRITE)
 | 
			
		||||
			else if (epa->mode == ASE_AWK_EXTIO_PIPE_WRITE)
 | 
			
		||||
				mode = ASE_T("w");
 | 
			
		||||
			else return -1; /* TODO: any way to set the error number? */
 | 
			
		||||
			__awk_dprintf (ASE_T("opending %s of type %d (pipe)\n"),  epa->name, epa->type);
 | 
			
		||||
@ -311,7 +311,7 @@ static ase_ssize_t process_extio_pipe (
 | 
			
		||||
 | 
			
		||||
		case ASE_AWK_IO_FLUSH:
 | 
			
		||||
		{
 | 
			
		||||
			if (epa->mode == ASE_AWK_IO_PIPE_READ) return -1;
 | 
			
		||||
			if (epa->mode == ASE_AWK_EXTIO_PIPE_READ) return -1;
 | 
			
		||||
			else return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -336,11 +336,11 @@ static ase_ssize_t process_extio_file (
 | 
			
		||||
			FILE* handle;
 | 
			
		||||
			const ase_char_t* mode;
 | 
			
		||||
 | 
			
		||||
			if (epa->mode == ASE_AWK_IO_FILE_READ)
 | 
			
		||||
			if (epa->mode == ASE_AWK_EXTIO_FILE_READ)
 | 
			
		||||
				mode = ASE_T("r");
 | 
			
		||||
			else if (epa->mode == ASE_AWK_IO_FILE_WRITE)
 | 
			
		||||
			else if (epa->mode == ASE_AWK_EXTIO_FILE_WRITE)
 | 
			
		||||
				mode = ASE_T("w");
 | 
			
		||||
			else if (epa->mode == ASE_AWK_IO_FILE_APPEND)
 | 
			
		||||
			else if (epa->mode == ASE_AWK_EXTIO_FILE_APPEND)
 | 
			
		||||
				mode = ASE_T("a");
 | 
			
		||||
			else return -1; /* TODO: any way to set the error number? */
 | 
			
		||||
 | 
			
		||||
@ -506,7 +506,7 @@ static int open_extio_console (ase_awk_extio_t* epa)
 | 
			
		||||
 | 
			
		||||
	__awk_dprintf (ASE_T("opening console[%s] of type %x\n"), epa->name, epa->type);
 | 
			
		||||
 | 
			
		||||
	if (epa->mode == ASE_AWK_IO_CONSOLE_READ)
 | 
			
		||||
	if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ)
 | 
			
		||||
	{
 | 
			
		||||
		if (infiles[infile_no] == ASE_NULL)
 | 
			
		||||
		{
 | 
			
		||||
@ -546,7 +546,7 @@ static int open_extio_console (ase_awk_extio_t* epa)
 | 
			
		||||
		infile_no++;
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	else if (epa->mode == ASE_AWK_IO_CONSOLE_WRITE)
 | 
			
		||||
	else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE)
 | 
			
		||||
	{
 | 
			
		||||
		__awk_dprintf (ASE_T("    console(w) - <standard output>\n"));
 | 
			
		||||
		/* TODO: does output console has a name??? */
 | 
			
		||||
 | 
			
		||||
@ -19,8 +19,14 @@ all: awk
 | 
			
		||||
awk: awk.obj
 | 
			
		||||
	$(LD) $(LDFLAGS) $(STARTUP) awk.obj,$@.exe,,$(LIBS),,
 | 
			
		||||
 | 
			
		||||
java: 
 | 
			
		||||
	javac -classpath ../../.. Awk.java
 | 
			
		||||
 | 
			
		||||
jrun:
 | 
			
		||||
	java -Xms1m -Xmx2m -classpath ../../.. ase.test.awk.Awk
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	del $(OBJS) *.obj $(OUT)
 | 
			
		||||
	del $(OBJS) *.obj *.class awk.exe 
 | 
			
		||||
 | 
			
		||||
.SUFFIXES: .c .obj
 | 
			
		||||
.c.obj:
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user