X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/bdf27468d23eade733c0afb4327c9b88444b9058..67dc75818d2a5905e09851feeb9dba23f815dd67:/h/mh.h diff --git a/h/mh.h b/h/mh.h index dda0c3d2..bb06366b 100644 --- a/h/mh.h +++ b/h/mh.h @@ -16,6 +16,13 @@ #define DMAXFOLDER 4 /* typical number of digits */ #define MAXFOLDER 1000 /* message increment */ +/* non-zero exit(3) values indicating the number of errors need to be + * capped else they interfere with the shell's use of high seven-bit + * values, and the shell's mapping of signals onto top-bit-set values. + * Plus, every so often the eight-bit value will wrap to zero, wrongly + * indicating success. */ +#define MAX_EXIT 120 + /* * This macro is for use by scan, for example, so that platforms with * a small BUFSIZ can easily allocate larger buffers. @@ -35,10 +42,20 @@ typedef unsigned char boolean; /* not int so we can pack in a structure */ #if __GNUC__ > 2 #define NORETURN __attribute__((__noreturn__)) #define CHECK_PRINTF(fmt, arg) __attribute__((format(printf, fmt, arg))) +#define ALLOC_SIZE(...) __attribute__((alloc_size(__VA_ARGS__))) +#define CONST __attribute__((const)) +#define MALLOC __attribute__((malloc)) +#define NONNULL(...) __attribute__((nonnull(__VA_ARGS__))) +#define PURE __attribute__((pure)) #define NMH_UNUSED(i) (void) i #else #define NORETURN #define CHECK_PRINTF(fmt, arg) +#define ALLOC_SIZE(...) +#define CONST +#define MALLOC +#define NONNULL(...) +#define PURE #define NMH_UNUSED(i) i #endif @@ -62,24 +79,24 @@ typedef unsigned char boolean; /* not int so we can pack in a structure */ typedef struct charstring *charstring_t; charstring_t charstring_create (size_t); -charstring_t charstring_copy (const charstring_t); +charstring_t charstring_copy (const charstring_t) NONNULL(1); void charstring_free (charstring_t); /* Append a single-byte character: */ -void charstring_push_back (charstring_t, const char); +void charstring_push_back (charstring_t, const char) NONNULL(1); /* Append possibly multi-byte character(s): */ -void charstring_push_back_chars (charstring_t, const char [], size_t, size_t); -void charstring_append (charstring_t, const charstring_t); -void charstring_append_cstring (charstring_t, const char []); -void charstring_clear (charstring_t); +void charstring_push_back_chars (charstring_t, const char [], size_t, size_t) NONNULL(1); +void charstring_append (charstring_t, const charstring_t) NONNULL(2); +void charstring_append_cstring (charstring_t, const char []) NONNULL(2); +void charstring_clear (charstring_t) NONNULL(1); /* Don't store return value of charstring_buffer() and use later after intervening push_back's; use charstring_buffer_copy() instead. */ -const char *charstring_buffer (const charstring_t); +const char *charstring_buffer (const charstring_t) NONNULL(1); /* User is responsible for free'ing result of buffer copy. */ -char *charstring_buffer_copy (const charstring_t); -size_t charstring_bytes (const charstring_t); -size_t charstring_chars (const charstring_t); +char *charstring_buffer_copy (const charstring_t) NONNULL(1); +size_t charstring_bytes (const charstring_t) NONNULL(1) PURE; +size_t charstring_chars (const charstring_t) NONNULL(1) PURE; /* Length of the last character in the charstring. */ -int charstring_last_char_len (const charstring_t); +int charstring_last_char_len (const charstring_t) NONNULL(1); /* * user context/profile structure @@ -203,33 +220,33 @@ struct bvector { typedef struct bvector *bvector_t; bvector_t bvector_create (void); -void bvector_init(struct bvector *bv); -void bvector_copy (bvector_t, bvector_t); -void bvector_free (bvector_t); -void bvector_fini(struct bvector *bv); -void bvector_clear (bvector_t, size_t); -void bvector_clear_all (bvector_t); -void bvector_set (bvector_t, size_t); -unsigned int bvector_at (bvector_t, size_t); -unsigned long bvector_first_bits (bvector_t); +void bvector_init(struct bvector *bv) NONNULL(1); +void bvector_copy (bvector_t, bvector_t) NONNULL(1, 2); +void bvector_free (bvector_t) NONNULL(1); +void bvector_fini(struct bvector *bv) NONNULL(1); +void bvector_clear (bvector_t, size_t) NONNULL(1); +void bvector_clear_all (bvector_t) NONNULL(1); +void bvector_set (bvector_t, size_t) NONNULL(1); +unsigned int bvector_at (bvector_t, size_t) NONNULL(1) PURE; +unsigned long bvector_first_bits (bvector_t) NONNULL(1) PURE; typedef struct svector *svector_t; svector_t svector_create (size_t); -void svector_free (svector_t); -char *svector_push_back (svector_t, char *); -char *svector_at (svector_t, size_t); -char **svector_find(svector_t, const char *); -char **svector_strs (svector_t); -size_t svector_size (svector_t); +void svector_free (svector_t) NONNULL(1); +char *svector_push_back (svector_t, char *) NONNULL(1); +char *svector_at (svector_t, size_t) NONNULL(1); +char **svector_find(svector_t, const char *) NONNULL(1) PURE; +char **svector_strs (svector_t) NONNULL(1) PURE; +size_t svector_size (svector_t) NONNULL(1) PURE; typedef struct ivector *ivector_t; ivector_t ivector_create (size_t); -void ivector_free (ivector_t); -int ivector_push_back (ivector_t, int); -int ivector_at (ivector_t, size_t); -int *ivector_atp (ivector_t, size_t); +void ivector_free (ivector_t) NONNULL(1); +int ivector_push_back (ivector_t, int) NONNULL(1); +int ivector_at (ivector_t, size_t) NONNULL(1); +int *ivector_atp (ivector_t, size_t) NONNULL(1); /* * Primary structure of folder/message information