1 /* util.c -- functions for initializing new tree elements, and other things.
2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19 #include <sys/types.h>
26 # define _(Text) gettext (Text)
31 # define N_(String) gettext_noop (String)
33 # define N_(String) (String)
37 /* Return the last component of pathname FNAME, with leading slashes
38 compressed into one slash. */
47 /* For "/", "//", etc., return "/". */
48 for (p
= fname
; *p
== '/'; ++p
)
52 p
= strrchr (fname
, '/');
53 return (p
== NULL
? fname
: p
+ 1);
55 #endif /* not HAVE_BASENAME */
57 /* Return a pointer to a new predicate structure, which has been
58 linked in as the last one in the predicates list.
60 Set `predicates' to point to the start of the predicates list.
61 Set `last_pred' to point to the new last predicate in the list.
63 Set all cells in the new structure to the default values. */
68 register struct predicate
*new_pred
;
70 if (predicates
== NULL
)
72 predicates
= (struct predicate
*)
73 xmalloc (sizeof (struct predicate
));
74 last_pred
= predicates
;
78 new_pred
= (struct predicate
*) xmalloc (sizeof (struct predicate
));
79 last_pred
->pred_next
= new_pred
;
82 last_pred
->pred_func
= NULL
;
84 last_pred
->p_name
= NULL
;
86 last_pred
->p_type
= NO_TYPE
;
87 last_pred
->p_prec
= NO_PREC
;
88 last_pred
->side_effects
= false;
89 last_pred
->need_stat
= true;
90 last_pred
->args
.str
= NULL
;
91 last_pred
->pred_next
= NULL
;
92 last_pred
->pred_left
= NULL
;
93 last_pred
->pred_right
= NULL
;
97 /* Return a pointer to a new predicate, with operator check.
98 Like get_new_pred, but it checks to make sure that the previous
99 predicate is an operator. If it isn't, the AND operator is inserted. */
102 get_new_pred_chk_op ()
104 struct predicate
*new_pred
;
107 switch (last_pred
->p_type
)
110 error (1, 0, _("oops -- invalid default insertion of and!"));
115 new_pred
= get_new_pred ();
116 new_pred
->pred_func
= pred_and
;
118 new_pred
->p_name
= find_pred_name (pred_and
);
120 new_pred
->p_type
= BI_OP
;
121 new_pred
->p_prec
= AND_PREC
;
122 new_pred
->need_stat
= false;
123 new_pred
->args
.str
= NULL
;
128 return (get_new_pred ());
131 /* Add a primary of predicate type PRED_FUNC to the predicate input list.
133 Return a pointer to the predicate node just inserted.
135 Fills in the following cells of the new predicate node:
142 Other cells that need to be filled in are defaulted by
143 get_new_pred_chk_op, which is used to insure that the prior node is
144 either not there at all (we are the very first node) or is an
148 insert_primary (pred_func
)
149 boolean (*pred_func
) ();
151 struct predicate
*new_pred
;
153 new_pred
= get_new_pred_chk_op ();
154 new_pred
->pred_func
= pred_func
;
156 new_pred
->p_name
= find_pred_name (pred_func
);
158 new_pred
->args
.str
= NULL
;
159 new_pred
->p_type
= PRIMARY_TYPE
;
160 new_pred
->p_prec
= NO_PREC
;
169 fprintf (stderr
, "%s: %s\n", program_name
, msg
);
170 fprintf (stderr
, _("\
171 Usage: %s [path...] [expression]\n"), program_name
);