From 1662d6d74f2e5a6b205490d62aa6051148529574 Mon Sep 17 00:00:00 2001 From: Dmitry Mikhirev Date: Tue, 25 Nov 2014 13:07:51 +0300 Subject: better error handling Use make error and warning functions instead just printing messages to stderr. Use gmk_alloc() instead malloc() to handle memory allocation errors on make side. --- pcre.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 15 deletions(-) diff --git a/pcre.c b/pcre.c index 2225952..f8dfcfa 100644 --- a/pcre.c +++ b/pcre.c @@ -16,6 +16,7 @@ along with this program. If not, see . */ +#include #include #include @@ -27,6 +28,8 @@ int plugin_is_GPL_compatible; const int MAX_CAP = 256; /* maximum number of substrings to capture */ const int MAX_CAP_LEN = 3; /* number of decimal digits in MAX_CAP */ +const int MAX_MSG_LEN = 1023; /* max length of error/warning/info message */ + /* esc_str() - escape string before assigning it to make variable */ char *esc_str(const char *str) { @@ -34,7 +37,7 @@ char *esc_str(const char *str) char *esc; /* escaped string */ char *pe; /* pointer to char in escaped string */ - esc = malloc(strlen(str) * 2 + 1); + esc = gmk_alloc(strlen(str) * 2 + 1); if (esc == NULL) { return NULL; } @@ -53,6 +56,63 @@ char *esc_str(const char *str) return esc; } +int mk_error(const char *fmt, ...) +{ + va_list args; + char *msg, *emsg, *mk; + + va_start(args, fmt); + + msg = gmk_alloc(MAX_MSG_LEN+1); + vsprintf(msg, fmt, args); + emsg = esc_str(msg); + gmk_free(msg); + mk = gmk_alloc(strlen(emsg) + 10); + sprintf(mk, "$(error %s)", emsg); + gmk_free(emsg); + gmk_eval(mk, NULL); + gmk_free(mk); + return 0; +} + +int mk_warning(const char *fmt, ...) +{ + va_list args; + char *msg, *emsg, *mk; + + va_start(args, fmt); + + msg = gmk_alloc(MAX_MSG_LEN+1); + vsprintf(msg, fmt, args); + emsg = esc_str(msg); + gmk_free(msg); + mk = gmk_alloc(strlen(emsg) + 12); + sprintf(mk, "$(warning %s)", emsg); + gmk_free(emsg); + gmk_eval(mk, NULL); + gmk_free(mk); + return 0; +} + +int mk_info(const char *fmt, ...) +{ + va_list args; + char *msg, *emsg, *mk; + + va_start(args, fmt); + + msg = gmk_alloc(MAX_MSG_LEN+1); + vsprintf(msg, fmt, args); + emsg = esc_str(msg); + gmk_free(msg); + mk = gmk_alloc(strlen(emsg) + 9); + sprintf(mk, "$(info %s)", emsg); + gmk_free(emsg); + gmk_eval(mk, NULL); + gmk_free(mk); + return 0; +} + /* def_var() - define make variable */ int def_var(const char *name, const char *value) { @@ -63,15 +123,15 @@ int def_var(const char *name, const char *value) if (escv == NULL) { return -1; }; - mkdef = malloc(strlen(name) + strlen(escv) + 16); + mkdef = gmk_alloc(strlen(name) + strlen(escv) + 16); if (mkdef == NULL) { return -1; } sprintf(mkdef, "define %s\n%s\nendef\n", name, escv); gmk_eval(mkdef, NULL); - free(escv); - free(mkdef); + gmk_free(escv); + gmk_free(mkdef); return 0; } @@ -85,15 +145,15 @@ int def_nvar(int num, const char *value) if (escv == NULL) { return -1; }; - mkdef = malloc(MAX_CAP_LEN + strlen(escv) + 16); + mkdef = gmk_alloc(MAX_CAP_LEN + strlen(escv) + 16); if (mkdef == NULL) { return -1; } sprintf(mkdef, "define %d\n%s\nendef\n", num, escv); gmk_eval(mkdef, NULL); - free(escv); - free(mkdef); + gmk_free(escv); + gmk_free(mkdef); return 0; } @@ -114,9 +174,9 @@ int parse_comp_opt(const char flag, const char *func) if (b) { return PCRE_UCP; } else { - fprintf(stderr, "%s: PCRE library does not support " + mk_warning("%s: PCRE library does not support " "Unicode properties, " - "`%c' option is unavailable\n", + "`%c' option is ignored", func, flag); } break; @@ -131,14 +191,14 @@ int parse_comp_opt(const char flag, const char *func) if (b) { return PCRE_UTF8; } else { - fprintf(stderr, "%s: PCRE library does not support " + mk_warning("%s: PCRE library does not support " "UTF-8, " - "`%c' option is unavailable\n", + "`%c' option is ignored", func, flag); } break; default: /* unknown option */ - fprintf(stderr, "%s: unknown option `%c'\n", func, flag); + mk_error("%s: unknown option `%c'", func, flag); break; } return 0; @@ -231,7 +291,7 @@ char *match(const char *name, int argc, char **argv) gmk_free(pat); } if (re == NULL) { /* compilation error */ - fprintf(stderr, "%s: %d: %s\n", name, erroffset, err); + mk_error("%s: %d: %s", name, erroffset, err); goto end_match; } @@ -239,8 +299,7 @@ char *match(const char *name, int argc, char **argv) str = gmk_expand(argv[1]); ncap = pcre_exec(re, NULL, str, strlen(str), 0, 0, ovec, MAX_CAP*3); if ((ncap < 0) && (ncap != PCRE_ERROR_NOMATCH)) { /* error occured */ - fprintf(stderr, "%s: pattern matching error: %d\n", - name, ncap); + mk_error("%s: pattern matching error: %d\n", name, ncap); } if (ncap > 0) { -- cgit v1.2.1