40
42
#define SOS_NOBODY 0 /* null serial number */
41
43
#define SOS_FIRST 1 /* first normal serial number */
43
/* memory allocation */
45
extern void *alloc_bytes(size_t size, const char *name);
46
#define alloc_thing(thing, name) (alloc_bytes(sizeof(thing), (name)))
48
extern void *clone_bytes(const void *orig, size_t size, const char *name);
49
#define clone_thing(orig, name) clone_bytes((const void *)&(orig), sizeof(orig), (name))
50
#define clone_str(str, name) \
51
((str) == NULL? NULL : clone_bytes((str), strlen((str))+1, (name)))
54
extern void pfree(void *ptr);
55
extern void report_leaks(void);
57
# define pfree(ptr) free(ptr) /* ordinary stdc free */
59
#define pfreeany(p) { if ((p) != NULL) pfree(p); }
60
#define replace(p, q) { pfreeany(p); (p) = (q); }
63
/* chunk is a simple pointer-and-size abstraction */
69
typedef struct chunk chunk_t;
71
#define setchunk(ch, addr, size) { (ch).ptr = (addr); (ch).len = (size); }
72
/* NOTE: freeanychunk, unlike pfreeany, NULLs .ptr */
73
#define freeanychunk(ch) { pfreeany((ch).ptr); (ch).ptr = NULL; }
74
#define clonetochunk(ch, addr, size, name) \
75
{ (ch).ptr = clone_bytes((addr), (ch).len = (size), name); }
76
#define clonereplacechunk(ch, addr, size, name) \
77
{ pfreeany((ch).ptr); clonetochunk(ch, addr, size, name); }
78
#define chunkcpy(dst, chunk) \
79
{ memcpy(dst, chunk.ptr, chunk.len); dst += chunk.len;}
81
extern const chunk_t empty_chunk;
83
45
/* display a date either in local or UTC time */
84
extern char* timetoa(const time_t *time, bool utc);
46
extern char* timetoa(const time_t *time, bool utc, char *buf, size_t blen);
86
48
/* warns a predefined interval before expiry */
87
49
extern const char* check_expiry(time_t expiration_date,