commit - 761c26b4d0017217bcc5085f10241a5b85a63d0b
commit + 225607eff40b77dc809fcbeb12af8cd159cfa78f
blob - 3e448b2bc7ab80fd1c0eed5d4090a304678f9321
blob + e306b210f55feedab9a96effdab669f0d6fd23e2
--- mymenu.c
+++ mymenu.c
/* 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);
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;
}
/*
short embed;
const char *sep = NULL;
const char *parent_window_id = NULL;
+ char *tmp[4];
char **lines, **vlines;
char *fontname, *text, *xrm;
}
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))
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 */
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 */
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]);
+ }
}
}
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;
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;