Only compare the actual size of the UTF-8 character, not all of it.
[tmux-openbsd.git] / attributes.c
blobb839f06d83b081f046659ab175b7997ff81369cb
1 /* $OpenBSD$ */
3 /*
4 * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
21 #include <string.h>
23 #include "tmux.h"
25 const char *
26 attributes_tostring(int attr)
28 static char buf[512];
29 size_t len;
31 if (attr == 0)
32 return ("none");
34 len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
35 (attr & GRID_ATTR_CHARSET) ? "acs," : "",
36 (attr & GRID_ATTR_BRIGHT) ? "bright," : "",
37 (attr & GRID_ATTR_DIM) ? "dim," : "",
38 (attr & GRID_ATTR_UNDERSCORE) ? "underscore," : "",
39 (attr & GRID_ATTR_BLINK)? "blink," : "",
40 (attr & GRID_ATTR_REVERSE) ? "reverse," : "",
41 (attr & GRID_ATTR_HIDDEN) ? "hidden," : "",
42 (attr & GRID_ATTR_ITALICS) ? "italics," : "",
43 (attr & GRID_ATTR_STRIKETHROUGH) ? "strikethrough," : "",
44 (attr & GRID_ATTR_UNDERSCORE_2) ? "double-underscore," : "",
45 (attr & GRID_ATTR_UNDERSCORE_3) ? "curly-underscore," : "",
46 (attr & GRID_ATTR_UNDERSCORE_4) ? "dotted-underscore," : "",
47 (attr & GRID_ATTR_UNDERSCORE_5) ? "dashed-underscore," : "",
48 (attr & GRID_ATTR_OVERLINE) ? "overline," : "");
49 if (len > 0)
50 buf[len - 1] = '\0';
52 return (buf);
55 int
56 attributes_fromstring(const char *str)
58 const char delimiters[] = " ,|";
59 int attr;
60 size_t end;
61 u_int i;
62 struct {
63 const char *name;
64 int attr;
65 } table[] = {
66 { "acs", GRID_ATTR_CHARSET },
67 { "bright", GRID_ATTR_BRIGHT },
68 { "bold", GRID_ATTR_BRIGHT },
69 { "dim", GRID_ATTR_DIM },
70 { "underscore", GRID_ATTR_UNDERSCORE },
71 { "blink", GRID_ATTR_BLINK },
72 { "reverse", GRID_ATTR_REVERSE },
73 { "hidden", GRID_ATTR_HIDDEN },
74 { "italics", GRID_ATTR_ITALICS },
75 { "strikethrough", GRID_ATTR_STRIKETHROUGH },
76 { "double-underscore", GRID_ATTR_UNDERSCORE_2 },
77 { "curly-underscore", GRID_ATTR_UNDERSCORE_3 },
78 { "dotted-underscore", GRID_ATTR_UNDERSCORE_4 },
79 { "dashed-underscore", GRID_ATTR_UNDERSCORE_5 },
80 { "overline", GRID_ATTR_OVERLINE }
83 if (*str == '\0' || strcspn(str, delimiters) == 0)
84 return (-1);
85 if (strchr(delimiters, str[strlen(str) - 1]) != NULL)
86 return (-1);
88 if (strcasecmp(str, "default") == 0 || strcasecmp(str, "none") == 0)
89 return (0);
91 attr = 0;
92 do {
93 end = strcspn(str, delimiters);
94 for (i = 0; i < nitems(table); i++) {
95 if (end != strlen(table[i].name))
96 continue;
97 if (strncasecmp(str, table[i].name, end) == 0) {
98 attr |= table[i].attr;
99 break;
102 if (i == nitems(table))
103 return (-1);
104 str += end + strspn(str + end, delimiters);
105 } while (*str != '\0');
107 return (attr);