Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
string.cpp
Go to the documentation of this file.
1
27#define _RWSTD_LIB_SRC
28#include <rw/_defs.h>
29
30
32
33
34_RWSTD_EXPORT void*
35__rw_memcpy (void *dst, const void *src, _RWSTD_SIZE_T nbytes)
36{
37 _RWSTD_ASSERT (0 == nbytes || dst && src);
38
39 const char* csrc = _RWSTD_STATIC_CAST (const char*, src);
40
41 for (char *tmp = _RWSTD_STATIC_CAST (char*, dst); nbytes; --nbytes)
42 *tmp++ = *csrc++;
43
44 return dst;
45}
46
47
48_RWSTD_EXPORT void*
49__rw_memmove (void *dst, const void *src, _RWSTD_SIZE_T nbytes)
50{
51 _RWSTD_ASSERT (0 == nbytes || dst && src);
52
53 char* cdst = _RWSTD_STATIC_CAST (char*, dst);
54 const char* csrc = _RWSTD_STATIC_CAST (const char*, src);
55
56 if (cdst < csrc) {
57 while (nbytes--)
58 *cdst++ = *csrc++;
59 }
60 else {
61 for (cdst += nbytes, csrc += nbytes; nbytes--; )
62 *--cdst = *--csrc;
63 }
64
65 return dst;
66}
67
68
69_RWSTD_EXPORT const void*
70__rw_memchr (const void *src, int c, _RWSTD_SIZE_T nbytes)
71{
72 _RWSTD_ASSERT (0 == nbytes || src);
73
74 typedef unsigned char UChar;
75
76 const UChar* csrc = _RWSTD_STATIC_CAST (const UChar*, src);
77
78 while (nbytes > 0 && int (*csrc) != c) {
79 ++csrc;
80 --nbytes;
81 }
82
83 return nbytes ? csrc : 0;
84}
85
86
87_RWSTD_EXPORT void*
88__rw_memset (void *dst, int c, _RWSTD_SIZE_T nbytes)
89{
90 _RWSTD_ASSERT (0 == nbytes || dst);
91
92 for (char *tmp = _RWSTD_STATIC_CAST (char*, dst); nbytes; ++tmp, --nbytes)
93 *tmp = c;
94
95 return dst;
96}
97
98
100__rw_memcmp (const void *s1, const void *s2, _RWSTD_SIZE_T nbytes)
101{
102 _RWSTD_ASSERT (0 == nbytes || s1 && s2);
103
104 typedef unsigned char UChar;
105
106 const UChar* cs1 = _RWSTD_STATIC_CAST (const UChar*, s1);
107 const UChar* cs2 = _RWSTD_STATIC_CAST (const UChar*, s2);
108
109 int result = 0;
110
111 for ( ; nbytes && !(result = *cs1 - *cs2); ++cs1, ++cs2, --nbytes);
112
113 return result;
114}
115
116
117_RWSTD_EXPORT _RWSTD_SIZE_T
118__rw_strlen (const char *str)
119{
120 const char* const begin = str;
121
122 for (; *str; ++str);
123
124 return _RWSTD_STATIC_CAST (_RWSTD_SIZE_T, str - begin);
125}
126
127
128#ifndef _RWSTD_NO_WCHAR_T
129
130_RWSTD_EXPORT wchar_t*
131__rw_wmemcpy (wchar_t *dst, const wchar_t *src, _RWSTD_SIZE_T nwchars)
132{
133 _RWSTD_ASSERT (0 == nwchars || dst && src);
134
135 for (wchar_t *tmp = dst; nwchars; --nwchars)
136 *tmp++ = *src++;
137
138 return dst;
139}
140
141
142_RWSTD_EXPORT wchar_t*
143__rw_wmemmove (wchar_t *dst, const wchar_t *src, _RWSTD_SIZE_T nwchars)
144{
145 _RWSTD_ASSERT (0 == nwchars || dst && src);
146
147 if (dst < src) {
148 while (nwchars--)
149 *dst++ = *src++;
150 }
151 else {
152 for (dst += nwchars, src += nwchars; nwchars--; )
153 *--dst = *--src;
154 }
155
156 return dst;
157}
158
159
160_RWSTD_EXPORT const wchar_t*
161__rw_wmemchr (const wchar_t *src, wchar_t wc, _RWSTD_SIZE_T nwchars)
162{
163 _RWSTD_ASSERT (0 == nwchars || src);
164
165 while (nwchars > 0 && *src != wc) {
166 ++src;
167 --nwchars;
168 }
169
170 return nwchars ? src : 0;
171}
172
173
174_RWSTD_EXPORT wchar_t*
175__rw_wmemset (wchar_t *dst, wchar_t wc, _RWSTD_SIZE_T nwchars)
176{
177 _RWSTD_ASSERT (0 == nwchars || dst);
178
179 for (wchar_t *tmp = dst; nwchars; ++tmp, --nwchars)
180 *tmp = wc;
181
182 return dst;
183}
184
185
187__rw_wmemcmp (const wchar_t *s1, const wchar_t *s2, _RWSTD_SIZE_T nwchars)
188{
189 _RWSTD_ASSERT (0 == nwchars || s1 && s2);
190
191 int result = 0;
192
193 for ( ; nwchars && !(result = *s1 - *s2); ++s1, ++s2, --nwchars);
194
195 return result;
196}
197
198
199_RWSTD_EXPORT _RWSTD_SIZE_T
200__rw_wcslen (const wchar_t *wstr)
201{
202 _RWSTD_ASSERT (0 != wstr);
203
204 const wchar_t* const begin = wstr;
205
206 for (; *wstr; ++wstr);
207
208 return _RWSTD_STATIC_CAST (_RWSTD_SIZE_T, wstr - begin);
209}
210
211#endif // _RWSTD_NO_WCHAR_T
212
213} // namespace __rw
#define s1
Definition 17.names.cpp:242
#define s2
Definition 17.names.cpp:268
#define c
Definition 17.names.cpp:111
#define tmp
Definition 17.names.cpp:553
volatile int result
#define _RWSTD_EXPORT
Definition _defs.h:485
#define _RWSTD_STATIC_CAST(T, x)
Definition _defs.h:534
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108
const char * str
Definition exec.cpp:170
unsigned char UChar
Definition collate.cpp:122