]> git.ipfire.org Git - thirdparty/bash.git/blame - array.h
Bash-5.0 patch 4: the wait builtin without arguments only waits for known children...
[thirdparty/bash.git] / array.h
CommitLineData
ccc6cda3
JA
1/* array.h -- definitions for the interface exported by array.c that allows
2 the rest of the shell to manipulate array variables. */
bb70624e 3
3185942a 4/* Copyright (C) 1997-2009 Free Software Foundation, Inc.
bb70624e
JA
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
3185942a
JA
8 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
bb70624e 12
3185942a
JA
13 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
20*/
bb70624e 21
bb70624e 22
ccc6cda3
JA
23#ifndef _ARRAY_H_
24#define _ARRAY_H_
25
26#include "stdc.h"
27
7117c2d2 28typedef intmax_t arrayind_t;
ccc6cda3
JA
29
30enum atype {array_indexed, array_assoc};
31
32typedef struct array {
33 enum atype type;
0001803f
CR
34 arrayind_t max_index;
35 int num_elements;
d233b485 36 struct array_element *lastref;
ccc6cda3
JA
37 struct array_element *head;
38} ARRAY;
39
40typedef struct array_element {
41 arrayind_t ind;
42 char *value;
43 struct array_element *next, *prev;
44} ARRAY_ELEMENT;
45
b80f6443 46typedef int sh_ae_map_func_t __P((ARRAY_ELEMENT *, void *));
f73dda09 47
7117c2d2
JA
48/* Basic operations on entire arrays */
49extern ARRAY *array_create __P((void));
50extern void array_flush __P((ARRAY *));
51extern void array_dispose __P((ARRAY *));
52extern ARRAY *array_copy __P((ARRAY *));
53extern ARRAY *array_slice __P((ARRAY *, ARRAY_ELEMENT *, ARRAY_ELEMENT *));
b80f6443 54extern void array_walk __P((ARRAY *, sh_ae_map_func_t *, void *));
ccc6cda3 55
7117c2d2
JA
56extern ARRAY_ELEMENT *array_shift __P((ARRAY *, int, int));
57extern int array_rshift __P((ARRAY *, int, char *));
b80f6443
JA
58extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
59extern int array_shift_element __P((ARRAY *, char *));
3185942a 60
7117c2d2 61extern ARRAY *array_quote __P((ARRAY *));
f1be666c 62extern ARRAY *array_quote_escapes __P((ARRAY *));
3185942a
JA
63extern ARRAY *array_dequote __P((ARRAY *));
64extern ARRAY *array_dequote_escapes __P((ARRAY *));
65extern ARRAY *array_remove_quoted_nulls __P((ARRAY *));
ccc6cda3 66
b80f6443 67extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
7117c2d2 68extern char *array_patsub __P((ARRAY *, char *, char *, int));
3185942a 69extern char *array_modcase __P((ARRAY *, char *, int, int));
ccc6cda3 70
7117c2d2
JA
71/* Basic operations on array elements. */
72extern ARRAY_ELEMENT *array_create_element __P((arrayind_t, char *));
73extern ARRAY_ELEMENT *array_copy_element __P((ARRAY_ELEMENT *));
74extern void array_dispose_element __P((ARRAY_ELEMENT *));
ccc6cda3 75
7117c2d2
JA
76extern int array_insert __P((ARRAY *, arrayind_t, char *));
77extern ARRAY_ELEMENT *array_remove __P((ARRAY *, arrayind_t));
78extern char *array_reference __P((ARRAY *, arrayind_t));
79
80/* Converting to and from arrays */
ccc6cda3 81extern WORD_LIST *array_to_word_list __P((ARRAY *));
7117c2d2 82extern ARRAY *array_from_word_list __P((WORD_LIST *));
b80f6443
JA
83extern WORD_LIST *array_keys_to_word_list __P((ARRAY *));
84
7117c2d2 85extern ARRAY *array_assign_list __P((ARRAY *, WORD_LIST *));
ccc6cda3 86
bb70624e
JA
87extern char **array_to_argv __P((ARRAY *));
88
7117c2d2 89extern char *array_to_assign __P((ARRAY *, int));
ccc6cda3 90extern char *array_to_string __P((ARRAY *, char *, int));
7117c2d2 91extern ARRAY *array_from_string __P((char *, char *));
ccc6cda3 92
7117c2d2
JA
93/* Flags for array_shift */
94#define AS_DISPOSE 0x01
ccc6cda3
JA
95
96#define array_num_elements(a) ((a)->num_elements)
97#define array_max_index(a) ((a)->max_index)
d233b485 98#define array_first_index(a) ((a)->head->next->ind)
ccc6cda3
JA
99#define array_head(a) ((a)->head)
100#define array_empty(a) ((a)->num_elements == 0)
101
102#define element_value(ae) ((ae)->value)
103#define element_index(ae) ((ae)->ind)
104#define element_forw(ae) ((ae)->next)
105#define element_back(ae) ((ae)->prev)
106
d233b485
CR
107#define set_element_value(ae, val) ((ae)->value = (val))
108
b80f6443
JA
109/* Convenience */
110#define array_push(a,v) \
111 do { array_rshift ((a), 1, (v)); } while (0)
112#define array_pop(a) \
113 do { array_dispose_element (array_shift ((a), 1, 0)); } while (0)
114
115#define GET_ARRAY_FROM_VAR(n, v, a) \
116 do { \
117 (v) = find_variable (n); \
118 (a) = ((v) && array_p ((v))) ? array_cell (v) : (ARRAY *)0; \
119 } while (0)
120
ccc6cda3
JA
121#define ALL_ELEMENT_SUB(c) ((c) == '@' || (c) == '*')
122
123#endif /* _ARRAY_H_ */