summaryrefslogtreecommitdiffstats
path: root/bsd/freebsd/contrib/ntp/libntp/hextoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsd/freebsd/contrib/ntp/libntp/hextoint.c')
-rwxr-xr-xbsd/freebsd/contrib/ntp/libntp/hextoint.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/bsd/freebsd/contrib/ntp/libntp/hextoint.c b/bsd/freebsd/contrib/ntp/libntp/hextoint.c
new file mode 100755
index 0000000..980a43f
--- /dev/null
+++ b/bsd/freebsd/contrib/ntp/libntp/hextoint.c
@@ -0,0 +1,42 @@
+/*
+ * hextoint - convert an ascii string in hex to an unsigned
+ * long, with error checking
+ */
+#include <config.h>
+#include <ctype.h>
+
+#include "ntp_stdlib.h"
+
+int
+hextoint(
+ const char *str,
+ u_long *pu
+ )
+{
+ register u_long u;
+ register const char *cp;
+
+ cp = str;
+
+ if (*cp == '\0')
+ return 0;
+
+ u = 0;
+ while (*cp != '\0') {
+ if (!isxdigit((unsigned char)*cp))
+ return 0;
+ if (u & 0xF0000000)
+ return 0; /* overflow */
+ u <<= 4;
+ if ('0' <= *cp && *cp <= '9')
+ u += *cp++ - '0';
+ else if ('a' <= *cp && *cp <= 'f')
+ u += *cp++ - 'a' + 10;
+ else if ('A' <= *cp && *cp <= 'F')
+ u += *cp++ - 'A' + 10;
+ else
+ return 0;
+ }
+ *pu = u;
+ return 1;
+}