1 /*
2  * alloc.h: safe wrappers around malloc, realloc, free, strdup
3  */
4 
5 #ifndef AGEDU_ALLOC_H
6 #define AGEDU_ALLOC_H
7 
8 #include <stddef.h>
9 
10 /*
11  * smalloc should guarantee to return a useful pointer.
12  */
13 void *smalloc(size_t size);
14 
15 /*
16  * srealloc should guaranteeably be able to realloc NULL
17  */
18 void *srealloc(void *p, size_t size);
19 
20 /*
21  * sfree should guaranteeably deal gracefully with freeing NULL
22  */
23 void sfree(void *p);
24 
25 /*
26  * dupstr is like strdup, but with the never-return-NULL property
27  * of smalloc (and also reliably defined in all environments :-)
28  */
29 char *dupstr(const char *s);
30 
31 /*
32  * dupfmt is a bit like printf, but does its own allocation and
33  * returns a dynamic string. It also supports a different (and
34  * much less featureful) set of format directives:
35  *
36  *  - %D takes no argument, and gives the current date and time in
37  *    a format suitable for an HTTP Date header
38  *  - %d takes an int argument and formats it like normal %d (but
39  *    doesn't support any of the configurability of standard
40  *    printf)
41  *  - %s takes a const char * and formats it like normal %s
42  *    (again, no fine-tuning available)
43  *  - %h takes a const char * but escapes it so that it's safe for
44  *    HTML
45  *  - %S takes a bool followed by a const char *. If the bool is
46  *    false, it behaves just like %s. If the bool is true, it
47  *    transforms the string by stuffing a \r before every \n.
48  */
49 char *dupfmt(const char *fmt, ...);
50 
51 /*
52  * snew allocates one instance of a given type, and casts the
53  * result so as to type-check that you're assigning it to the
54  * right kind of pointer. Protects against allocation bugs
55  * involving allocating the wrong size of thing.
56  */
57 #define snew(type) \
58     ( (type *) smalloc (sizeof (type)) )
59 
60 /*
61  * snewn allocates n instances of a given type, for arrays.
62  */
63 #define snewn(number, type) \
64     ( (type *) smalloc ((number) * sizeof (type)) )
65 
66 /*
67  * sresize wraps realloc so that you specify the new number of
68  * elements and the type of the element, with the same type-
69  * checking advantages. Also type-checks the input pointer.
70  */
71 #define sresize(array, number, type) \
72     ( (void)sizeof((array)-(type *)0), \
73       (type *) srealloc ((array), (number) * sizeof (type)) )
74 
75 #endif /* AGEDU_ALLOC_H */
76