Current Path : /usr/src/contrib/ntp/libntp/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/src/contrib/ntp/libntp/hextolfp.c |
/* * hextolfp - convert an ascii hex string to an l_fp number */ #include <stdio.h> #include <ctype.h> #include "ntp_fp.h" #include "ntp_string.h" #include "ntp_stdlib.h" int hextolfp( const char *str, l_fp *lfp ) { register const char *cp; register const char *cpstart; register u_long dec_i; register u_long dec_f; char *ind = NULL; static const char *digits = "0123456789abcdefABCDEF"; dec_i = dec_f = 0; cp = str; /* * We understand numbers of the form: * * [spaces]8_hex_digits[.]8_hex_digits[spaces|\n|\0] */ while (isspace((int)*cp)) cp++; cpstart = cp; while (*cp != '\0' && (cp - cpstart) < 8 && (ind = strchr(digits, *cp)) != NULL) { dec_i = dec_i << 4; /* multiply by 16 */ dec_i += ((ind - digits) > 15) ? (ind - digits) - 6 : (ind - digits); cp++; } if ((cp - cpstart) < 8 || ind == NULL) return 0; if (*cp == '.') cp++; cpstart = cp; while (*cp != '\0' && (cp - cpstart) < 8 && (ind = strchr(digits, *cp)) != NULL) { dec_f = dec_f << 4; /* multiply by 16 */ dec_f += ((ind - digits) > 15) ? (ind - digits) - 6 : (ind - digits); cp++; } if ((cp - cpstart) < 8 || ind == NULL) return 0; if (*cp != '\0' && !isspace((int)*cp)) return 0; lfp->l_ui = dec_i; lfp->l_uf = dec_f; return 1; }