3 * Common functions used throughout the stack.
5 * These are reference implementations of the byte swapping functions.
6 * Again with the aim of being simple, correct and fully portable.
7 * Byte swapping is the second thing you would want to optimize. You will
8 * need to port it to your architecture and in your cc.h:
10 * \#define lwip_htons(x) your_htons
11 * \#define lwip_htonl(x) your_htonl
13 * Note lwip_ntohs() and lwip_ntohl() are merely references to the htonx counterparts.
15 * If you \#define them to htons() and htonl(), you should
16 * \#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from
17 * defining htonx/ntohx compatibility macros.
19 * @defgroup sys_nonstandard Non-standard functions
21 * lwIP provides default implementations for non-standard functions.
22 * These can be mapped to OS functions to reduce code footprint if desired.
23 * All defines related to this section must not be placed in lwipopts.h,
25 * These options cannot be \#defined in lwipopts.h since they are not options
26 * of lwIP itself, but options of the lwIP port to your system.
30 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
31 * All rights reserved.
33 * Redistribution and use in source and binary forms, with or without modification,
34 * are permitted provided that the following conditions are met:
36 * 1. Redistributions of source code must retain the above copyright notice,
37 * this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright notice,
39 * this list of conditions and the following disclaimer in the documentation
40 * and/or other materials provided with the distribution.
41 * 3. The name of the author may not be used to endorse or promote products
42 * derived from this software without specific prior written permission.
44 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
45 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
46 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
47 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
48 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
49 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
51 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
52 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
55 * This file is part of the lwIP TCP/IP stack.
57 * Author: Simon Goldschmidt
66 #if BYTE_ORDER == LITTLE_ENDIAN
68 #if !defined(lwip_htons)
70 * Convert an u16_t from host- to network byte order.
72 * @param n u16_t in host byte order
73 * @return n in network byte order
78 return (u16_t
)PP_HTONS(n
);
80 #endif /* lwip_htons */
82 #if !defined(lwip_htonl)
84 * Convert an u32_t from host- to network byte order.
86 * @param n u32_t in host byte order
87 * @return n in network byte order
92 return (u32_t
)PP_HTONL(n
);
94 #endif /* lwip_htonl */
96 #endif /* BYTE_ORDER == LITTLE_ENDIAN */
100 * @ingroup sys_nonstandard
101 * lwIP default implementation for strnstr() non-standard function.
102 * This can be \#defined to strnstr() depending on your platform port.
105 lwip_strnstr(const char* buffer
, const char* token
, size_t n
)
108 size_t tokenlen
= strlen(token
);
110 return LWIP_CONST_CAST(char *, buffer
);
112 for (p
= buffer
; *p
&& (p
+ tokenlen
<= buffer
+ n
); p
++) {
113 if ((*p
== *token
) && (strncmp(p
, token
, tokenlen
) == 0)) {
114 return LWIP_CONST_CAST(char *, p
);
123 * @ingroup sys_nonstandard
124 * lwIP default implementation for stricmp() non-standard function.
125 * This can be \#defined to stricmp() depending on your platform port.
128 lwip_stricmp(const char* str1
, const char* str2
)
136 char c1_upc
= c1
| 0x20;
137 if ((c1_upc
>= 'a') && (c1_upc
<= 'z')) {
138 /* characters are not equal an one is in the alphabet range:
139 downcase both chars and check again */
140 char c2_upc
= c2
| 0x20;
141 if (c1_upc
!= c2_upc
) {
142 /* still not equal */
143 /* don't care for < or > */
147 /* characters are not equal but none is in the alphabet range */
156 #ifndef lwip_strnicmp
158 * @ingroup sys_nonstandard
159 * lwIP default implementation for strnicmp() non-standard function.
160 * This can be \#defined to strnicmp() depending on your platform port.
163 lwip_strnicmp(const char* str1
, const char* str2
, size_t len
)
171 char c1_upc
= c1
| 0x20;
172 if ((c1_upc
>= 'a') && (c1_upc
<= 'z')) {
173 /* characters are not equal an one is in the alphabet range:
174 downcase both chars and check again */
175 char c2_upc
= c2
| 0x20;
176 if (c1_upc
!= c2_upc
) {
177 /* still not equal */
178 /* don't care for < or > */
182 /* characters are not equal but none is in the alphabet range */
186 } while (len
-- && c1
!= 0);
193 * @ingroup sys_nonstandard
194 * lwIP default implementation for itoa() non-standard function.
195 * This can be \#defined to itoa() or snprintf(result, bufsize, "%d", number) depending on your platform port.
198 lwip_itoa(char* result
, size_t bufsize
, int number
)
201 char* ptr
= result
, *ptr1
= result
, tmp_char
;
203 LWIP_UNUSED_ARG(bufsize
);
208 *ptr
++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value
- number
* base
)];
211 /* Apply negative sign */