*** empty log message ***
This commit is contained in:
		@ -1,17 +1,17 @@
 | 
				
			|||||||
LIBRARY	"xpawk.dll"
 | 
					LIBRARY	"xpawk.dll"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPORTS
 | 
					EXPORTS
 | 
				
			||||||
	xp_awk_open PRIVATE
 | 
						xp_awk_open 
 | 
				
			||||||
	xp_awk_close PRIVATE
 | 
						xp_awk_close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_awk_geterrnum PRIVATE
 | 
						xp_awk_geterrnum 
 | 
				
			||||||
	xp_awk_geterrstr PRIVATE
 | 
						xp_awk_geterrstr 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_awk_clear PRIVATE
 | 
						xp_awk_clear 
 | 
				
			||||||
	xp_awk_setparseopt PRIVATE
 | 
						xp_awk_setparseopt 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_awk_attsrc PRIVATE
 | 
						xp_awk_attsrc 
 | 
				
			||||||
	xp_awk_detsrc PRIVATE
 | 
						xp_awk_detsrc 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_awk_parse PRIVATE
 | 
						xp_awk_parse 
 | 
				
			||||||
	xp_awk_run PRIVATE
 | 
						xp_awk_run 
 | 
				
			||||||
 | 
				
			|||||||
@ -149,10 +149,6 @@ SOURCE=.\awk_i.h
 | 
				
			|||||||
# End Source File
 | 
					# End Source File
 | 
				
			||||||
# Begin Source File
 | 
					# Begin Source File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOURCE=.\err.h
 | 
					 | 
				
			||||||
# End Source File
 | 
					 | 
				
			||||||
# Begin Source File
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCE=.\map.h
 | 
					SOURCE=.\map.h
 | 
				
			||||||
# End Source File
 | 
					# End Source File
 | 
				
			||||||
# Begin Source File
 | 
					# Begin Source File
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/* 
 | 
					/* 
 | 
				
			||||||
 * $Id: awk.h,v 1.39 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: awk.h,v 1.40 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_AWK_H_
 | 
					#ifndef _XP_AWK_AWK_H_
 | 
				
			||||||
@ -31,6 +31,41 @@ enum
 | 
				
			|||||||
	XP_AWK_SHIFT    = (1 << 4)  /* support shift operators */
 | 
						XP_AWK_SHIFT    = (1 << 4)  /* support shift operators */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* error code */
 | 
				
			||||||
 | 
					enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						XP_AWK_ENOERR,      /* no error */
 | 
				
			||||||
 | 
						XP_AWK_ENOMEM,      /* out of memory */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XP_AWK_ESRCOP,
 | 
				
			||||||
 | 
						XP_AWK_ESRCCL,
 | 
				
			||||||
 | 
						XP_AWK_ESRCDT,      /* error in reading source */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XP_AWK_ELXCHR,      /* lexer came accross an wrong character */
 | 
				
			||||||
 | 
						XP_AWK_ELXUNG,      /* lexer failed to unget a character */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XP_AWK_EENDSRC,     /* unexpected end of source */
 | 
				
			||||||
 | 
						XP_AWK_ELBRACE,     /* left brace expected */
 | 
				
			||||||
 | 
						XP_AWK_ELPAREN,     /* left parenthesis expected */
 | 
				
			||||||
 | 
						XP_AWK_ERPAREN,     /* right parenthesis expected */
 | 
				
			||||||
 | 
						XP_AWK_ERBRACK,     /* right bracket expected */
 | 
				
			||||||
 | 
						XP_AWK_ECOMMA,      /* comma expected */
 | 
				
			||||||
 | 
						XP_AWK_ESEMICOLON,  /* semicolon expected */
 | 
				
			||||||
 | 
						XP_AWK_EEXPRESSION, /* expression expected */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XP_AWK_EWHILE,      /* keyword 'while' is expected */
 | 
				
			||||||
 | 
						XP_AWK_EASSIGNMENT, /* assignment statement expected */
 | 
				
			||||||
 | 
						XP_AWK_EIDENT,      /* identifier expected */
 | 
				
			||||||
 | 
						XP_AWK_EDUPBEGIN,   /* duplicate BEGIN */
 | 
				
			||||||
 | 
						XP_AWK_EDUPEND,     /* duplicate END */
 | 
				
			||||||
 | 
						XP_AWK_EDUPFUNC,    /* duplicate function name */
 | 
				
			||||||
 | 
						XP_AWK_EDUPPARAM,   /* duplicate parameter name */
 | 
				
			||||||
 | 
						XP_AWK_EDUPVAR,     /* duplicate variable name */
 | 
				
			||||||
 | 
						XP_AWK_EDUPNAME,    /* duplicate name - function, variable, etc */
 | 
				
			||||||
 | 
						XP_AWK_EUNDEF,      /* undefined identifier */
 | 
				
			||||||
 | 
						XP_AWK_ELVALUE      /* l-value required */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,11 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: awk_i.h,v 1.1 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: awk_i.h,v 1.2 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_AWKI_H_
 | 
					#ifndef _XP_AWK_AWKI_H_
 | 
				
			||||||
#define _XP_AWK_AWKI_H_
 | 
					#define _XP_AWK_AWKI_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk.h>
 | 
					#include <xp/awk/awk.h>
 | 
				
			||||||
#include <xp/awk/err.h>
 | 
					 | 
				
			||||||
#include <xp/awk/tree.h>
 | 
					#include <xp/awk/tree.h>
 | 
				
			||||||
#include <xp/awk/tab.h>
 | 
					#include <xp/awk/tab.h>
 | 
				
			||||||
#include <xp/awk/map.h>
 | 
					#include <xp/awk/map.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: err.c,v 1.2 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: err.c,v 1.3 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -37,7 +37,8 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
 | 
				
			|||||||
		XP_TEXT("duplicate parameter name"),
 | 
							XP_TEXT("duplicate parameter name"),
 | 
				
			||||||
		XP_TEXT("duplicate variable name"),
 | 
							XP_TEXT("duplicate variable name"),
 | 
				
			||||||
		XP_TEXT("duplicate name"),
 | 
							XP_TEXT("duplicate name"),
 | 
				
			||||||
		XP_TEXT("undefined identifier")	
 | 
							XP_TEXT("undefined identifier"),
 | 
				
			||||||
 | 
							XP_TEXT("l-value required")
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (awk->errnum >= 0 && awk->errnum < xp_countof(__errstr)) {
 | 
						if (awk->errnum >= 0 && awk->errnum < xp_countof(__errstr)) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,45 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * $Id: err.h,v 1.2 2006-03-04 15:54:37 bacon Exp $
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _XP_AWK_ERR_H_
 | 
					 | 
				
			||||||
#define _XP_AWK_ERR_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _XP_AWK_AWK_H_
 | 
					 | 
				
			||||||
#error Never include this file directly. Include <xp/awk/awk.h> instead
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	XP_AWK_ENOERR,      /* no error */
 | 
					 | 
				
			||||||
	XP_AWK_ENOMEM,      /* out of memory */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	XP_AWK_ESRCOP,
 | 
					 | 
				
			||||||
	XP_AWK_ESRCCL,
 | 
					 | 
				
			||||||
	XP_AWK_ESRCDT,      /* error in reading source */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	XP_AWK_ELXCHR,      /* lexer came accross an wrong character */
 | 
					 | 
				
			||||||
	XP_AWK_ELXUNG,      /* lexer failed to unget a character */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	XP_AWK_EENDSRC,     /* unexpected end of source */
 | 
					 | 
				
			||||||
	XP_AWK_ELBRACE,     /* left brace expected */
 | 
					 | 
				
			||||||
	XP_AWK_ELPAREN,     /* left parenthesis expected */
 | 
					 | 
				
			||||||
	XP_AWK_ERPAREN,     /* right parenthesis expected */
 | 
					 | 
				
			||||||
	XP_AWK_ERBRACK,     /* right bracket expected */
 | 
					 | 
				
			||||||
	XP_AWK_ECOMMA,      /* comma expected */
 | 
					 | 
				
			||||||
	XP_AWK_ESEMICOLON,  /* semicolon expected */
 | 
					 | 
				
			||||||
	XP_AWK_EEXPRESSION, /* expression expected */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	XP_AWK_EWHILE,      /* keyword 'while' is expected */
 | 
					 | 
				
			||||||
	XP_AWK_EASSIGNMENT, /* assignment statement expected */
 | 
					 | 
				
			||||||
	XP_AWK_EIDENT,      /* identifier expected */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPBEGIN,   /* duplicate BEGIN */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPEND,     /* duplicate END */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPFUNC,    /* duplicate function name */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPPARAM,   /* duplicate parameter name */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPVAR,     /* duplicate variable name */
 | 
					 | 
				
			||||||
	XP_AWK_EDUPNAME,    /* duplicate name - function, variable, etc */
 | 
					 | 
				
			||||||
	XP_AWK_EUNDEF       /* undefined identifier */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
							
								
								
									
										179
									
								
								ase/awk/parse.c
									
									
									
									
									
								
							
							
						
						
									
										179
									
								
								ase/awk/parse.c
									
									
									
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: parse.c,v 1.67 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: parse.c,v 1.68 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -126,6 +126,7 @@ static xp_awk_nde_t* __parse_shift (xp_awk_t* awk);
 | 
				
			|||||||
static xp_awk_nde_t* __parse_additive (xp_awk_t* awk);
 | 
					static xp_awk_nde_t* __parse_additive (xp_awk_t* awk);
 | 
				
			||||||
static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk);
 | 
					static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk);
 | 
				
			||||||
static xp_awk_nde_t* __parse_unary (xp_awk_t* awk);
 | 
					static xp_awk_nde_t* __parse_unary (xp_awk_t* awk);
 | 
				
			||||||
 | 
					static xp_awk_nde_t* __parse_increment (xp_awk_t* awk);
 | 
				
			||||||
static xp_awk_nde_t* __parse_primary (xp_awk_t* awk);
 | 
					static xp_awk_nde_t* __parse_primary (xp_awk_t* awk);
 | 
				
			||||||
static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name);
 | 
					static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name);
 | 
				
			||||||
static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name);
 | 
					static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name);
 | 
				
			||||||
@ -1262,98 +1263,100 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk)
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return __parse_binary_expr (awk, map, __parse_unary);
 | 
						return __parse_binary_expr (awk, map, __parse_unary);
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
	xp_awk_nde_exp_t* nde;
 | 
					 | 
				
			||||||
	xp_awk_nde_t* left, * right;
 | 
					 | 
				
			||||||
	int opcode;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	left = __parse_unary (awk);
 | 
					 | 
				
			||||||
	if (left == XP_NULL) return XP_NULL;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	while (1) 
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (MATCH(awk,TOKEN_MUL)) opcode = XP_AWK_BINOP_MUL;
 | 
					 | 
				
			||||||
		else if (MATCH(awk,TOKEN_DIV)) opcode = XP_AWK_BINOP_DIV;
 | 
					 | 
				
			||||||
		else if (MATCH(awk,TOKEN_MOD)) opcode = XP_AWK_BINOP_MOD;
 | 
					 | 
				
			||||||
		else break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (__get_token(awk) == -1) 
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			xp_awk_clrpt (left);
 | 
					 | 
				
			||||||
			return XP_NULL; 
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		right = __parse_unary (awk);
 | 
					 | 
				
			||||||
		if (right == XP_NULL) 
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			xp_awk_clrpt (left);	
 | 
					 | 
				
			||||||
			return XP_NULL;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		/* TODO: enhance constant folding. do it in a better way */
 | 
					 | 
				
			||||||
		/* TODO: differentiate different types of numbers ... */
 | 
					 | 
				
			||||||
		if (left->type == XP_AWK_NDE_INT && 
 | 
					 | 
				
			||||||
		    right->type == XP_AWK_NDE_INT) 
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			xp_long_t l, r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			l = ((xp_awk_nde_int_t*)left)->val; 
 | 
					 | 
				
			||||||
			r = ((xp_awk_nde_int_t*)right)->val; 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			xp_awk_clrpt (right);
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if (opcode == XP_AWK_BINOP_MUL) l *= r;
 | 
					 | 
				
			||||||
			else if (opcode == XP_AWK_BINOP_DIV) l /= r;
 | 
					 | 
				
			||||||
			else if (opcode == XP_AWK_BINOP_MOD) l %= r;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			((xp_awk_nde_int_t*)left)->val = l;
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		} 
 | 
					 | 
				
			||||||
		/* TODO:
 | 
					 | 
				
			||||||
		else if (left->type == XP_AWK_NDE_REAL && 
 | 
					 | 
				
			||||||
		         right->type == XP_AWK_NDE_REAL) 
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else if (left->type == XP_AWK_NDE_STR &&
 | 
					 | 
				
			||||||
		         right->type == XP_AWK_NDE_STR)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			// TODO: string concatenation operator.... 
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		nde = (xp_awk_nde_exp_t*)xp_malloc(xp_sizeof(xp_awk_nde_exp_t));
 | 
					 | 
				
			||||||
		if (nde == XP_NULL) 
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			xp_awk_clrpt (right);	
 | 
					 | 
				
			||||||
			xp_awk_clrpt (left);	
 | 
					 | 
				
			||||||
			PANIC (awk, XP_AWK_ENOMEM);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		nde->type = XP_AWK_NDE_EXP_BIN;
 | 
					 | 
				
			||||||
		nde->next = XP_NULL;
 | 
					 | 
				
			||||||
		nde->opcode = opcode;
 | 
					 | 
				
			||||||
		nde->left = left;
 | 
					 | 
				
			||||||
		nde->right = right;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		left = (xp_awk_nde_t*)nde;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return left;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static xp_awk_nde_t* __parse_unary (xp_awk_t* awk)
 | 
					static xp_awk_nde_t* __parse_unary (xp_awk_t* awk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// TOKEN_PLUS_PLUS, TOKEN_MINUS_MINUS
 | 
						xp_awk_nde_exp_t* nde; 
 | 
				
			||||||
	//TODO:
 | 
						xp_awk_nde_t* left;
 | 
				
			||||||
	/*
 | 
						int opcode;
 | 
				
			||||||
	while (MATCH(awk,TOKEN_PLUS) || MATCH(awk,TOKEN_MINUS) ||
 | 
					 | 
				
			||||||
	       MATCH(awk,TOKEN_NOT)  || MATCH(awk,TOKEN_BNOT))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return __parse_primary (awk);
 | 
						opcode = (MATCH(awk,TOKEN_PLUS))?  XP_AWK_UNROP_PLUS:
 | 
				
			||||||
 | 
						         (MATCH(awk,TOKEN_MINUS))? XP_AWK_UNROP_MINUS:
 | 
				
			||||||
 | 
						         (MATCH(awk,TOKEN_NOT))?   XP_AWK_UNROP_NOT:
 | 
				
			||||||
 | 
						         (MATCH(awk,TOKEN_BNOT))?  XP_AWK_UNROP_BNOT: -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (opcode == -1) return __parse_increment (awk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (__get_token(awk) == -1) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left = __parse_unary (awk);
 | 
				
			||||||
 | 
						if (left == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nde = (xp_awk_nde_exp_t*)
 | 
				
			||||||
 | 
							xp_malloc (xp_sizeof(xp_awk_nde_exp_t));
 | 
				
			||||||
 | 
						if (nde == XP_NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xp_awk_clrpt (left);
 | 
				
			||||||
 | 
							PANIC (awk, XP_AWK_ENOMEM);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nde->type = XP_AWK_NDE_EXP_UNR;
 | 
				
			||||||
 | 
						nde->next = XP_NULL;
 | 
				
			||||||
 | 
						nde->opcode = opcode;
 | 
				
			||||||
 | 
						nde->left = left;
 | 
				
			||||||
 | 
						nde->right = XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (xp_awk_nde_t*)nde;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static xp_awk_nde_t* __parse_increment (xp_awk_t* awk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xp_awk_nde_exp_t* nde;
 | 
				
			||||||
 | 
						xp_awk_nde_t* left;
 | 
				
			||||||
 | 
						int type, opcode, opcode1, opcode2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opcode1 = MATCH(awk,TOKEN_PLUSPLUS)? XP_AWK_INCOP_PLUS:
 | 
				
			||||||
 | 
						          MATCH(awk,TOKEN_MINUSMINUS)? XP_AWK_INCOP_MINUS: -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (opcode1 != -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (__get_token(awk) == -1) return XP_NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left = __parse_primary (awk);
 | 
				
			||||||
 | 
						if (left == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opcode2 = MATCH(awk,TOKEN_PLUSPLUS)? XP_AWK_INCOP_PLUS:
 | 
				
			||||||
 | 
						          MATCH(awk,TOKEN_MINUSMINUS)? XP_AWK_INCOP_MINUS: -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (opcode1 != -1 && opcode2 != -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xp_awk_clrpt (left);
 | 
				
			||||||
 | 
							PANIC (awk, XP_AWK_ELVALUE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (opcode1 == -1 && opcode2 == -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return left;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (opcode1 != -1) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							type = XP_AWK_NDE_EXP_INCPRE;
 | 
				
			||||||
 | 
							opcode = opcode1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (opcode2 != -1) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							type = XP_AWK_NDE_EXP_INCPST;
 | 
				
			||||||
 | 
							opcode = opcode2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (__get_token(awk) == -1) return XP_NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nde = (xp_awk_nde_exp_t*)
 | 
				
			||||||
 | 
							xp_malloc (xp_sizeof(xp_awk_nde_exp_t));
 | 
				
			||||||
 | 
						if (nde == XP_NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xp_awk_clrpt (left);
 | 
				
			||||||
 | 
							PANIC (awk, XP_AWK_ENOMEM);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nde->type = type;
 | 
				
			||||||
 | 
						nde->next = XP_NULL;
 | 
				
			||||||
 | 
						nde->opcode = opcode;
 | 
				
			||||||
 | 
						nde->left = left;
 | 
				
			||||||
 | 
						nde->right = XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (xp_awk_nde_t*)nde;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static xp_awk_nde_t* __parse_primary (xp_awk_t* awk)
 | 
					static xp_awk_nde_t* __parse_primary (xp_awk_t* awk)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										224
									
								
								ase/awk/run.c
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								ase/awk/run.c
									
									
									
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: run.c,v 1.28 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: run.c,v 1.29 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -39,6 +39,9 @@ static int __run_exit_statement (xp_awk_t* awk, xp_awk_nde_exit_t* nde);
 | 
				
			|||||||
static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde);
 | 
					static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde);
 | 
				
			||||||
static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde);
 | 
					static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde);
 | 
				
			||||||
static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
 | 
					static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
 | 
				
			||||||
static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde);
 | 
					static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __raw_push (xp_awk_t* awk, void* val);
 | 
					static int __raw_push (xp_awk_t* awk, void* val);
 | 
				
			||||||
@ -434,7 +437,15 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
 | 
				
			|||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_EXP_UNR:
 | 
						case XP_AWK_NDE_EXP_UNR:
 | 
				
			||||||
		// TODO: .......................
 | 
							val = __eval_unary (awk, (xp_awk_nde_exp_t*)nde);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case XP_AWK_NDE_EXP_INCPRE:
 | 
				
			||||||
 | 
							val = __eval_incpre (awk, (xp_awk_nde_exp_t*)nde);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case XP_AWK_NDE_EXP_INCPST:
 | 
				
			||||||
 | 
							val = __eval_incpst (awk, (xp_awk_nde_exp_t*)nde);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_STR:
 | 
						case XP_AWK_NDE_STR:
 | 
				
			||||||
@ -444,11 +455,13 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
 | 
				
			|||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_INT:
 | 
						case XP_AWK_NDE_INT:
 | 
				
			||||||
		val = xp_awk_makeintval(awk,((xp_awk_nde_int_t*)nde)->val);
 | 
							val = xp_awk_makeintval (
 | 
				
			||||||
 | 
								awk, ((xp_awk_nde_int_t*)nde)->val);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_REAL:
 | 
						case XP_AWK_NDE_REAL:
 | 
				
			||||||
		val = xp_awk_makerealval(awk,((xp_awk_nde_real_t*)nde)->val);
 | 
							val = xp_awk_makerealval (
 | 
				
			||||||
 | 
								awk, ((xp_awk_nde_real_t*)nde)->val);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_NAMED:
 | 
						case XP_AWK_NDE_NAMED:
 | 
				
			||||||
@ -682,13 +695,214 @@ static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	xp_awk_refdownval (awk, left);
 | 
						xp_awk_refdownval (awk, left);
 | 
				
			||||||
	xp_awk_refdownval (awk, right);
 | 
						xp_awk_refdownval (awk, right);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xp_awk_val_t* left, * res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_assert (nde->type == XP_AWK_NDE_EXP_UNR);
 | 
				
			||||||
 | 
						xp_assert (nde->right == XP_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left = __eval_expression (awk, nde->left);
 | 
				
			||||||
 | 
						if (left == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refupval (left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: a lot of things to do....
 | 
				
			||||||
 | 
						if (nde->opcode == XP_AWK_UNROP_PLUS) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// TODO: error handling
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (nde->opcode == XP_AWK_UNROP_MINUS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, -r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, -r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// TODO: error handling
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (nde->opcode == XP_AWK_UNROP_NOT)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, !r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, !r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// TODO: error handling
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (nde->opcode == XP_AWK_UNROP_BNOT)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, ~r);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// TODO: error handling
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xp_awk_val_t* left, * res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_assert (nde->type == XP_AWK_NDE_EXP_INCPRE);
 | 
				
			||||||
 | 
						xp_assert (nde->right == XP_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left = __eval_expression (awk, nde->left); // TODO: do it differently
 | 
				
			||||||
 | 
						if (left == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refupval (left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (nde->opcode == XP_AWK_UNROP_PLUS) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, r + 1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, r + 1.0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (nde->opcode == XP_AWK_UNROP_MINUS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, r - 1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, r - 1.0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xp_awk_val_t* left, * res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_assert (nde->type == XP_AWK_NDE_EXP_INCPST);
 | 
				
			||||||
 | 
						xp_assert (nde->right == XP_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left = __eval_expression (awk, nde->left); // TODO: get the actual target...
 | 
				
			||||||
 | 
						if (left == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refupval (left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (nde->opcode == XP_AWK_UNROP_PLUS) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// TODO: increment the actual target...
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// TODO: increment the actual target...
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (nde->opcode == XP_AWK_UNROP_MINUS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (left->type == XP_AWK_VAL_INT)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_long_t r = ((xp_awk_val_int_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makeintval (awk, r - 1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (left->type == XP_AWK_VAL_REAL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_real_t r = ((xp_awk_val_real_t*)left)->val;
 | 
				
			||||||
 | 
								res = xp_awk_makerealval (awk, r - 1.0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xp_awk_refdownval (awk, left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde)
 | 
					static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_awk_func_t* func;
 | 
						xp_awk_func_t* func;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: run.h,v 1.5 2006-03-31 12:04:14 bacon Exp $
 | 
					 * $Id: run.h,v 1.6 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_RUN_H_
 | 
					#ifndef _XP_AWK_RUN_H_
 | 
				
			||||||
@ -22,8 +22,7 @@ struct xp_awk_frm_t
 | 
				
			|||||||
enum 
 | 
					enum 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* if you change this, you have to change 
 | 
						/* if you change this, you have to change 
 | 
				
			||||||
	 * __binop_str in tree.c accordingly */
 | 
						 * __binop_str in tree.c accordingly. */ 
 | 
				
			||||||
 | 
					 | 
				
			||||||
	XP_AWK_BINOP_LOR,
 | 
						XP_AWK_BINOP_LOR,
 | 
				
			||||||
	XP_AWK_BINOP_LAND,
 | 
						XP_AWK_BINOP_LAND,
 | 
				
			||||||
	XP_AWK_BINOP_BOR,
 | 
						XP_AWK_BINOP_BOR,
 | 
				
			||||||
@ -49,12 +48,20 @@ enum
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
enum
 | 
					enum
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	XP_AWK_UNAOP_PLUS,
 | 
						/* if you change this, you have to change 
 | 
				
			||||||
	XP_AWK_UNAOP_MINUS,
 | 
						 * __unrop_str in tree.c accordingly. */ 
 | 
				
			||||||
	XP_AWK_UNAOP_PLUSPLUS,
 | 
						XP_AWK_UNROP_PLUS,
 | 
				
			||||||
	XP_AWK_UNAOP_MINUSMINUS,
 | 
						XP_AWK_UNROP_MINUS,
 | 
				
			||||||
	XP_AWK_UNAOP_NOT,
 | 
						XP_AWK_UNROP_NOT,
 | 
				
			||||||
	XP_AWK_UNAOP_BNOT
 | 
						XP_AWK_UNROP_BNOT
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* if you change this, you have to change 
 | 
				
			||||||
 | 
						 * __incop_str in tree.c accordingly. */ 
 | 
				
			||||||
 | 
						XP_AWK_INCOP_PLUS,
 | 
				
			||||||
 | 
						XP_AWK_INCOP_MINUS
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: tree.c,v 1.30 2006-03-31 16:35:37 bacon Exp $
 | 
					 * $Id: tree.c,v 1.31 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -35,16 +35,22 @@ static const xp_char_t* __binop_str[] =
 | 
				
			|||||||
	XP_TEXT("%")
 | 
						XP_TEXT("%")
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const xp_char_t* __unaop_str[] =
 | 
					static const xp_char_t* __unrop_str[] =
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	XP_TEXT("+"),
 | 
						XP_TEXT("+"),
 | 
				
			||||||
	XP_TEXT("-"),
 | 
						XP_TEXT("-"),
 | 
				
			||||||
	XP_TEXT("++"),
 | 
					 | 
				
			||||||
	XP_TEXT("--"),
 | 
					 | 
				
			||||||
	XP_TEXT("!"),
 | 
						XP_TEXT("!"),
 | 
				
			||||||
	XP_TEXT("~")
 | 
						XP_TEXT("~")
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const xp_char_t* __incop_str[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						XP_TEXT("++"),
 | 
				
			||||||
 | 
						XP_TEXT("--"),
 | 
				
			||||||
 | 
						XP_TEXT("++"),
 | 
				
			||||||
 | 
						XP_TEXT("--")
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __print_tabs (int depth);
 | 
					static void __print_tabs (int depth);
 | 
				
			||||||
static int __print_expression (xp_awk_nde_t* nde);
 | 
					static int __print_expression (xp_awk_nde_t* nde);
 | 
				
			||||||
static int __print_expression_list (xp_awk_nde_t* tree);
 | 
					static int __print_expression_list (xp_awk_nde_t* tree);
 | 
				
			||||||
@ -68,19 +74,49 @@ static int __print_expression (xp_awk_nde_t* nde)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_EXP_BIN:
 | 
						case XP_AWK_NDE_EXP_BIN:
 | 
				
			||||||
		xp_printf (XP_TEXT("("));
 | 
							xp_printf (XP_TEXT("("));
 | 
				
			||||||
		if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1) return -1;
 | 
							if (__print_expression(((xp_awk_nde_exp_t*)nde)->left) == -1)
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
		xp_assert ((((xp_awk_nde_exp_t*)nde)->left)->next == XP_NULL);
 | 
							xp_assert ((((xp_awk_nde_exp_t*)nde)->left)->next == XP_NULL);
 | 
				
			||||||
		xp_printf (XP_TEXT(" %s "), __binop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
 | 
							xp_printf (XP_TEXT(" %s "), 
 | 
				
			||||||
		if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS) xp_printf (XP_TEXT("("));
 | 
								__binop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
 | 
				
			||||||
		if (__print_expression (((xp_awk_nde_exp_t*)nde)->right) == -1) return -1;
 | 
							if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS) 
 | 
				
			||||||
		if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS) xp_printf (XP_TEXT(")"));
 | 
								xp_printf (XP_TEXT("("));
 | 
				
			||||||
 | 
							if (__print_expression (((xp_awk_nde_exp_t*)nde)->right) == -1)
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS)
 | 
				
			||||||
 | 
								xp_printf (XP_TEXT(")"));
 | 
				
			||||||
		xp_assert ((((xp_awk_nde_exp_t*)nde)->right)->next == XP_NULL);
 | 
							xp_assert ((((xp_awk_nde_exp_t*)nde)->right)->next == XP_NULL);
 | 
				
			||||||
		xp_printf (XP_TEXT(")"));
 | 
							xp_printf (XP_TEXT(")"));
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_EXP_UNR:
 | 
						case XP_AWK_NDE_EXP_UNR:
 | 
				
			||||||
// TODO:
 | 
							xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
 | 
				
			||||||
		xp_printf (XP_TEXT("unary basic expression\n"));
 | 
					
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT("%s("), 
 | 
				
			||||||
 | 
								__unrop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
 | 
				
			||||||
 | 
							if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT(")"));
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case XP_AWK_NDE_EXP_INCPRE:
 | 
				
			||||||
 | 
							xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT("%s("), 
 | 
				
			||||||
 | 
								__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
 | 
				
			||||||
 | 
							if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT(")"));
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case XP_AWK_NDE_EXP_INCPST:
 | 
				
			||||||
 | 
							xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT("("));
 | 
				
			||||||
 | 
							if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							xp_printf (XP_TEXT(")%s"), 
 | 
				
			||||||
 | 
								__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case XP_AWK_NDE_INT:
 | 
						case XP_AWK_NDE_INT:
 | 
				
			||||||
@ -504,7 +540,10 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case XP_AWK_NDE_EXP_UNR:
 | 
							case XP_AWK_NDE_EXP_UNR:
 | 
				
			||||||
// TODO: clear unary expression...
 | 
							case XP_AWK_NDE_EXP_INCPRE:
 | 
				
			||||||
 | 
							case XP_AWK_NDE_EXP_INCPST:
 | 
				
			||||||
 | 
								xp_assert (((xp_awk_nde_exp_t*)p)->right == XP_NULL);
 | 
				
			||||||
 | 
								xp_awk_clrpt (((xp_awk_nde_exp_t*)p)->left);
 | 
				
			||||||
			xp_free (p);
 | 
								xp_free (p);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: tree.h,v 1.28 2006-03-28 16:33:09 bacon Exp $
 | 
					 * $Id: tree.h,v 1.29 2006-04-02 12:41:14 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_TREE_H_
 | 
					#ifndef _XP_AWK_TREE_H_
 | 
				
			||||||
@ -18,6 +18,8 @@ enum
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	XP_AWK_NDE_EXP_BIN,
 | 
						XP_AWK_NDE_EXP_BIN,
 | 
				
			||||||
	XP_AWK_NDE_EXP_UNR,
 | 
						XP_AWK_NDE_EXP_UNR,
 | 
				
			||||||
 | 
						XP_AWK_NDE_EXP_INCPRE,
 | 
				
			||||||
 | 
						XP_AWK_NDE_EXP_INCPST,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XP_AWK_NDE_INT,
 | 
						XP_AWK_NDE_INT,
 | 
				
			||||||
	XP_AWK_NDE_REAL,
 | 
						XP_AWK_NDE_REAL,
 | 
				
			||||||
@ -101,13 +103,14 @@ struct xp_awk_nde_ass_t
 | 
				
			|||||||
	xp_awk_nde_t* right;
 | 
						xp_awk_nde_t* right;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR */
 | 
					/* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR, 
 | 
				
			||||||
 | 
					 * XP_AWK_NDE_EXP_INCPRE, XP_AWNDE_EXP_INCPST */
 | 
				
			||||||
struct xp_awk_nde_exp_t
 | 
					struct xp_awk_nde_exp_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	XP_AWK_NDE_HDR;
 | 
						XP_AWK_NDE_HDR;
 | 
				
			||||||
	int opcode;
 | 
						int opcode;
 | 
				
			||||||
	xp_awk_nde_t* left;
 | 
						xp_awk_nde_t* left;
 | 
				
			||||||
	xp_awk_nde_t* right; /* optional for XP_AWK_NDE_UNR */
 | 
						xp_awk_nde_t* right; /* XP_NULL for UNR, INCPRE, INCPST */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */
 | 
					/* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
CC = cl
 | 
					CC = cl
 | 
				
			||||||
#CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
 | 
					#CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
 | 
				
			||||||
CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
 | 
					CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
 | 
				
			||||||
LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk\debug
 | 
					LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk
 | 
				
			||||||
LIBS = xpbas.lib xpawk.lib 
 | 
					LIBS = xpbas.lib xpawk.lib 
 | 
				
			||||||
#LIBS = xpawk.lib
 | 
					#LIBS = xpawk.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user