X-Git-Url: http://git.refcnt.org/?a=blobdiff_plain;f=colorize.c;h=1325fce1f10326f432fa55d0edf2c5cde168dec1;hb=20c83df5d03e4b89d3a93803db0f9f9307517faf;hp=cf0c047c23af2c6d9d7174c3d11c8f1796408b59;hpb=f1bd09fc21e607b7d3fea1a8db57b8115d849c13;p=colorize.git diff --git a/colorize.c b/colorize.c index cf0c047..1325fce 100644 --- a/colorize.c +++ b/colorize.c @@ -2,7 +2,7 @@ * colorize - Read text from standard input stream or file and print * it colorized through use of ANSI escape sequences * - * Copyright (c) 2011-2014 Steven Schubiger + * Copyright (c) 2011-2015 Steven Schubiger * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #define _BSD_SOURCE #define _XOPEN_SOURCE 700 +#define _FILE_OFFSET_BITS 64 #include #include #include @@ -45,19 +46,22 @@ #define streq(s1, s2) (strcmp (s1, s2) == 0) #if !DEBUG -# define xmalloc(size) malloc_wrap(size) -# define xcalloc(nmemb, size) calloc_wrap(nmemb, size) -# define xrealloc(ptr, size) realloc_wrap(ptr, size) +# define xmalloc(size) malloc_wrap(size) +# define xcalloc(nmemb, size) calloc_wrap(nmemb, size) +# define xrealloc(ptr, size) realloc_wrap(ptr, size) +# define xstrdup(str) strdup_wrap(str, NULL, 0) +# define str_concat(str1, str2) str_concat_wrap(str1, str2, NULL, 0) #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__) +# 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__) +# define xstrdup(str) strdup_wrap(str, __FILE__, __LINE__) +# define str_concat(str1, str2) str_concat_wrap(str1, str2, __FILE__, __LINE__) #endif #define free_null(ptr) free_wrap((void **)&ptr) -#define xstrdup(str) strdup_wrap(str) -#if BUF_SIZE <= 0 || BUF_SIZE > 65536 +#if defined(BUF_SIZE) && (BUF_SIZE <= 0 || BUF_SIZE > 65536) # undef BUF_SIZE #endif #ifndef BUF_SIZE @@ -102,7 +106,9 @@ #define COLOR_SEP_CHAR '/' -#define VERSION "0.54" +#define DEBUG_FILE "debug.txt" + +#define VERSION "0.55" typedef enum { false, true } bool; @@ -181,6 +187,9 @@ static const struct { }; static FILE *stream = NULL; +#if DEBUG +static FILE *log = NULL; +#endif static unsigned int stacked_vars = 0; static void **vars_list = NULL; @@ -215,11 +224,12 @@ 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 char *strdup_wrap (const char *, const char *, unsigned int); +static char *str_concat_wrap (const char *, const char *, const char *, unsigned int); 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 FILE *open_file (const char *, const char *); static void vfprintf_diag (const char *, ...); static void vfprintf_fail (const char *, ...); static void stack_var (void ***, unsigned int *, unsigned int, void *); @@ -272,6 +282,10 @@ main (int argc, char **argv) setvbuf (stdout, NULL, _IOLBF, 0); +#if DEBUG + log = open_file (DEBUG_FILE, "w"); +#endif + while ((opt = getopt_long (argc, argv, "hv", long_opts, NULL)) != -1) { PARSE_OPT: @@ -447,6 +461,10 @@ cleanup (void) if (stream && fileno (stream) != STDIN_FILENO) fclose (stream); +#if DEBUG + if (log) + fclose (log); +#endif if (vars_list) { @@ -496,7 +514,7 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct /* Ensure that we don't fail if there's a file with one or more color names in its path. */ - if (ret != -1) + if (ret == 0) /* success */ { bool have_file; unsigned int c; @@ -1007,7 +1025,7 @@ malloc_wrap_debug (size_t size, const char *file, unsigned int line) void *p = malloc (size); if (!p) MEM_ALLOC_FAIL_DEBUG (file, line); - vfprintf_diag ("malloc'ed %lu bytes [file %s, line %u]", (unsigned long)size, file, line); + fprintf (log, "%s: malloc'ed %lu bytes [source file %s, line %u]\n", program_name, (unsigned long)size, file, line); return p; } @@ -1017,7 +1035,7 @@ calloc_wrap_debug (size_t nmemb, size_t size, const char *file, unsigned int lin void *p = calloc (nmemb, size); if (!p) MEM_ALLOC_FAIL_DEBUG (file, line); - vfprintf_diag ("calloc'ed %lu bytes [file %s, line %u]", (unsigned long)(nmemb * size), file, line); + fprintf (log, "%s: calloc'ed %lu bytes [source file %s, line %u]\n", program_name, (unsigned long)(nmemb * size), file, line); return p; } @@ -1027,7 +1045,7 @@ realloc_wrap_debug (void *ptr, size_t size, const char *file, unsigned int line) void *p = realloc (ptr, size); if (!p) MEM_ALLOC_FAIL_DEBUG (file, line); - vfprintf_diag ("realloc'ed %lu bytes [file %s, line %u]", (unsigned long)size, file, line); + fprintf (log, "%s: realloc'ed %lu bytes [source file %s, line %u]\n", program_name, (unsigned long)size, file, line); return p; } #endif /* !DEBUG */ @@ -1039,22 +1057,28 @@ free_wrap (void **ptr) *ptr = NULL; } +#if !DEBUG +# define do_malloc(len, file, line) malloc_wrap(len) +#else +# define do_malloc(len, file, line) malloc_wrap_debug(len, file, line) +#endif + static char * -strdup_wrap (const char *str) +strdup_wrap (const char *str, const char *file, unsigned int line) { const size_t len = strlen (str) + 1; - char *p = xmalloc (len); + char *p = do_malloc (len, file, line); strncpy (p, str, len); return p; } static char * -str_concat (const char *str1, const char *str2) +str_concat_wrap (const char *str1, const char *str2, const char *file, unsigned int line) { const size_t len = strlen (str1) + strlen (str2) + 1; char *p, *str; - p = str = xmalloc (len); + p = str = do_malloc (len, file, line); strncpy (p, str1, strlen (str1)); p += strlen (str1); strncpy (p, str2, strlen (str2)); @@ -1120,6 +1144,19 @@ has_color_name (const char *str, const char *name) return true; } +static FILE * +open_file (const char *file, const char *mode) +{ + FILE *stream; + + errno = 0; + stream = fopen (file, mode); + if (!stream) + vfprintf_fail (formats[FMT_FILE], file, strerror (errno)); + + return stream; +} + #define DO_VFPRINTF(fmt) \ va_list ap; \ fprintf (stderr, "%s: ", program_name); \