staging: speakup: fix a bug when translate octal numbers
[linux-2.6-microblaze.git] / drivers / staging / speakup / varhandlers.c
index f8c1e45..0099cb1 100644 (file)
@@ -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,38 +319,10 @@ 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;
@@ -372,9 +344,9 @@ char *spk_xlate(char *s)
                        p1++;
                } else if (*p1 >= '0' && *p1 <= '7') {
                        num = (*p1++)&7;
-                       while (num < 256 && *p1 >= '0' && *p1 <= '7') {
+                       while (num < 32 && *p1 >= '0' && *p1 <= '7') {
                                num <<= 3;
-                               num = (*p1++)&7;
+                               num += (*p1++)&7;
                        }
                        *p++ = num;
                } else if (*p1 == 'x' &&