]>
Commit | Line | Data |
---|---|---|
726f6388 JA |
1 | /* general.h -- defines that everybody likes to use. */ |
2 | ||
3185942a | 3 | /* Copyright (C) 1993-2009 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__) |
61 | extern char *strchr (), *strrchr (); | |
62 | #endif | |
63 | ||
7117c2d2 | 64 | #if !defined (strcpy) && (defined (HAVE_DECL_STRCPY) && !HAVE_DECL_STRCPY) |
f73dda09 | 65 | extern 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 | ||
95 | /* Bound on length of the string representing an integer value of type T. | |
96 | Subtract one for the sign bit if T is signed; | |
97 | 302 / 1000 is log10 (2) rounded up; | |
98 | add one for integer division truncation; | |
99 | add one more for a minus sign if t is signed. */ | |
100 | #define INT_STRLEN_BOUND(t) \ | |
101 | ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ | |
102 | + 1 + TYPE_SIGNED (t)) | |
726f6388 | 103 | |
28ef6c31 | 104 | |
ccc6cda3 | 105 | /* Define exactly what a legal shell identifier consists of. */ |
f73dda09 JA |
106 | #define legal_variable_starter(c) (ISALPHA(c) || (c == '_')) |
107 | #define legal_variable_char(c) (ISALNUM(c) || c == '_') | |
ccc6cda3 | 108 | |
726f6388 JA |
109 | /* Definitions used in subst.c and by the `read' builtin for field |
110 | splitting. */ | |
111 | #define spctabnl(c) ((c) == ' ' || (c) == '\t' || (c) == '\n') | |
112 | ||
726f6388 JA |
113 | /* All structs which contain a `next' field should have that field |
114 | as the first field in the struct. This means that functions | |
115 | can be written to handle the general case for linked lists. */ | |
116 | typedef struct g_list { | |
117 | struct g_list *next; | |
118 | } GENERIC_LIST; | |
119 | ||
120 | /* Here is a generic structure for associating character strings | |
121 | with integers. It is used in the parser for shell tokenization. */ | |
122 | typedef struct { | |
123 | char *word; | |
124 | int token; | |
125 | } STRING_INT_ALIST; | |
126 | ||
ac50fbac | 127 | /* A macro to avoid making an unneccessary function call. */ |
726f6388 | 128 | #define REVERSE_LIST(list, type) \ |
7117c2d2 | 129 | ((list && list->next) ? (type)list_reverse ((GENERIC_LIST *)list) \ |
28ef6c31 | 130 | : (type)(list)) |
726f6388 JA |
131 | |
132 | #if __GNUC__ > 1 | |
95732b49 | 133 | # define FASTCOPY(s, d, n) __builtin_memcpy ((d), (s), (n)) |
726f6388 | 134 | #else /* !__GNUC__ */ |
ccc6cda3 JA |
135 | # if !defined (HAVE_BCOPY) |
136 | # if !defined (HAVE_MEMMOVE) | |
95732b49 | 137 | # define FASTCOPY(s, d, n) memcpy ((d), (s), (n)) |
726f6388 | 138 | # else |
95732b49 | 139 | # define FASTCOPY(s, d, n) memmove ((d), (s), (n)) |
ccc6cda3 JA |
140 | # endif /* !HAVE_MEMMOVE */ |
141 | # else /* HAVE_BCOPY */ | |
95732b49 | 142 | # define FASTCOPY(s, d, n) bcopy ((s), (d), (n)) |
ccc6cda3 | 143 | # endif /* HAVE_BCOPY */ |
726f6388 JA |
144 | #endif /* !__GNUC__ */ |
145 | ||
146 | /* String comparisons that possibly save a function call each. */ | |
147 | #define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0) | |
bb70624e JA |
148 | #define STREQN(a, b, n) ((n == 0) ? (1) \ |
149 | : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)) | |
726f6388 JA |
150 | |
151 | /* More convenience definitions that possibly save system or libc calls. */ | |
152 | #define STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) | |
153 | #define FREE(s) do { if (s) free (s); } while (0) | |
cce855bc | 154 | #define MEMBER(c, s) (((c) && c == (s)[0] && !(s)[1]) || (member(c, s))) |
726f6388 | 155 | |
ccc6cda3 JA |
156 | /* A fairly hairy macro to check whether an allocated string has more room, |
157 | and to resize it using xrealloc if it does not. | |
158 | STR is the string (char *) | |
159 | CIND is the current index into the string (int) | |
160 | ROOM is the amount of additional room we need in the string (int) | |
161 | CSIZE is the currently-allocated size of STR (int) | |
162 | SINCR is how much to increment CSIZE before calling xrealloc (int) */ | |
163 | ||
164 | #define RESIZE_MALLOCED_BUFFER(str, cind, room, csize, sincr) \ | |
165 | do { \ | |
166 | if ((cind) + (room) >= csize) \ | |
167 | { \ | |
168 | while ((cind) + (room) >= csize) \ | |
169 | csize += (sincr); \ | |
170 | str = xrealloc (str, csize); \ | |
171 | } \ | |
172 | } while (0) | |
726f6388 JA |
173 | |
174 | /* Function pointers can be declared as (Function *)foo. */ | |
ccc6cda3 JA |
175 | #if !defined (_FUNCTION_DEF) |
176 | # define _FUNCTION_DEF | |
726f6388 JA |
177 | typedef int Function (); |
178 | typedef void VFunction (); | |
f73dda09 JA |
179 | typedef char *CPFunction (); /* no longer used */ |
180 | typedef char **CPPFunction (); /* no longer used */ | |
726f6388 JA |
181 | #endif /* _FUNCTION_DEF */ |
182 | ||
f73dda09 JA |
183 | #ifndef SH_FUNCTION_TYPEDEF |
184 | # define SH_FUNCTION_TYPEDEF | |
185 | ||
186 | /* Shell function typedefs with prototypes */ | |
187 | /* `Generic' function pointer typedefs */ | |
188 | ||
189 | typedef int sh_intfunc_t __P((int)); | |
190 | typedef int sh_ivoidfunc_t __P((void)); | |
191 | typedef int sh_icpfunc_t __P((char *)); | |
192 | typedef int sh_icppfunc_t __P((char **)); | |
193 | typedef int sh_iptrfunc_t __P((PTR_T)); | |
194 | ||
195 | typedef void sh_voidfunc_t __P((void)); | |
196 | typedef void sh_vintfunc_t __P((int)); | |
197 | typedef void sh_vcpfunc_t __P((char *)); | |
198 | typedef void sh_vcppfunc_t __P((char **)); | |
199 | typedef void sh_vptrfunc_t __P((PTR_T)); | |
200 | ||
201 | typedef int sh_wdesc_func_t __P((WORD_DESC *)); | |
202 | typedef int sh_wlist_func_t __P((WORD_LIST *)); | |
203 | ||
204 | typedef int sh_glist_func_t __P((GENERIC_LIST *)); | |
205 | ||
206 | typedef char *sh_string_func_t __P((char *)); /* like savestring, et al. */ | |
207 | ||
208 | typedef int sh_msg_func_t __P((const char *, ...)); /* printf(3)-like */ | |
209 | typedef void sh_vmsg_func_t __P((const char *, ...)); /* printf(3)-like */ | |
210 | ||
211 | /* Specific function pointer typedefs. Most of these could be done | |
212 | with #defines. */ | |
213 | typedef void sh_sv_func_t __P((char *)); /* sh_vcpfunc_t */ | |
214 | typedef void sh_free_func_t __P((PTR_T)); /* sh_vptrfunc_t */ | |
215 | typedef void sh_resetsig_func_t __P((int)); /* sh_vintfunc_t */ | |
216 | ||
217 | typedef int sh_ignore_func_t __P((const char *)); /* sh_icpfunc_t */ | |
218 | ||
495aee44 CR |
219 | typedef int sh_assign_func_t __P((const char *)); |
220 | typedef int sh_wassign_func_t __P((WORD_DESC *, int)); | |
f73dda09 JA |
221 | |
222 | typedef int sh_builtin_func_t __P((WORD_LIST *)); /* sh_wlist_func_t */ | |
223 | ||
224 | #endif /* SH_FUNCTION_TYPEDEF */ | |
225 | ||
726f6388 JA |
226 | #define NOW ((time_t) time ((time_t *) 0)) |
227 | ||
228 | /* Some defines for calling file status functions. */ | |
229 | #define FS_EXISTS 0x1 | |
230 | #define FS_EXECABLE 0x2 | |
231 | #define FS_EXEC_PREFERRED 0x4 | |
232 | #define FS_EXEC_ONLY 0x8 | |
ccc6cda3 JA |
233 | #define FS_DIRECTORY 0x10 |
234 | #define FS_NODIRS 0x20 | |
95732b49 | 235 | #define FS_READABLE 0x40 |
726f6388 | 236 | |
7117c2d2 JA |
237 | /* Default maximum for move_to_high_fd */ |
238 | #define HIGH_FD_MAX 256 | |
239 | ||
f73dda09 JA |
240 | /* The type of function passed as the fourth argument to qsort(3). */ |
241 | #ifdef __STDC__ | |
242 | typedef int QSFUNC (const void *, const void *); | |
243 | #else | |
244 | typedef int QSFUNC (); | |
245 | #endif | |
246 | ||
28ef6c31 JA |
247 | /* Some useful definitions for Unix pathnames. Argument convention: |
248 | x == string, c == character */ | |
249 | ||
250 | #if !defined (__CYGWIN__) | |
251 | # define ABSPATH(x) ((x)[0] == '/') | |
252 | # define RELPATH(x) ((x)[0] != '/') | |
253 | #else /* __CYGWIN__ */ | |
95732b49 JA |
254 | # define ABSPATH(x) (((x)[0] && ISALPHA((unsigned char)(x)[0]) && (x)[1] == ':') || ISDIRSEP((x)[0])) |
255 | # define RELPATH(x) (ABSPATH(x) == 0) | |
28ef6c31 JA |
256 | #endif /* __CYGWIN__ */ |
257 | ||
258 | #define ROOTEDPATH(x) (ABSPATH(x)) | |
259 | ||
260 | #define DIRSEP '/' | |
95732b49 JA |
261 | #if !defined (__CYGWIN__) |
262 | # define ISDIRSEP(c) ((c) == '/') | |
263 | #else | |
264 | # define ISDIRSEP(c) ((c) == '/' || (c) == '\\') | |
265 | #endif /* __CYGWIN__ */ | |
28ef6c31 JA |
266 | #define PATHSEP(c) (ISDIRSEP(c) || (c) == 0) |
267 | ||
f73dda09 | 268 | #if 0 |
ccc6cda3 | 269 | /* Declarations for functions defined in xmalloc.c */ |
f73dda09 JA |
270 | extern PTR_T xmalloc __P((size_t)); |
271 | extern PTR_T xrealloc __P((void *, size_t)); | |
bb70624e | 272 | extern void xfree __P((void *)); |
f73dda09 | 273 | #endif |
726f6388 | 274 | |
ccc6cda3 JA |
275 | /* Declarations for functions defined in general.c */ |
276 | extern void posix_initialize __P((int)); | |
726f6388 | 277 | |
ccc6cda3 JA |
278 | #if defined (RLIMTYPE) |
279 | extern RLIMTYPE string_to_rlimtype __P((char *)); | |
280 | extern void print_rlimtype __P((RLIMTYPE, int)); | |
281 | #endif | |
726f6388 | 282 | |
726f6388 | 283 | extern int all_digits __P((char *)); |
3185942a | 284 | extern int legal_number __P((const char *, intmax_t *)); |
726f6388 JA |
285 | extern int legal_identifier __P((char *)); |
286 | extern int check_identifier __P((WORD_DESC *, int)); | |
b80f6443 JA |
287 | extern int legal_alias_name __P((char *, int)); |
288 | extern int assignment __P((const char *, int)); | |
ccc6cda3 | 289 | |
28ef6c31 | 290 | extern int sh_unset_nodelay_mode __P((int)); |
7117c2d2 | 291 | extern int sh_validfd __P((int)); |
495aee44 | 292 | extern int fd_ispipe __P((int)); |
ccc6cda3 | 293 | extern void check_dev_tty __P((void)); |
d166f048 | 294 | extern int move_to_high_fd __P((int, int, int)); |
f73dda09 JA |
295 | extern int check_binary_file __P((char *, int)); |
296 | ||
297 | #ifdef _POSIXSTAT_H_ | |
298 | extern int same_file __P((char *, char *, struct stat *, struct stat *)); | |
299 | #endif | |
ccc6cda3 | 300 | |
3185942a JA |
301 | extern int sh_openpipe __P((int *)); |
302 | extern int sh_closepipe __P((int *)); | |
303 | ||
304 | extern int file_exists __P((char *)); | |
b80f6443 JA |
305 | extern int file_isdir __P((char *)); |
306 | extern int file_iswdir __P((char *)); | |
ac50fbac | 307 | extern int path_dot_or_dotdot __P((const char *)); |
f73dda09 JA |
308 | extern int absolute_pathname __P((const char *)); |
309 | extern int absolute_program __P((const char *)); | |
95732b49 JA |
310 | |
311 | extern char *make_absolute __P((char *, char *)); | |
726f6388 JA |
312 | extern char *base_pathname __P((char *)); |
313 | extern char *full_pathname __P((char *)); | |
726f6388 | 314 | extern char *polite_directory_format __P((char *)); |
3185942a | 315 | extern char *trim_pathname __P((char *, int)); |
726f6388 | 316 | |
ccc6cda3 | 317 | extern char *extract_colon_unit __P((char *, int *)); |
726f6388 | 318 | |
ccc6cda3 | 319 | extern void tilde_initialize __P((void)); |
95732b49 | 320 | extern char *bash_tilde_find_word __P((const char *, int, int *)); |
7117c2d2 | 321 | extern char *bash_tilde_expand __P((const char *, int)); |
726f6388 | 322 | |
d166f048 | 323 | extern int group_member __P((gid_t)); |
d166f048 | 324 | extern char **get_group_list __P((int *)); |
b72432fd | 325 | extern int *get_group_array __P((int *)); |
d166f048 | 326 | |
ccc6cda3 | 327 | #endif /* _GENERAL_H_ */ |