File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libntp / hextolfp.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>