*** empty log message ***
This commit is contained in:
		@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: parse.c,v 1.68 2006-04-02 12:41:14 bacon Exp $
 | 
			
		||||
 * $Id: parse.c,v 1.69 2006-04-04 06:26:56 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <xp/awk/awk_i.h>
 | 
			
		||||
@ -143,6 +143,7 @@ static xp_awk_nde_t* __parse_next (xp_awk_t* awk);
 | 
			
		||||
static xp_awk_nde_t* __parse_nextfile (xp_awk_t* awk);
 | 
			
		||||
 | 
			
		||||
static int __get_token (xp_awk_t* awk);
 | 
			
		||||
static int __get_number (xp_awk_t* awk);
 | 
			
		||||
static int __get_char (xp_awk_t* awk);
 | 
			
		||||
static int __unget_char (xp_awk_t* awk, xp_cint_t c);
 | 
			
		||||
static int __skip_spaces (xp_awk_t* awk);
 | 
			
		||||
@ -2164,14 +2165,7 @@ static int __get_token (xp_awk_t* awk)
 | 
			
		||||
	}	
 | 
			
		||||
	else if (xp_isdigit(c)) 
 | 
			
		||||
	{
 | 
			
		||||
		/* number */
 | 
			
		||||
		do {
 | 
			
		||||
			ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
			GET_CHAR_TO (awk, c);
 | 
			
		||||
		} while (xp_isdigit(c));
 | 
			
		||||
 | 
			
		||||
		SET_TOKEN_TYPE (awk, TOKEN_INT);
 | 
			
		||||
// TODO: enhance nubmer handling
 | 
			
		||||
		if (__get_number(awk) == -1) return -1;
 | 
			
		||||
	}
 | 
			
		||||
	else if (xp_isalpha(c) || c == XP_CHAR('_')) 
 | 
			
		||||
	{
 | 
			
		||||
@ -2443,6 +2437,88 @@ static int __get_token (xp_awk_t* awk)
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __get_number (xp_awk_t* awk)
 | 
			
		||||
{
 | 
			
		||||
	xp_cint_t c;
 | 
			
		||||
 | 
			
		||||
	xp_assert (XP_STR_LEN(&awk->token.name) == 0);
 | 
			
		||||
	SET_TOKEN_TYPE (awk, TOKEN_INT);
 | 
			
		||||
 | 
			
		||||
	c = awk->lex.curc;
 | 
			
		||||
 | 
			
		||||
	if (c == XP_CHAR('0'))
 | 
			
		||||
	{
 | 
			
		||||
		ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
		GET_CHAR_TO (awk, c);
 | 
			
		||||
 | 
			
		||||
		if (c == XP_CHAR('x') || c == XP_CHAR('X'))
 | 
			
		||||
		{
 | 
			
		||||
			/* hexadecimal number */
 | 
			
		||||
			do 
 | 
			
		||||
			{
 | 
			
		||||
				ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
				GET_CHAR_TO (awk, c);
 | 
			
		||||
			} while (xp_isxdigit(c));
 | 
			
		||||
 | 
			
		||||
			// TODO: return hexadecimal number...
 | 
			
		||||
		}
 | 
			
		||||
		else if (c != '.')
 | 
			
		||||
		{
 | 
			
		||||
			/* octal number */
 | 
			
		||||
			do
 | 
			
		||||
			{
 | 
			
		||||
				ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
				GET_CHAR_TO (awk, c);
 | 
			
		||||
			} while (c >= XP_CHAR('0') || c <= XP_CHAR('7'));
 | 
			
		||||
 | 
			
		||||
			// TOOD: return octal number
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (xp_isdigit(c)) 
 | 
			
		||||
	{
 | 
			
		||||
		ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
		GET_CHAR_TO (awk, c);
 | 
			
		||||
	} 
 | 
			
		||||
 | 
			
		||||
	if (c == XP_CHAR('.'))
 | 
			
		||||
	{
 | 
			
		||||
		/* floating-point number */
 | 
			
		||||
		SET_TOKEN_TYPE (awk, TOKEN_REAL);
 | 
			
		||||
 | 
			
		||||
		ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
		GET_CHAR_TO (awk, c);
 | 
			
		||||
 | 
			
		||||
		while (xp_isdigit(c))
 | 
			
		||||
		{
 | 
			
		||||
			ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
			GET_CHAR_TO (awk, c);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (c == XP_CHAR('E') || c == XP_CHAR('e'))
 | 
			
		||||
	{
 | 
			
		||||
		SET_TOKEN_TYPE (awk, TOKEN_REAL);
 | 
			
		||||
 | 
			
		||||
		ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
		GET_CHAR_TO (awk, c);
 | 
			
		||||
 | 
			
		||||
		if (c == XP_CHAR('+') || c == XP_CHAR('-'))
 | 
			
		||||
		{
 | 
			
		||||
			ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
			GET_CHAR_TO (awk, c);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		while (xp_isdigit(c))
 | 
			
		||||
		{
 | 
			
		||||
			ADD_TOKEN_CHAR (awk, c);
 | 
			
		||||
			GET_CHAR_TO (awk, c);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __get_char (xp_awk_t* awk)
 | 
			
		||||
{
 | 
			
		||||
	xp_ssize_t n;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: run.c,v 1.33 2006-04-03 15:31:33 bacon Exp $
 | 
			
		||||
 * $Id: run.c,v 1.34 2006-04-04 06:26:56 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <xp/awk/awk_i.h>
 | 
			
		||||
@ -721,6 +721,10 @@ static xp_awk_val_t* __eval_binop_lor (
 | 
			
		||||
		res = xp_awk_makeintval (awk, r);
 | 
			
		||||
		// TOOD: error handling
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* TODO: trigger error */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
@ -739,6 +743,10 @@ static xp_awk_val_t* __eval_binop_land (
 | 
			
		||||
		res = xp_awk_makeintval (awk, r);
 | 
			
		||||
		// TOOD: error handling
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		// TODO: trigger error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
@ -955,6 +963,34 @@ static xp_awk_val_t* __eval_binop_plus (
 | 
			
		||||
		res = xp_awk_makeintval (awk, r);
 | 
			
		||||
		// TOOD: error handling
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_REAL && 
 | 
			
		||||
	         right->type == XP_AWK_VAL_REAL)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_real_t*)left)->val +
 | 
			
		||||
			((xp_awk_val_real_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_INT && 
 | 
			
		||||
	         right->type == XP_AWK_VAL_REAL)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_int_t*)left)->val +
 | 
			
		||||
			((xp_awk_val_real_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_REAL &&
 | 
			
		||||
		 right->type == XP_AWK_VAL_INT)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_real_t*)left)->val +
 | 
			
		||||
			((xp_awk_val_int_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* TODO: trigger error */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
@ -968,11 +1004,39 @@ static xp_awk_val_t* __eval_binop_minus (
 | 
			
		||||
	    right->type == XP_AWK_VAL_INT)
 | 
			
		||||
	{
 | 
			
		||||
		xp_long_t r = 
 | 
			
		||||
			((xp_awk_val_int_t*)left)->val -
 | 
			
		||||
			((xp_awk_val_int_t*)left)->val - 
 | 
			
		||||
			((xp_awk_val_int_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makeintval (awk, r);
 | 
			
		||||
		// TOOD: error handling
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_REAL && 
 | 
			
		||||
	         right->type == XP_AWK_VAL_REAL)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_real_t*)left)->val -
 | 
			
		||||
			((xp_awk_val_real_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_INT && 
 | 
			
		||||
	         right->type == XP_AWK_VAL_REAL)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_int_t*)left)->val -
 | 
			
		||||
			((xp_awk_val_real_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else if (left->type == XP_AWK_VAL_REAL &&
 | 
			
		||||
		 right->type == XP_AWK_VAL_INT)
 | 
			
		||||
	{
 | 
			
		||||
		xp_real_t r = 
 | 
			
		||||
			((xp_awk_val_real_t*)left)->val -
 | 
			
		||||
			((xp_awk_val_int_t*)right)->val;
 | 
			
		||||
		res = xp_awk_makerealval (awk, r);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* TODO: trigger error */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id: sa.h,v 1.17 2006-03-31 16:35:37 bacon Exp $
 | 
			
		||||
 * $Id: sa.h,v 1.18 2006-04-04 06:26:56 bacon Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _XP_AWK_SA_H_
 | 
			
		||||
@ -37,6 +37,7 @@
 | 
			
		||||
 | 
			
		||||
#ifdef XP_CHAR_IS_MCHAR
 | 
			
		||||
#define xp_isdigit isdigit
 | 
			
		||||
#define xp_isxdigit isxdigit
 | 
			
		||||
#define xp_isalpha isalpha
 | 
			
		||||
#define xp_isalnum isalnum
 | 
			
		||||
#define xp_isspace isspace
 | 
			
		||||
@ -44,6 +45,7 @@
 | 
			
		||||
#define xp_tolower tolower
 | 
			
		||||
#else
 | 
			
		||||
#define xp_isdigit iswdigit
 | 
			
		||||
#define xp_isxdigit iswxdigit
 | 
			
		||||
#define xp_isalpha iswalpha
 | 
			
		||||
#define xp_isalnum iswalnum
 | 
			
		||||
#define xp_isspace iswspace
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user