X-Git-Url: http://git.refcnt.org/?a=blobdiff_plain;f=colorize.c;h=30d03bc1d1c3e65733f5bf8fc380b2f926c8a2f0;hb=32458f1006aa98c549909ebcdd731dec08f0c474;hp=6c998ab6c5778a3a10eba3d74ddd3a2799fa40c8;hpb=0029079c8eb98e122286fb05f8fb798476a1b7a8;p=colorize.git diff --git a/colorize.c b/colorize.c index 6c998ab..30d03bc 100644 --- a/colorize.c +++ b/colorize.c @@ -44,20 +44,20 @@ #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 @@ -79,14 +79,17 @@ 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); \ } 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 (2); \ +} while (false) +#endif #define ABORT_TRACE() \ fprintf (stderr, "Aborting in source file %s, line %u\n", __FILE__, __LINE__); \ @@ -99,7 +102,7 @@ #define COLOR_SEP_CHAR '/' -#define VERSION "0.53" +#define VERSION "0.54" typedef enum { false, true } bool; @@ -140,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, @@ -151,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 */ @@ -195,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 *, ...); @@ -389,7 +403,13 @@ print_help (void) static void print_version (void) { +#ifdef HAVE_VERSION +# include "version.h" +#else + const char *version = NULL; +#endif const char *c_flags; + struct bytes_size bytes_size; bool debug; #ifdef CFLAGS c_flags = to_str (CFLAGS); @@ -401,9 +421,21 @@ print_version (void) #else debug = false; #endif - printf ("%s v%s (compiled at %s, %s)\n", "colorize", VERSION, __DATE__, __TIME__); + if (version) + printf ("colorize %s (compiled at %s, %s)\n", version, __DATE__, __TIME__); + else + printf ("colorize v%s (compiled at %s, %s)\n", VERSION, __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"); } @@ -499,14 +531,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"); } } } @@ -514,11 +547,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); @@ -617,7 +650,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); @@ -939,6 +972,7 @@ print_free_offsets (const char *line, char ***offsets, unsigned int count) free_null (offsets); } +#if !DEBUG static void * malloc_wrap (size_t size) { @@ -965,7 +999,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) { @@ -992,6 +1026,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) @@ -1025,6 +1060,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) {