qse/qse/lib/awk/tree.h

324 lines
7.0 KiB
C
Raw Normal View History

/*
2012-08-16 03:47:55 +00:00
* $Id$
*
2013-12-31 10:24:12 +00:00
Copyright 2006-2014 Chung, Hyung-Hwan.
2009-09-16 04:01:02 +00:00
This file is part of QSE.
2009-09-16 04:01:02 +00:00
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
2009-09-16 04:01:02 +00:00
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
2009-09-16 04:01:02 +00:00
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
2008-12-21 21:35:07 +00:00
#ifndef _QSE_LIB_AWK_TREE_H_
#define _QSE_LIB_AWK_TREE_H_
2008-12-21 21:35:07 +00:00
enum qse_awk_in_type_t
{
/* the order of these values match
2009-02-16 08:31:34 +00:00
* __in_type_map and __in_opt_map in rio.c */
2008-12-21 21:35:07 +00:00
QSE_AWK_IN_PIPE,
QSE_AWK_IN_RWPIPE,
2008-12-21 21:35:07 +00:00
QSE_AWK_IN_FILE,
QSE_AWK_IN_CONSOLE
};
2008-12-21 21:35:07 +00:00
enum qse_awk_out_type_t
{
/* the order of these values match
2009-02-16 08:31:34 +00:00
* __out_type_map and __out_opt_map in rio.c */
2008-12-21 21:35:07 +00:00
QSE_AWK_OUT_PIPE,
QSE_AWK_OUT_RWPIPE, /* dual direction pipe */
2008-12-21 21:35:07 +00:00
QSE_AWK_OUT_FILE,
QSE_AWK_OUT_APFILE, /* file for appending */
2008-12-21 21:35:07 +00:00
QSE_AWK_OUT_CONSOLE
};
2008-12-21 21:35:07 +00:00
typedef struct qse_awk_nde_blk_t qse_awk_nde_blk_t;
typedef struct qse_awk_nde_grp_t qse_awk_nde_grp_t;
typedef struct qse_awk_nde_ass_t qse_awk_nde_ass_t;
typedef struct qse_awk_nde_exp_t qse_awk_nde_exp_t;
typedef struct qse_awk_nde_cnd_t qse_awk_nde_cnd_t;
typedef struct qse_awk_nde_pos_t qse_awk_nde_pos_t;
typedef struct qse_awk_nde_int_t qse_awk_nde_int_t;
typedef struct qse_awk_nde_flt_t qse_awk_nde_flt_t;
2008-12-21 21:35:07 +00:00
typedef struct qse_awk_nde_str_t qse_awk_nde_str_t;
typedef struct qse_awk_nde_rex_t qse_awk_nde_rex_t;
typedef struct qse_awk_nde_var_t qse_awk_nde_var_t;
typedef struct qse_awk_nde_fncall_t qse_awk_nde_fncall_t;
2008-12-21 21:35:07 +00:00
typedef struct qse_awk_nde_getline_t qse_awk_nde_getline_t;
typedef struct qse_awk_nde_if_t qse_awk_nde_if_t;
typedef struct qse_awk_nde_while_t qse_awk_nde_while_t;
typedef struct qse_awk_nde_for_t qse_awk_nde_for_t;
typedef struct qse_awk_nde_foreach_t qse_awk_nde_foreach_t;
typedef struct qse_awk_nde_break_t qse_awk_nde_break_t;
typedef struct qse_awk_nde_continue_t qse_awk_nde_continue_t;
typedef struct qse_awk_nde_return_t qse_awk_nde_return_t;
typedef struct qse_awk_nde_exit_t qse_awk_nde_exit_t;
typedef struct qse_awk_nde_next_t qse_awk_nde_next_t;
typedef struct qse_awk_nde_nextfile_t qse_awk_nde_nextfile_t;
typedef struct qse_awk_nde_delete_t qse_awk_nde_delete_t;
typedef struct qse_awk_nde_reset_t qse_awk_nde_reset_t;
typedef struct qse_awk_nde_print_t qse_awk_nde_print_t;
/* QSE_AWK_NDE_BLK - block statement including top-level blocks */
struct qse_awk_nde_blk_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_size_t nlcls; /* number of local variables */
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* body;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_GRP - expression group */
struct qse_awk_nde_grp_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* body;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_ASS - assignment */
struct qse_awk_nde_ass_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
int opcode;
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* left;
qse_awk_nde_t* right;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_EXP_BIN, QSE_AWK_NDE_EXP_UNR,
* QSE_AWK_NDE_EXP_INCPRE, QSE_AW_NDE_EXP_INCPST */
struct qse_awk_nde_exp_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
int opcode;
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* left;
qse_awk_nde_t* right; /* QSE_NULL for UNR, INCPRE, INCPST */
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_CND */
struct qse_awk_nde_cnd_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* test;
qse_awk_nde_t* left;
qse_awk_nde_t* right;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_POS - positional - $1, $2, $x, etc */
struct qse_awk_nde_pos_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* val;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_INT */
struct qse_awk_nde_int_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_int_t val;
qse_char_t* str;
qse_size_t len;
};
/* QSE_AWK_NDE_FLT */
struct qse_awk_nde_flt_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_flt_t val;
qse_char_t* str;
qse_size_t len;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_STR */
struct qse_awk_nde_str_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_char_t* ptr;
2008-12-21 21:35:07 +00:00
qse_size_t len;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_REX */
struct qse_awk_nde_rex_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
2014-07-08 14:30:42 +00:00
qse_cstr_t str;
void* code[2]; /* [0]: case sensitive, [1]: case insensitive */
};
/* QSE_AWK_NDE_NAMED, QSE_AWK_NDE_GBL,
* QSE_AWK_NDE_LCL, QSE_AWK_NDE_ARG
* QSE_AWK_NDE_NAMEDIDX, QSE_AWK_NDE_GBLIDX,
* QSE_AWK_NDE_LCLIDX, QSE_AWK_NDE_ARGIDX */
2008-12-21 21:35:07 +00:00
struct qse_awk_nde_var_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
struct
{
2014-07-08 14:30:42 +00:00
qse_cstr_t name;
2008-12-21 21:35:07 +00:00
qse_size_t idxa;
} id;
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* idx; /* QSE_NULL for non-XXXXIDX */
};
/* QSE_AWK_NDE_FNC, QSE_AWK_NDE_FUN */
struct qse_awk_nde_fncall_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
union
{
struct
{
2014-07-08 14:30:42 +00:00
qse_cstr_t name;
} fun;
/* minimum information of a intrinsic function
* needed during run-time. */
struct
{
qse_awk_fnc_info_t info;
qse_awk_fnc_spec_t spec;
} fnc;
} u;
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* args;
qse_size_t nargs;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_GETLINE */
struct qse_awk_nde_getline_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* var;
int in_type; /* QSE_AWK_GETLINE_XXX */
qse_awk_nde_t* in;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_IF */
struct qse_awk_nde_if_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* test;
qse_awk_nde_t* then_part;
qse_awk_nde_t* else_part; /* optional */
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_WHILE, QSE_AWK_NDE_DOWHILE */
struct qse_awk_nde_while_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* test;
qse_awk_nde_t* body;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_FOR */
struct qse_awk_nde_for_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* init; /* optional */
qse_awk_nde_t* test; /* optional */
qse_awk_nde_t* incr; /* optional */
qse_awk_nde_t* body;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_FOREACH */
struct qse_awk_nde_foreach_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* test;
qse_awk_nde_t* body;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_BREAK */
struct qse_awk_nde_break_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_CONTINUE */
struct qse_awk_nde_continue_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_RETURN */
struct qse_awk_nde_return_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* val; /* optional (no return code if QSE_NULL) */
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_EXIT */
struct qse_awk_nde_exit_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* val; /* optional (no exit code if QSE_NULL) */
int abort;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_NEXT */
struct qse_awk_nde_next_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_NEXTFILE */
struct qse_awk_nde_nextfile_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
int out;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_DELETE */
struct qse_awk_nde_delete_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* var;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_RESET */
struct qse_awk_nde_reset_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* var;
};
2008-12-21 21:35:07 +00:00
/* QSE_AWK_NDE_PRINT */
struct qse_awk_nde_print_t
{
2008-12-21 21:35:07 +00:00
QSE_AWK_NDE_HDR;
qse_awk_nde_t* args;
int out_type; /* QSE_AWK_OUT_XXX */
qse_awk_nde_t* out;
};
#ifdef __cplusplus
extern "C" {
#endif
2007-12-08 00:24:28 +00:00
/* print the entire tree */
2008-12-21 21:35:07 +00:00
int qse_awk_prnpt (qse_awk_t* awk, qse_awk_nde_t* tree);
2007-12-08 00:24:28 +00:00
/* print a single top-level node */
2008-12-21 21:35:07 +00:00
int qse_awk_prnnde (qse_awk_t* awk, qse_awk_nde_t* node);
2007-12-08 00:24:28 +00:00
/* print the pattern part */
2008-12-21 21:35:07 +00:00
int qse_awk_prnptnpt (qse_awk_t* awk, qse_awk_nde_t* tree);
2008-12-21 21:35:07 +00:00
void qse_awk_clrpt (qse_awk_t* awk, qse_awk_nde_t* tree);
#ifdef __cplusplus
}
#endif
#endif