1 /* $Id: uintlist.h 218147 2019-01-16 21:28:41Z twu $ */
2 #ifndef UINTLIST_INCLUDED
3 #define UINTLIST_INCLUDED
4 #ifdef HAVE_CONFIG_H
5 #include <config.h>		/* For HAVE_INLINE */
6 #endif
7 
8 typedef struct Uintlist_T *Uintlist_T;
9 
10 #include <stdlib.h>
11 #include "bool.h"
12 #include "mem.h"
13 
14 #define T Uintlist_T
15 struct T {
16   unsigned int first;
17   struct T *rest;
18 };
19 
20 
21 #if !defined(HAVE_INLINE)
22 
23 extern T Uintlist_push (T list, unsigned int x);
24 extern T Uintlist_pop (T list, unsigned int *x);
25 extern unsigned int Uintlist_head (T list);
26 extern T Uintlist_next (T list);
27 extern void Uintlist_free (T *list);
28 extern T Uintlist_reverse (T list);
29 extern int Uintlist_length (T list);
30 
31 #else
32 /* extern inline T Uintlist_push (T list, unsigned int x); */
33 static inline T
Uintlist_push(T list,unsigned int x)34 Uintlist_push (T list, unsigned int x) {
35   T new = (T) MALLOC(sizeof(*new));
36 
37   new->first = x;
38   new->rest = list;
39   return new;
40 }
41 
42 /* extern inline T Uintlist_pop (T list, unsigned int *x); */
43 static inline T
Uintlist_pop(T list,unsigned int * x)44 Uintlist_pop (T list, unsigned int *x) {
45   T head;
46 
47   if (list) {
48     head = list->rest;
49     *x = list->first;
50     FREE(list);
51     return head;
52   } else {
53     return list;
54   }
55 }
56 
57 /* extern inline unsigned int Uintlist_head (T list); */
58 static inline unsigned int
Uintlist_head(T list)59 Uintlist_head (T list) {
60   return list->first;
61 }
62 
63 /* extern inline T Uintlist_next (T list); */
64 static inline T
Uintlist_next(T list)65 Uintlist_next (T list) {
66   if (list) {
67     return list->rest;
68   } else {
69     return NULL;
70   }
71 }
72 
73 /* extern inline void Uintlist_free (T *list); */
74 static inline void
Uintlist_free(T * list)75 Uintlist_free (T *list) {
76   T prev;
77 
78   while ((prev = *list) != NULL) {
79     *list = prev->rest;
80     FREE(prev);
81   }
82 
83   return;
84 }
85 
86 /* extern inline T Uintlist_reverse (T list); */
87 static inline T
Uintlist_reverse(T list)88 Uintlist_reverse (T list) {
89   T head = NULL, next;
90 
91   for ( ; list; list = next) {
92     next = list->rest;
93     list->rest = head;
94     head = list;
95   }
96   return head;
97 }
98 
99 /* extern inline int Uintlist_length (T list); */
100 static inline int
Uintlist_length(T list)101 Uintlist_length (T list) {
102   int n;
103 
104   for (n = 0; list; list = list->rest) {
105     n++;
106   }
107   return n;
108 }
109 #endif
110 
111 
112 extern void
113 Uintlist_head_set (T list, unsigned int x);
114 extern T
115 Uintlist_keep_one (T list, int i);
116 extern unsigned int
117 Uintlist_max (T list);
118 extern unsigned int
119 Uintlist_min (T list);
120 extern unsigned int *
121 Uintlist_to_array (int *n, T list);
122 extern void
123 Uintlist_fill_array (unsigned int *array, T list);
124 extern void
125 Uintlist_fill_array_and_free (unsigned int *array, T *list);
126 extern unsigned int *
127 Uintlist_to_array_out (int *n, T list);
128 extern T
129 Uintlist_from_array (unsigned int *array, int n);
130 extern T
131 Uintlist_copy (T list);
132 extern T
133 Uintlist_append (T list, T tail);
134 extern unsigned int
135 Uintlist_last_value (T this);
136 extern unsigned int
137 Uintlist_index (T this, int index);
138 extern bool
139 Uintlist_find (T this, unsigned int value);
140 extern char *
141 Uintlist_to_string (T this);
142 extern char *
143 Uintlist_to_string_offset (T this, unsigned int chroffset);
144 
145 #undef T
146 #endif
147