AmendHub

Download

jcs

/

wallops

/

util.h

 

(View History)

jcs   util: Add SLIST macros from OpenBSD Latest amendment: 45 on 2023-01-11

1 /*
2 * Copyright (c) 2020-2022 joshua stein <jcs@jcs.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 #ifndef __UTIL_H__
18 #define __UTIL_H__
19
20 #include <stdlib.h>
21 #include <limits.h>
22 #include <time.h>
23
24 #ifndef SIZE_MAX
25 #define SIZE_MAX ULONG_MAX
26 #endif
27
28 #define nitems(what) (sizeof((what)) / sizeof((what)[0]))
29 #define member_size(type, member) sizeof(((type *)0)->member)
30
31 #define MALLOC_NOTE_SIZE 32
32
33 #define MIN(a, b) ((a) < (b) ? (a) : (b))
34 #define MAX(a, b) ((a) > (b) ? (a) : (b))
35 #define BOUND(a, min, max) ((a) > (max) ? (max) : ((a) < (min) ? (min) : (a)))
36
37 /*
38 * If var of var_size (of which used_size is used) is not big enough to
39 * hold add, expand it by grow_amount (to give headroom for subsequent
40 * expansion).
41 */
42 #define EXPAND_TO_FIT(var, var_size, used_size, add, grow_amount) { \
43 if ((used_size) + (add) >= (var_size)) { \
44 while ((used_size) + (add) >= (var_size)) { \
45 (var_size) += (grow_amount); \
46 } \
47 (var) = xrealloc((var), (var_size)); \
48 } \
49 }
50
51 #define CHARS_TO_LONG(a,b,c,d) (unsigned long)(\
52 ((unsigned long)((unsigned char)(a)) << 24) | \
53 ((unsigned long)((unsigned char)(b)) << 16) | \
54 ((unsigned long)((unsigned char)(c)) << 8) | \
55 (unsigned long)((unsigned char)(d)) )
56 #define CHARS_TO_SHORT(a,b) (unsigned short)(\
57 ((unsigned short)((unsigned char)(a)) << 8) | \
58 (unsigned short)((unsigned char)(b)) )
59
60 #define SCROLLBAR_WIDTH 16
61
62 /* GetMBarHeight() is not very useful */
63 #define MENUBAR_HEIGHT 20
64
65 #define TICKS_PER_SEC 60L
66
67 #define MAX_TEXTEDIT_SIZE 32767L
68
69 #ifndef bool
70 typedef Boolean bool;
71 #endif
72 typedef signed long off_t;
73 typedef signed long ssize_t;
74 typedef unsigned char u_char;
75 typedef unsigned long u_int;
76 typedef unsigned char u_int8_t;
77 typedef unsigned short u_int16_t;
78 typedef unsigned long u_int32_t;
79
80 #define BYTE_ORDER BIG_ENDIAN
81
82 /* singly-linked lists */
83 #define SLIST_HEAD(name, type) struct name { struct type *slh_first; }
84 #define SLIST_HEAD_INITIALIZER(head) { NULL }
85 #define SLIST_ENTRY(type) struct { struct type *sle_next; }
86 #define SLIST_FIRST(head) ((head)->slh_first)
87 #define SLIST_END(head) NULL
88 #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
89 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
90 #define SLIST_INIT(head) do { SLIST_FIRST((head)) = NULL; } while (0)
91 #define SLIST_FOREACH(var, head, field) \
92 for ((var) = SLIST_FIRST(head); \
93 (var) != SLIST_END(head); \
94 (var) = SLIST_NEXT(var, field))
95
96 #define SLIST_FOREACH_SAFE(var, head, field, tvar) \
97 for ((var) = SLIST_FIRST(head); \
98 (var) && ((tvar) = SLIST_NEXT(var, field), 1); \
99 (var) = (tvar))
100
101 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
102 (elm)->field.sle_next = (slistelm)->field.sle_next; \
103 (slistelm)->field.sle_next = (elm); \
104 } while (0)
105
106 #define SLIST_INSERT_HEAD(head, elm, field) do { \
107 (elm)->field.sle_next = (head)->slh_first; \
108 (head)->slh_first = (elm); \
109 } while (0)
110
111 #define SLIST_APPEND(head, elm, type, field) do { \
112 if (SLIST_EMPTY(head)) { \
113 SLIST_INSERT_HEAD(head, elm, field); \
114 } else { \
115 struct type *curelm = (head)->slh_first; \
116 while (curelm->field.sle_next != NULL) \
117 curelm = curelm->field.sle_next; \
118 curelm->field.sle_next = (elm); \
119 } \
120 } while (0)
121
122 #define SLIST_REMOVE_AFTER(elm, field) do { \
123 (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \
124 } while (0)
125
126 #define SLIST_REMOVE_HEAD(head, field) do { \
127 (head)->slh_first = (head)->slh_first->field.sle_next; \
128 } while (0)
129
130 #define SLIST_REMOVE(head, elm, type, field) do { \
131 if ((head)->slh_first == (elm)) { \
132 SLIST_REMOVE_HEAD((head), field); \
133 } else { \
134 struct type *curelm = (head)->slh_first; \
135 while (curelm->field.sle_next != (elm)) \
136 curelm = curelm->field.sle_next; \
137 curelm->field.sle_next = curelm->field.sle_next->field.sle_next; \
138 } \
139 (elm)->field.sle_next = NULL; \
140 } while (0)
141
142 typedef struct {
143 short push[2], rts;
144 void *addr;
145 } tCodeStub;
146
147 struct stat {
148 short st_mode;
149 ssize_t st_size;
150 time_t st_ctime;
151 time_t st_mtime;
152 unsigned char st_flags;
153 };
154
155 void util_init(void);
156
157 void * xmalloc(size_t, char *note);
158 void xfree(void *ptrptr);
159 void xfree_verify(void);
160 void * xmalloczero(size_t, char *note);
161 void * xcalloc(size_t, size_t, char *note);
162 void * xrealloc(void *src, size_t size);
163 void * xreallocarray(void *, size_t, size_t);
164 char * xstrdup(const char *, char *note);
165 char * xstrndup(const char *str, size_t maxlen, char *note);
166
167 short getline(char *str, size_t len, char **ret);
168 const char * ordinal(unsigned short n);
169 size_t rtrim(char *str, char *chars);
170 long strpos_quoted(char *str, char c);
171 char * OSTypeToString(OSType type);
172
173 unsigned long xorshift32(void);
174
175 void panic(const char *format, ...);
176 void err(short ret, const char *format, ...);
177 void warnx(const char *format, ...);
178 void warn(const char *format, ...);
179 void note(const char *format, ...);
180 void appicon_note(const char *format, ...);
181 short ask(const char *format, ...);
182 #define ASK_YES 1
183 #define ASK_NO 2
184 void about(char *program_name);
185 void progress(char *format, ...);
186 void window_rect(WindowPtr win, Rect *ret);
187 void center_in_screen(short width, short height, bool titlebar, Rect *b);
188 Point centered_sf_dialog(void);
189
190 Handle xNewHandle(size_t size);
191 Handle xGetResource(ResType type, short id);
192 StringHandle xGetString(short id);
193 char * xGetStringAsChar(short id);
194 long xGetStringAsLong(short id);
195 void xSetHandleSize(Handle h, Size s);
196
197 short getpath(short vRefNum, Str255 fileName, Str255 *ret, bool include_file);
198 bool FIsDir(Str255 path);
199 short stat(char *path, struct stat *sb);
200 short FStat(Str255 path, struct stat *sb);
201 OSErr copy_file(Str255 source, Str255 dest, bool overwrite);
202 OSErr copy_file_contents(short source_ref, short dest_ref);
203 OSErr FSReadLine(short frefnum, char *buf, size_t buflen);
204
205 char * gestalt_machine_type(void);
206 char * get_version(bool long_version);
207
208 short FontHeight(short font_id, short size);
209 void DrawGrowIconOnly(WindowPtr win);
210 short TEGetWidth(short off, TEHandle te);
211 void UpdateScrollbarForTE(GrafPtr win, ControlHandle scroller, TEHandle te,
212 bool reset);
213 void SetTrackControlTE(TEHandle te);
214 pascal void TrackMouseDownInControl(ControlHandle control, short part);
215 pascal bool ModalDialogFilter(DialogPtr dlg, EventRecord *event,
216 short *hit);
217 void PasswordDialogFieldFilterSetup(short ditl_id, char *storage,
218 size_t len);
219 pascal bool PasswordDialogFieldFilter(DialogPtr dlg, EventRecord *event,
220 short *hit);
221 void PasswordDialogFieldFinish(void);
222 pascal void NullCaretHook(void);
223 void HideMenuBar(void);
224 void RestoreHiddenMenuBar(void);
225
226 size_t strlcat(char *dst, const char *src, size_t dsize);
227 size_t strlcpy(char *dst, const char *src, size_t dsize);
228 char * strndup(const char *str, size_t maxlen);
229 char * strsep(char **stringp, const char *delim);
230 int snprintf(char *s, size_t size, const char *fmt, ...);
231 int vsnprintf(char *s, size_t size, const char *fmt, void *p);
232
233 short strcasecmp(const char *s1, const char *s2);
234 short strncasecmp(const char *s1, const char *s2, size_t n);
235
236 #endif