summaryrefslogtreecommitdiffstats
path: root/tty-term.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-01-24 22:01:13 +0000
committerThomas Adam <thomas@xteddy.org>2017-01-24 22:01:13 +0000
commit418ab1a553f46996d3524bab5c81b2c66fa7efc6 (patch)
treeb29b61f95da6d7732628cdfb6dcf5e23c2fede5e /tty-term.c
parentf38a6bbd816533d01d14c8bbafbb51621e5e1326 (diff)
parentffc28a7765f4b560427404c9679966232655e67e (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'tty-term.c')
-rw-r--r--tty-term.c139
1 files changed, 71 insertions, 68 deletions
diff --git a/tty-term.c b/tty-term.c
index 9e29188d..0fcf5205 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -297,86 +297,82 @@ tty_term_strip(const char *s)
}
static void
-tty_term_override(struct tty_term *term, const char *overrides)
+tty_term_override(struct tty_term *term, const char *override)
{
const struct tty_term_code_entry *ent;
struct tty_code *code;
- char *termnext, *termstr;
- char *entnext, *entstr;
- char *s, *ptr, *val;
+ char *next, *s, *copy, *cp, *value;
const char *errstr;
u_int i;
- int n, removeflag;
+ int n, remove;
- s = xstrdup(overrides);
+ copy = next = xstrdup(override);
- termnext = s;
- while ((termstr = strsep(&termnext, ",")) != NULL) {
- entnext = termstr;
+ s = strsep(&next, ":");
+ if (s == NULL || next == NULL || fnmatch(s, term->name, 0) != 0) {
+ free(copy);
+ return;
+ }
- entstr = strsep(&entnext, ":");
- if (entstr == NULL || entnext == NULL)
- continue;
- if (fnmatch(entstr, term->name, 0) != 0)
+ while ((s = strsep(&next, ":")) != NULL) {
+ if (*s == '\0')
continue;
- while ((entstr = strsep(&entnext, ":")) != NULL) {
- if (*entstr == '\0')
+ value = NULL;
+
+ remove = 0;
+ if ((cp = strchr(s, '=')) != NULL) {
+ *cp++ = '\0';
+ value = xstrdup(cp);
+ if (strunvis(value, cp) == -1) {
+ free(value);
+ value = xstrdup(cp);
+ }
+ } else if (s[strlen(s) - 1] == '@') {
+ s[strlen(s) - 1] = '\0';
+ remove = 1;
+ } else
+ value = xstrdup("");
+
+ if (remove)
+ log_debug("%s override: %s@", term->name, s);
+ else
+ log_debug("%s override: %s=%s", term->name, s, value);
+
+ for (i = 0; i < tty_term_ncodes(); i++) {
+ ent = &tty_term_codes[i];
+ if (strcmp(s, ent->name) != 0)
continue;
+ code = &term->codes[i];
- val = NULL;
- removeflag = 0;
- if ((ptr = strchr(entstr, '=')) != NULL) {
- *ptr++ = '\0';
- val = xstrdup(ptr);
- if (strunvis(val, ptr) == -1) {
- free(val);
- val = xstrdup(ptr);
- }
- } else if (entstr[strlen(entstr) - 1] == '@') {
- entstr[strlen(entstr) - 1] = '\0';
- removeflag = 1;
- } else
- val = xstrdup("");
-
- log_debug("%s override: %s %s",
- term->name, entstr, removeflag ? "@" : val);
- for (i = 0; i < tty_term_ncodes(); i++) {
- ent = &tty_term_codes[i];
- if (strcmp(entstr, ent->name) != 0)
- continue;
- code = &term->codes[i];
-
- if (removeflag) {
- code->type = TTYCODE_NONE;
- continue;
- }
- switch (ent->type) {
- case TTYCODE_NONE:
- break;
- case TTYCODE_STRING:
- if (code->type == TTYCODE_STRING)
- free(code->value.string);
- code->value.string = xstrdup(val);
- code->type = ent->type;
- break;
- case TTYCODE_NUMBER:
- n = strtonum(val, 0, INT_MAX, &errstr);
- if (errstr != NULL)
- break;
- code->value.number = n;
- code->type = ent->type;
- break;
- case TTYCODE_FLAG:
- code->value.flag = 1;
- code->type = ent->type;
+ if (remove) {
+ code->type = TTYCODE_NONE;
+ continue;
+ }
+ switch (ent->type) {
+ case TTYCODE_NONE:
+ break;
+ case TTYCODE_STRING:
+ if (code->type == TTYCODE_STRING)
+ free(code->value.string);
+ code->value.string = xstrdup(value);
+ code->type = ent->type;
+ break;
+ case TTYCODE_NUMBER:
+ n = strtonum(value, 0, INT_MAX, &errstr);
+ if (errstr != NULL)
break;
- }
+ code->value.number = n;
+ code->type = ent->type;
+ break;
+ case TTYCODE_FLAG:
+ code->value.flag = 1;
+ code->type = ent->type;
+ break;
}
-
- free(val);
}
- }
+ free(value);
+ }
free(s);
}
@@ -386,7 +382,8 @@ tty_term_find(char *name, int fd, char **cause)
struct tty_term *term;
const struct tty_term_code_entry *ent;
struct tty_code *code;
- u_int i;
+ struct options_entry *o;
+ u_int size, i;
int n, error;
const char *s, *acs;
@@ -460,8 +457,14 @@ tty_term_find(char *name, int fd, char **cause)
}
/* Apply terminal overrides. */
- s = options_get_string(global_options, "terminal-overrides");
- tty_term_override(term, s);
+ o = options_get_only(global_options, "terminal-overrides");
+ if (options_array_size(o, &size) != -1) {
+ for (i = 0; i < size; i++) {
+ s = options_array_get(o, i);
+ if (s != NULL)
+ tty_term_override(term, s);
+ }
+ }
/* Delete curses data. */
#if !defined(NCURSES_VERSION_MAJOR) || NCURSES_VERSION_MAJOR > 5 || \