1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * hextolfp - convert an ascii hex string to an l_fp number 3c0b746e5SOllivier Robert */ 42b15cb3dSCy Schubert #include <config.h> 5c0b746e5SOllivier Robert #include <stdio.h> 6c0b746e5SOllivier Robert #include <ctype.h> 7c0b746e5SOllivier Robert 8c0b746e5SOllivier Robert #include "ntp_fp.h" 9c0b746e5SOllivier Robert #include "ntp_string.h" 10c0b746e5SOllivier Robert #include "ntp_stdlib.h" 11c0b746e5SOllivier Robert 12c0b746e5SOllivier Robert int hextolfp(const char * str,l_fp * lfp)13c0b746e5SOllivier Roberthextolfp( 14c0b746e5SOllivier Robert const char *str, 15c0b746e5SOllivier Robert l_fp *lfp 16c0b746e5SOllivier Robert ) 17c0b746e5SOllivier Robert { 18c0b746e5SOllivier Robert register const char *cp; 19c0b746e5SOllivier Robert register const char *cpstart; 20c0b746e5SOllivier Robert register u_long dec_i; 21c0b746e5SOllivier Robert register u_long dec_f; 22c0b746e5SOllivier Robert char *ind = NULL; 23c0b746e5SOllivier Robert static const char *digits = "0123456789abcdefABCDEF"; 24c0b746e5SOllivier Robert 25c0b746e5SOllivier Robert dec_i = dec_f = 0; 26c0b746e5SOllivier Robert cp = str; 27c0b746e5SOllivier Robert 28c0b746e5SOllivier Robert /* 29c0b746e5SOllivier Robert * We understand numbers of the form: 30c0b746e5SOllivier Robert * 31c0b746e5SOllivier Robert * [spaces]8_hex_digits[.]8_hex_digits[spaces|\n|\0] 32c0b746e5SOllivier Robert */ 332b15cb3dSCy Schubert while (isspace((unsigned char)*cp)) 34c0b746e5SOllivier Robert cp++; 35c0b746e5SOllivier Robert 36c0b746e5SOllivier Robert cpstart = cp; 37c0b746e5SOllivier Robert while (*cp != '\0' && (cp - cpstart) < 8 && 38c0b746e5SOllivier Robert (ind = strchr(digits, *cp)) != NULL) { 39c0b746e5SOllivier Robert dec_i = dec_i << 4; /* multiply by 16 */ 40*3311ff84SXin LI dec_i += ((ind - digits) > 15) 41*3311ff84SXin LI ? (u_long)(ind - digits - 6) 42*3311ff84SXin LI : (u_long)(ind - digits); 43c0b746e5SOllivier Robert cp++; 44c0b746e5SOllivier Robert } 45c0b746e5SOllivier Robert 46c0b746e5SOllivier Robert if ((cp - cpstart) < 8 || ind == NULL) 47c0b746e5SOllivier Robert return 0; 48c0b746e5SOllivier Robert if (*cp == '.') 49c0b746e5SOllivier Robert cp++; 50c0b746e5SOllivier Robert 51c0b746e5SOllivier Robert cpstart = cp; 52c0b746e5SOllivier Robert while (*cp != '\0' && (cp - cpstart) < 8 && 53c0b746e5SOllivier Robert (ind = strchr(digits, *cp)) != NULL) { 54c0b746e5SOllivier Robert dec_f = dec_f << 4; /* multiply by 16 */ 55*3311ff84SXin LI dec_f += ((ind - digits) > 15) 56*3311ff84SXin LI ? (u_long)(ind - digits - 6) 57*3311ff84SXin LI : (u_long)(ind - digits); 58c0b746e5SOllivier Robert cp++; 59c0b746e5SOllivier Robert } 60c0b746e5SOllivier Robert 61c0b746e5SOllivier Robert if ((cp - cpstart) < 8 || ind == NULL) 62c0b746e5SOllivier Robert return 0; 63c0b746e5SOllivier Robert 642b15cb3dSCy Schubert if (*cp != '\0' && !isspace((unsigned char)*cp)) 65c0b746e5SOllivier Robert return 0; 66c0b746e5SOllivier Robert 67c0b746e5SOllivier Robert lfp->l_ui = dec_i; 68c0b746e5SOllivier Robert lfp->l_uf = dec_f; 69c0b746e5SOllivier Robert return 1; 70c0b746e5SOllivier Robert } 71