diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2012-05-07 23:44:31 -0400 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2012-05-07 23:44:31 -0400 |
commit | 96d7539b12aa96f85280be1ebbb933e951046cff (patch) | |
tree | 58a9fe214175dbe51e52c7423498791e74ff7144 /gawkapi.h | |
parent | 7e83cf5fd642b233a8d7af72b092e0c9bab29647 (diff) | |
download | egawk-96d7539b12aa96f85280be1ebbb933e951046cff.tar.gz egawk-96d7539b12aa96f85280be1ebbb933e951046cff.tar.bz2 egawk-96d7539b12aa96f85280be1ebbb933e951046cff.zip |
Copy new gawkapi.h from xgawk branch.
Diffstat (limited to 'gawkapi.h')
-rw-r--r-- | gawkapi.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/gawkapi.h b/gawkapi.h new file mode 100644 index 00000000..e51dccef --- /dev/null +++ b/gawkapi.h @@ -0,0 +1,216 @@ +/* + * gawkpi.h -- Definitions for use by extension functions calling into gawk. + */ + +/* + * Copyright (C) 2012, the Free Software Foundation, Inc. + * + * This file is part of GAWK, the GNU implementation of the + * AWK Programming Language. + * + * GAWK is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * GAWK 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* + * N.B. You must include <sys/types.h> and <sys/stat.h> + * before including this file! + */ + +#ifndef _GAWK_API_H +#define _GAWK_API_H + + /* Allow the use in C++ code. */ +#ifdef __cplusplus + extern "C" { +#endif + + typedef struct iobuf { + const char *name; /* filename */ + int fd; /* file descriptor */ + struct stat sbuf; /* stat buf */ + char *buf; /* start data buffer */ + char *off; /* start of current record in buffer */ + char *dataend; /* first byte in buffer to hold new data, + NULL if not read yet */ + char *end; /* end of buffer */ + size_t readsize; /* set from fstat call */ + size_t size; /* buffer size */ + ssize_t count; /* amount read last time */ + size_t scanoff; /* where we were in the buffer when we had + to regrow/refill */ + /* + * No argument prototype on read_func. See get_src_buf() + * in awkgram.y. + */ + ssize_t (*read_func)(); + + void *opaque; /* private data for open hooks */ + int (*get_record)(char **out, struct iobuf *, int *errcode); + void (*close_func)(struct iobuf *); /* open and close hooks */ + + int errcode; + + int flag; +# define IOP_IS_TTY 1 +# define IOP_NOFREE_OBJ 2 +# define IOP_AT_EOF 4 +# define IOP_CLOSED 8 +# define IOP_AT_START 16 + } IOBUF; + +#define GAWK_API_MAJOR_VERSION 0 +#define GAWK_API_MINOR_VERSION 0 + +#define DO_FLAGS_SIZE 6 + + typedef enum { + AWK_UNDEFINED, + AWK_NUMBER, + AWK_CONST_STRING, + AWK_STRING, + AWK_ARRAY + } awk_valtype_t; + + typedef struct { + const char *const str; + const size_t len; + } awk_const_string_t; + + typedef struct { + char *str; + size_t len; + } awk_string_t; + + typedef struct { + awk_valtype_t val_type; + union { + awk_const_string cs; + awk_string s; + double d; + void* a; + } u; +#define const_str_val u.cs +#define str_val u.s +#define num_val u.d +#define array_cookie u.a + } awk_value_t; + + + typedef struct { + const char *name; + size_t num_args; + void (*function)(int num_args); + } awk_ext_func_t; + + typedef struct gawk_api { + int major_version; + int minor_version; + + int do_flags[DO_FLAGS_SIZE]; + /* Use these as indices into do_flags[] array to check the values */ +#define gawk_do_lint 0 +#define gawk_do_traditional 1 +#define gawk_do_profile 2 +#define gawk_do_sandbox 3 +#define gawk_do_debug 4 +#define gawk_do_mpfr 5 + + /* get the number of arguments passed in function call */ + /* FIXME: Needed? Won't we pass the count in the real call? */ + size_t (*get_curfunc_arg_count)(void *ext_id); + awk_value_t *(*get_curfunc_param)(void *ext_id, size_t count); + + /* functions to print messages */ + void (*fatal)(void *ext_id, const char *format, ...); + void (*warning)(void *ext_id, const char *format, ...); + void (*lintwarn)(void *ext_id, const char *format, ...); + + /* register an open hook; for opening files read-only */ + int (*register_open_hook)(void *ext_id, + void* (*open_func)(IOBUF *)); + + /* functions to update ERRNO */ + void (*update_ERRNO_int)(void *ext_id, int); + void (*update_ERRNO_string)(void *ext_id, const char *string, + int translate); + void (*unset_ERRNO)(void *ext_id); + + /* check if a value received from gawk is the null string */ + int (*is_null_string)(void *ext_id, void *value); + + /* add a function to the interpreter */ + int *(add_ext_func)(void *ext_id, const awk_ext_func_t *func); + + /* add an exit call back */ + void (*awk_atexit)(void *ext_id, void (*funcp)(void *data, int exit_status), void *arg0); + + /* Symbol table access */ + awk_value_t *(*sym_lookup)(void *ext_id, const char *name); + int (*sym_update)(void *ext_id, const char *name, awk_value_t *value); + int (*sym_remove)(void *ext_id, const char *name); + + /* Array management */ + awk_value_t *(*get_array_element)(void *ext_id, void *a_cookie, const awk_value_t* const index); + awk_value_t *(*set_array_element)(void *ext_id, void *a_cookie, + const awk_value_t* const index, const awk_value_t* const value); + awk_value_t *(*del_array_element)(void *ext_id, void *a_cookie, const awk_value_t* const index); + size_t (*get_element_count)(void *ext_id, void *a_cookie); + + } gawk_api_t; + +#ifndef GAWK /* these are not for the gawk code itself */ + /* + * Use these if you want to define a "global" variable named api + * to make the code a little easier to read. + */ +#define do_lint api->do_flags[gawk_do_lint] +#define do_traditional api->do_flags[gawk_do_traditional] +#define do_profile api->do_flags[gawk_do_profile] +#define do_sandbox api->do_flags[gawk_do_sandbox] +#define do_debug api->do_flags[gawk_do_debug] + +#define get_curfunc_arg_count api->get_curfunc_arg_count +#define get_curfunc_param api->get_curfunc_param + +#define fatal api->fatal +#define warning api->warning +#define lintwarn api->lintwarn + +#define register_open_hook api->register_open_hook + +#define update_ERRNO_int api->update_ERRNO_int +#define update_ERRNO_string api->update_ERRNO_string +#define unset_ERRNO api->unset_ERRNO + +#define is_null_string api->is_null_string + +#define add_ext_func api->add_ext_func +#define awk_atexit api->awk_atexit + +#define sym_lookup api->sym_lookup +#define sym_update api->sym_update +#define sym_remove api->sym_remove + +#define get_array_element api->get_array_element +#define set_array_element api->set_array_element +#define del_array_element api->del_array_element +#define get_element_count api->get_element_count +#endif /* GAWK */ + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* _GAWK_API_H */ |