Git init
[framework/base/acl.git] / setfacl / sequence.c
1 /*
2   File: sequence.c
3   (Linux Access Control List Management)
4
5   Copyright (C) 1999, 2000
6   Andreas Gruenbacher, <a.gruenbacher@bestbits.at>
7         
8   This program is free software; you can redistribute it and/or
9   modify it under the terms of the GNU Lesser General Public
10   License as published by the Free Software Foundation; either
11   version 2.1 of the License, or (at your option) any later version.
12
13   This program 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 GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public
19   License along with this library; if not, write to the Free Software
20   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22
23
24 #include <stdlib.h>
25 #include "sequence.h"
26
27
28 cmd_t
29 cmd_init(
30         void)
31 {
32         return (cmd_t)malloc(sizeof(struct cmd_obj));
33 }
34
35
36 void
37 cmd_free(
38         cmd_t cmd)
39 {
40         free(cmd);
41 }
42
43
44 seq_t
45 seq_init(
46         void)
47 {
48         seq_t seq = (seq_t)malloc(sizeof(struct seq_obj));
49         if (seq == NULL)
50                 return NULL;
51         seq->s_first = seq->s_last = NULL;
52         return seq;
53 }
54
55
56 int
57 seq_free(
58         seq_t seq)
59 {
60         cmd_t cmd = seq->s_first;
61         while (cmd) {
62                 seq->s_first = seq->s_first->c_next;
63                 cmd_free(cmd);
64                 cmd = seq->s_first;
65         }
66         free(seq);
67         return 0;
68 }
69
70
71 int
72 seq_empty(
73         seq_t seq)
74 {
75         return (seq->s_first == NULL);
76 }
77
78
79 int
80 seq_append(
81         seq_t seq,
82         cmd_t cmd)
83 {
84         cmd->c_next = NULL;
85         if (seq->s_first == NULL) {
86                 seq->s_first = seq->s_last = cmd;
87         } else {
88                 seq->s_last->c_next = cmd;
89                 seq->s_last = cmd;
90         }
91         return 0;
92 }
93
94
95 int
96 seq_append_cmd(
97         seq_t seq,
98         cmd_tag_t cmd,
99         acl_type_t type)
100 {
101         cmd_t cmd_d = cmd_init();
102         if (cmd_d == NULL)
103                 return -1;
104         cmd_d->c_cmd = cmd;
105         cmd_d->c_type = type;
106         if (seq_append(seq, cmd_d) != 0) {
107                 cmd_free(cmd_d);
108                 return -1;
109         }
110         return 0;
111 }
112
113
114 int
115 seq_get_cmd(
116         seq_t seq,
117         int which,
118         cmd_t *cmd)
119 {
120         if (which == SEQ_FIRST_CMD) {
121                 if (seq->s_first == NULL)
122                         return 0;
123                 if (cmd)
124                         *cmd = seq->s_first;
125                 return 1;
126         } else if (which == SEQ_NEXT_CMD) {
127                 if (cmd == NULL)
128                         return -1;
129                 if (*cmd) {
130                         *cmd = (*cmd)->c_next;
131                         return (*cmd == NULL) ? 0 : 1;
132                 }
133                 return 0;
134         } else {
135                 return -1;
136         }
137 }
138
139
140 int
141 seq_delete_cmd(
142         seq_t seq,
143         cmd_t cmd)
144 {
145         cmd_t prev = seq->s_first;
146
147         if (cmd == seq->s_first) {
148                 seq->s_first = seq->s_first->c_next;
149                 cmd_free(cmd);
150                 return 0;
151         }
152         while (prev != NULL && prev->c_next != cmd)
153                 prev = prev->c_next;
154         if (prev == NULL)
155                 return -1;
156         if (cmd == seq->s_last)
157                 seq->s_last = prev;
158         prev->c_next = cmd->c_next;
159         cmd_free(cmd);
160         return 0;
161 }
162