qse/qse/lib/awk/awk.h

386 lines
6.8 KiB
C
Raw Normal View History

/*
* $Id: awk.h 127 2009-05-07 13:15:04Z hyunghwan.chung $
*
2009-02-04 08:39:21 +00:00
Copyright 2006-2009 Chung, Hyung-Hwan.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
2008-12-21 21:35:07 +00:00
#ifndef _QSE_LIB_AWK_AWK_H_
#define _QSE_LIB_AWK_AWK_H_
2008-08-19 05:21:48 +00:00
#include "../cmn/mem.h"
#include <qse/cmn/chr.h>
2008-12-21 21:35:07 +00:00
#include <qse/cmn/str.h>
#include <qse/cmn/map.h>
#include <qse/cmn/lda.h>
#include <qse/cmn/rex.h>
2008-12-21 21:35:07 +00:00
typedef struct qse_awk_chain_t qse_awk_chain_t;
typedef struct qse_awk_tree_t qse_awk_tree_t;
2008-12-21 21:35:07 +00:00
#include <qse/awk/awk.h>
#include <qse/cmn/chr.h>
2008-06-07 04:33:44 +00:00
#include "tree.h"
#include "fnc.h"
2008-06-07 04:33:44 +00:00
#include "parse.h"
#include "run.h"
2009-02-16 08:31:34 +00:00
#include "rio.h"
#include "val.h"
2008-06-07 04:33:44 +00:00
#include "misc.h"
#define QSE_AWK_MAX_GBLS 9999
#define QSE_AWK_MAX_LCLS 9999
2008-12-21 21:35:07 +00:00
#define QSE_AWK_MAX_PARAMS 9999
#define QSE_AWK_ALLOC(awk,size) QSE_MMGR_ALLOC((awk)->mmgr,size)
#define QSE_AWK_REALLOC(awk,ptr,size) QSE_MMGR_REALLOC((awk)->mmgr,ptr,size)
#define QSE_AWK_FREE(awk,ptr) QSE_MMGR_FREE((awk)->mmgr,ptr)
#define QSE_AWK_ISUPPER(awk,c) QSE_ISUPPER(c)
#define QSE_AWK_ISLOWER(awk,c) QSE_ISLOWER(c)
#define QSE_AWK_ISALPHA(awk,c) QSE_ISALPHA(c)
#define QSE_AWK_ISDIGIT(awk,c) QSE_ISDIGIT(c)
#define QSE_AWK_ISXDIGIT(awk,c) QSE_ISXDIGIT(c)
#define QSE_AWK_ISALNUM(awk,c) QSE_ISALNUM(c)
#define QSE_AWK_ISSPACE(awk,c) QSE_ISSPACE(c)
#define QSE_AWK_ISPRINT(awk,c) QSE_ISPRINT(c)
#define QSE_AWK_ISGRAPH(awk,c) QSE_ISGRAPH(c)
#define QSE_AWK_ISCNTRL(awk,c) QSE_ISCNTRL(c)
#define QSE_AWK_ISPUNCT(awk,c) QSE_ISPUNCT(c)
#define QSE_AWK_TOUPPER(awk,c) QSE_TOUPPER(c)
#define QSE_AWK_TOLOWER(awk,c) QSE_TOLOWER(c)
2008-12-21 21:35:07 +00:00
#define QSE_AWK_STRDUP(awk,str) (qse_strdup(str,(awk)->mmgr))
#define QSE_AWK_STRXDUP(awk,str,len) (qse_strxdup(str,len,(awk)->mmgr))
struct qse_awk_tree_t
{
2009-02-03 03:54:32 +00:00
qse_size_t ngbls; /* total number of globals */
qse_size_t ngbls_base; /* number of intrinsic globals */
qse_cstr_t cur_fun;
qse_map_t* funs; /* awk function map */
2007-12-05 08:13:38 +00:00
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* begin;
qse_awk_nde_t* begin_tail;
2007-12-05 08:13:38 +00:00
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* end;
qse_awk_nde_t* end_tail;
2007-12-05 08:13:38 +00:00
2008-12-21 21:35:07 +00:00
qse_awk_chain_t* chain;
qse_awk_chain_t* chain_tail;
qse_size_t chain_size; /* number of nodes in the chain */
2007-12-05 08:13:38 +00:00
int ok;
};
2008-12-21 21:35:07 +00:00
struct qse_awk_t
{
2009-02-17 02:11:31 +00:00
/* memory manager */
qse_mmgr_t* mmgr;
2009-02-17 02:11:31 +00:00
/* primitive functions */
qse_awk_prm_t prm;
2008-07-20 23:53:29 +00:00
/* options */
int option;
/* word table */
2008-12-21 21:35:07 +00:00
qse_map_t* wtab;
/* reverse word table */
2008-12-21 21:35:07 +00:00
qse_map_t* rwtab;
/* parse tree */
2008-12-21 21:35:07 +00:00
qse_awk_tree_t tree;
/* temporary information that the parser needs */
struct
{
struct
{
int block;
int loop;
int stmnt; /* statement */
} id;
struct
{
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t block;
qse_size_t loop;
qse_size_t expr; /* expression */
} cur;
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t block;
qse_size_t expr;
} max;
} depth;
2007-12-12 08:05:58 +00:00
/* function calls */
qse_map_t* funs;
/* named variables */
2008-12-21 21:35:07 +00:00
qse_map_t* named;
2007-12-12 08:05:58 +00:00
/* global variables */
qse_lda_t* gbls;
2007-12-12 08:05:58 +00:00
/* local variables */
qse_lda_t* lcls;
2007-12-12 08:05:58 +00:00
/* parameters to a function */
2008-12-21 21:35:07 +00:00
qse_lda_t* params;
2007-12-12 08:05:58 +00:00
/* maximum number of local variables */
qse_size_t nlcls_max;
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* (*parse_block) (
qse_awk_t*,qse_size_t,qse_bool_t);
2007-12-12 08:05:58 +00:00
} parse;
/* source code management */
struct
{
qse_awk_sio_t ios;
struct
{
2008-12-21 21:35:07 +00:00
qse_cint_t curc;
qse_cint_t ungotc[5];
qse_size_t ungotc_line[5];
qse_size_t ungotc_column[5];
qse_size_t ungotc_count;
qse_size_t line;
qse_size_t column;
} lex;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t buf[512];
qse_size_t buf_pos;
qse_size_t buf_len;
} shared;
} src;
/* token */
struct
{
struct
{
int type;
2008-12-21 21:35:07 +00:00
qse_size_t line;
qse_size_t column;
} prev;
int type;
2008-12-21 21:35:07 +00:00
qse_str_t* name;
qse_size_t line;
qse_size_t column;
} token;
/* intrinsic functions */
struct
{
qse_awk_fnc_t* sys;
2008-12-21 21:35:07 +00:00
qse_map_t* user;
} fnc;
struct
{
struct
{
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t block;
qse_size_t expr;
} max;
} depth;
} run;
struct
{
struct
{
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t build;
qse_size_t match;
} max;
} depth;
} rex;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t fmt[1024];
} tmp;
/* housekeeping */
2008-02-13 01:57:21 +00:00
int errnum;
2008-12-21 21:35:07 +00:00
qse_size_t errlin;
qse_char_t errmsg[256];
qse_char_t* errstr[QSE_AWK_NUMERRNUM];
2008-12-21 21:35:07 +00:00
qse_bool_t stopall;
};
2008-12-21 21:35:07 +00:00
struct qse_awk_chain_t
{
2008-12-21 21:35:07 +00:00
qse_awk_nde_t* pattern;
qse_awk_nde_t* action;
qse_awk_chain_t* next;
};
struct qse_awk_rtx_t
{
int id;
2008-12-21 21:35:07 +00:00
qse_map_t* named;
void** stack;
2008-12-21 21:35:07 +00:00
qse_size_t stack_top;
qse_size_t stack_base;
qse_size_t stack_limit;
int exit_level;
2008-12-21 21:35:07 +00:00
qse_awk_val_ref_t* fcache[128];
/*qse_awk_val_str_t* scache32[128];
qse_awk_val_str_t* scache64[128];*/
qse_size_t fcache_count;
/*qse_size_t scache32_count;
qse_size_t scache64_count;*/
2008-01-16 21:46:08 +00:00
struct
{
2008-12-21 21:35:07 +00:00
qse_awk_val_int_t* ifree;
qse_awk_val_chunk_t* ichunk;
qse_awk_val_real_t* rfree;
qse_awk_val_chunk_t* rchunk;
2008-01-16 21:46:08 +00:00
} vmgr;
2008-01-16 08:03:41 +00:00
2008-12-21 21:35:07 +00:00
qse_awk_nde_blk_t* active_block;
qse_byte_t* pattern_range_state;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t buf[1024];
qse_size_t buf_pos;
qse_size_t buf_len;
qse_bool_t eof;
2008-12-21 21:35:07 +00:00
qse_str_t line;
qse_awk_val_t* d0; /* $0 */
2008-12-21 21:35:07 +00:00
qse_size_t maxflds;
qse_size_t nflds; /* NF */
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
qse_awk_val_t* val; /* $1 .. $NF */
}* flds;
} inrec;
struct
{
void* rs;
void* fs;
int ignorecase;
2008-12-21 21:35:07 +00:00
qse_long_t nr;
qse_long_t fnr;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
} convfmt;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
} ofmt;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
} ofs;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
} ors;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len;
} subsep;
} gbl;
2009-02-16 08:31:34 +00:00
/* rio chain */
struct
{
2009-02-16 08:31:34 +00:00
qse_awk_riof_t handler[QSE_AWK_RIO_NUM];
qse_awk_riod_t* chain;
} rio;
struct
{
2008-12-21 21:35:07 +00:00
qse_str_t fmt;
qse_str_t out;
struct
{
2008-12-21 21:35:07 +00:00
qse_char_t* ptr;
qse_size_t len; /* length */
qse_size_t inc; /* increment */
} tmp;
} format;
struct
{
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t block;
qse_size_t expr; /* expression */
} cur;
struct
{
2008-12-21 21:35:07 +00:00
qse_size_t block;
qse_size_t expr;
} max;
} depth;
2008-02-13 01:57:21 +00:00
int errnum;
2008-12-21 21:35:07 +00:00
qse_size_t errlin;
qse_char_t errmsg[256];
2008-12-21 21:35:07 +00:00
qse_awk_t* awk;
qse_awk_rcb_t rcb;
};
2008-03-04 03:31:41 +00:00
2008-12-21 21:35:07 +00:00
#define QSE_AWK_FREEREX(awk,code) qse_freerex((awk)->mmgr,code)
#define QSE_AWK_ISEMPTYREX(awk,code) qse_isemptyrex(code)
#define QSE_AWK_BUILDREX(awk,ptn,len,errnum) \
qse_awk_buildrex(awk,ptn,len,errnum)
#define QSE_AWK_MATCHREX(awk,code,option,str,len,match_ptr,match_len,errnum) \
qse_awk_matchrex(awk,code,option,str,len,match_ptr,match_len,errnum)
2008-03-04 03:31:41 +00:00
#endif