5a82c85cc1e35e8bb52158ce03b77a9343bc8bd6
[people/oremanj/gpxe.git] / src / core / misc.c
1 /**************************************************************************
2 MISC Support Routines
3 **************************************************************************/
4
5 FILE_LICENCE ( GPL2_OR_LATER );
6
7 #include <stdlib.h>
8 #include <byteswap.h>
9 #include <gpxe/in.h>
10 #include <gpxe/timer.h>
11
12 /**************************************************************************
13 INET_ATON - Convert an ascii x.x.x.x to binary form
14 **************************************************************************/
15 int inet_aton ( const char *cp, struct in_addr *inp ) {
16         const char *p = cp;
17         const char *digits_start;
18         unsigned long ip = 0;
19         unsigned long val;
20         int j;
21         for(j = 0; j <= 3; j++) {
22                 digits_start = p;
23                 val = strtoul(p, ( char ** ) &p, 10);
24                 if ((p == digits_start) || (val > 255)) return 0;
25                 if ( ( j < 3 ) && ( *(p++) != '.' ) ) return 0;
26                 ip = (ip << 8) | val;
27         }
28         if ( *p == '\0' ) {
29                 inp->s_addr = htonl(ip);
30                 return 1;
31         }
32         return 0;
33 }
34
35 int isspace ( int c ) {
36         switch ( c ) {
37         case ' ':
38         case '\f':
39         case '\n':
40         case '\r':
41         case '\t':
42         case '\v':
43                 return 1;
44         default:
45                 return 0;
46         }
47 }
48
49 unsigned long strtoul ( const char *p, char **endp, int base ) {
50         unsigned long ret = 0;
51         unsigned int charval;
52
53         while ( isspace ( *p ) )
54                 p++;
55
56         if ( base == 0 ) {
57                 base = 10;
58                 if ( *p == '0' ) {
59                         p++;
60                         base = 8;
61                         if ( ( *p | 0x20 ) == 'x' ) {
62                                 p++;
63                                 base = 16;
64                         }
65                 }
66         }
67
68         while ( 1 ) {
69                 charval = *p;
70                 if ( charval >= 'a' ) {
71                         charval = ( charval - 'a' + 10 );
72                 } else if ( charval >= 'A' ) {
73                         charval = ( charval - 'A' + 10 );
74                 } else if ( charval <= '9' ) {
75                         charval = ( charval - '0' );
76                 }
77                 if ( charval >= ( unsigned int ) base )
78                         break;
79                 ret = ( ( ret * base ) + charval );
80                 p++;
81         }
82
83         if ( endp )
84                 *endp = ( char * ) p;
85
86         return ( ret );
87 }
88
89 /*
90  * Local variables:
91  *  c-basic-offset: 8
92  * End:
93  */