hextoint.c revision 285612
1327952Sdim/* 2274955Ssvnmir * hextoint - convert an ascii string in hex to an unsigned 3274955Ssvnmir * long, with error checking 4274955Ssvnmir */ 5274955Ssvnmir#include <config.h> 6274955Ssvnmir#include <ctype.h> 7274955Ssvnmir 8274955Ssvnmir#include "ntp_stdlib.h" 9274955Ssvnmir 10274955Ssvnmirint 11274955Ssvnmirhextoint( 12274955Ssvnmir const char *str, 13274955Ssvnmir u_long *pu 14274955Ssvnmir ) 15274955Ssvnmir{ 16274955Ssvnmir register u_long u; 17274955Ssvnmir register const char *cp; 18274955Ssvnmir 19274955Ssvnmir cp = str; 20274955Ssvnmir 21274955Ssvnmir if (*cp == '\0') 22274955Ssvnmir return 0; 23274955Ssvnmir 24274955Ssvnmir u = 0; 25274955Ssvnmir while (*cp != '\0') { 26274955Ssvnmir if (!isxdigit((unsigned char)*cp)) 27274955Ssvnmir return 0; 28274955Ssvnmir if (u & 0xF0000000) 29274955Ssvnmir return 0; /* overflow */ 30274955Ssvnmir u <<= 4; 31274955Ssvnmir if ('0' <= *cp && *cp <= '9') 32274955Ssvnmir u += *cp++ - '0'; 33274955Ssvnmir else if ('a' <= *cp && *cp <= 'f') 34274955Ssvnmir u += *cp++ - 'a' + 10; 35274955Ssvnmir else if ('A' <= *cp && *cp <= 'F') 36274955Ssvnmir u += *cp++ - 'A' + 10; 37274955Ssvnmir else 38274955Ssvnmir return 0; 39274955Ssvnmir } 40274955Ssvnmir *pu = u; 41274955Ssvnmir return 1; 42274955Ssvnmir} 43274955Ssvnmir