Annotation of embedaddon/ntp/libntp/hextolfp.c, revision 1.1.1.1

1.1       misho       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>