STDX.C
[目次 | 関数 | マクロ]
1|/**************************************************************************
2|* 1. <<< 標準ライブラリ (StdX) >>>
3|***************************************************************************/
4|#define STDX_FOR_COMPILE
5|#define STDLIBS_INCLUDE
6|#define STDLIBS_INCLUDE_STDIO_H
7|#define STDLIBS_INCLUDE_STDARG_H
8|
9|#include <stdx.ah>
10|
11|
12|
13|
14|
15|/**************************************************************************
16|* 2. <<< [StdX_strcpy] 文字列をコピーする >>>
17|*【引数】
18|* ・char* dst; コピー格納先の文字列領域の先頭アドレス
19|* ・char* src; コピー元の文字列
20|* ・char* 返り値; dst(格納された文字列の先頭アドレス)
21|***************************************************************************/
22|char* StdX_strcpy( char* dst, const char* src )
23|{
24| char* p = dst;
25|
26| for (;;) {
27| *p = *src;
28| if ( *p == '\0' ) return dst;
29| p++; src++;
30| }
31|}
32|
33|
34|/**************************************************************************
35|* 3. <<< [StdX_strlen] 文字列の長さを返す >>>
36|*【引数】
37|* ・char* s; 長さを調べる文字列
38|* ・unsigned 返り値; 文字列 s の長さ [byte]
39|***************************************************************************/
40|unsigned StdX_strlen( const char* s )
41|{
42| int len = 0;
43|
44| while ( *s++ != '\0' ) len++;
45|
46| return len;
47|}
48|
49|
50|/**************************************************************************
51|* 4. <<< [StdX_strchr] 文字列中の文字を検索する >>>
52|*【引数】
53|* ・char* s; 文字列
54|* ・int c; 検索する文字
55|* ・char* 返り値; 見つかった文字の文字列中のアドレス、or NULL
56|***************************************************************************/
57|char* StdX_strchr( const char* s, int c )
58|{
59| for (;;) {
60| if ( *s == c ) return (char*)s;
61| if ( *s == '\0' ) return (char*)NULL;
62| s++;
63| }
64|}
65|
66|
67|/**************************************************************************
68|* 5. <<< [StdX_strcmp] 文字列を比較する >>>
69|*【引数】
70|* ・char* s 長さを調べる文字列
71|* ・int 返り値 文字列 s の長さ [byte]
72|***************************************************************************/
73|int StdX_strcmp( const char* s, const char* ss )
74|{
75| while ( *s != '\0' && *ss != '\0' && *s == *ss ) { s++; ss++; }
76|
77| return *s - *ss;
78|}
79|
80|
81|/***********************************************************************
82|* 6. <<< [StdX_stricmp] 大文字小文字を区別しないで比較する >>>
83|************************************************************************/
84|int StdX_stricmp( const char* s, const char* ss )
85|{
86| while ( *s != '\0' && *ss != '\0' &&
87| StdX_toupper(*s) == StdX_toupper(*ss) )
88| { s++; ss++; }
89|
90| return *s - *ss;
91|}
92|
93|/**************************************************************************
94|* 7. <<< [StdX_memcpy] メモリ・コピーする >>>
95|*【引数】
96|* ・void* dec; コピー先の先頭のアドレス
97|* ・void* src; コピー元の先頭のアドレス
98|* ・size_t n; コピーする長さ[byte]
99|* ・void* 返り値; dec と同じ
100|***************************************************************************/
101|void* StdX_memcpy( void* _dec, const void* _src, size_t n )
102|{
103| char* dec = (char*)_dec;
104| const char* src = (const char*)_src;
105|
106| while ( n-- > 0 )
107| *dec++ = *src++;
108| return _dec;
109|}
110|
111|
112|/**************************************************************************
113|* 8. <<< [StdX_memmove] メモリ・コピーする(重なり可能) >>>
114|*【引数】
115|* ・void* dec; コピー先の先頭のアドレス
116|* ・void* src; コピー元の先頭のアドレス
117|* ・size_t n; コピーする長さ[byte]
118|* ・void* 返り値; dec と同じ
119|***************************************************************************/
120|void* StdX_memmove( void* _dec, const void* _src, size_t n )
121|{
122| char* dec = (char*)_dec;
123| const char* src = (const char*)_src;
124|
125| if ( src > dec ) {
126| while ( n-- > 0 )
127| *dec++ = *src++;
128| }
129| else {
130| dec += n; src += n;
131| while ( n-- > 0 )
132| *--dec = *--src;
133| }
134| return _dec;
135|}
136|
137|
138|/**************************************************************************
139|* 9. <<< [StdX_memset] 同じ文字を連続して埋め込む >>>
140|*【引数】
141|* ・char* dec 埋め込み先の先頭のアドレス
142|* ・int ch 埋め込む文字
143|* ・unsigned n 埋め込む文字数[byte]
144|***************************************************************************/
145|void* StdX_memset( void* _dec, int ch, unsigned n )
146|{
147| char* dec = (char*)_dec;
148|
149| while ( n-- > 0 )
150| *dec ++ = ch;
151| return dec;
152|}
153|
154|
155|
156|/**************************************************************************
157|* 10. <<< [StdX_memcmp] メモリ内容を比較する >>>
158|***************************************************************************/
159|int StdX_memcmp( const void* a, const void* b, size_t size )
160|{
161| const char* ap = (const char*)a;
162| const char* ap_over = ap + size;
163| const char* bp = (const char*)b;
164|
165| while ( ap < ap_over ) {
166| if ( *ap != *bp ) return *ap - *bp;
167| ap ++; bp++;
168| }
169|
170| return 0;
171|}
172|
173|
174|
175|/**************************************************************************
176|* 11. <<< [StdX_sprintf] 書式に従って文字列を作成する(1) >>>
177|*【引数】
178|* ・char* s; 文字列を格納するアドレス
179|* ・char* fmt; 書式(全て対応していません)
180|* ・ ...; パラメータ
181|* ・int 返り値; 格納した文字列のバイト数('\0'文字を除く)
182|***************************************************************************/
183|#if defined(USES_STDX_STDARG)
184|int StdX_sprintf( char* s, const char* fmt, ... )
185|{
186| va_list va;
187| int ret;
188|
189| va_start( va, fmt );
190| ret = vsprintf( s, fmt, va );
191| va_end( va );
192|
193| return ret;
194|}
195|#endif
196|
197|
198|
199|/**************************************************************************
200|* 12. <<< [StdX_vsprintf] 書式に従って文字列を作成する(2) >>>
201|*【引数】
202|* ・char* s; 文字列を格納するアドレス
203|* ・char* fmt; 書式(全て対応していません)
204|* ・va_list va; パラメータ・リスト
205|* ・int 返り値; 格納した文字列のバイト数('\0'文字を除く)
206|***************************************************************************/
207|#if defined(USES_STDX_STDARG)
208|int StdX_vsprintf( char* s, const char* fmt, va_list va )
209|{
210| char* p = s;
211| char* pp;
212| int c;
213| int bZeroPad; /* 左を0で埋める */
214| int keta; /* 表示桁数 */
215|
216| while ( *fmt != '\0' ) {
217| c = *fmt;
218|
219| /* % 指定でない場合 */
220| if ( c != '%' ) {
221| *p = c;
222| p++; fmt ++;
223| }
224|
225| /* % 指定の場合 */
226| else {
227| fmt++; c = *fmt;
228| keta = 1;
229|
230| /* "%08X" などの "08" を bZeroPad, keta に設定する */
231| if ( c == '0' ) { bZeroPad = 1; fmt++; c = *fmt; }
232| else bZeroPad = 0;
233| if ( c >= '1' && c <= '9' ) { keta = c - '0'; fmt++; c = *fmt; }
234|
235| /* 型に従って文字列を作成する */
236| switch ( c ) {
237|
238| /*---- [%c] ----*/
239| case 'c':
240| p[0] = va_arg(va,int);
241| p[1] = '\0';
242| break;
243|
244| /*---- [%d] ----*/
245| case 'd':
246| _itoa( va_arg(va,int), p, 10 );
247| break;
248|
249| /*---- [%s] ----*/
250| case 's':
251| StdX_strcpy( p, va_arg(va,char*) );
252| break;
253|
254| /*---- [%X] ----*/
255| case 'X':
256| _utoa( va_arg(va,int), p, 16 );
257| break;
258|
259| /*---- [%x] ----*/
260| case 'x':
261| _utoa( va_arg(va,int), p, 16 );
262| for ( pp = p; *pp != '\0'; pp++ ) {
263| if ( *pp >= 'A' && *pp <= 'F' )
264| *pp += 0x20;
265| }
266| break;
267|
268| /*---- [%p] ----*/
269| case 'p':
270| _utoa( va_arg(va,int), p, 16 );
271| keta = 8; bZeroPad = 1;
272| break;
273|
274| default:
275| /*ERRORS_NOT_SUPPORT();*/
276| break;
277| }
278|
279| /* 桁合わせ */
280| if ( keta == 1 ) {
281| p = StdX_strchr( p, '\0' );
282| }
283| else {
284| int n, plus;
285|
286| pp = StdX_strchr( p, '\0' );
287| n = pp - p;
288| plus = keta - n;
289|
290| if ( plus > 0 ) {
291| char* p1 = p + n; /* 元 */
292| char* p2 = p + keta; /* 先 */
293|
294| do {
295| *p2 = *p1; p2--; p1--;
296| } while ( p1 >= p );
297| StdX_memset( p, ( bZeroPad ? '0' : ' ' ), plus );
298| p += keta;
299| }
300| else
301| p = pp;
302| }
303|
304| /* 次のフォーマットへ */
305| fmt++;
306| }
307| }
308| *p = '\0';
309|
310| return p - s - 1;
311|}
312|#endif
313|
314|
315|
316|/***********************************************************************
317|* 13. <<< [StdX_rand,StdX_srand] 乱数発生 >>>
318|*【補足】
319|*・StdX_srand でジェネレータを初期化してから、StdX_rand で乱数を取得します。
320|*・StdX_srand の引数は、時刻(time_t 型)にするのが一般的です。
321|*・StdX_rand の返り値は、0〜STDX_RAND_MAX の整数です。
322|*・0〜nまでの整数の乱数を取得するには、StdX_rand の返り値を r として、
323|* r % (n+1) のように計算します。
324|*・参考:http://www.safety.genv.nagoya-u.ac.jp/hattori/program/program.htm
325|************************************************************************/
326|int StdX_rand_seed = 0;
327|
328|void StdX_srand( unsigned int seed )
329|{
330| StdX_rand_seed = (int)seed;
331|}
332|
333|int StdX_rand()
334|{
335| enum {
336| multi = 843314861,
337| add = 453816693
338| };
339|
340| int n;
341|
342| n = StdX_rand_seed;
343|
344| n = multi * n + add;
345|
346| if ( n < 0 )
347| n &= 0x7FFFFFFF;
348|
349| StdX_rand_seed = n;
350|
351| return StdX_rand_seed = n;
352|}
353|
354|
355|
356|
357|
358|/**************************************************************************
359|* 14. <<< GHS SDV ダミー関数 >>>
360|*【補足】
361|*・undefined リンクエラーを回避します。
362|***************************************************************************/
363|#if 0
364|#ifdef FOR_GHSSDV
365|void _exit()
366|{
367| #ifdef FOR_GHS
368| __asm("jal exit");
369| #endif
370| #ifdef FOR_GNU
371| asm("jal exit");
372| #endif
373| #ifndef FOR_GHS
374| #ifndef FOR_GNU
375| ASSERT(1);
376| #endif
377| #endif
378|}
379|void __gh_set_errno()
380|{
381| #ifndef NDEBUG
382| error();
383| #endif
384|}
385|void creat()
386|{
387| #ifndef NDEBUG
388| error();
389| #endif
390|}
391|int system(const char* s)
392|{
393| #ifndef NDEBUG
394| error();
395| #endif
396|}
397|void* memset( void* dec, int ch, size_t n )
398|{
399| return StdX_memset( dec,ch,n );
400|}
401|#endif
402|#endif
403|
404|