home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / gnu / gawk213s.lzh / GAWK213S / AWK.H < prev    next >
C/C++ Source or Header  |  1993-07-29  |  22KB  |  783 lines

  1. /*
  2.  * awk.h -- Definitions for gawk. 
  3.  */
  4.  
  5. /* 
  6.  * Copyright (C) 1986, 1988, 1989, 1991 the Free Software Foundation, Inc.
  7.  * 
  8.  * This file is part of GAWK, the GNU implementation of the
  9.  * AWK Progamming Language.
  10.  * 
  11.  * GAWK is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 1, or (at your option)
  14.  * any later version.
  15.  * 
  16.  * GAWK is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  * 
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with GAWK; see the file COPYING.  If not, write to
  23.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25.  
  26. /* ------------------------------ Includes ------------------------------ */
  27. #include <stdio.h>
  28. #include <ctype.h>
  29. #include <setjmp.h>
  30. #include <varargs.h>
  31. #include <time.h>
  32. #include <errno.h>
  33. #include <signal.h>
  34.  
  35. /* ----------------- System dependencies (with more includes) -----------*/
  36.  
  37. #ifndef VAXC
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40. #else    /* VMS w/ Digital's "VAX C" compiler */
  41. #include <types.h>
  42. #include <stat.h>
  43. #include <file.h>    /* avoid <fcntl.h> in io.c */
  44. #endif    /*VAXC*/
  45.  
  46. #include "config.h"
  47.  
  48. #ifdef __STDC__
  49. #define    P(s)    s
  50. #define MALLOC_ARG_T size_t
  51. #else
  52. #define    P(s)    ()
  53. #define MALLOC_ARG_T unsigned
  54. #define volatile
  55. #define const
  56. #endif
  57.  
  58. #ifndef SIGTYPE
  59. #define SIGTYPE    void
  60. #endif
  61.  
  62. #ifdef SIZE_T_MISSING
  63. typedef unsigned int size_t;
  64. #endif
  65.  
  66. #ifndef SZTC
  67. #define SZTC
  68. #define INTC
  69. #endif
  70.  
  71. #ifdef STDC_HEADERS
  72. #include <stdlib.h>
  73. #include <string.h>
  74. #ifdef NeXT
  75. #include <libc.h>
  76. #undef atof
  77. #else
  78. #if defined(atarist) || defined(VMS)
  79. #include <unixlib.h>
  80. #else
  81. #include <unistd.h>
  82. #endif    /* atarist || VMS */
  83. #endif    /* Next */
  84. #else    /* STDC_HEADERS */
  85. #include "protos.h"
  86. #endif    /* STDC_HEADERS */
  87.  
  88. #if defined(ultrix) && !defined(Ultrix41)
  89. extern char * getenv P((char *name));
  90. extern double atof P((char *s));
  91. #endif
  92.  
  93. #ifdef sparc
  94. /* nasty nasty SunOS-ism */
  95. #include <alloca.h>
  96. #ifdef lint
  97. extern char *alloca();
  98. #endif
  99. #else /* not sparc */
  100. #if (!defined(atarist)) && (!defined(NeXT)) && (!defined(alloca))
  101. extern char *alloca();
  102. #endif /* atarist */
  103. #endif /* sparc */
  104.  
  105. #ifdef HAVE_UNDERSCORE_SETJMP
  106. /* nasty nasty berkelixm */
  107. #define setjmp    _setjmp
  108. #define longjmp    _longjmp
  109. #endif
  110.  
  111. /*
  112.  * if you don't have vprintf, but you are BSD, the version defined in
  113.  * vprintf.c should do the trick.  Otherwise, try this and cross your fingers.
  114.  */
  115. #if defined(VPRINTF_MISSING) && !defined(DOPRNT_MISSING) && !defined(BSDSTDIO)
  116. #define vfprintf(fp,fmt,arg)    _doprnt((fmt), (arg), (fp))
  117. #endif
  118.  
  119. #ifdef VMS
  120. /* some macros to redirect to code in vms/vms_misc.c */
  121. #define exit        vms_exit
  122. #define strerror    vms_strerror
  123. #define strdup        vms_strdup
  124. extern void  exit P((int));
  125. extern char *strerror P((int));
  126. extern char *strdup P((const char *str));
  127. # ifndef NO_TTY_FWRITE
  128. #define fwrite        tty_fwrite
  129. #define fclose        tty_fclose
  130. extern size_t fwrite P((const void *,size_t,size_t,FILE *));
  131. extern int    fclose P((FILE *));
  132. # endif
  133. extern void vms_arg_fixup P((int *,char ***));
  134. #endif  /*VMS*/
  135.  
  136. #ifndef _MSC_VER
  137. extern int errno;    /* not necessary on many systems, but it can't hurt */
  138. #endif
  139.  
  140. #define    GNU_REGEX
  141. #ifdef GNU_REGEX
  142. #include "regex.h"
  143. #include "dfa.h"
  144. typedef struct Regexp {
  145.     struct re_pattern_buffer pat;
  146.     struct re_registers regs;
  147.     struct regexp dfareg;
  148.     int dfa;
  149. } Regexp;
  150. #define    RESTART(rp,s)    (rp)->regs.start[0]
  151. #define    REEND(rp,s)    (rp)->regs.end[0]
  152. #else    /* GNU_REGEX */
  153. #endif    /* GNU_REGEX */
  154.  
  155. #ifdef atarist
  156. #define read _text_read /* we do not want all these CR's to mess our input */
  157. extern int _text_read (int, char *, int);
  158. #endif
  159.  
  160. #ifndef DEFPATH
  161. #define DEFPATH    ".:/usr/local/lib/awk:/usr/lib/awk"
  162. #endif
  163.  
  164. #ifndef ENVSEP
  165. #define ENVSEP    ':'
  166. #endif
  167.  
  168. /* ------------------ Constants, Structures, Typedefs  ------------------ */
  169. #define AWKNUM    double
  170.  
  171. typedef enum {
  172.     /* illegal entry == 0 */
  173.     Node_illegal,
  174.  
  175.     /* binary operators  lnode and rnode are the expressions to work on */
  176.     Node_times,
  177.     Node_quotient,
  178.     Node_mod,
  179.     Node_plus,
  180.     Node_minus,
  181.     Node_cond_pair,        /* conditional pair (see Node_line_range) */
  182.     Node_subscript,
  183.     Node_concat,
  184.     Node_exp,
  185.  
  186.     /* unary operators   subnode is the expression to work on */
  187. /*10*/    Node_preincrement,
  188.     Node_predecrement,
  189.     Node_postincrement,
  190.     Node_postdecrement,
  191.     Node_unary_minus,
  192.     Node_field_spec,
  193.  
  194.     /* assignments   lnode is the var to assign to, rnode is the exp */
  195.     Node_assign,
  196.     Node_assign_times,
  197.     Node_assign_quotient,
  198.     Node_assign_mod,
  199. /*20*/    Node_assign_plus,
  200.     Node_assign_minus,
  201.     Node_assign_exp,
  202.  
  203.     /* boolean binaries   lnode and rnode are expressions */
  204.     Node_and,
  205.     Node_or,
  206.  
  207.     /* binary relationals   compares lnode and rnode */
  208.     Node_equal,
  209.     Node_notequal,
  210.     Node_less,
  211.     Node_greater,
  212.     Node_leq,
  213. /*30*/    Node_geq,
  214.     Node_match,
  215.     Node_nomatch,
  216.  
  217.     /* unary relationals   works on subnode */
  218.     Node_not,
  219.  
  220.     /* program structures */
  221.     Node_rule_list,        /* lnode is a rule, rnode is rest of list */
  222.     Node_rule_node,        /* lnode is pattern, rnode is statement */
  223.     Node_statement_list,    /* lnode is statement, rnode is more list */
  224.     Node_if_branches,    /* lnode is to run on true, rnode on false */
  225.     Node_expression_list,    /* lnode is an exp, rnode is more list */
  226.     Node_param_list,    /* lnode is a variable, rnode is more list */
  227.  
  228.     /* keywords */
  229. /*40*/    Node_K_if,        /* lnode is conditonal, rnode is if_branches */
  230.     Node_K_while,        /* lnode is condtional, rnode is stuff to run */
  231.     Node_K_for,        /* lnode is for_struct, rnode is stuff to run */
  232.     Node_K_arrayfor,    /* lnode is for_struct, rnode is stuff to run */
  233.     Node_K_break,        /* no subs */
  234.     Node_K_continue,    /* no stuff */
  235.     Node_K_print,        /* lnode is exp_list, rnode is redirect */
  236.     Node_K_printf,        /* lnode is exp_list, rnode is redirect */
  237.     Node_K_next,        /* no subs */
  238.     Node_K_exit,        /* subnode is return value, or NULL */
  239. /*50*/    Node_K_do,        /* lnode is conditional, rnode stuff to run */
  240.     Node_K_return,
  241.     Node_K_delete,
  242.     Node_K_getline,
  243.     Node_K_function,    /* lnode is statement list, rnode is params */
  244.  
  245.     /* I/O redirection for print statements */
  246.     Node_redirect_output,    /* subnode is where to redirect */
  247.     Node_redirect_append,    /* subnode is where to redirect */
  248.     Node_redirect_pipe,    /* subnode is where to redirect */
  249.     Node_redirect_pipein,    /* subnode is where to redirect */
  250.     Node_redirect_input,    /* subnode is where to redirect */
  251.  
  252.     /* Variables */
  253. /*60*/    Node_var,        /* rnode is value, lnode is array stuff */
  254.     Node_var_array,        /* array is ptr to elements, asize num of
  255.                  * eles */
  256.     Node_val,        /* node is a value - type in flags */
  257.  
  258.     /* Builtins   subnode is explist to work on, proc is func to call */
  259.     Node_builtin,
  260.  
  261.     /*
  262.      * pattern: conditional ',' conditional ;  lnode of Node_line_range
  263.      * is the two conditionals (Node_cond_pair), other word (rnode place)
  264.      * is a flag indicating whether or not this range has been entered.
  265.      */
  266.     Node_line_range,
  267.  
  268.     /*
  269.      * boolean test of membership in array lnode is string-valued
  270.      * expression rnode is array name 
  271.      */
  272.     Node_in_array,
  273.  
  274.     Node_func,        /* lnode is param. list, rnode is body */
  275.     Node_func_call,        /* lnode is name, rnode is argument list */
  276.  
  277.     Node_cond_exp,        /* lnode is conditonal, rnode is if_branches */
  278.     Node_regex,
  279. /*70*/    Node_hashnode,
  280.     Node_ahash,
  281.     Node_NF,
  282.     Node_NR,
  283.     Node_FNR,
  284.     Node_FS,
  285.     Node_RS,
  286.     Node_FIELDWIDTHS,
  287.     Node_IGNORECASE,
  288.     Node_OFS,
  289.     Node_ORS,
  290.     Node_OFMT,
  291.     Node_CONVFMT
  292. } NODETYPE;
  293.  
  294. /*
  295.  * NOTE - this struct is a rather kludgey -- it is packed to minimize
  296.  * space usage, at the expense of cleanliness.  Alter at own risk.
  297.  */
  298. typedef struct exp_node {
  299.     union {
  300.         struct {
  301.             union {
  302.                 struct exp_node *lptr;
  303.                 char *param_name;
  304.             } l;
  305.             union {
  306.                 struct exp_node *rptr;
  307.                 struct exp_node *(*pptr) ();
  308.                 Regexp *preg;
  309.                 struct for_loop_header *hd;
  310.                 struct exp_node **av;
  311.                 int r_ent;    /* range entered */
  312.             } r;
  313.             union {
  314.                 char *name;
  315.                 struct exp_node *extra;
  316.             } x;
  317.             short number;
  318.             unsigned char reflags;
  319. #            define    CASE    1
  320. #            define    CONST    2
  321. #            define    FS_DFLT    4
  322.         } nodep;
  323.         struct {
  324.             AWKNUM fltnum;    /* this is here for optimal packing of
  325.                      * the structure on many machines
  326.                      */
  327.             char *sp;
  328.             short slen;
  329.             unsigned char sref;
  330.             char idx;
  331.         } val;
  332.         struct {
  333.             struct exp_node *next;
  334.             char *name;
  335.             int length;
  336.             struct exp_node *value;
  337.         } hash;
  338. #define    hnext    sub.hash.next
  339. #define    hname    sub.hash.name
  340. #define    hlength    sub.hash.length
  341. #define    hvalue    sub.hash.value
  342.         struct {
  343.             struct exp_node *next;
  344.             struct exp_node *name;
  345.             struct exp_node *value;
  346.         } ahash;
  347. #define    ahnext    sub.ahash.next
  348. #define    ahname    sub.ahash.name
  349. #define    ahvalue    sub.ahash.value
  350.     } sub;
  351.     NODETYPE type;
  352.     unsigned short flags;
  353. #            define    MEM    0x7
  354. #            define    MALLOC    1    /* can be free'd */
  355. #            define    TEMP    2    /* should be free'd */
  356. #            define    PERM    4    /* can't be free'd */
  357. #            define    VAL    0x18
  358. #            define    NUM    8    /* numeric value is current */
  359. #            define    STR    16    /* string value is current */
  360. #            define    NUMERIC    32    /* entire string is numeric */
  361. #            define    NUMBER    64    /* assigned as number */
  362. #            define    STRING    128    /* assigned as string */
  363. #            define    MAYBE_NUM    256
  364. } NODE;
  365.  
  366. #define lnode    sub.nodep.l.lptr
  367. #define nextp    sub.nodep.l.lptr
  368. #define rnode    sub.nodep.r.rptr
  369. #define source_file    sub.nodep.x.name
  370. #define    source_line    sub.nodep.number
  371. #define    param_cnt    sub.nodep.number
  372. #define param    sub.nodep.l.param_name
  373.  
  374. #define subnode    lnode
  375. #define proc    sub.nodep.r.pptr
  376.  
  377. #define re_reg    sub.nodep.r.preg
  378. #define re_flags sub.nodep.reflags
  379. #define re_text lnode
  380. #define re_exp    sub.nodep.x.extra
  381. #define    re_cnt    sub.nodep.number
  382.  
  383. #define forsub    lnode
  384. #define forloop    rnode->sub.nodep.r.hd
  385.  
  386. #define stptr    sub.val.sp
  387. #define stlen    sub.val.slen
  388. #define stref    sub.val.sref
  389. #define    stfmt    sub.val.idx
  390.  
  391. #define numbr    sub.val.fltnum
  392.  
  393. #define var_value lnode
  394. #define var_array sub.nodep.r.av
  395.  
  396. #define condpair lnode
  397. #define triggered sub.nodep.r.r_ent
  398.  
  399. #ifdef DONTDEF
  400. int primes[] = {31, 61, 127, 257, 509, 1021, 2053, 4099, 8191, 16381};
  401. #endif
  402. /* a quick profile suggests that the following is a good value */
  403. #define    HASHSIZE    127
  404.  
  405. typedef struct for_loop_header {
  406.     NODE *init;
  407.     NODE *cond;
  408.     NODE *incr;
  409. } FOR_LOOP_HEADER;
  410.  
  411. /* for "for(iggy in foo) {" */
  412. struct search {
  413.     NODE **arr_ptr;
  414.     NODE **arr_end;
  415.     NODE *bucket;
  416.     NODE *retval;
  417. };
  418.  
  419. /* for faster input, bypass stdio */
  420. typedef struct iobuf {
  421.     int fd;
  422.     char *buf;
  423.     char *off;
  424.     char *end;
  425.     size_t size;    /* this will be determined by an fstat() call */
  426.     int cnt;
  427.     char *secbuf;
  428.     size_t secsiz;
  429.     int flag;
  430. #    define        IOP_IS_TTY    1
  431. } IOBUF;
  432.  
  433. typedef void (*Func_ptr)();
  434.  
  435. /*
  436.  * structure used to dynamically maintain a linked-list of open files/pipes
  437.  */
  438. struct redirect {
  439.     unsigned int flag;
  440. #        define        RED_FILE    1
  441. #        define        RED_PIPE    2
  442. #        define        RED_READ    4
  443. #        define        RED_WRITE    8
  444. #        define        RED_APPEND    16
  445. #        define        RED_NOBUF    32
  446. #        define        RED_USED    64
  447.     char *value;
  448.     FILE *fp;
  449.     IOBUF *iop;
  450.     int pid;
  451.     int status;
  452.     struct redirect *prev;
  453.     struct redirect *next;
  454. };
  455.  
  456. /* longjmp return codes, must be nonzero */
  457. /* Continue means either for loop/while continue, or next input record */
  458. #define TAG_CONTINUE 1
  459. /* Break means either for/while break, or stop reading input */
  460. #define TAG_BREAK 2
  461. /* Return means return from a function call; leave value in ret_node */
  462. #define    TAG_RETURN 3
  463.  
  464. #if defined(MSDOS) || (defined(atarist)) && (defined(__MSHORT__))
  465. #define HUGE    0x7fff
  466. #else
  467. #define HUGE    0x7fffffff
  468. #endif
  469.  
  470. /* -------------------------- External variables -------------------------- */
  471. /* gawk builtin variables */
  472. extern int NF;
  473. extern int NR;
  474. extern int FNR;
  475. extern int IGNORECASE;
  476. extern char *FS;
  477. extern char *RS;
  478. extern char *OFS;
  479. extern int OFSlen;
  480. extern char *ORS;
  481. extern int ORSlen;
  482. extern char *OFMT;
  483. extern char *CONVFMT;
  484. extern int CONVFMTidx;
  485. extern int OFMTidx;
  486. extern NODE *FS_node, *NF_node, *RS_node, *NR_node;
  487. extern NODE *FILENAME_node, *OFS_node, *ORS_node, *OFMT_node;
  488. extern NODE *CONVFMT_node;
  489. extern NODE *FNR_node, *RLENGTH_node, *RSTART_node, *SUBSEP_node;
  490. extern NODE *IGNORECASE_node;
  491. extern NODE *FIELDWIDTHS_node;
  492.  
  493. extern NODE **stack_ptr;
  494. extern NODE *Nnull_string;
  495. extern NODE **fields_arr;
  496. extern int sourceline;
  497. extern char *source;
  498. extern NODE *expression_value;
  499.  
  500. extern NODE *_t;    /* used as temporary in tree_eval */
  501.  
  502. extern const char *myname;
  503.  
  504. extern NODE *nextfree;
  505. extern int field0_valid;
  506. extern int strict;
  507. extern int do_posix;
  508. extern int do_lint;
  509.  
  510. /* ------------------------- Pseudo-functions ------------------------- */
  511.  
  512. #define is_identchar(c) (isalnum(c) || (c) == '_')
  513.  
  514.  
  515. #ifndef MPROF
  516. #define    getnode(n)    if (nextfree) n = nextfree, nextfree = nextfree->nextp;\
  517.             else n = more_nodes()
  518. #define    freenode(n)    ((n)->nextp = nextfree, nextfree = (n))
  519. #else
  520. #define    getnode(n)    emalloc(n, NODE *, sizeof(NODE), "getnode")
  521. #define    freenode(n)    free(n)
  522. #endif
  523.  
  524. #ifdef DEBUG
  525. #define    tree_eval(t)    r_tree_eval(t)
  526. #else
  527. #define    tree_eval(t)    (_t = (t),(_t) == NULL ? Nnull_string : \
  528.             ((_t)->type == Node_val ? (_t) : \
  529.             ((_t)->type == Node_var ? (_t)->var_value : \
  530.             ((_t)->type == Node_param_list ? \
  531.             (stack_ptr[(_t)->param_cnt])->var_value : \
  532.             r_tree_eval((_t))))))
  533. #endif
  534.  
  535. #define    make_number(x)    mk_number((x), (MALLOC|NUM|NUMERIC|NUMBER))
  536. #define    tmp_number(x)    mk_number((x), (MALLOC|TEMP|NUM|NUMERIC|NUMBER))
  537.  
  538. #define    free_temp(n)    if ((n)->flags&TEMP) { unref(n); } else
  539. #define    make_string(s,l)    make_str_node((s), SZTC (l),0)
  540. #define        SCAN            1
  541. #define        ALREADY_MALLOCED    2
  542.  
  543. #define    cant_happen()    fatal("line %d, file: %s; bailing out", \
  544.                 __LINE__, basename(__FILE__));
  545. #ifdef MEMDEBUG
  546. #define memmsg(X,Y,Z,ZZ) \
  547.     fprintf(stdout, "malloc: %s: %s: %ld 0x%08lx\n", Z, X, (long)Y, ZZ)
  548. #if defined(__STDC__) && !defined(NO_TOKEN_PASTING)
  549. #define free(s)    fprintf(stdout, "free: %s: 0x%08lx\n", #s, (long)s), do_free(s)
  550. #else
  551. #define free(s)    fprintf(stdout, "free: s: 0x%08lx\n", (long)s), do_free(s)
  552. #endif
  553. #else /* MEMDEBUG */
  554. #define memmsg(x,y,z,zz)
  555. #endif /* MEMDEBUG */
  556.  
  557. #if defined(__STDC__) && !defined(NO_TOKEN_PASTING)
  558. #define    emalloc(var,ty,x,str)    if ((var=(ty)malloc((MALLOC_ARG_T)(x)))==NULL)\
  559.                     fatal("%s: %s: can't allocate memory (%s)",\
  560.                     (str), #var, strerror(errno));\
  561.                 else memmsg(#var, x, str, var)
  562. #define    erealloc(var,ty,x,str)    if((var=(ty)realloc((char *)var,\
  563.                         (MALLOC_ARG_T)(x)))==NULL)\
  564.                     fatal("%s: %s: can't allocate memory (%s)",\
  565.                     (str), #var, strerror(errno));\
  566.                 else memmsg("re:" #var, x, str, var)
  567. #else /* __STDC__ */
  568. #define    emalloc(var,ty,x,str)    if ((var=(ty)malloc((MALLOC_ARG_T)(x)))==NULL)\
  569.                     fatal("%s: %s: can't allocate memory (%s)",\
  570.                     (str), "var", strerror(errno));\
  571.                 else memmsg("var", x, str, var)
  572. #define    erealloc(var,ty,x,str)    if((var=(ty)realloc((char *)var,\
  573.                         (MALLOC_ARG_T)(x)))==NULL)\
  574.                     fatal("%s: %s: can't allocate memory (%s)",\
  575.                     (str), "var", strerror(errno));\
  576.                 else memmsg("re: var", x, str, var)
  577. #endif /* __STDC__ */
  578.  
  579. #ifdef DEBUG
  580. #define    force_number    r_force_number
  581. #define    force_string    r_force_string
  582. #else /* not DEBUG */
  583. #ifdef lint
  584. extern AWKNUM force_number();
  585. #endif
  586. #ifdef MSDOS
  587. extern double _msc51bug;
  588. #define    force_number(n)    (_msc51bug=(_t = (n),(_t->flags & NUM) ? _t->numbr : r_force_number(_t)))
  589. #else /* not MSDOS */
  590. #define    force_number(n)    (_t = (n),(_t->flags & NUM) ? _t->numbr : r_force_number(_t))
  591. #endif /* MSDOS */
  592. #define    force_string(s)    (_t = (s),(_t->flags & STR) ? _t : r_force_string(_t))
  593. #endif /* not DEBUG */
  594.  
  595. #define    STREQ(a,b)    (*(a) == *(b) && strcmp((a), (b)) == 0)
  596. #define    STREQN(a,b,n)    ((n)&& *(a)== *(b) && strncmp((a), (b), SZTC (n)) == 0)
  597.  
  598. /* ------------- Function prototypes or defs (as appropriate) ------------- */
  599.  
  600. extern void set_NF();
  601. extern void set_FIELDWIDTHS();
  602. extern void set_NR();
  603. extern void set_FNR();
  604. extern void set_FS();
  605. extern void set_RS();
  606. extern void set_IGNORECASE();
  607. extern void set_OFMT();
  608. extern void set_CONVFMT();
  609. extern void set_OFS();
  610. extern void set_ORS();
  611.  
  612. /* array.c */
  613. extern NODE *concat_exp P((NODE *tree));
  614. extern void assoc_clear P((NODE *symbol));
  615. extern unsigned int hash P((char *s, int len));
  616. extern int in_array P((NODE *symbol, NODE *subs));
  617. extern NODE **assoc_lookup P((NODE *symbol, NODE *subs));
  618. extern void do_delete P((NODE *symbol, NODE *tree));
  619. extern void assoc_scan P((NODE *symbol, struct search *lookat));
  620. extern void assoc_next P((struct search *lookat));
  621. /* awk.tab.c */
  622. extern char *tokexpand P((void));
  623. extern char nextc P((void));
  624. extern NODE *node P((NODE *left, NODETYPE op, NODE *right));
  625. extern NODE *install P((char *name, NODE *value));
  626. extern NODE *lookup P((char *name));
  627. extern NODE *variable P((char *name, int can_free));
  628. extern int yyparse P((void));
  629. /* builtin.c */
  630. extern NODE *do_exp P((NODE *tree));
  631. extern NODE *do_index P((NODE *tree));
  632. extern NODE *do_int P((NODE *tree));
  633. extern NODE *do_length P((NODE *tree));
  634. extern NODE *do_log P((NODE *tree));
  635. extern NODE *do_sprintf P((NODE *tree));
  636. extern void do_printf P((NODE *tree));
  637. extern void print_simple P((NODE *tree, FILE *fp));
  638. extern NODE *do_sqrt P((NODE *tree));
  639. extern NODE *do_substr P((NODE *tree));
  640. extern NODE *do_strftime P((NODE *tree));
  641. extern NODE *do_systime P((NODE *tree));
  642. extern NODE *do_system P((NODE *tree));
  643. extern void do_print P((NODE *tree));
  644. extern NODE *do_tolower P((NODE *tree));
  645. extern NODE *do_toupper P((NODE *tree));
  646. extern NODE *do_atan2 P((NODE *tree));
  647. extern NODE *do_sin P((NODE *tree));
  648. extern NODE *do_cos P((NODE *tree));
  649. extern NODE *do_rand P((NODE *tree));
  650. extern NODE *do_srand P((NODE *tree));
  651. extern NODE *do_match P((NODE *tree));
  652. extern NODE *do_gsub P((NODE *tree));
  653. extern NODE *do_sub P((NODE *tree));
  654. /* debug.c */
  655. extern int ptree P((NODE *n));
  656. extern NODE *pt P((void));
  657. extern int print_parse_tree P((NODE *ptr));
  658. extern int dump_vars P((void));
  659. extern int dump_fields P((void));
  660. extern int print_debug P((char *str, void * n));
  661. extern int print_a_node P((NODE *ptr));
  662. extern int print_maybe_semi P((NODE *ptr));
  663. extern int deal_with_curls P((NODE *ptr));
  664. extern NODE *do_prvars P((void));
  665. extern NODE *do_bp P((void));
  666. extern void do_free P((char *s));
  667. /* dfa.c */
  668. extern void regsyntax P((int bits, int fold));
  669. extern void regparse P((const char *s, size_t len, struct regexp *r));
  670. extern void reganalyze P((struct regexp *r, int searchflag));
  671. extern void regstate P((int s, struct regexp *r, int trans[]));
  672. extern char *regexecute P((struct regexp *r, char *begin,
  673.                char *end, int newline, int *count, int *backref));
  674. extern void reginit P((struct regexp *r));
  675. extern void regcompile P((const char *s, size_t len,
  676.               struct regexp *r, int searchflag));
  677. extern void regfree P((struct regexp *r));
  678. /* eval.c */
  679. extern int interpret P((NODE *tree));
  680. extern NODE *r_tree_eval P((NODE *tree));
  681. extern int cmp_nodes P((NODE *t1, NODE *t2));
  682. extern NODE **get_lhs P((NODE *ptr, Func_ptr *assign));
  683. extern void set_IGNORECASE P((void));
  684. /* field.c */
  685. extern void init_fields P((void));
  686. extern void set_record P((char *buf, int cnt, int freeold));
  687. extern void reset_record P((void));
  688. extern void set_NF P((void));
  689. extern NODE **get_field P((int num, Func_ptr *assign));
  690. extern NODE *do_split P((NODE *tree));
  691. extern void set_FS P((void));
  692. extern void set_RS P((void));
  693. extern void set_FIELDWIDTHS P((void));
  694. /* io.c */
  695. extern void set_FNR P((void));
  696. extern void set_NR P((void));
  697. extern void do_input P((void));
  698. extern struct redirect *redirect P((NODE *tree, int *errflg));
  699. extern NODE *do_close P((NODE *tree));
  700. extern int flush_io P((void));
  701. extern int close_io P((void));
  702. extern int devopen P((char *name, char *mode));
  703. extern int pathopen P((char *file));
  704. extern NODE *do_getline P((NODE *tree));
  705. /* iop.c */
  706. extern int optimal_bufsize P((int fd));
  707. extern IOBUF *iop_alloc P((int fd));
  708. extern int get_a_record P((char **out, IOBUF *iop, int rs));
  709. /* main.c */
  710. extern int main P((int argc, char **argv));
  711. extern Regexp *mk_re_parse P((char *s, int ignorecase));
  712. extern void load_environ P((void));
  713. extern char *arg_assign P((char *arg));
  714. extern SIGTYPE catchsig P((int sig, int code));
  715. extern const char *basename P((const char *));
  716. /* msg.c */
  717. #if 0 /* old varargs.h stuff */
  718. extern void msg P((int va_alist));
  719. extern void warning P((int va_alist));
  720. extern void fatal P((int va_alist));
  721. #endif
  722. void msg ();
  723. void warning ();
  724. void fatal ();
  725. /* node.c */
  726. extern AWKNUM r_force_number P((NODE *n));
  727. extern NODE *r_force_string P((NODE *s));
  728. extern NODE *dupnode P((NODE *n));
  729. extern NODE *mk_number P((AWKNUM x, unsigned int flags));
  730. extern NODE *make_str_node P((char *s, size_t len, int scan ));
  731. extern NODE *tmp_string P((char *s, size_t len ));
  732. extern NODE *more_nodes P((void));
  733. #ifdef DEBUG
  734. extern void freenode P((NODE *it));
  735. #endif
  736. extern void unref P((NODE *tmp));
  737. extern int parse_escape P((char **string_ptr));
  738. /* re.c */
  739. extern Regexp *make_regexp P((NODE *s, int ignorecase, int dfa));
  740. extern int research P((Regexp *rp, char *str, int len, int need_start));
  741. extern void refree P((Regexp *rp));
  742. extern void regerror P((const char *s));
  743. extern Regexp *re_update P((NODE *t));
  744. /* regex.c */
  745. extern int re_set_syntax P((int syntax));
  746. extern char *re_compile_pattern P((char *pattern,
  747.          size_t size,
  748.          struct re_pattern_buffer *bufp ));
  749.  
  750. extern int re_search P((struct re_pattern_buffer *pbufp,
  751.          char *string,
  752.          int size,
  753.          int startpos,
  754.          int range,
  755.          struct re_registers *regs ));
  756. extern void re_compile_fastmap P((struct re_pattern_buffer *bufp));
  757. /* strcase.c */
  758. extern int strcasecmp P((const char *s1, const char *s2));
  759. extern int strncasecmp P((const char *s1, const char *s2, register size_t n));
  760.  
  761. #ifdef atarist
  762. /* atari/tmpnam.c */
  763. extern char *tmpnam P((char *buf));
  764. extern char *tempnam P((const char *path, const char *base));
  765. #endif
  766.  
  767. /* Figure out what '\a' really is. */
  768. #ifdef __STDC__
  769. #define BELL    '\a'        /* sure makes life easy, don't it? */
  770. #else
  771. #    if 'z' - 'a' == 25    /* ascii */
  772. #        if 'a' != 97    /* machine is dumb enough to use mark parity */
  773. #            define BELL    '\207'
  774. #        else
  775. #            define BELL    '\07'
  776. #        endif
  777. #    else
  778. #        define BELL    '\057'
  779. #    endif
  780. #endif
  781.  
  782. extern char casetable[];    /* for case-independent regexp matching */
  783.