OSDN Git Service

82b06715797e97a469f6970eabc40bc0932b491a
[uclinux-h8/uClibc.git] / libc / inet / ether_addr.c
1 /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.
19 */
20
21 /*
22  *  2002-12-24  Nick Fedchik <nick@fedchik.org.ua>
23  *      - initial uClibc port
24  */
25
26 #define __FORCE_GLIBC
27 #include <features.h>
28 #include <ctype.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <netinet/ether.h>
32 #include <netinet/if_ether.h>
33
34 /* libc_hidden_proto(ether_ntoa_r) */
35 /* libc_hidden_proto(sprintf) */
36 #ifdef __UCLIBC_HAS_XLOCALE__
37 /* libc_hidden_proto(__ctype_b_loc) */
38 /* libc_hidden_proto(__ctype_tolower_loc) */
39 #elif defined __UCLIBC_HAS_CTYPE_TABLES__
40 /* libc_hidden_proto(__ctype_b) */
41 /* libc_hidden_proto(__ctype_tolower) */
42 #endif
43
44 struct ether_addr *ether_aton_r(const char *asc, struct ether_addr *addr)
45 {
46         size_t cnt;
47
48         for (cnt = 0; cnt < 6; ++cnt) {
49                 unsigned int number;
50                 char ch;
51
52                 ch = _tolower(*asc++);
53                 if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
54                         return NULL;
55                 number = isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
56
57                 ch = _tolower(*asc);
58                 if ((cnt < 5 && ch != ':')
59                         || (cnt == 5 && ch != '\0' && !isspace(ch))) {
60                         ++asc;
61                         if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
62                                 return NULL;
63                         number <<= 4;
64                         number += isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
65
66                         ch = *asc;
67                         if (cnt < 5 && ch != ':')
68                                 return NULL;
69                 }
70
71                 /* Store result.  */
72                 addr->ether_addr_octet[cnt] = (unsigned char) number;
73
74                 /* Skip ':'.  */
75                 ++asc;
76         }
77
78         return addr;
79 }
80 libc_hidden_def(ether_aton_r)
81
82 struct ether_addr *ether_aton(const char *asc)
83 {
84         static struct ether_addr result;
85
86         return ether_aton_r(asc, &result);
87 }
88
89 char *ether_ntoa_r(const struct ether_addr *addr, char *buf)
90 {
91         sprintf(buf, "%x:%x:%x:%x:%x:%x",
92                         addr->ether_addr_octet[0], addr->ether_addr_octet[1],
93                         addr->ether_addr_octet[2], addr->ether_addr_octet[3],
94                         addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
95         return buf;
96 }
97 libc_hidden_def(ether_ntoa_r)
98
99 char *ether_ntoa(const struct ether_addr *addr)
100 {
101         static char asc[18];
102
103         return ether_ntoa_r(addr, asc);
104 }