commit 225607eff40b77dc809fcbeb12af8cd159cfa78f from: Omar Polo date: Mon May 23 17:05:39 2022 UTC change parse_csslike to receive an array to fill fixes many memory leaks, makes the code shorter AND cleaner! commit - 761c26b4d0017217bcc5085f10241a5b85a63d0b commit + 225607eff40b77dc809fcbeb12af8cd159cfa78f blob - 3e448b2bc7ab80fd1c0eed5d4090a304678f9321 blob + e306b210f55feedab9a96effdab669f0d6fd23e2 --- mymenu.c +++ mymenu.c @@ -1054,22 +1054,18 @@ parse_int_with_pos(Display *d, const char *str, int de /* Parse a string like a CSS value. */ /* TODO: harden a bit this function */ -char ** -parse_csslike(const char *str) +int +parse_csslike(const char *str, char **ret) { int i, j; - char *s, *token, **ret; + char *s, *token; short any_null; + memset(ret, 0, 4 * sizeof(*ret)); + s = strdup(str); if (s == NULL) - return NULL; - - ret = malloc(4 * sizeof(char *)); - if (ret == NULL) { - free(s); - return NULL; - } + return -1; for (i = 0; (token = strsep(&s, " ")) != NULL && i < 4; ++i) ret[i] = strdup(token); @@ -1097,16 +1093,14 @@ parse_csslike(const char *str) if (any_null) for (i = 0; i < 4; ++i) - if (ret[i] != NULL) - free(ret[i]); + free(ret[i]); if (i == 0 || any_null) { free(s); - free(ret); - return NULL; + return -1; } - return ret; + return 1; } /* @@ -1546,6 +1540,7 @@ main(int argc, char **argv) short embed; const char *sep = NULL; const char *parent_window_id = NULL; + char *tmp[4]; char **lines, **vlines; char *fontname, *text, *xrm; @@ -1713,39 +1708,32 @@ main(int argc, char **argv) } if (XrmGetResource(xdb, "MyMenu.prompt.border.size", "*", datatype, &value)) { - char **sizes; - sizes = parse_csslike(value.addr); - if (sizes != NULL) - for (i = 0; i < 4; ++i) - r.p_borders[i] = parse_integer(sizes[i], 0); - else - fprintf(stderr, - "error while parsing " - "MyMenu.prompt.border.size"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) { + r.p_borders[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.prompt.border.color", "*", datatype, &value)) { - char **colors; - colors = parse_csslike(value.addr); - if (colors != NULL) - for (i = 0; i < 4; ++i) - p_borders_bg[i] = parse_color(colors[i], "#000"); - else - fprintf(stderr, - "error while parsing " - "MyMenu.prompt.border.color"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + p_borders_bg[i] = parse_color(tmp[i], "#000"); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.prompt.padding", "*", datatype, &value)) { - char **colors; - colors = parse_csslike(value.addr); - if (colors != NULL) - for (i = 0; i < 4; ++i) - r.p_padding[i] = parse_integer(colors[i], 0); - else - fprintf(stderr, - "error while parsing " - "MyMenu.prompt.padding"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.p_padding[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.width", "*", datatype, &value)) @@ -1765,16 +1753,14 @@ main(int argc, char **argv) y = parse_int_with_pos(r.d, value.addr, y, d_height, r.height); if (XrmGetResource(xdb, "MyMenu.border.size", "*", datatype, &value)) { - char **borders; - borders = parse_csslike(value.addr); - if (borders != NULL) - for (i = 0; i < 4; ++i) - r.borders[i] = parse_int_with_percentage( - borders[i], 0, (i % 2) == 0 ? d_height : d_width); - else - fprintf(stderr, - "error while parsing " - "MyMenu.border.size\n"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.borders[i] = parse_int_with_percentage(tmp[i], 0, + (i % 2) == 0 ? d_height : d_width); + free(tmp[i]); + } } /* Prompt */ @@ -1792,39 +1778,33 @@ main(int argc, char **argv) bgs[1] = parse_color(value.addr, "#000"); if (XrmGetResource(xdb, "MyMenu.completion.padding", "*", datatype, &value)) { - char **paddings; - paddings = parse_csslike(value.addr); - if (paddings != NULL) - for (i = 0; i < 4; ++i) - r.c_padding[i] = parse_integer(paddings[i], 0); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion.padding"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.c_padding[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.completion.border.size", "*", datatype, &value)) { - char **sizes; - sizes = parse_csslike(value.addr); - if (sizes != NULL) - for (i = 0; i < 4; ++i) - r.c_borders[i] = parse_integer(sizes[i], 0); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion.border.size"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.c_borders[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.completion.border.color", "*", datatype, &value)) { - char **sizes; - sizes = parse_csslike(value.addr); - if (sizes != NULL) - for (i = 0; i < 4; ++i) - c_borders_bg[i] = parse_color(sizes[i], "#000"); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion.border.color"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + c_borders_bg[i] = parse_color(tmp[i], "#000"); + free(tmp[i]); + } } /* Completion Highlighted */ @@ -1838,57 +1818,46 @@ main(int argc, char **argv) if (XrmGetResource( xdb, "MyMenu.completion_highlighted.padding", "*", datatype, &value)) { - char **paddings; - paddings = parse_csslike(value.addr); - if (paddings != NULL) - for (i = 0; i < 4; ++i) - r.ch_padding[i] = parse_integer(paddings[i], 0); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion_highlighted." - "padding"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.ch_padding[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.completion_highlighted.border.size", "*", datatype, - &value)) { - char **sizes; - sizes = parse_csslike(value.addr); - if (sizes != NULL) - for (i = 0; i < 4; ++i) - r.ch_borders[i] = parse_integer(sizes[i], 0); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion_highlighted." - "border.size"); + &value)) { + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + r.ch_borders[i] = parse_integer(tmp[i], 0); + free(tmp[i]); + } } if (XrmGetResource(xdb, "MyMenu.completion_highlighted.border.color", "*", datatype, &value)) { - char **colors; - colors = parse_csslike(value.addr); - if (colors != NULL) - for (i = 0; i < 4; ++i) - ch_borders_bg[i] = parse_color(colors[i], "#000"); - else - fprintf(stderr, - "Error while parsing " - "MyMenu.completion_highlighted." - "border.color"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + ch_borders_bg[i] = parse_color(tmp[i], "#000"); + free(tmp[i]); + } } /* Border */ if (XrmGetResource(xdb, "MyMenu.border.color", "*", datatype, &value)) { - char **colors; - colors = parse_csslike(value.addr); - if (colors != NULL) - for (i = 0; i < 4; ++i) - borders_bg[i] = parse_color(colors[i], "#000"); - else - fprintf(stderr, - "error while parsing " - "MyMenu.border.color\n"); + if (parse_csslike(value.addr, tmp) == -1) + err(1, "parse_csslike"); + + for (i = 0; i < 4; ++i) { + borders_bg[i] = parse_color(tmp[i], "#000"); + free(tmp[i]); + } } } @@ -1924,55 +1893,48 @@ main(int argc, char **argv) case 'y': y = parse_int_with_pos(r.d, optarg, y, d_height, r.height); break; - case 'P': { - char **paddings; - if ((paddings = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - r.p_padding[i] = parse_integer(paddings[i], 0); + case 'P': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + r.p_padding[i] = parse_integer(tmp[i], 0); break; - } - case 'G': { - char **colors; - if ((colors = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - p_borders_bg[i] = parse_color(colors[i], "#000"); + case 'G': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + p_borders_bg[i] = parse_color(tmp[i], "#000"); break; - } - case 'g': { - char **sizes; - if ((sizes = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - r.p_borders[i] = parse_integer(sizes[i], 0); - break; - } - case 'I': { - char **colors; - if ((colors = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - c_borders_bg[i] = parse_color(colors[i], "#000"); + case 'g': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + r.p_borders[i] = parse_integer(tmp[i], 0); break; - } - case 'i': { - char **sizes; - if ((sizes = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - r.c_borders[i] = parse_integer(sizes[i], 0); + case 'I': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + c_borders_bg[i] = parse_color(tmp[i], "#000"); break; - } - case 'J': { - char **colors; - if ((colors = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - ch_borders_bg[i] = parse_color(colors[i], "#000"); + case 'i': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + r.c_borders[i] = parse_integer(tmp[i], 0); break; - } - case 'j': { - char **sizes; - if ((sizes = parse_csslike(optarg)) != NULL) - for (i = 0; i < 4; ++i) - r.ch_borders[i] = parse_integer(sizes[i], 0); + case 'J': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + ch_borders_bg[i] = parse_color(tmp[i], "#000"); break; - } + case 'j': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + r.ch_borders[i] = parse_integer(tmp[i], 0); + break; case 'l': r.horizontal_layout = !strcmp(optarg, "horizontal"); break; @@ -1990,24 +1952,18 @@ main(int argc, char **argv) case 'H': r.height = parse_int_with_percentage(optarg, r.height, d_height); break; - case 'b': { - char **borders; - if ((borders = parse_csslike(optarg)) != NULL) { - for (i = 0; i < 4; ++i) - r.borders[i] = parse_integer(borders[i], 0); - } else - fprintf(stderr, "Error parsing b option\n"); + case 'b': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + r.borders[i] = parse_integer(tmp[i], 0); break; - } - case 'B': { - char **colors; - if ((colors = parse_csslike(optarg)) != NULL) { - for (i = 0; i < 4; ++i) - borders_bg[i] = parse_color(colors[i], "#000"); - } else - fprintf(stderr, "error while parsing B option\n"); + case 'B': + if (parse_csslike(optarg, tmp) == -1) + err(1, "parse_csslike"); + for (i = 0; i < 4; ++i) + borders_bg[i] = parse_color(tmp[i], "#000"); break; - } case 't': fgs[0] = parse_color(optarg, NULL); break;