]> git.ipfire.org Git - thirdparty/bash.git/blame - array.h
Bash-4.3 patch 32
[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;
ccc6cda3
JA
36 struct array_element *head;
37} ARRAY;
38
39typedef struct array_element {
40 arrayind_t ind;
41 char *value;
42 struct array_element *next, *prev;
43} ARRAY_ELEMENT;
44
b80f6443 45typedef int sh_ae_map_func_t __P((ARRAY_ELEMENT *, void *));
f73dda09 46
7117c2d2
JA
47/* Basic operations on entire arrays */
48extern ARRAY *array_create __P((void));
49extern void array_flush __P((ARRAY *));
50extern void array_dispose __P((ARRAY *));
51extern ARRAY *array_copy __P((ARRAY *));
52extern ARRAY *array_slice __P((ARRAY *, ARRAY_ELEMENT *, ARRAY_ELEMENT *));
b80f6443 53extern void array_walk __P((ARRAY *, sh_ae_map_func_t *, void *));
ccc6cda3 54
7117c2d2
JA
55extern ARRAY_ELEMENT *array_shift __P((ARRAY *, int, int));
56extern int array_rshift __P((ARRAY *, int, char *));
b80f6443
JA
57extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
58extern int array_shift_element __P((ARRAY *, char *));
3185942a 59
7117c2d2 60extern ARRAY *array_quote __P((ARRAY *));
f1be666c 61extern ARRAY *array_quote_escapes __P((ARRAY *));
3185942a
JA
62extern ARRAY *array_dequote __P((ARRAY *));
63extern ARRAY *array_dequote_escapes __P((ARRAY *));
64extern ARRAY *array_remove_quoted_nulls __P((ARRAY *));
ccc6cda3 65
b80f6443 66extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
7117c2d2 67extern char *array_patsub __P((ARRAY *, char *, char *, int));
3185942a 68extern char *array_modcase __P((ARRAY *, char *, int, int));
ccc6cda3 69
7117c2d2
JA
70/* Basic operations on array elements. */
71extern ARRAY_ELEMENT *array_create_element __P((arrayind_t, char *));
72extern ARRAY_ELEMENT *array_copy_element __P((ARRAY_ELEMENT *));
73extern void array_dispose_element __P((ARRAY_ELEMENT *));
ccc6cda3 74
7117c2d2
JA
75extern int array_insert __P((ARRAY *, arrayind_t, char *));
76extern ARRAY_ELEMENT *array_remove __P((ARRAY *, arrayind_t));
77extern char *array_reference __P((ARRAY *, arrayind_t));
78
79/* Converting to and from arrays */
ccc6cda3 80extern WORD_LIST *array_to_word_list __P((ARRAY *));
7117c2d2 81extern ARRAY *array_from_word_list __P((WORD_LIST *));
b80f6443
JA
82extern WORD_LIST *array_keys_to_word_list __P((ARRAY *));
83
7117c2d2 84extern ARRAY *array_assign_list __P((ARRAY *, WORD_LIST *));
ccc6cda3 85
bb70624e
JA
86extern char **array_to_argv __P((ARRAY *));
87
7117c2d2 88extern char *array_to_assign __P((ARRAY *, int));
ccc6cda3 89extern char *array_to_string __P((ARRAY *, char *, int));
7117c2d2 90extern ARRAY *array_from_string __P((char *, char *));
ccc6cda3 91
7117c2d2
JA
92/* Flags for array_shift */
93#define AS_DISPOSE 0x01
ccc6cda3
JA
94
95#define array_num_elements(a) ((a)->num_elements)
96#define array_max_index(a) ((a)->max_index)
97#define array_head(a) ((a)->head)
98#define array_empty(a) ((a)->num_elements == 0)
99
100#define element_value(ae) ((ae)->value)
101#define element_index(ae) ((ae)->ind)
102#define element_forw(ae) ((ae)->next)
103#define element_back(ae) ((ae)->prev)
104
b80f6443
JA
105/* Convenience */
106#define array_push(a,v) \
107 do { array_rshift ((a), 1, (v)); } while (0)
108#define array_pop(a) \
109 do { array_dispose_element (array_shift ((a), 1, 0)); } while (0)
110
111#define GET_ARRAY_FROM_VAR(n, v, a) \
112 do { \
113 (v) = find_variable (n); \
114 (a) = ((v) && array_p ((v))) ? array_cell (v) : (ARRAY *)0; \
115 } while (0)
116
ccc6cda3
JA
117#define ALL_ELEMENT_SUB(c) ((c) == '@' || (c) == '*')
118
119#endif /* _ARRAY_H_ */