changed the way to handle @words.

switched global, local, reset, abort to @global, @local, @reset, @abort to avoid collision with existing awk programs
This commit is contained in:
hyung-hwan 2012-11-20 14:44:43 +00:00
parent 1157af0b8a
commit c2668bbe26
19 changed files with 142 additions and 133 deletions

View File

@ -378,8 +378,7 @@ struct opttab_t
} opttab[] = } opttab[] =
{ {
{ QSE_T("implicit"), QSE_AWK_IMPLICIT, QSE_T("allow undeclared variables") }, { QSE_T("implicit"), QSE_AWK_IMPLICIT, QSE_T("allow undeclared variables") },
{ QSE_T("explicit"), QSE_AWK_EXPLICIT, QSE_T("enable local,global for variable declaration") }, { QSE_T("extrakws"), QSE_AWK_EXTRAKWS, QSE_T("enable abort,reset,nextofile,OFILENAME,@include,@global,@local") },
{ QSE_T("extrakws"), QSE_AWK_EXTRAKWS, QSE_T("enable abort,reset,nextofile,OFILENAME,@include") },
{ QSE_T("rio"), QSE_AWK_RIO, QSE_T("enable builtin I/O including getline & print") }, { QSE_T("rio"), QSE_AWK_RIO, QSE_T("enable builtin I/O including getline & print") },
{ QSE_T("rwpipe"), QSE_AWK_RWPIPE, QSE_T("allow a dual-directional pipe") }, { QSE_T("rwpipe"), QSE_AWK_RWPIPE, QSE_T("allow a dual-directional pipe") },
{ QSE_T("newline"), QSE_AWK_NEWLINE, QSE_T("enable a newline to terminate a statement") }, { QSE_T("newline"), QSE_AWK_NEWLINE, QSE_T("enable a newline to terminate a statement") },
@ -522,7 +521,6 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
{ {
{ QSE_T(":implicit"), QSE_T('\0') }, { QSE_T(":implicit"), QSE_T('\0') },
{ QSE_T(":explicit"), QSE_T('\0') },
{ QSE_T(":extrakws"), QSE_T('\0') }, { QSE_T(":extrakws"), QSE_T('\0') },
{ QSE_T(":rio"), QSE_T('\0') }, { QSE_T(":rio"), QSE_T('\0') },
{ QSE_T(":rwpipe"), QSE_T('\0') }, { QSE_T(":rwpipe"), QSE_T('\0') },

View File

@ -980,12 +980,6 @@ enum qse_awk_trait_t
**/ **/
QSE_AWK_IMPLICIT = (1 << 0), QSE_AWK_IMPLICIT = (1 << 0),
/**
* allows explicit variable declaration, the concatenation
* operator, a period, and performs the parse-time function check.
*/
QSE_AWK_EXPLICIT = (1 << 1),
/** /**
* enable abort,reset,nextofile,OFILENAME,@include. * enable abort,reset,nextofile,OFILENAME,@include.
*/ */
@ -1178,7 +1172,8 @@ enum qse_awk_errnum_t
QSE_AWK_EINCDECOPR,/**< illegal operand for incr/decr operator */ QSE_AWK_EINCDECOPR,/**< illegal operand for incr/decr operator */
QSE_AWK_EINCLSTR, /**< 'include' not followed by a string */ QSE_AWK_EINCLSTR, /**< 'include' not followed by a string */
QSE_AWK_EINCLTD, /**< include level too deep */ QSE_AWK_EINCLTD, /**< include level too deep */
QSE_AWK_EDIRECNR, /**< directive '${0}' not recognized */ QSE_AWK_EXKWNR, /**< @word '${0}' not recognized */
QSE_AWK_EXKWEM, /**< @ not followed by a valid word */
/* run time error */ /* run time error */
QSE_AWK_EDIVBY0, /**< divide by zero */ QSE_AWK_EDIVBY0, /**< divide by zero */

View File

@ -101,7 +101,8 @@ const qse_char_t* qse_awk_dflerrstr (const qse_awk_t* awk, qse_awk_errnum_t errn
QSE_T("illegal operand for increment/decrement operator"), QSE_T("illegal operand for increment/decrement operator"),
QSE_T("'include' not followed by a string"), QSE_T("'include' not followed by a string"),
QSE_T("include level too deep"), QSE_T("include level too deep"),
QSE_T("directive '${0}' not recognized"), QSE_T("@word '${0}' not recognized"),
QSE_T("@ not followed by a valid word"),
QSE_T("divide by zero"), QSE_T("divide by zero"),
QSE_T("invalid operand"), QSE_T("invalid operand"),

View File

@ -94,8 +94,9 @@ enum tok_t
TOK_END, TOK_END,
TOK_FUNCTION, TOK_FUNCTION,
TOK_LOCAL, TOK_XLOCAL,
TOK_GLOBAL, TOK_XGLOBAL,
TOK_XINCLUDE,
TOK_IF, TOK_IF,
TOK_ELSE, TOK_ELSE,
@ -106,12 +107,12 @@ enum tok_t
TOK_CONTINUE, TOK_CONTINUE,
TOK_RETURN, TOK_RETURN,
TOK_EXIT, TOK_EXIT,
TOK_ABORT, TOK_XABORT,
TOK_NEXT, TOK_NEXT,
TOK_NEXTFILE, TOK_NEXTFILE,
TOK_NEXTOFILE, TOK_NEXTOFILE,
TOK_DELETE, TOK_DELETE,
TOK_RESET, TOK_XRESET,
TOK_PRINT, TOK_PRINT,
TOK_PRINTF, TOK_PRINTF,
@ -254,9 +255,13 @@ static kwent_t kwtab[] =
{ {
/* keep this table in sync with the kw_t enums in <parse.h>. /* keep this table in sync with the kw_t enums in <parse.h>.
* also keep it sorted by the first field for binary search */ * also keep it sorted by the first field for binary search */
{ { QSE_T("@abort"), 6 }, TOK_XABORT, QSE_AWK_EXTRAKWS },
{ { QSE_T("@global"), 7 }, TOK_XGLOBAL, QSE_AWK_EXTRAKWS },
{ { QSE_T("@include"), 8 }, TOK_XINCLUDE, QSE_AWK_EXTRAKWS },
{ { QSE_T("@local"), 6 }, TOK_XLOCAL, QSE_AWK_EXTRAKWS },
{ { QSE_T("@reset"), 6 }, TOK_XRESET, QSE_AWK_EXTRAKWS },
{ { QSE_T("BEGIN"), 5 }, TOK_BEGIN, QSE_AWK_PABLOCK }, { { QSE_T("BEGIN"), 5 }, TOK_BEGIN, QSE_AWK_PABLOCK },
{ { QSE_T("END"), 3 }, TOK_END, QSE_AWK_PABLOCK }, { { QSE_T("END"), 3 }, TOK_END, QSE_AWK_PABLOCK },
{ { QSE_T("abort"), 5 }, TOK_ABORT, QSE_AWK_EXTRAKWS },
{ { QSE_T("break"), 5 }, TOK_BREAK, 0 }, { { QSE_T("break"), 5 }, TOK_BREAK, 0 },
{ { QSE_T("continue"), 8 }, TOK_CONTINUE, 0 }, { { QSE_T("continue"), 8 }, TOK_CONTINUE, 0 },
{ { QSE_T("delete"), 6 }, TOK_DELETE, 0 }, { { QSE_T("delete"), 6 }, TOK_DELETE, 0 },
@ -266,16 +271,13 @@ static kwent_t kwtab[] =
{ { QSE_T("for"), 3 }, TOK_FOR, 0 }, { { QSE_T("for"), 3 }, TOK_FOR, 0 },
{ { QSE_T("function"), 8 }, TOK_FUNCTION, 0 }, { { QSE_T("function"), 8 }, TOK_FUNCTION, 0 },
{ { QSE_T("getline"), 7 }, TOK_GETLINE, QSE_AWK_RIO }, { { QSE_T("getline"), 7 }, TOK_GETLINE, QSE_AWK_RIO },
{ { QSE_T("global"), 6 }, TOK_GLOBAL, QSE_AWK_EXPLICIT },
{ { QSE_T("if"), 2 }, TOK_IF, 0 }, { { QSE_T("if"), 2 }, TOK_IF, 0 },
{ { QSE_T("in"), 2 }, TOK_IN, 0 }, { { QSE_T("in"), 2 }, TOK_IN, 0 },
{ { QSE_T("local"), 5 }, TOK_LOCAL, QSE_AWK_EXPLICIT },
{ { QSE_T("next"), 4 }, TOK_NEXT, QSE_AWK_PABLOCK }, { { QSE_T("next"), 4 }, TOK_NEXT, QSE_AWK_PABLOCK },
{ { QSE_T("nextfile"), 8 }, TOK_NEXTFILE, QSE_AWK_PABLOCK }, { { QSE_T("nextfile"), 8 }, TOK_NEXTFILE, QSE_AWK_PABLOCK },
{ { QSE_T("nextofile"), 9 }, TOK_NEXTOFILE, QSE_AWK_PABLOCK | QSE_AWK_EXTRAKWS }, { { QSE_T("nextofile"), 9 }, TOK_NEXTOFILE, QSE_AWK_PABLOCK | QSE_AWK_EXTRAKWS },
{ { QSE_T("print"), 5 }, TOK_PRINT, QSE_AWK_RIO }, { { QSE_T("print"), 5 }, TOK_PRINT, QSE_AWK_RIO },
{ { QSE_T("printf"), 6 }, TOK_PRINTF, QSE_AWK_RIO }, { { QSE_T("printf"), 6 }, TOK_PRINTF, QSE_AWK_RIO },
{ { QSE_T("reset"), 5 }, TOK_RESET, QSE_AWK_EXTRAKWS },
{ { QSE_T("return"), 6 }, TOK_RETURN, 0 }, { { QSE_T("return"), 6 }, TOK_RETURN, 0 },
{ { QSE_T("while"), 5 }, TOK_WHILE, 0 } { { QSE_T("while"), 5 }, TOK_WHILE, 0 }
}; };
@ -540,8 +542,7 @@ static int parse (qse_awk_t* awk)
if (parse_progunit (awk) <= -1) goto oops; if (parse_progunit (awk) <= -1) goto oops;
} }
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
!(awk->opt.trait & QSE_AWK_IMPLICIT))
{ {
/* ensure that all functions called are defined /* ensure that all functions called are defined
* in the EXPLICIT-only mode */ * in the EXPLICIT-only mode */
@ -798,7 +799,7 @@ static int parse_progunit (qse_awk_t* awk)
{ {
/* /*
@include "xxxx" @include "xxxx"
global xxx, xxxx; @global xxx, xxxx;
BEGIN { action } BEGIN { action }
END { action } END { action }
pattern { action } pattern { action }
@ -807,7 +808,7 @@ static int parse_progunit (qse_awk_t* awk)
QSE_ASSERT (awk->parse.depth.loop == 0); QSE_ASSERT (awk->parse.depth.loop == 0);
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && MATCH(awk,TOK_GLOBAL)) if (MATCH(awk,TOK_XGLOBAL))
{ {
qse_size_t ngbls; qse_size_t ngbls;
@ -826,12 +827,7 @@ static int parse_progunit (qse_awk_t* awk)
return -1; return -1;
} }
} }
else if (MATCH(awk,TOK_ATSIGN)) else if (MATCH(awk,TOK_XINCLUDE))
{
if (get_token(awk) <= -1) return -1;
if (MATCH(awk,TOK_IDENT) &&
qse_strcmp (QSE_STR_PTR(awk->tok.name), QSE_T("include")) == 0)
{ {
if (awk->opt.depth.s.incl > 0 && if (awk->opt.depth.s.incl > 0 &&
awk->parse.depth.incl >= awk->opt.depth.s.incl) awk->parse.depth.incl >= awk->opt.depth.s.incl)
@ -856,12 +852,6 @@ static int parse_progunit (qse_awk_t* awk)
* inclusion. the loop in parse() proceeds to call * inclusion. the loop in parse() proceeds to call
* parse_progunit() */ * parse_progunit() */
} }
else
{
SETERR_TOK (awk, QSE_AWK_EDIRECNR);
return -1;
}
}
else if (MATCH(awk,TOK_FUNCTION)) else if (MATCH(awk,TOK_FUNCTION))
{ {
awk->parse.id.block = PARSE_FUNCTION; awk->parse.id.block = PARSE_FUNCTION;
@ -1433,8 +1423,6 @@ static qse_awk_nde_t* parse_block (
nlcls_max = awk->parse.nlcls_max; nlcls_max = awk->parse.nlcls_max;
/* local variable declarations */ /* local variable declarations */
if (awk->opt.trait & QSE_AWK_EXPLICIT)
{
while (1) while (1)
{ {
/* skip new lines before local declaration in a block*/ /* skip new lines before local declaration in a block*/
@ -1443,7 +1431,7 @@ static qse_awk_nde_t* parse_block (
if (get_token(awk) <= -1) return QSE_NULL; if (get_token(awk) <= -1) return QSE_NULL;
} }
if (!MATCH(awk,TOK_LOCAL)) break; if (!MATCH(awk,TOK_XLOCAL)) break;
if (get_token(awk) <= -1) if (get_token(awk) <= -1)
{ {
@ -1461,7 +1449,6 @@ static qse_awk_nde_t* parse_block (
return QSE_NULL; return QSE_NULL;
} }
} }
}
/* block body */ /* block body */
head = QSE_NULL; curr = QSE_NULL; head = QSE_NULL; curr = QSE_NULL;
@ -2468,7 +2455,7 @@ static qse_awk_nde_t* parse_exit (qse_awk_t* awk, const qse_awk_loc_t* xloc)
qse_awk_nde_exit_t* nde; qse_awk_nde_exit_t* nde;
qse_awk_nde_t* val; qse_awk_nde_t* val;
QSE_ASSERT (awk->ptok.type == TOK_EXIT || awk->ptok.type == TOK_ABORT); QSE_ASSERT (awk->ptok.type == TOK_EXIT || awk->ptok.type == TOK_XABORT);
nde = (qse_awk_nde_exit_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*nde)); nde = (qse_awk_nde_exit_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*nde));
if (nde == QSE_NULL) if (nde == QSE_NULL)
@ -2479,7 +2466,7 @@ static qse_awk_nde_t* parse_exit (qse_awk_t* awk, const qse_awk_loc_t* xloc)
nde->type = QSE_AWK_NDE_EXIT; nde->type = QSE_AWK_NDE_EXIT;
nde->loc = *xloc; nde->loc = *xloc;
nde->abort = (awk->ptok.type == TOK_ABORT); nde->abort = (awk->ptok.type == TOK_XABORT);
if (MATCH_TERMINATOR(awk)) if (MATCH_TERMINATOR(awk))
{ {
@ -2569,7 +2556,7 @@ static qse_awk_nde_t* parse_delete (qse_awk_t* awk, const qse_awk_loc_t* xloc)
int inparen = 0; int inparen = 0;
QSE_ASSERT (awk->ptok.type == TOK_DELETE || QSE_ASSERT (awk->ptok.type == TOK_DELETE ||
awk->ptok.type == TOK_RESET); awk->ptok.type == TOK_XRESET);
type = (awk->ptok.type == TOK_DELETE)? type = (awk->ptok.type == TOK_DELETE)?
QSE_AWK_NDE_DELETE: QSE_AWK_NDE_RESET; QSE_AWK_NDE_DELETE: QSE_AWK_NDE_RESET;
@ -2855,7 +2842,7 @@ static qse_awk_nde_t* parse_statement_nb (
if (get_token(awk) <= -1) return QSE_NULL; if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_return (awk, xloc); nde = parse_return (awk, xloc);
} }
else if (MATCH(awk,TOK_EXIT) || MATCH(awk,TOK_ABORT)) else if (MATCH(awk,TOK_EXIT) || MATCH(awk,TOK_XABORT))
{ {
if (get_token(awk) <= -1) return QSE_NULL; if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_exit (awk, xloc); nde = parse_exit (awk, xloc);
@ -2875,7 +2862,7 @@ static qse_awk_nde_t* parse_statement_nb (
if (get_token(awk) <= -1) return QSE_NULL; if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_nextfile (awk, xloc, 1); nde = parse_nextfile (awk, xloc, 1);
} }
else if (MATCH(awk,TOK_DELETE) || MATCH(awk,TOK_RESET)) else if (MATCH(awk,TOK_DELETE) || MATCH(awk,TOK_XRESET))
{ {
if (get_token(awk) <= -1) return QSE_NULL; if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_delete (awk, xloc); nde = parse_delete (awk, xloc);
@ -5924,6 +5911,39 @@ retry:
goto try_get_symbols; goto try_get_symbols;
} }
} }
else if (c == QSE_T('@'))
{
int type;
ADD_TOKEN_CHAR (awk, tok, c);
GET_CHAR_TO (awk, c);
if (c != QSE_T('_') && !QSE_AWK_ISALPHA (awk, c))
{
/* this extended keyword is empty,
* not followed by a valid word */
SETERR_LOC (awk, QSE_AWK_EXKWEM, &(awk)->tok.loc);
return -1;
}
/* expect normal identifier starting with an alphabet */
do
{
ADD_TOKEN_CHAR (awk, tok, c);
GET_CHAR_TO (awk, c);
}
while (c == QSE_T('_') ||
QSE_AWK_ISALPHA (awk, c) ||
QSE_AWK_ISDIGIT (awk, c));
type = classify_ident (awk, QSE_STR_CSTR(tok->name));
if (type == TOK_IDENT)
{
SETERR_TOK (awk, QSE_AWK_EXKWNR);
return -1;
}
SET_TOKEN_TYPE (awk, tok, type);
}
else if (c == QSE_T('_') || QSE_AWK_ISALPHA (awk, c)) else if (c == QSE_T('_') || QSE_AWK_ISALPHA (awk, c))
{ {
int type; int type;
@ -6113,20 +6133,16 @@ static int deparse (qse_awk_t* awk)
QSE_ASSERT (awk->tree.ngbls > 0); QSE_ASSERT (awk->tree.ngbls > 0);
qse_awk_getkwname (awk, QSE_AWK_KWID_GLOBAL, &kw); qse_awk_getkwname (awk, QSE_AWK_KWID_XGLOBAL, &kw);
if (qse_awk_putsrcstrn(awk,kw.ptr,kw.len) <= -1) if (qse_awk_putsrcstrn(awk,kw.ptr,kw.len) <= -1 ||
{ qse_awk_putsrcstr (awk, QSE_T(" ")) <= -1)
EXIT_DEPARSE ();
}
if (qse_awk_putsrcstr (awk, QSE_T(" ")) <= -1)
{ {
EXIT_DEPARSE (); EXIT_DEPARSE ();
} }
for (i = awk->tree.ngbls_base; i < awk->tree.ngbls - 1; i++) for (i = awk->tree.ngbls_base; i < awk->tree.ngbls - 1; i++)
{ {
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
!(awk->opt.trait & QSE_AWK_IMPLICIT))
{ {
/* use the actual name if no named variable /* use the actual name if no named variable
* is allowed */ * is allowed */
@ -6153,8 +6169,7 @@ static int deparse (qse_awk_t* awk)
EXIT_DEPARSE (); EXIT_DEPARSE ();
} }
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
!(awk->opt.trait & QSE_AWK_IMPLICIT))
{ {
if (qse_awk_putsrcstrn (awk, if (qse_awk_putsrcstrn (awk,
QSE_LDA_DPTR(awk->parse.gbls,i), QSE_LDA_DPTR(awk->parse.gbls,i),

View File

@ -24,9 +24,13 @@
/* these enums should match kwtab in parse.c */ /* these enums should match kwtab in parse.c */
enum qse_awk_kwid_t enum qse_awk_kwid_t
{ {
QSE_AWK_KWID_XABORT,
QSE_AWK_KWID_XGLOBAL,
QSE_AWK_KWID_XINCLUDE,
QSE_AWK_KWID_XLOCAL,
QSE_AWK_KWID_XRESET,
QSE_AWK_KWID_BEGIN, QSE_AWK_KWID_BEGIN,
QSE_AWK_KWID_END, QSE_AWK_KWID_END,
QSE_AWK_KWID_ABORT,
QSE_AWK_KWID_BREAK, QSE_AWK_KWID_BREAK,
QSE_AWK_KWID_CONTINUE, QSE_AWK_KWID_CONTINUE,
QSE_AWK_KWID_DELETE, QSE_AWK_KWID_DELETE,
@ -36,16 +40,13 @@ enum qse_awk_kwid_t
QSE_AWK_KWID_FOR, QSE_AWK_KWID_FOR,
QSE_AWK_KWID_FUNCTION, QSE_AWK_KWID_FUNCTION,
QSE_AWK_KWID_GETLINE, QSE_AWK_KWID_GETLINE,
QSE_AWK_KWID_GLOBAL,
QSE_AWK_KWID_IF, QSE_AWK_KWID_IF,
QSE_AWK_KWID_IN, QSE_AWK_KWID_IN,
QSE_AWK_KWID_LOCAL,
QSE_AWK_KWID_NEXT, QSE_AWK_KWID_NEXT,
QSE_AWK_KWID_NEXTFILE, QSE_AWK_KWID_NEXTFILE,
QSE_AWK_KWID_NEXTOFILE, QSE_AWK_KWID_NEXTOFILE,
QSE_AWK_KWID_PRINT, QSE_AWK_KWID_PRINT,
QSE_AWK_KWID_PRINTF, QSE_AWK_KWID_PRINTF,
QSE_AWK_KWID_RESET,
QSE_AWK_KWID_RETURN, QSE_AWK_KWID_RETURN,
QSE_AWK_KWID_WHILE QSE_AWK_KWID_WHILE
}; };

View File

@ -482,8 +482,7 @@ static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde)
if (px->id.idxa != (qse_size_t)-1) if (px->id.idxa != (qse_size_t)-1)
{ {
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
!(awk->opt.trait & QSE_AWK_IMPLICIT))
{ {
/* no implicit(named) variable is allowed. /* no implicit(named) variable is allowed.
* use the actual name */ * use the actual name */
@ -524,8 +523,7 @@ static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde)
if (px->id.idxa != (qse_size_t)-1) if (px->id.idxa != (qse_size_t)-1)
{ {
if ((awk->opt.trait & QSE_AWK_EXPLICIT) && if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
!(awk->opt.trait & QSE_AWK_IMPLICIT))
{ {
/* no implicit(named) variable is allowed. /* no implicit(named) variable is allowed.
* use the actual name */ * use the actual name */
@ -744,7 +742,8 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (px->nlcls > 0) if (px->nlcls > 0)
{ {
PRINT_TABS (awk, depth + 1); PRINT_TABS (awk, depth + 1);
qse_awk_getkwname (awk, QSE_AWK_KWID_LOCAL, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_XLOCAL, &kw);
PUT_SRCSTRN (awk, kw.ptr, kw.len); PUT_SRCSTRN (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ")); PUT_SRCSTR (awk, QSE_T(" "));
@ -973,14 +972,14 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (px->val == QSE_NULL) if (px->val == QSE_NULL)
{ {
qse_awk_getkwname (awk, (px->abort? QSE_AWK_KWID_ABORT: QSE_AWK_KWID_EXIT), &kw); qse_awk_getkwname (awk, (px->abort? QSE_AWK_KWID_XABORT: QSE_AWK_KWID_EXIT), &kw);
PUT_SRCSTRN (awk, kw.ptr, kw.len); PUT_SRCSTRN (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";")); PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk); PUT_NL (awk);
} }
else else
{ {
qse_awk_getkwname (awk, (px->abort? QSE_AWK_KWID_ABORT: QSE_AWK_KWID_EXIT), &kw); qse_awk_getkwname (awk, (px->abort? QSE_AWK_KWID_XABORT: QSE_AWK_KWID_EXIT), &kw);
PUT_SRCSTRN (awk, kw.ptr, kw.len); PUT_SRCSTRN (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ")); PUT_SRCSTR (awk, QSE_T(" "));
QSE_ASSERT (px->val->next == QSE_NULL); QSE_ASSERT (px->val->next == QSE_NULL);
@ -1032,7 +1031,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_RESET: case QSE_AWK_NDE_RESET:
{ {
PRINT_TABS (awk, depth); PRINT_TABS (awk, depth);
qse_awk_getkwname (awk, QSE_AWK_KWID_RESET, &kw); qse_awk_getkwname (awk, QSE_AWK_KWID_XRESET, &kw);
PUT_SRCSTRN (awk, kw.ptr, kw.len); PUT_SRCSTRN (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ")); PUT_SRCSTR (awk, QSE_T(" "));
qse_awk_prnpt (awk, ((qse_awk_nde_reset_t*)p)->var); qse_awk_prnpt (awk, ((qse_awk_nde_reset_t*)p)->var);

View File

@ -449,7 +449,7 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
return -1; return -1;
} }
fd = socket (SOCKADDR_FAMILY(&addr), SOCK_STREAM, IPPROTO_TCP); fd = socket (qse_skadfamily(&addr), SOCK_STREAM, IPPROTO_TCP);
if (fd <= -1) goto oops; if (fd <= -1) goto oops;
#if defined(FD_CLOEXEC) #if defined(FD_CLOEXEC)
@ -518,7 +518,7 @@ IP_TRANSPRENT is needed for:
if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1) if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1)
{ {
#if defined(IPV6_V6ONLY) #if defined(IPV6_V6ONLY)
if (errno == EADDRINUSE && SOCKADDR_FAMILY(&addr) == AF_INET6) if (errno == EADDRINUSE && qse_skadfamily(&addr) == AF_INET6)
{ {
int on = 1; int on = 1;
setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on));
@ -682,7 +682,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
return -1; return -1;
} }
fd = socket (SOCKADDR_FAMILY(&connaddr), SOCK_STREAM, IPPROTO_TCP); fd = socket (qse_skadfamily(&connaddr), SOCK_STREAM, IPPROTO_TCP);
if (fd <= -1) goto oops; if (fd <= -1) goto oops;
#if defined(IP_TRANSPARENT) #if defined(IP_TRANSPARENT)

View File

@ -7,10 +7,10 @@ function a (x) { print x; }
BEGIN { BEGIN {
{ {
local a; @local a;
a = 50; a = 50;
{ {
local a; @local a;
a = 30; a = 30;
print a; print a;
} }

View File

@ -1,5 +1,5 @@
# #
# a global variable can not have the same name as a function name # a global variable can not have the same name as a function name
# #
global a; @global a;
function a () { } function a () { }

View File

@ -9,7 +9,7 @@ function fn ()
return a; return a;
} }
global a; @global a;
BEGIN { BEGIN {
a = 30 a = 30

View File

@ -2,15 +2,15 @@
# a local variable can shade a global variable # a local variable can shade a global variable
# #
global x; @global x;
BEGIN { BEGIN {
x = 1; x = 1;
{ {
local x; @local x;
x = 2; x = 2;
{ {
local x; @local x;
x = 3; x = 3;
print x; print x;
} }

View File

@ -3,7 +3,7 @@ function a (a) {
} }
BEGIN { BEGIN {
local a; @local a;
a = 20; a = 20;
} }

View File

@ -1,4 +1,4 @@
global ARGV; @global ARGV;
BEGIN { BEGIN {
print ARGC; print ARGC;

View File

@ -1,2 +1,2 @@
global + ; @global + ;

View File

@ -1,5 +1,5 @@
BEGIN { BEGIN {
local +; @local +;
} }

View File

@ -1,5 +1,5 @@
BEGIN { BEGIN {
local a; @local a;
a = 21; a = 21;
print a > 20? 1 2; print a > 20? 1 2;

View File

@ -1,5 +1,5 @@
BEGIN { BEGIN {
local a; @local a;
a = 21; a = 21;
print a > 20? 1 : 2; print a > 20? 1 : 2;

View File

@ -2,11 +2,11 @@
function abc () function abc ()
{ {
local x; @local x;
print x = 20; print x = 20;
{ {
local abc; @local abc;
abc = 30; abc = 30;
print abc; print abc;

View File

@ -130,11 +130,11 @@ PROGS="
lang-002.awk!!!--newline=on -d- lang-002.awk!!!--newline=on -d-
lang-003.awk!!!--newline=on -d- lang-003.awk!!!--newline=on -d-
lang-004.awk!!!--newline=on -d- lang-004.awk!!!--newline=on -d-
lang-005.awk!!!--implicit=off --explicit=on --newline=on -d- lang-005.awk!!!--implicit=off --newline=on -d-
lang-006.awk!!!--implicit=off --explicit=on --newline=on -d- lang-006.awk!!!--implicit=off --newline=on -d-
lang-007.awk!!!--implicit=on --explicit=on --newline=on -d- lang-007.awk!!!--implicit=on --newline=on -d-
lang-008.awk!!!--implicit=off --explicit=on --newline=on -d- lang-008.awk!!!--implicit=off --newline=on -d-
lang-009.awk!lang-009.awk!!--implicit=off --explicit=on --newline=on --strictnaming=off -d- lang-009.awk!lang-009.awk!!--implicit=off --newline=on --strictnaming=off -d-
lang-010.awk!this is just a test!!--newline=on -d- lang-010.awk!this is just a test!!--newline=on -d-
lang-011.awk!!!--newline=on -d- lang-011.awk!!!--newline=on -d-
lang-012.awk!!!--newline=on -d- lang-012.awk!!!--newline=on -d-
@ -144,18 +144,18 @@ PROGS="
lang-016.awk!!!--newline=on -d- lang-016.awk!!!--newline=on -d-
lang-017.awk!!!--newline=on -d- lang-017.awk!!!--newline=on -d-
lang-017.awk!!!--call main --newline=on -d- lang-017.awk!!!--call main --newline=on -d-
lang-018.awk!!!--explicit=on --newline=on -d- lang-018.awk!!!--newline=on -d-
lang-019.awk!!!--explicit=on --newline=on -d- lang-019.awk!!!--newline=on -d-
lang-020.awk!!!--explicit=on --newline=on -d- lang-020.awk!!!--newline=on -d-
lang-021.awk!!!--explicit=on --newline=on -d- lang-021.awk!!!--newline=on -d-
lang-022.awk!!!--newline=on -d- lang-022.awk!!!--newline=on -d-
lang-023.awk!!!--explicit=on --newline=on -d- lang-023.awk!!!--newline=on -d-
lang-024.awk!!!--explicit=on --newline=on -d- lang-024.awk!!!--newline=on -d-
lang-025.awk!!!--newline=on -d- lang-025.awk!!!--newline=on -d-
lang-026.awk!!!--newline=on -d- lang-026.awk!!!--newline=on -d-
lang-027.awk!!!--newline=on -d- lang-027.awk!!!--newline=on -d-
lang-028.awk!!!--newline=on -d- lang-028.awk!!!--newline=on -d-
lang-029.awk!!!--explicit=on --newline=on -d- lang-029.awk!!!--newline=on -d-
lang-030.awk!!!--newline=on -d- lang-030.awk!!!--newline=on -d-
lang-031.awk!!!--newline=on -d- lang-031.awk!!!--newline=on -d-
lang-032.awk!!!--newline=on -d- lang-032.awk!!!--newline=on -d-