*** empty log message ***
This commit is contained in:
parent
b974c49c76
commit
7e20e755e2
@ -4,7 +4,7 @@ OUT = xpawk.lib
|
||||
|
||||
CC = cl
|
||||
#CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../..
|
||||
CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -D__STAND_ALONE
|
||||
CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -D__STAND_ALONE -DXP_CHAR_IS_WCHAR
|
||||
|
||||
all: $(OBJS)
|
||||
link -lib @<<
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c,v 1.35 2006-03-28 16:33:09 bacon Exp $
|
||||
* $Id: awk.c,v 1.36 2006-03-29 16:37:31 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
@ -10,6 +10,7 @@
|
||||
#endif
|
||||
|
||||
static void __free_func (xp_awk_t* awk, void* func);
|
||||
static void __free_namedval (xp_awk_t* awk, void* val);
|
||||
|
||||
xp_awk_t* xp_awk_open (xp_awk_t* awk)
|
||||
{
|
||||
@ -56,7 +57,7 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk)
|
||||
}
|
||||
|
||||
// TODO: initial map size...
|
||||
if (xp_awk_map_open(&awk->run.named,awk,256,xp_awk_refdownval) == XP_NULL) {
|
||||
if (xp_awk_map_open(&awk->run.named,awk,256,__free_namedval) == XP_NULL) {
|
||||
xp_str_close (&awk->token.name);
|
||||
xp_awk_map_close (&awk->tree.funcs);
|
||||
xp_awk_tab_close (&awk->parse.globals);
|
||||
@ -198,3 +199,8 @@ static void __free_func (xp_awk_t* awk, void* func)
|
||||
xp_awk_clrpt (f->body);
|
||||
xp_free (f);
|
||||
}
|
||||
|
||||
static void __free_namedval (xp_awk_t* awk, void* val)
|
||||
{
|
||||
xp_awk_refdownval (awk, val);
|
||||
}
|
||||
|
208
ase/awk/parse.c
208
ase/awk/parse.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c,v 1.61 2006-03-27 11:43:17 bacon Exp $
|
||||
* $Id: parse.c,v 1.62 2006-03-29 16:37:31 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
@ -35,6 +35,10 @@ enum
|
||||
TOKEN_MOD,
|
||||
TOKEN_RSHIFT,
|
||||
TOKEN_LSHIFT,
|
||||
TOKEN_LOR,
|
||||
TOKEN_LAND,
|
||||
TOKEN_BOR,
|
||||
TOKEN_BAND,
|
||||
|
||||
TOKEN_LPAREN,
|
||||
TOKEN_RPAREN,
|
||||
@ -81,9 +85,9 @@ enum
|
||||
#endif
|
||||
|
||||
|
||||
static xp_awk_t* __parse_progunit (xp_awk_t* awk);
|
||||
static xp_awk_t* __collect_globals (xp_awk_t* awk);
|
||||
static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals);
|
||||
static xp_awk_t* __parse_progunit (xp_awk_t* awk);
|
||||
static xp_awk_t* __collect_globals (xp_awk_t* awk);
|
||||
static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals);
|
||||
|
||||
static xp_awk_nde_t* __parse_function (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_begin (xp_awk_t* awk);
|
||||
@ -96,6 +100,11 @@ static xp_awk_nde_t* __parse_statement (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_statement_nb (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_expression (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_basic_expr (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_conditional (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_logical_or (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_logical_and (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_bitwise_or (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_bitwise_xor (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_equality (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_relational (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_shift (xp_awk_t* awk);
|
||||
@ -920,7 +929,6 @@ static xp_awk_nde_t* __parse_statement_nb (xp_awk_t* awk)
|
||||
if (__get_token(awk) == -1) return XP_NULL;
|
||||
nde = __parse_exit(awk);
|
||||
}
|
||||
|
||||
/* TODO:
|
||||
else if (MATCH(awk,TOKEN_DELETE))
|
||||
{
|
||||
@ -1033,7 +1041,165 @@ static xp_awk_nde_t* __parse_basic_expr (xp_awk_t* awk)
|
||||
* <basic expression list> ::= <basic expression> [comma <basic expression>]*
|
||||
*/
|
||||
|
||||
return __parse_equality (awk);
|
||||
return __parse_conditional (awk);
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_conditional (xp_awk_t* awk)
|
||||
{
|
||||
return __parse_logical_or (awk);
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_logical_or (xp_awk_t* awk)
|
||||
{
|
||||
xp_awk_nde_exp_t* nde;
|
||||
xp_awk_nde_t* left, * right;
|
||||
int opcode;
|
||||
|
||||
left = __parse_logical_and (awk);
|
||||
if (left == XP_NULL) return XP_NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (MATCH(awk,TOKEN_LOR)) opcode = XP_AWK_BINOP_LOR;
|
||||
else break;
|
||||
|
||||
if (__get_token(awk) == -1)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
right = __parse_logical_and (awk);
|
||||
if (right == XP_NULL)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
// TODO: constant folding -> in other parts of the program also...
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_logical_and (xp_awk_t* awk)
|
||||
{
|
||||
xp_awk_nde_exp_t* nde;
|
||||
xp_awk_nde_t* left, * right;
|
||||
int opcode;
|
||||
|
||||
left = __parse_bitwise_or (awk);
|
||||
if (left == XP_NULL) return XP_NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (MATCH(awk,TOKEN_LAND)) opcode = XP_AWK_BINOP_LAND;
|
||||
else break;
|
||||
|
||||
if (__get_token(awk) == -1)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
right = __parse_bitwise_or (awk);
|
||||
if (right == XP_NULL)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
// TODO: constant folding -> in other parts of the program also...
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_bitwise_or (xp_awk_t* awk)
|
||||
{
|
||||
xp_awk_nde_exp_t* nde;
|
||||
xp_awk_nde_t* left, * right;
|
||||
int opcode;
|
||||
|
||||
left = __parse_bitwise_xor (awk);
|
||||
if (left == XP_NULL) return XP_NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (MATCH(awk,TOKEN_BOR)) opcode = XP_AWK_BINOP_BOR;
|
||||
else break;
|
||||
|
||||
if (__get_token(awk) == -1)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
right = __parse_bitwise_xor (awk);
|
||||
if (right == XP_NULL)
|
||||
{
|
||||
xp_awk_clrpt (left);
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
// TODO: constant folding -> in other parts of the program also...
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_bitwise_xor (xp_awk_t* awk)
|
||||
{
|
||||
// TODO:
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_equality (xp_awk_t* awk)
|
||||
@ -2208,6 +2374,36 @@ static int __get_token (xp_awk_t* awk)
|
||||
ADD_TOKEN_STR (awk, XP_TEXT("<"));
|
||||
}
|
||||
}
|
||||
else if (c == XP_CHAR('|'))
|
||||
{
|
||||
GET_CHAR_TO (awk, c);
|
||||
if (c == XP_CHAR('|'))
|
||||
{
|
||||
SET_TOKEN_TYPE (awk, TOKEN_LOR);
|
||||
ADD_TOKEN_STR (awk, XP_TEXT("||"));
|
||||
GET_CHAR_TO (awk, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
SET_TOKEN_TYPE (awk, TOKEN_BOR);
|
||||
ADD_TOKEN_STR (awk, XP_TEXT("|"));
|
||||
}
|
||||
}
|
||||
else if (c == XP_CHAR('&'))
|
||||
{
|
||||
GET_CHAR_TO (awk, c);
|
||||
if (c == XP_CHAR('&&'))
|
||||
{
|
||||
SET_TOKEN_TYPE (awk, TOKEN_LAND);
|
||||
ADD_TOKEN_STR (awk, XP_TEXT("&&"));
|
||||
GET_CHAR_TO (awk, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
SET_TOKEN_TYPE (awk, TOKEN_BAND);
|
||||
ADD_TOKEN_STR (awk, XP_TEXT("&"));
|
||||
}
|
||||
}
|
||||
else if (c == XP_CHAR('+'))
|
||||
{
|
||||
GET_CHAR_TO (awk, c);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.h,v 1.1 2006-03-07 16:02:58 bacon Exp $
|
||||
* $Id: run.h,v 1.2 2006-03-29 16:37:31 bacon Exp $
|
||||
*/
|
||||
|
||||
#ifndef _XP_AWK_RUN_H_
|
||||
@ -21,6 +21,10 @@ struct xp_awk_frm_t
|
||||
|
||||
enum
|
||||
{
|
||||
XP_AWK_BINOP_LOR,
|
||||
XP_AWK_BINOP_LAND,
|
||||
XP_AWK_BINOP_BOR,
|
||||
XP_AWK_BINOP_BAND,
|
||||
XP_AWK_BINOP_PLUS,
|
||||
XP_AWK_BINOP_MINUS,
|
||||
XP_AWK_BINOP_MUL,
|
||||
|
25
ase/awk/sa.c
25
ase/awk/sa.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sa.c,v 1.10 2006-03-27 14:40:58 bacon Exp $
|
||||
* $Id: sa.c,v 1.11 2006-03-29 16:37:31 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
@ -8,6 +8,13 @@
|
||||
|
||||
static xp_char_t* __adjust_format (const xp_char_t* format);
|
||||
|
||||
xp_size_t xp_strlen (const xp_char_t* str)
|
||||
{
|
||||
const xp_char_t* p = str;
|
||||
while (*p != XP_CHAR('\0')) p++;
|
||||
return p - str;
|
||||
}
|
||||
|
||||
xp_char_t* xp_strdup (const xp_char_t* str)
|
||||
{
|
||||
xp_char_t* tmp;
|
||||
@ -31,6 +38,13 @@ xp_char_t* xp_strxdup (const xp_char_t* str, xp_size_t len)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
xp_size_t xp_strcpy (xp_char_t* buf, const xp_char_t* str)
|
||||
{
|
||||
xp_char_t* org = buf;
|
||||
while ((*buf++ = *str++) != XP_CHAR('\0'));
|
||||
return buf - org - 1;
|
||||
}
|
||||
|
||||
xp_size_t xp_strxncpy (
|
||||
xp_char_t* buf, xp_size_t bsz, const xp_char_t* str, xp_size_t len)
|
||||
{
|
||||
@ -44,6 +58,15 @@ xp_size_t xp_strxncpy (
|
||||
return n;
|
||||
}
|
||||
|
||||
int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2)
|
||||
{
|
||||
while (*s1 == *s2 && *s2 != XP_CHAR('\0')) s1++, s2++;
|
||||
if (*s1 > *s2) return 1;
|
||||
else if (*s1 < *s2) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
xp_long_t xp_strtolong (xp_char_t* str)
|
||||
{
|
||||
xp_long_t n = 0;
|
||||
|
81
ase/awk/sa.h
81
ase/awk/sa.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sa.h,v 1.14 2006-03-27 11:43:17 bacon Exp $
|
||||
* $Id: sa.h,v 1.15 2006-03-29 16:37:31 bacon Exp $
|
||||
*/
|
||||
|
||||
#ifndef _XP_AWK_SA_H_
|
||||
@ -11,29 +11,45 @@
|
||||
|
||||
#ifdef __STAND_ALONE
|
||||
|
||||
#if !defined(XP_CHAR_IS_MCHAR) && !defined(XP_CHAR_IS_WCHAR)
|
||||
#error Neither XP_CHAR_IS_MCHAR nor XP_CHAR_IS_WCHAR is defined.
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef XP_CHAR_IS_MCHAR
|
||||
#include <ctype.h>
|
||||
#else
|
||||
#include <wchar.h>
|
||||
#if !defined(__BEOS__)
|
||||
#include <wctype.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define xp_malloc malloc
|
||||
#define xp_realloc realloc
|
||||
#define xp_free free
|
||||
#define xp_assert assert
|
||||
|
||||
#ifdef XP_CHAR_IS_MCHAR
|
||||
#define xp_isdigit isdigit
|
||||
#define xp_isalpha isalpha
|
||||
#define xp_isalnum isalnum
|
||||
#define xp_isspace isspace
|
||||
#define xp_toupper toupper
|
||||
#define xp_tolower tolower
|
||||
#else
|
||||
#define xp_isdigit iswdigit
|
||||
#define xp_isalpha iswalpha
|
||||
#define xp_isalnum iswalnum
|
||||
#define xp_isspace iswspace
|
||||
#define xp_toupper towupper
|
||||
#define xp_tolower towlower
|
||||
|
||||
#define xp_strcpy wcscpy
|
||||
#define xp_strcmp wcscmp
|
||||
#define xp_strlen wcslen
|
||||
#endif
|
||||
|
||||
#define xp_memcpy memcpy
|
||||
#define xp_memcmp memcmp
|
||||
@ -45,10 +61,6 @@
|
||||
|
||||
#define xp_main main
|
||||
|
||||
#define XP_CHAR(c) L##c
|
||||
#define XP_TEXT(c) L##c
|
||||
#define XP_CHAR_EOF WEOF
|
||||
|
||||
#define XP_NULL NULL
|
||||
|
||||
#define xp_sizeof(n) (sizeof(n))
|
||||
@ -58,26 +70,46 @@
|
||||
#define xp_false (0 != 0)
|
||||
|
||||
typedef unsigned char xp_byte_t;
|
||||
typedef int xp_bool_t;
|
||||
typedef wchar_t xp_char_t;
|
||||
typedef wint_t xp_cint_t;
|
||||
typedef size_t xp_size_t;
|
||||
typedef int xp_bool_t;
|
||||
typedef size_t xp_size_t;
|
||||
|
||||
#ifdef XP_CHAR_IS_MCHAR
|
||||
typedef char xp_char_t;
|
||||
typedef int xp_cint_t;
|
||||
#else
|
||||
typedef wchar_t xp_char_t;
|
||||
typedef wint_t xp_cint_t;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) || defined(vms) || defined(__vms)
|
||||
typedef long xp_ssize_t;
|
||||
typedef long xp_ssize_t;
|
||||
#else
|
||||
typedef ssize_t xp_ssize_t;
|
||||
typedef ssize_t xp_ssize_t;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
typedef __int64 xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
typedef __int64 xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
#elif defined(vax) || defined(__vax)
|
||||
typedef long xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
typedef long xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
#else
|
||||
typedef long long xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
typedef long long xp_long_t;
|
||||
typedef long double xp_real_t;
|
||||
#endif
|
||||
|
||||
#ifdef XP_CHAR_IS_MCHAR
|
||||
#define XP_CHAR(c) c
|
||||
#define XP_TEXT(c) c
|
||||
#define XP_CHAR_EOF EOF
|
||||
#else
|
||||
#define XP_CHAR(c) L##c
|
||||
#define XP_TEXT(c) L##c
|
||||
#ifdef WEOF
|
||||
#define XP_CHAR_EOF WEOF
|
||||
#else
|
||||
#define XP_CHAR_EOF ((xp_char_t)-1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define XP_STR_LEN(x) ((x)->size)
|
||||
@ -99,12 +131,15 @@ struct xp_str_t
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
xp_size_t xp_strlen (const xp_char_t* str);
|
||||
xp_char_t* xp_strdup (const xp_char_t* str);
|
||||
xp_char_t* xp_strxdup (const xp_char_t* str, xp_size_t len);
|
||||
|
||||
xp_size_t xp_strcpy (xp_char_t* buf, const xp_char_t* str);
|
||||
xp_size_t xp_strxncpy (
|
||||
xp_char_t* buf, xp_size_t bsz, const xp_char_t* str, xp_size_t len);
|
||||
|
||||
int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2);
|
||||
xp_long_t xp_strtolong (xp_char_t* str);
|
||||
|
||||
int xp_printf (const xp_char_t* fmt, ...);
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
static xp_ssize_t process_source (int cmd, void* arg, xp_char_t* data, xp_size_t size)
|
||||
{
|
||||
wchar_t c;
|
||||
xp_char_t c;
|
||||
|
||||
switch (cmd) {
|
||||
case XP_AWK_IO_OPEN:
|
||||
@ -13,7 +13,11 @@ static xp_ssize_t process_source (int cmd, void* arg, xp_char_t* data, xp_size_t
|
||||
|
||||
case XP_AWK_IO_DATA:
|
||||
if (size <= 0) return -1;
|
||||
#ifdef XP_CHAR_IS_MCHAR
|
||||
c = fgetc (stdin);
|
||||
#else
|
||||
c = fgetwc (stdin);
|
||||
#endif
|
||||
if (c == XP_CHAR_EOF) return 0;
|
||||
*data = c;
|
||||
return 1;
|
||||
@ -52,7 +56,11 @@ static xp_ssize_t process_source (int cmd, void* arg, xp_char_t* data, xp_size_t
|
||||
#include <mcheck.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
int xp_main (int argc, xp_char_t* argv[])
|
||||
#else
|
||||
int xp_main (int argc, char* argv[])
|
||||
#endif
|
||||
{
|
||||
xp_awk_t awk;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user