.title ASEAWK == ASEAWK == ASE provides an embeddable processor of a dialect of the AWK programming language. The language implemented is slightly different from {the version developed by Brian W. Kernighan, http://cm.bell-labs.com/cm/cs/awkbook/index.html} and has been adjusted to the author's preference. === Overview === The following code fragment illustrates the basic steps of embedding the processor. {{{ 1) #include 2) ase_awk_t* awk; 3) awk = ase_awk_open (...); 4) if (ase_awk_parse (awk, ...) == -1) { /* parse error */ } else { 5) if (ase_awk_run (awk, ...) == -1) { /* run-time error */ } } 6) ase_awk_close (awk); }}} ((( * Most of the functions and data types needed are defined in the header file ##ase/awk/awk.h##. * ##ase_awk_t## represents the processor. However, the internal representation is not exposed. * ##ase_awk_open## creates the processor instance. * ##ase_awk_parse## parses an AWK script. * ##ase_awk_run## executes the script parsed. * ##ase_awk_close## destroys the processor instance. ))) An embedding example is available in ##ase/test/awk/awk.c##. Refer to the sample code along with this document for more information. === Primitive Functions === A set of primitive functions is needed to create an instance of the AWK processor. A primitive function is a user-defined function to help the library perform system-dependent operations such as memory allocation, character class handling, etc. {{{ struct ase_awk_prmfns_t { ase_mmgr_t mmgr; ase_ccls_t ccls; struct { ase_awk_pow_t pow; ase_awk_sprintf_t sprintf; ase_awk_dprintf_t dprintf; void* custom_data; } misc; }; }}} A caller of ##ase_awk_open## should fill in most of the fields of a ##ase_awk_prmfns_t## structure and pass the structure to it. The function pointers in the miscellaneous group labeled [misc] is defined as follows: {{{ /* returns the value of x raised to the power of y */ typedef ase_real_t (*ase_awk_pow_t) (void* custom, ase_real_t x, ase_real_t y); /* similar to snprintf of the standard C library. */ typedef int (*ase_awk_sprintf_t) ( void* custom, ase_char_t* buf, ase_size_t size, const ase_char_t* fmt, ...); /* similar to printf of the standard C library. called by a few uncommonly * used output functions usually for debugging purpose */ typedef void (*ase_awk_dprintf_t) ( void* custom, const ase_char_t* fmt, ...); }}} The fourth field of the group is passed to its member functions as the first argument on invocation. The function pointed by the ##sprintf## field should ensure that the resuliting string is null-terminated and ##%s## and ##%c## are accepted for the ##ase_char_t*## and ##ase_char_t## type respectively regardless the character mode. The memory manager group labeled [mmgr] and the character class group labled [ccls] are defined as follows: {{{ typedef void* (*ase_malloc_t) (void* custom, ase_size_t n); typedef void* (*ase_realloc_t) (void* custom, void* ptr, ase_size_t n); typedef void (*ase_free_t) (void* custom, void* ptr); typedef ase_bool_t (*ase_isccls_t) (void* custom, ase_cint_t c); typedef ase_cint_t (*ase_toccls_t) (void* custom, ase_cint_t c); struct ase_mmgr_t { ase_malloc_t malloc; ase_realloc_t realloc; ase_free_t free; void* custom_data; }; struct ase_ccls_t { ase_isccls_t is_upper; ase_isccls_t is_lower; ase_isccls_t is_alpha; ase_isccls_t is_digit; ase_isccls_t is_xdigit; ase_isccls_t is_alnum; ase_isccls_t is_space; ase_isccls_t is_print; ase_isccls_t is_graph; ase_isccls_t is_cntrl; ase_isccls_t is_punct; ase_toccls_t to_upper; ase_toccls_t to_lower; void* custom_data; }; }}} The functions in these groups perform the memory operations and character class related operations respectively. They follow the style of the memory allocation functions and character class handling functions of the standard C library except that they accept a pointer to the user-defined data as the first argument, thus providing more flexibility. The pointer to the user-defined data is specified into the ##custom_data## field of each group. The ##realloc## field, however, can be ##ASE_NULL##, in which case the functions pointed by the free and the malloc field replace the role of the function pointed by the ##realloc## field. === Source IO Handler === ase_awk_srcio_t The source code is read in with the source input handler provided. The optional source output handler writes the generated source code. === External IO Handler === ase_awk_extio_t External IO handlers should be provided to support the AWK's built-in IO facilities. === Reference Manual === [[[ * {Reference Manual,awk-ref-en.html} ]]]