Merged changes made for version 4.1.20 onto the trunk
[findutils.git] / find / util.c
blob1106b40cc82750dc7a5b9751bf6bbb475e0ca3ef
1 /* util.c -- functions for initializing new tree elements, and other things.
2 Copyright (C) 1990, 91, 92, 93, 94, 2000 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)
7 any later version.
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., 9 Temple Place - Suite 330, Boston, MA 02111-1307,
17 USA.
20 #include "defs.h"
22 #if ENABLE_NLS
23 # include <libintl.h>
24 # define _(Text) gettext (Text)
25 #else
26 # define _(Text) Text
27 #endif
28 #ifdef gettext_noop
29 # define N_(String) gettext_noop (String)
30 #else
31 # define N_(String) (String)
32 #endif
35 /* Return a pointer to a new predicate structure, which has been
36 linked in as the last one in the predicates list.
38 Set `predicates' to point to the start of the predicates list.
39 Set `last_pred' to point to the new last predicate in the list.
41 Set all cells in the new structure to the default values. */
43 struct predicate *
44 get_new_pred (void)
46 register struct predicate *new_pred;
48 if (predicates == NULL)
50 predicates = (struct predicate *)
51 xmalloc (sizeof (struct predicate));
52 last_pred = predicates;
54 else
56 new_pred = (struct predicate *) xmalloc (sizeof (struct predicate));
57 last_pred->pred_next = new_pred;
58 last_pred = new_pred;
60 last_pred->pred_func = NULL;
61 #ifdef DEBUG
62 last_pred->p_name = NULL;
63 #endif /* DEBUG */
64 last_pred->p_type = NO_TYPE;
65 last_pred->p_prec = NO_PREC;
66 last_pred->side_effects = false;
67 last_pred->no_default_print = false;
68 last_pred->need_stat = true;
69 last_pred->args.str = NULL;
70 last_pred->pred_next = NULL;
71 last_pred->pred_left = NULL;
72 last_pred->pred_right = NULL;
73 return (last_pred);
76 /* Return a pointer to a new predicate, with operator check.
77 Like get_new_pred, but it checks to make sure that the previous
78 predicate is an operator. If it isn't, the AND operator is inserted. */
80 struct predicate *
81 get_new_pred_chk_op (void)
83 struct predicate *new_pred;
85 if (last_pred)
86 switch (last_pred->p_type)
88 case NO_TYPE:
89 error (1, 0, _("oops -- invalid default insertion of and!"));
90 break;
92 case PRIMARY_TYPE:
93 case CLOSE_PAREN:
94 new_pred = get_new_pred ();
95 new_pred->pred_func = pred_and;
96 #ifdef DEBUG
97 new_pred->p_name = find_pred_name (pred_and);
98 #endif /* DEBUG */
99 new_pred->p_type = BI_OP;
100 new_pred->p_prec = AND_PREC;
101 new_pred->need_stat = false;
102 new_pred->args.str = NULL;
104 default:
105 break;
107 return (get_new_pred ());
110 /* Add a primary of predicate type PRED_FUNC to the predicate input list.
112 Return a pointer to the predicate node just inserted.
114 Fills in the following cells of the new predicate node:
116 pred_func PRED_FUNC
117 args(.str) NULL
118 p_type PRIMARY_TYPE
119 p_prec NO_PREC
121 Other cells that need to be filled in are defaulted by
122 get_new_pred_chk_op, which is used to insure that the prior node is
123 either not there at all (we are the very first node) or is an
124 operator. */
126 struct predicate *
127 insert_primary (boolean (*pred_func) (/* ??? */))
129 struct predicate *new_pred;
131 new_pred = get_new_pred_chk_op ();
132 new_pred->pred_func = pred_func;
133 #ifdef DEBUG
134 new_pred->p_name = find_pred_name (pred_func);
135 #endif /* DEBUG */
136 new_pred->args.str = NULL;
137 new_pred->p_type = PRIMARY_TYPE;
138 new_pred->p_prec = NO_PREC;
139 return (new_pred);
142 void
143 usage (char *msg)
145 if (msg)
146 fprintf (stderr, "%s: %s\n", program_name, msg);
147 fprintf (stderr, _("\
148 Usage: %s [path...] [expression]\n"), program_name);
149 exit (1);