]> git.refcnt.org Git - colorize.git/blobdiff - colorize.c
Use more portable exit failure status macro
[colorize.git] / colorize.c
index 69aca359feb79deb8128623a1f47dfeffc18fcb0..5729f0e24c56e3b48cac1e1fe6c6e7f4a3aa07ea 100644 (file)
@@ -19,7 +19,8 @@
  *
  */
 
-#define _POSIX_C_SOURCE 200809L
+#define _BSD_SOURCE
+#define _XOPEN_SOURCE 700
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
 
 #define streq(s1, s2) (strcmp (s1, s2) == 0)
 
-#if DEBUG
-# define xmalloc(size)        malloc_wrap_debug(size,        __FILE__, __LINE__)
-# define xcalloc(nmemb, size) calloc_wrap_debug(nmemb, size, __FILE__, __LINE__)
-# define xrealloc(ptr, size)  realloc_wrap_debug(ptr, size,  __FILE__, __LINE__)
-#else
+#if !DEBUG
 # define xmalloc(size)        malloc_wrap(size)
 # define xcalloc(nmemb, size) calloc_wrap(nmemb, size)
 # define xrealloc(ptr, size)  realloc_wrap(ptr, size)
+#else
+# define xmalloc(size)        malloc_wrap_debug(size,        __FILE__, __LINE__)
+# define xcalloc(nmemb, size) calloc_wrap_debug(nmemb, size, __FILE__, __LINE__)
+# define xrealloc(ptr, size)  realloc_wrap_debug(ptr, size,  __FILE__, __LINE__)
 #endif
 
 #define free_null(ptr) free_wrap((void **)&ptr)
 #define xstrdup(str)   strdup_wrap(str)
 
-#if BUF_SIZE <= 0
+#if BUF_SIZE <= 0 || BUF_SIZE > 65536
 # undef BUF_SIZE
 #endif
 #ifndef BUF_SIZE
     release_var (vars_list, stacked_vars, (void **)&ptr); \
 } while (false)
 
-#define MEM_ALLOC_FAIL_DEBUG(file, line) do {                                               \
-    fprintf (stderr, "Memory allocation failure in source file %s, line %u\n", file, line); \
-    exit (2);                                                                               \
-} while (false)
-#define MEM_ALLOC_FAIL() do {                                          \
+#if !DEBUG
+# define MEM_ALLOC_FAIL() do {                                         \
     fprintf (stderr, "%s: memory allocation failure\n", program_name); \
-    exit (2);                                                          \
+    exit (EXIT_FAILURE);                                               \
+} while (false)
+#else
+# define MEM_ALLOC_FAIL_DEBUG(file, line) do {                                              \
+    fprintf (stderr, "Memory allocation failure in source file %s, line %u\n", file, line); \
+    exit (EXIT_FAILURE);                                                                    \
 } while (false)
+#endif
 
 #define ABORT_TRACE()                                                              \
     fprintf (stderr, "Aborting in source file %s, line %u\n", __FILE__, __LINE__); \
 
 #define COLOR_SEP_CHAR '/'
 
-#define VERSION "0.53"
+#define VERSION "0.54"
 
 typedef enum { false, true } bool;
 
@@ -139,8 +143,14 @@ static const struct color bg_colors[] = {
     { "default", "49m" },
 };
 
+struct bytes_size {
+    unsigned int size;
+    char unit;
+};
+
 enum fmts {
     FMT_GENERIC,
+    FMT_STRING,
     FMT_QUOTE,
     FMT_COLOR,
     FMT_RANDOM,
@@ -150,6 +160,7 @@ enum fmts {
 };
 static const char *formats[] = {
     "%s",                    /* generic */
+    "%s '%s'",               /* string  */
     "%s `%s' %s",            /* quote   */
     "%s color '%s' %s",      /* color   */
     "%s color '%s' %s '%s'", /* random  */
@@ -194,15 +205,19 @@ static void find_color_entry (const struct color_name *, unsigned int, const str
 static void print_line (bool, const struct color **, const char * const, unsigned int);
 static void print_clean (const char *);
 static void print_free_offsets (const char *, char ***, unsigned int);
+#if !DEBUG
 static void *malloc_wrap (size_t);
 static void *calloc_wrap (size_t, size_t);
 static void *realloc_wrap (void *, size_t);
+#else
 static void *malloc_wrap_debug (size_t, const char *, unsigned int);
 static void *calloc_wrap_debug (size_t, size_t, const char *, unsigned int);
 static void *realloc_wrap_debug (void *, size_t, const char *, unsigned int);
+#endif
 static void free_wrap (void **);
 static char *strdup_wrap (const char *);
 static char *str_concat (const char *, const char *);
+static bool get_bytes_size (unsigned long, struct bytes_size *);
 static char *get_file_type (mode_t);
 static bool has_color_name (const char *, const char *);
 static void vfprintf_diag (const char *, ...);
@@ -388,7 +403,14 @@ print_help (void)
 static void
 print_version (void)
 {
+#ifdef HAVE_VERSION
+# include "version.h"
+#else
+    const char *version = NULL;
+#endif
+    const char *version_prefix, *version_string;
     const char *c_flags;
+    struct bytes_size bytes_size;
     bool debug;
 #ifdef CFLAGS
     c_flags = to_str (CFLAGS);
@@ -400,9 +422,21 @@ print_version (void)
 #else
     debug = false;
 #endif
-    printf ("%s v%s (compiled at %s, %s)\n", "colorize", VERSION, __DATE__, __TIME__);
+    version_prefix = version ? "" : "v";
+    version_string = version ? version : VERSION;
+    printf ("colorize %s%s (compiled at %s, %s)\n", version_prefix, version_string, __DATE__, __TIME__);
+
     printf ("Compiler flags: %s\n", c_flags);
-    printf ("Buffer size: %u bytes\n", BUF_SIZE);
+    if (get_bytes_size (BUF_SIZE, &bytes_size))
+      {
+        if (BUF_SIZE % 1024 == 0)
+          printf ("Buffer size: %u%c\n", bytes_size.size, bytes_size.unit);
+        else
+          printf ("Buffer size: %u%c, %u byte%s\n", bytes_size.size, bytes_size.unit,
+                   BUF_SIZE % 1024, BUF_SIZE % 1024 > 1 ? "s" : "");
+      }
+    else
+      printf ("Buffer size: %lu byte%s\n", (unsigned long)BUF_SIZE, BUF_SIZE > 1 ? "s" : "");
     printf ("Debugging: %s\n", debug ? "yes" : "no");
 }
 
@@ -498,14 +532,15 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct
 
         if (have_file)
           {
+            const char *file_exists = color_string;
             if (file_string)
-              vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), color_string, "cannot be used as color string");
+              vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "cannot be used as color string");
             else
               {
                 if (VALID_FILE_TYPE (mode))
-                  vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), color_string, "must be preceeded by color string");
+                  vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "must be preceeded by color string");
                 else
-                  vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), color_string, "is not a valid file type");
+                  vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "is not a valid file type");
               }
           }
       }
@@ -513,11 +548,11 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct
     if ((p = strchr (color_string, COLOR_SEP_CHAR)))
       {
         if (p == color_string)
-          vfprintf_fail (formats[FMT_GENERIC], "foreground color missing");
+          vfprintf_fail (formats[FMT_STRING], "foreground color missing in string", color_string);
         else if (p == color_string + strlen (color_string) - 1)
-          vfprintf_fail (formats[FMT_GENERIC], "background color missing");
+          vfprintf_fail (formats[FMT_STRING], "background color missing in string", color_string);
         else if (strchr (++p, COLOR_SEP_CHAR))
-          vfprintf_fail (formats[FMT_GENERIC], "one color pair allowed only");
+          vfprintf_fail (formats[FMT_STRING], "one color pair allowed only for string", color_string);
       }
 
     str = xstrdup (color_string);
@@ -616,7 +651,7 @@ process_file_arg (const char *file_string, const char **file, FILE **stream)
             FILE *s;
             const char *file = file_string;
             struct stat sb;
-            int errno, ret;
+            int ret;
 
             errno = 0;
             ret = lstat (file, &sb);
@@ -938,6 +973,7 @@ print_free_offsets (const char *line, char ***offsets, unsigned int count)
     free_null (offsets);
 }
 
+#if !DEBUG
 static void *
 malloc_wrap (size_t size)
 {
@@ -964,7 +1000,7 @@ realloc_wrap (void *ptr, size_t size)
       MEM_ALLOC_FAIL ();
     return p;
 }
-
+#else
 static void *
 malloc_wrap_debug (size_t size, const char *file, unsigned int line)
 {
@@ -991,6 +1027,7 @@ realloc_wrap_debug (void *ptr, size_t size, const char *file, unsigned int line)
       MEM_ALLOC_FAIL_DEBUG (file, line);
     return p;
 }
+#endif /* !DEBUG */
 
 static void
 free_wrap (void **ptr)
@@ -1024,6 +1061,24 @@ str_concat (const char *str1, const char *str2)
     return str;
 }
 
+static bool
+get_bytes_size (unsigned long bytes, struct bytes_size *bytes_size)
+{
+    const char *unit, units[] = { '0', 'K', 'M', 'G', '\0' };
+    unsigned long size = bytes;
+    if (bytes < 1024)
+      return false;
+    unit = units;
+    while (size >= 1024 && *(unit + 1))
+      {
+        size /= 1024;
+        unit++;
+      }
+    bytes_size->size = (unsigned int)size;
+    bytes_size->unit = *unit;
+    return true;
+}
+
 static char *
 get_file_type (mode_t mode)
 {