OSDN Git Service

hidden_def/hidden_proto: convert all users (I hope) termios split, add some missing...
[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_aton_r)
35 libc_hidden_proto(ether_ntoa_r)
36 libc_hidden_proto(sprintf)
37
38 struct ether_addr *ether_aton_r(const char *asc, struct ether_addr *addr)
39 {
40         size_t cnt;
41
42         for (cnt = 0; cnt < 6; ++cnt) {
43                 unsigned int number;
44                 char ch;
45
46                 ch = _tolower(*asc++);
47                 if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
48                         return NULL;
49                 number = isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
50
51                 ch = _tolower(*asc);
52                 if ((cnt < 5 && ch != ':')
53                         || (cnt == 5 && ch != '\0' && !isspace(ch))) {
54                         ++asc;
55                         if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
56                                 return NULL;
57                         number <<= 4;
58                         number += isdigit(ch) ? (ch - '0') : (ch - 'a' + 10);
59
60                         ch = *asc;
61                         if (cnt < 5 && ch != ':')
62                                 return NULL;
63                 }
64
65                 /* Store result.  */
66                 addr->ether_addr_octet[cnt] = (unsigned char) number;
67
68                 /* Skip ':'.  */
69                 ++asc;
70         }
71
72         return addr;
73 }
74 libc_hidden_def(ether_aton_r)
75
76 struct ether_addr *ether_aton(const char *asc)
77 {
78         static struct ether_addr result;
79
80         return ether_aton_r(asc, &result);
81 }
82
83 char *ether_ntoa_r(const struct ether_addr *addr, char *buf)
84 {
85         sprintf(buf, "%x:%x:%x:%x:%x:%x",
86                         addr->ether_addr_octet[0], addr->ether_addr_octet[1],
87                         addr->ether_addr_octet[2], addr->ether_addr_octet[3],
88                         addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
89         return buf;
90 }
91 libc_hidden_def(ether_ntoa_r)
92
93 char *ether_ntoa(const struct ether_addr *addr)
94 {
95         static char asc[18];
96
97         return ether_ntoa_r(addr, asc);
98 }