Add strict_strtoX() compatibilty functions for kernel < 2.6.25.
authorIan Abbott <abbotti@mev.co.uk>
Mon, 11 May 2009 10:15:12 +0000 (10:15 +0000)
committerIan Abbott <abbotti@mev.co.uk>
Mon, 11 May 2009 10:15:12 +0000 (10:15 +0000)
Reported by labrat <tvrkng -at- gmail -dot- com>.

include/linux/kernel.h

index 46f78af1b8d896001bd9db0b647b6163e530b650..693a71c198f587962dec610b58427d1dd8041183 100644 (file)
 
 #endif
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
+/* Add missing strict_strtox functions. */
+#include <linux/string.h>
+#include <linux/errno.h>
+
+static inline int comedi_strict_strtoul(const char *cp, unsigned int base,
+       unsigned long *res)
+{
+       char *tail;
+       unsigned long val;
+       size_t len;
+
+       *res = 0;
+       len = strlen(cp);
+       if (len == 0)
+               return -EINVAL;
+
+       val = simple_strtoul(cp, &tail, base);
+       if (tail == cp)
+               return -EINVAL;
+       if ((*tail == '\0') ||
+               ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
+               *res = val;
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+#undef strict_strtoul
+#define strict_strtoul(cp, base, res) comedi_strict_strtoul(cp, base, res)
+
+static inline int comedi_strict_strtol(const char *cp, unsigned int base,
+       long *res)
+{
+       int ret;
+       if (*cp == '-') {
+               ret = comedi_strict_strtoul(cp + 1, base, (unsigned long *)res);
+               if (!ret)
+                       *res = -(*res);
+       } else {
+               ret = comedi_strict_strtoul(cp, base, (unsigned long *)res);
+       }
+
+       return ret;
+}
+
+#undef strict_strtol
+#define strict_strtol(cp, base, res) comedi_strict_strtoul(cp, base, res)
+
+static inline int comedi_strict_strtoull(const char *cp, unsigned int base,
+       unsigned long long *res)
+{
+       char *tail;
+       unsigned long long val;
+       size_t len;
+
+       *res = 0;
+       len = strlen(cp);
+       if (len == 0)
+               return -EINVAL;
+
+       val = simple_strtoull(cp, &tail, base);
+       if (tail == cp)
+               return -EINVAL;
+       if ((*tail == '\0') ||
+               ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
+               *res = val;
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+#undef strict_strtoull
+#define strict_strtoull(cp, base, res) comedi_strict_strtoul(cp, base, res)
+
+static inline int comedi_strict_strtoll(const char *cp, unsigned int base,
+       long long *res)
+{
+       int ret;
+       if (*cp == '-') {
+               ret = comedi_strict_strtoull(cp + 1, base, (unsigned long long *)res);
+               if (!ret)
+                       *res = -(*res);
+       } else {
+               ret = comedi_strict_strtoull(cp, base, (unsigned long long *)res);
+       }
+
+       return ret;
+}
+
+#undef strict_strtoll
+#define strict_strtoll(cp, base, res) comedi_strict_strtoul(cp, base, res)
+
+#endif
+
 #endif // _KERNEL_COMPAT_H