1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <libintl.h>
4 #include "lst.h"
5 #include "util.h"
6
7
8 void
9 lst_create(lst_t *plst)
10 {
11 plst->csz = 0;
12 plst->tsz = 0;
13 plst->buf = NULL;
14 }
15
16 int
17 lst_is_empty(lst_t *plst)
18 {
19 return (plst->csz == 0);
20 }
21
22 void
23 lst_insert_head(lst_t *plst, void *ndata)
24 {
25 int i;
26 if (plst->csz == plst->tsz) {
27 plst->tsz = (plst->tsz == 0) ? 1 : plst->tsz * 2;
28 plst->buf = util_safe_realloc(plst->buf,
29 plst->tsz * sizeof (void *));
30 }
31
32 for (i = plst->csz; i > 0; i--)
33 plst->buf[i] = plst->buf[i - 1];
34
35 plst->buf[0] = ndata;
36 plst->csz++;
37 }
38
39
40 void
41 lst_insert_tail(lst_t *plst, void *ndata)
42 {
43 if (plst->csz == plst->tsz) {
44 plst->tsz = (plst->tsz == 0) ? 1 : plst->tsz * 2;
45 plst->buf = util_safe_realloc(plst->buf,
46 plst->tsz * sizeof (void *));
47 }
48
49 plst->buf[plst->csz++] = ndata;
50 }
51
52 int
53 lst_remove(lst_t *plst, void *rdata)
54 {
55 int i, idx = -1;
56 for (i = 0; i < plst->csz; i++) {
57 if (plst->buf[i] == rdata) {
58 idx = i;
59 break;
60 }
61 }
62 if (idx >= 0) {
63 for (i = idx; i < plst->csz - 1; i++)
64 plst->buf[i] = plst->buf[i + 1];
65
66 if (--plst->csz == 0) {
67 plst->tsz = 0;
68 free(plst->buf);
69 plst->buf = NULL;
70 }
71 return (0);
72 }
73 return (-1);
74 }
75
76 void
77 *lst_at(lst_t *plst, int idx)
78 {
79 if (idx < 0 || idx >= plst->csz) {
80 (void) fprintf(stderr, gettext(
81 "error accessing element outside lst\n"));
82 exit(1);
83 }
84 return (plst->buf[idx]);
85 }
86
87 void
88 *lst_replace_at(lst_t *plst, int idx, void *ndata)
89 {
90 void *odata;
91
92 if (idx < 0 || idx >= plst->csz) {
93 (void) fprintf(stderr, gettext(
94 "error accessing element outside lst\n"));
95 exit(1);
96 }
97 odata = plst->buf[idx];
98 plst->buf[idx] = ndata;
99 return (odata);
100 }
101
102 int
103 lst_size(lst_t *plst)
104 {
105 return (plst->csz);
106 }