+/*
+ * Error codes. Functions returning these should return a jb_err
+ */
+#define JB_ERR_OK 0 /* Success, no error */
+#define JB_ERR_MEMORY 1 /* Out of memory */
+#define JB_ERR_CGI_PARAMS 2 /* Missing or corrupt CGI parameters */
+#define JB_ERR_FILE 3 /* Error opening, reading or writing a file */
+#define JB_ERR_PARSE 4 /* Error parsing file */
+#define JB_ERR_MODIFIED 5 /* File has been modified outside of the */
+ /* CGI actions editor. */
+typedef int jb_err;
+
+
+/*
+ * This macro is used to free a pointer that may be NULL
+ */
+#define freez(X) { if(X) { free((void*)X); X = NULL ; } }
+
+
+/* Fix a problem with Solaris. There should be no effect on other
+ * platforms.
+ * Solaris's isspace() is a macro which uses it's argument directly
+ * as an array index. Therefore we need to make sure that high-bit
+ * characters generate +ve values, and ideally we also want to make
+ * the argument match the declared parameter type of "int".
+ *
+ * Note: Remember to #include <ctype.h> if you use these macros.
+ */
+#define ijb_toupper(__X) toupper((int)(unsigned char)(__X))
+#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
+#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))
+
+/*
+ * Use for statically allocated buffers if you have no other choice.
+ * Remember to check the length of what you write into the buffer
+ * - we don't want any buffer overflows!
+ */