]> git.ipfire.org Git - thirdparty/bash.git/blame - general.h
Bash-5.0 patch 4: the wait builtin without arguments only waits for known children...
[thirdparty/bash.git] / general.h
CommitLineData
726f6388
JA
1/* general.h -- defines that everybody likes to use. */
2
a0c0a00f 3/* Copyright (C) 1993-2016 Free Software Foundation, Inc.
726f6388
JA
4
5 This file is part of GNU Bash, the Bourne Again SHell.
6
3185942a
JA
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
726f6388 11
3185942a
JA
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
726f6388 16
3185942a
JA
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
726f6388 20
ccc6cda3
JA
21#if !defined (_GENERAL_H_)
22#define _GENERAL_H_
726f6388
JA
23
24#include "stdc.h"
25
d166f048 26#include "bashtypes.h"
95732b49 27#include "chartypes.h"
d166f048 28
cce855bc
JA
29#if defined (HAVE_SYS_RESOURCE_H) && defined (RLIMTYPE)
30# if defined (HAVE_SYS_TIME_H)
31# include <sys/time.h>
32# endif
33# include <sys/resource.h>
34#endif
35
d166f048
JA
36#if defined (HAVE_STRING_H)
37# include <string.h>
38#else
39# include <strings.h>
40#endif /* !HAVE_STRING_H */
41
f73dda09
JA
42#if defined (HAVE_LIMITS_H)
43# include <limits.h>
726f6388
JA
44#endif
45
f73dda09
JA
46#include "xmalloc.h"
47
ccc6cda3 48/* NULL pointer type. */
726f6388
JA
49#if !defined (NULL)
50# if defined (__STDC__)
51# define NULL ((void *) 0)
52# else
53# define NULL 0x0
54# endif /* !__STDC__ */
55#endif /* !NULL */
56
7117c2d2
JA
57/* Hardly used anymore */
58#define pointer_to_int(x) (int)((char *)x - (char *)0)
726f6388 59
ccc6cda3
JA
60#if defined (alpha) && defined (__GNUC__) && !defined (strchr) && !defined (__STDC__)
61extern char *strchr (), *strrchr ();
62#endif
63
7117c2d2 64#if !defined (strcpy) && (defined (HAVE_DECL_STRCPY) && !HAVE_DECL_STRCPY)
f73dda09 65extern char *strcpy __P((char *, const char *));
ccc6cda3
JA
66#endif
67
726f6388 68#if !defined (savestring)
726f6388
JA
69# define savestring(x) (char *)strcpy (xmalloc (1 + strlen (x)), (x))
70#endif
71
ccc6cda3 72#ifndef member
0001803f 73# define member(c, s) ((c) ? ((char *)mbschr ((s), (c)) != (char *)NULL) : 0)
ccc6cda3
JA
74#endif
75
726f6388
JA
76#ifndef whitespace
77#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
78#endif
79
f73dda09
JA
80#ifndef CHAR_MAX
81# ifdef __CHAR_UNSIGNED__
82# define CHAR_MAX 0xff
83# else
84# define CHAR_MAX 0x7f
85# endif
726f6388
JA
86#endif
87
f73dda09
JA
88#ifndef CHAR_BIT
89# define CHAR_BIT 8
726f6388
JA
90#endif
91
f73dda09
JA
92/* Nonzero if the integer type T is signed. */
93#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
94
d233b485
CR
95/* The width in bits of the integer type or expression T.
96 Padding bits are not supported; this is checked at compile-time below. */
97#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
98
99/* Bound on length of the string representing an unsigned integer
100 value representable in B bits. log10 (2.0) < 146/485. The
101 smallest value of B where this bound is not tight is 2621. */
102#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
103
f73dda09
JA
104/* Bound on length of the string representing an integer value of type T.
105 Subtract one for the sign bit if T is signed;
106 302 / 1000 is log10 (2) rounded up;
107 add one for integer division truncation;
108 add one more for a minus sign if t is signed. */
109#define INT_STRLEN_BOUND(t) \
d233b485 110 ((TYPE_WIDTH (t) - TYPE_SIGNED (t)) * 302 / 1000 \
f73dda09 111 + 1 + TYPE_SIGNED (t))
726f6388 112
d233b485
CR
113/* Updated version adapted from gnulib/intprops.h, not used right now.
114 Changes the approximation of log10(2) from 302/1000 to 146/485. */
115#if 0
116#define INT_STRLEN_BOUND(t) \
117 (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - TYPE_SIGNED (t)) + TYPE_SIGNED(t))
118#endif
119
120/* Bound on buffer size needed to represent an integer type or expression T,
121 including the terminating null. */
122#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
28ef6c31 123
ccc6cda3 124/* Define exactly what a legal shell identifier consists of. */
f73dda09
JA
125#define legal_variable_starter(c) (ISALPHA(c) || (c == '_'))
126#define legal_variable_char(c) (ISALNUM(c) || c == '_')
ccc6cda3 127
726f6388
JA
128/* Definitions used in subst.c and by the `read' builtin for field
129 splitting. */
130#define spctabnl(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
131
726f6388
JA
132/* All structs which contain a `next' field should have that field
133 as the first field in the struct. This means that functions
134 can be written to handle the general case for linked lists. */
135typedef struct g_list {
136 struct g_list *next;
137} GENERIC_LIST;
138
139/* Here is a generic structure for associating character strings
140 with integers. It is used in the parser for shell tokenization. */
141typedef struct {
142 char *word;
143 int token;
144} STRING_INT_ALIST;
145
a0c0a00f 146/* A macro to avoid making an unnecessary function call. */
726f6388 147#define REVERSE_LIST(list, type) \
7117c2d2 148 ((list && list->next) ? (type)list_reverse ((GENERIC_LIST *)list) \
28ef6c31 149 : (type)(list))
726f6388
JA
150
151#if __GNUC__ > 1
95732b49 152# define FASTCOPY(s, d, n) __builtin_memcpy ((d), (s), (n))
726f6388 153#else /* !__GNUC__ */
ccc6cda3
JA
154# if !defined (HAVE_BCOPY)
155# if !defined (HAVE_MEMMOVE)
95732b49 156# define FASTCOPY(s, d, n) memcpy ((d), (s), (n))
726f6388 157# else
95732b49 158# define FASTCOPY(s, d, n) memmove ((d), (s), (n))
ccc6cda3
JA
159# endif /* !HAVE_MEMMOVE */
160# else /* HAVE_BCOPY */
95732b49 161# define FASTCOPY(s, d, n) bcopy ((s), (d), (n))
ccc6cda3 162# endif /* HAVE_BCOPY */
726f6388
JA
163#endif /* !__GNUC__ */
164
165/* String comparisons that possibly save a function call each. */
166#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
bb70624e
JA
167#define STREQN(a, b, n) ((n == 0) ? (1) \
168 : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
726f6388
JA
169
170/* More convenience definitions that possibly save system or libc calls. */
171#define STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0)
172#define FREE(s) do { if (s) free (s); } while (0)
cce855bc 173#define MEMBER(c, s) (((c) && c == (s)[0] && !(s)[1]) || (member(c, s)))
726f6388 174
ccc6cda3
JA
175/* A fairly hairy macro to check whether an allocated string has more room,
176 and to resize it using xrealloc if it does not.
177 STR is the string (char *)
178 CIND is the current index into the string (int)
179 ROOM is the amount of additional room we need in the string (int)
180 CSIZE is the currently-allocated size of STR (int)
181 SINCR is how much to increment CSIZE before calling xrealloc (int) */
182
183#define RESIZE_MALLOCED_BUFFER(str, cind, room, csize, sincr) \
184 do { \
185 if ((cind) + (room) >= csize) \
186 { \
187 while ((cind) + (room) >= csize) \
188 csize += (sincr); \
189 str = xrealloc (str, csize); \
190 } \
191 } while (0)
726f6388
JA
192
193/* Function pointers can be declared as (Function *)foo. */
ccc6cda3
JA
194#if !defined (_FUNCTION_DEF)
195# define _FUNCTION_DEF
726f6388
JA
196typedef int Function ();
197typedef void VFunction ();
f73dda09
JA
198typedef char *CPFunction (); /* no longer used */
199typedef char **CPPFunction (); /* no longer used */
726f6388
JA
200#endif /* _FUNCTION_DEF */
201
f73dda09
JA
202#ifndef SH_FUNCTION_TYPEDEF
203# define SH_FUNCTION_TYPEDEF
204
205/* Shell function typedefs with prototypes */
206/* `Generic' function pointer typedefs */
207
208typedef int sh_intfunc_t __P((int));
209typedef int sh_ivoidfunc_t __P((void));
210typedef int sh_icpfunc_t __P((char *));
211typedef int sh_icppfunc_t __P((char **));
212typedef int sh_iptrfunc_t __P((PTR_T));
213
214typedef void sh_voidfunc_t __P((void));
215typedef void sh_vintfunc_t __P((int));
216typedef void sh_vcpfunc_t __P((char *));
217typedef void sh_vcppfunc_t __P((char **));
218typedef void sh_vptrfunc_t __P((PTR_T));
219
220typedef int sh_wdesc_func_t __P((WORD_DESC *));
221typedef int sh_wlist_func_t __P((WORD_LIST *));
222
223typedef int sh_glist_func_t __P((GENERIC_LIST *));
224
225typedef char *sh_string_func_t __P((char *)); /* like savestring, et al. */
226
227typedef int sh_msg_func_t __P((const char *, ...)); /* printf(3)-like */
228typedef void sh_vmsg_func_t __P((const char *, ...)); /* printf(3)-like */
229
230/* Specific function pointer typedefs. Most of these could be done
231 with #defines. */
232typedef void sh_sv_func_t __P((char *)); /* sh_vcpfunc_t */
233typedef void sh_free_func_t __P((PTR_T)); /* sh_vptrfunc_t */
234typedef void sh_resetsig_func_t __P((int)); /* sh_vintfunc_t */
235
236typedef int sh_ignore_func_t __P((const char *)); /* sh_icpfunc_t */
237
495aee44
CR
238typedef int sh_assign_func_t __P((const char *));
239typedef int sh_wassign_func_t __P((WORD_DESC *, int));
f73dda09 240
a0c0a00f
CR
241typedef int sh_load_func_t __P((char *));
242typedef void sh_unload_func_t __P((char *));
243
f73dda09
JA
244typedef int sh_builtin_func_t __P((WORD_LIST *)); /* sh_wlist_func_t */
245
246#endif /* SH_FUNCTION_TYPEDEF */
247
726f6388
JA
248#define NOW ((time_t) time ((time_t *) 0))
249
250/* Some defines for calling file status functions. */
251#define FS_EXISTS 0x1
252#define FS_EXECABLE 0x2
253#define FS_EXEC_PREFERRED 0x4
254#define FS_EXEC_ONLY 0x8
ccc6cda3
JA
255#define FS_DIRECTORY 0x10
256#define FS_NODIRS 0x20
95732b49 257#define FS_READABLE 0x40
726f6388 258
7117c2d2
JA
259/* Default maximum for move_to_high_fd */
260#define HIGH_FD_MAX 256
261
f73dda09
JA
262/* The type of function passed as the fourth argument to qsort(3). */
263#ifdef __STDC__
264typedef int QSFUNC (const void *, const void *);
265#else
266typedef int QSFUNC ();
267#endif
268
28ef6c31
JA
269/* Some useful definitions for Unix pathnames. Argument convention:
270 x == string, c == character */
271
272#if !defined (__CYGWIN__)
273# define ABSPATH(x) ((x)[0] == '/')
274# define RELPATH(x) ((x)[0] != '/')
275#else /* __CYGWIN__ */
95732b49
JA
276# define ABSPATH(x) (((x)[0] && ISALPHA((unsigned char)(x)[0]) && (x)[1] == ':') || ISDIRSEP((x)[0]))
277# define RELPATH(x) (ABSPATH(x) == 0)
28ef6c31
JA
278#endif /* __CYGWIN__ */
279
280#define ROOTEDPATH(x) (ABSPATH(x))
281
282#define DIRSEP '/'
95732b49
JA
283#if !defined (__CYGWIN__)
284# define ISDIRSEP(c) ((c) == '/')
285#else
286# define ISDIRSEP(c) ((c) == '/' || (c) == '\\')
287#endif /* __CYGWIN__ */
28ef6c31
JA
288#define PATHSEP(c) (ISDIRSEP(c) || (c) == 0)
289
f73dda09 290#if 0
ccc6cda3 291/* Declarations for functions defined in xmalloc.c */
f73dda09
JA
292extern PTR_T xmalloc __P((size_t));
293extern PTR_T xrealloc __P((void *, size_t));
bb70624e 294extern void xfree __P((void *));
f73dda09 295#endif
726f6388 296
ccc6cda3
JA
297/* Declarations for functions defined in general.c */
298extern void posix_initialize __P((int));
726f6388 299
d233b485
CR
300extern int num_posix_options __P((void));
301extern char *get_posix_options __P((char *));
302extern void set_posix_options __P((const char *));
303
ccc6cda3
JA
304#if defined (RLIMTYPE)
305extern RLIMTYPE string_to_rlimtype __P((char *));
306extern void print_rlimtype __P((RLIMTYPE, int));
307#endif
726f6388 308
a0c0a00f 309extern int all_digits __P((const char *));
3185942a 310extern int legal_number __P((const char *, intmax_t *));
a0c0a00f
CR
311extern int legal_identifier __P((const char *));
312extern int importable_function_name __P((const char *, size_t));
313extern int exportable_function_name __P((const char *));
726f6388 314extern int check_identifier __P((WORD_DESC *, int));
a0c0a00f
CR
315extern int valid_nameref_value __P((const char *, int));
316extern int check_selfref __P((const char *, char *, int));
317extern int legal_alias_name __P((const char *, int));
d233b485 318extern int line_isblank __P((const char *));
b80f6443 319extern int assignment __P((const char *, int));
ccc6cda3 320
28ef6c31 321extern int sh_unset_nodelay_mode __P((int));
d233b485 322extern int sh_setclexec __P((int));
7117c2d2 323extern int sh_validfd __P((int));
495aee44 324extern int fd_ispipe __P((int));
ccc6cda3 325extern void check_dev_tty __P((void));
d166f048 326extern int move_to_high_fd __P((int, int, int));
a0c0a00f 327extern int check_binary_file __P((const char *, int));
f73dda09
JA
328
329#ifdef _POSIXSTAT_H_
a0c0a00f 330extern int same_file __P((const char *, const char *, struct stat *, struct stat *));
f73dda09 331#endif
ccc6cda3 332
3185942a
JA
333extern int sh_openpipe __P((int *));
334extern int sh_closepipe __P((int *));
335
a0c0a00f
CR
336extern int file_exists __P((const char *));
337extern int file_isdir __P((const char *));
338extern int file_iswdir __P((const char *));
ac50fbac 339extern int path_dot_or_dotdot __P((const char *));
f73dda09
JA
340extern int absolute_pathname __P((const char *));
341extern int absolute_program __P((const char *));
95732b49 342
a0c0a00f 343extern char *make_absolute __P((const char *, const char *));
726f6388
JA
344extern char *base_pathname __P((char *));
345extern char *full_pathname __P((char *));
726f6388 346extern char *polite_directory_format __P((char *));
3185942a 347extern char *trim_pathname __P((char *, int));
a0c0a00f 348extern char *printable_filename __P((char *, int));
726f6388 349
ccc6cda3 350extern char *extract_colon_unit __P((char *, int *));
726f6388 351
ccc6cda3 352extern void tilde_initialize __P((void));
95732b49 353extern char *bash_tilde_find_word __P((const char *, int, int *));
7117c2d2 354extern char *bash_tilde_expand __P((const char *, int));
726f6388 355
d166f048 356extern int group_member __P((gid_t));
d166f048 357extern char **get_group_list __P((int *));
b72432fd 358extern int *get_group_array __P((int *));
d166f048 359
a0c0a00f 360extern char *conf_standard_path __P((void));
d233b485 361extern int default_columns __P((void));
a0c0a00f 362
ccc6cda3 363#endif /* _GENERAL_H_ */