aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2019-12-27 23:33:55 -0500
committerSimon Ser <contact@emersion.fr>2019-12-28 10:07:25 +0100
commit97f9f0b699316ba60009b395948a712ec0b671d2 (patch)
treeb5916b36f4161c1c4d670295254d0f3fd9e793df /common
parent088b374b1a3e7ead08e1430d3d89649b1cd5a54b (diff)
parse_color: return success + drop fallback color
This is the first in a series of commits to refactor the color handling in sway. This changes parse_color to return whether it was success and no longer uses 0xFFFFFFFF as the fallback color. This also verifies that the string actually contains a valid hexadecimal number along with the length checks. In the process of altering the calls to parse_color, I also took the opportunity to heavily refactor swaybar's ipc_parse_colors function. This allowed for several lines of duplicated code to be removed.
Diffstat (limited to 'common')
-rw-r--r--common/util.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/common/util.c b/common/util.c
index c0324b2f..84ebab99 100644
--- a/common/util.c
+++ b/common/util.c
@@ -1,4 +1,5 @@
#define _POSIX_C_SOURCE 200809L
+#include <ctype.h>
#include <float.h>
#include <fcntl.h>
#include <math.h>
@@ -13,21 +14,21 @@ int wrap(int i, int max) {
return ((i % max) + max) % max;
}
-uint32_t parse_color(const char *color) {
+bool parse_color(const char *color, uint32_t *result) {
if (color[0] == '#') {
++color;
}
-
int len = strlen(color);
- if (len != 6 && len != 8) {
- sway_log(SWAY_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color);
- return 0xFFFFFFFF;
+ if ((len != 6 && len != 8) || !isxdigit(color[0]) || !isxdigit(color[1])) {
+ return false;
}
- uint32_t res = (uint32_t)strtoul(color, NULL, 16);
- if (strlen(color) == 6) {
- res = (res << 8) | 0xFF;
+ char *ptr;
+ uint32_t parsed = strtoul(color, &ptr, 16);
+ if (*ptr != '\0') {
+ return false;
}
- return res;
+ *result = len == 6 ? ((parsed << 8) | 0xFF) : parsed;
+ return true;
}
bool parse_boolean(const char *boolean, bool current) {