diff options
Diffstat (limited to 'drivers/staging/speakup')
-rw-r--r-- | drivers/staging/speakup/kobjects.c | 14 | ||||
-rw-r--r-- | drivers/staging/speakup/main.c | 2 | ||||
-rw-r--r-- | drivers/staging/speakup/selection.c | 2 | ||||
-rw-r--r-- | drivers/staging/speakup/speakup.h | 7 | ||||
-rw-r--r-- | drivers/staging/speakup/varhandlers.c | 102 |
5 files changed, 24 insertions, 103 deletions
diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c index 35f647c..943b6c1 100644 --- a/drivers/staging/speakup/kobjects.c +++ b/drivers/staging/speakup/kobjects.c @@ -15,6 +15,7 @@ #include <linux/kernel.h> #include <linux/kobject.h> #include <linux/string.h> +#include <linux/string_helpers.h> #include <linux/sysfs.h> #include <linux/ctype.h> @@ -417,7 +418,7 @@ static ssize_t synth_direct_store(struct kobject *kobj, bytes = min_t(size_t, len, 250); strncpy(tmp, ptr, bytes); tmp[bytes] = '\0'; - spk_xlate(tmp); + string_unescape_any_inplace(tmp); synth_printf("%s", tmp); ptr += bytes; len -= bytes; @@ -605,7 +606,8 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, if (param->data == NULL) return 0; ret = 0; - cp = spk_xlate((char *) buf); + cp = (char *)buf; + string_unescape_any_inplace(cp); spk_lock(flags); switch (param->var_type) { @@ -617,9 +619,9 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, len = E_INC; else len = E_SET; - speakup_s2i(cp, &value); + value = simple_strtol(cp, NULL, 10); ret = spk_set_num_var(value, param, len); - if (ret == E_RANGE) { + if (ret == -ERANGE) { var_data = param->data; pr_warn("value for %s out of range, expect %d to %d\n", attr->attr.name, @@ -637,7 +639,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, cp = (char *) buf; cp[len] = '\0'; ret = spk_set_string_var(buf, param, len); - if (ret == E_TOOLONG) + if (ret == -E2BIG) pr_warn("value too long for %s\n", attr->attr.name); break; @@ -670,7 +672,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, } spk_unlock(flags); - if (ret == SET_DEFAULT) + if (ret == -ERESTART) pr_info("%s reset to default value\n", attr->attr.name); return count; } diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c index 9916e94..6c7b55c 100644 --- a/drivers/staging/speakup/main.c +++ b/drivers/staging/speakup/main.c @@ -1892,7 +1892,7 @@ oops: spk_special_handler = NULL; return 1; } - cp = speakup_s2i(goto_buf, &go_pos); + go_pos = simple_strtol(goto_buf, &cp, 10); goto_pos = (u_long) go_pos; if (*cp == 'x') { if (*goto_buf < '0') diff --git a/drivers/staging/speakup/selection.c b/drivers/staging/speakup/selection.c index 775af26..f0fb003 100644 --- a/drivers/staging/speakup/selection.c +++ b/drivers/staging/speakup/selection.c @@ -14,7 +14,7 @@ unsigned short spk_xs, spk_ys, spk_xe, spk_ye; /* our region points */ /* Variables for selection control. */ -/* must not be disallocated */ +/* must not be deallocated */ struct vc_data *spk_sel_cons; /* cleared by clear_selection */ static int sel_start = -1; diff --git a/drivers/staging/speakup/speakup.h b/drivers/staging/speakup/speakup.h index 22f0fbb..0126f71 100644 --- a/drivers/staging/speakup/speakup.h +++ b/drivers/staging/speakup/speakup.h @@ -44,11 +44,6 @@ #define IS_CHAR(x, type) (spk_chartab[((u_char)x)]&type) #define IS_TYPE(x, type) ((spk_chartab[((u_char)x)]&type) == type) -#define SET_DEFAULT -4 -#define E_RANGE -3 -#define E_TOOLONG -2 -#define E_UNDEF -1 - extern int speakup_thread(void *data); extern void spk_reset_default_chars(void); extern void spk_reset_default_chartab(void); @@ -58,9 +53,7 @@ void spk_reset_index_count(int sc); void spk_get_index_count(int *linecount, int *sentcount); extern int spk_set_key_info(const u_char *key_info, u_char *k_buffer); extern char *spk_strlwr(char *s); -extern char *speakup_s2i(char *start, int *dest); extern char *spk_s2uchar(char *start, char *dest); -extern char *spk_xlate(char *s); extern int speakup_kobj_init(void); extern void speakup_kobj_exit(void); extern int spk_chartab_get_value(char *keyword); diff --git a/drivers/staging/speakup/varhandlers.c b/drivers/staging/speakup/varhandlers.c index f8c1e45..7f6288f 100644 --- a/drivers/staging/speakup/varhandlers.c +++ b/drivers/staging/speakup/varhandlers.c @@ -184,19 +184,19 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) char buf[32]; char *cp; struct var_t *var_data = var->data; + if (var_data == NULL) - return E_UNDEF; + return -ENODATA; if (how == E_NEW_DEFAULT) { if (input < var_data->u.n.low || input > var_data->u.n.high) - ret = E_RANGE; - else - var_data->u.n.default_val = input; - return ret; + return -ERANGE; + var_data->u.n.default_val = input; + return 0; } if (how == E_DEFAULT) { val = var_data->u.n.default_val; - ret = SET_DEFAULT; + ret = -ERESTART; } else { if (how == E_SET) val = input; @@ -207,7 +207,7 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) else if (how == E_DEC) val -= input; if (val < var_data->u.n.low || val > var_data->u.n.high) - return E_RANGE; + return -ERANGE; } var_data->u.n.value = val; if (var->var_type == VAR_TIME && p_val != NULL) { @@ -246,25 +246,25 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) int spk_set_string_var(const char *page, struct st_var_header *var, int len) { - int ret = 0; struct var_t *var_data = var->data; + if (var_data == NULL) - return E_UNDEF; + return -ENODATA; if (len > MAXVARLEN) - return -E_TOOLONG; + return -E2BIG; if (!len) { if (!var_data->u.s.default_val) return 0; - ret = SET_DEFAULT; if (!var->p_val) var->p_val = var_data->u.s.default_val; if (var->p_val != var_data->u.s.default_val) strcpy((char *)var->p_val, var_data->u.s.default_val); + return -ERESTART; } else if (var->p_val) strcpy((char *)var->p_val, page); else - return -E_TOOLONG; - return ret; + return -E2BIG; + return 0; } /* spk_set_mask_bits sets or clears the punc/delim/repeat bits, @@ -319,86 +319,12 @@ char *spk_strlwr(char *s) return s; } -char *speakup_s2i(char *start, int *dest) -{ - int val; - char ch = *start; - if (ch == '-' || ch == '+') - start++; - if (*start < '0' || *start > '9') - return start; - val = (*start) - '0'; - start++; - while (*start >= '0' && *start <= '9') { - val *= 10; - val += (*start) - '0'; - start++; - } - if (ch == '-') - *dest = -val; - else - *dest = val; - return start; -} - char *spk_s2uchar(char *start, char *dest) { int val = 0; - while (*start && *start <= SPACE) - start++; - while (*start >= '0' && *start <= '9') { - val *= 10; - val += (*start) - '0'; - start++; - } + val = simple_strtoul(skip_spaces(start), &start, 10); if (*start == ',') start++; *dest = (u_char)val; return start; } - -char *spk_xlate(char *s) -{ - static const char finds[] = "nrtvafe"; - static const char subs[] = "\n\r\t\013\001\014\033"; - static const char hx[] = "0123456789abcdefABCDEF"; - char *p = s, *p1, *p2, c; - int num; - while ((p = strchr(p, '\\'))) { - p1 = p+1; - p2 = strchr(finds, *p1); - if (p2) { - *p++ = subs[p2-finds]; - p1++; - } else if (*p1 >= '0' && *p1 <= '7') { - num = (*p1++)&7; - while (num < 256 && *p1 >= '0' && *p1 <= '7') { - num <<= 3; - num = (*p1++)&7; - } - *p++ = num; - } else if (*p1 == 'x' && - strchr(hx, p1[1]) && strchr(hx, p1[2])) { - p1++; - c = *p1++; - if (c > '9') - c = (c - '7') & 0x0f; - else - c -= '0'; - num = c << 4; - c = *p1++; - if (c > '9') - c = (c-'7')&0x0f; - else - c -= '0'; - num += c; - *p++ = num; - } else - *p++ = *p1++; - p2 = p; - while (*p1) - *p2++ = *p1++; - *p2 = '\0'; - } - return s; -} |