home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gawk-2.15.6-base.tgz / gawk-2.15.6-base.tar / fsf / gawk / awk.h < prev    next >
C/C++ Source or Header  |  1995-03-09  |  22KB  |  794 lines

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