OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@198 47198e57-cb75-475f-84c4-a814cd...
[mimic/MiMicSDK.git] / lib / src / include / NyLPC_stdlib.h
1 /*********************************************************************************\r
2  * PROJECT: MiMic\r
3  * --------------------------------------------------------------------------------\r
4  *\r
5  * This file is part of MiMic\r
6  * Copyright (C)2011 Ryo Iizuka\r
7  *\r
8  * MiMic is free software: you can redistribute it and/or modify\r
9  * it under the terms of the GNU Lesser General Public License as published\r
10  * by the Free Software Foundation, either version 3 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU Lesser General Public License\r
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
20  *\r
21  * For further information please contact.\r
22  *      http://nyatla.jp/\r
23  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
24  *\r
25  *********************************************************************************/\r
26 /**\r
27  * @file\r
28  * このファイルは、ルートモジュールにあるヘッダファイルを集積します。\r
29  * 基本的な型の定義も行います。\r
30  */\r
31 #ifndef NyLPC_stdlib_h\r
32 #define NyLPC_stdlib_h\r
33 #include "NyLPC_config.h"\r
34 \r
35 #include <string.h>\r
36 \r
37 #ifdef __cplusplus\r
38 extern "C" {\r
39 #endif /* __cplusplus */\r
40 \r
41 /**********************************************************************\r
42  *\r
43  * ASSERT/ABORT\r
44  *\r
45  **********************************************************************/\r
46 \r
47 /**\r
48  * 引数チェック専用のASSERT構文です。\r
49  * デバック時のみ有効です。\r
50  */\r
51 #define NyLPC_ArgAssert(e) if(!(e)){NyLPC_assertHook(NULL,-1);};\r
52 \r
53 /**\r
54  * ASSERTマクロです。\r
55  * デバック時のみ有効です。\r
56  */\r
57 #define NyLPC_Assert(e) if(!(e)){NyLPC_assertHook(NULL,-1);};\r
58 \r
59 /**\r
60  * デバック用のフックマクロです。\r
61  * デバック時のみ有効です。\r
62  */\r
63 #define NyAR_DebugHook() {NyLPC_debugHook(__FILE__,__LINE__);};\r
64 \r
65 /**\r
66  * Abortマクロです。プログラムを異常終了するときのエントリポイントになります。\r
67  * デバック時/リリース時のどちらでも有効です。\r
68  */\r
69 #define NyLPC_Abort() {NyLPC_abortHook(__FILE__,__LINE__);};    //もうだめ\r
70 \r
71 /**\r
72  * Abortマクロです。eが偽の時に、異常終了します。\r
73  * デバック時/リリース時のどちらでも有効です。\r
74  * @param e\r
75  * 評価式です。\r
76  */\r
77 #define NyLPC_AbortIfNot(e) if(!(e)){NyLPC_abortHook(__FILE__,__LINE__);};\r
78 \r
79 /**\r
80  * 警告表示用のマクロです。デバックに使います。\r
81  * デバック時のみ有効です。\r
82  */\r
83 #define NyLPC_Warning() {NyLPC_debugHook(__FILE__,__LINE__);};\r
84 \r
85 /**\r
86  * 警告表示用のマクロです。eが偽の時に、警告を出します。\r
87  * デバック時のみ有効です。\r
88  * @param e\r
89  * 評価式です。\r
90  */\r
91 #define NyLPC_WarningIfNot(e) if(!(e)){NyLPC_debugHook(__FILE__,__LINE__);};\r
92 \r
93 /*\r
94  * トレースマクロです。デバックに使います。\r
95  * 内部変数に、最後にコールされたファイル名と、行番号を保存します。\r
96  * デバック時のみ有効です。\r
97  */\r
98 #define NyLPC_Trace() {NyLPC_debugHook(__FILE__,__LINE__);};\r
99 \r
100 /**\r
101  * アサートマクロが使う関数です。\r
102  * @param m\r
103  * __FILE__を指定します。\r
104  * @param l\r
105  * __LINE__を指定します。\r
106  */\r
107 void NyLPC_assertHook(const char* m,int l);\r
108  /**\r
109   * Abortマクロが使う関数です。\r
110   * @param m\r
111   * __FILE__を指定します。\r
112   * @param l\r
113   * __LINE__を指定します。\r
114   */\r
115 void NyLPC_abortHook(const char* m,int l);\r
116 /**\r
117  * Debugマクロが使う関数です。\r
118  * @param m\r
119  * __FILE__を指定します。\r
120  * @param l\r
121  * __LINE__を指定します。\r
122  */\r
123 void NyLPC_debugHook(const char* m,int l);\r
124 \r
125 /**\r
126  * デバック用のステータス変数です。\r
127  * アサートを検出した回数を保存します。\r
128  */\r
129 extern unsigned int NyLPC_assert_counter;\r
130 /**\r
131  * デバック用のステータス変数です。\r
132  * アサートを検出した回数を保存します。\r
133  */\r
134 extern unsigned int NyLPC_abort_counter;\r
135 /**\r
136  * デバック用のステータス変数です。\r
137  * アサートを検出した回数を保存します。\r
138  */\r
139 extern unsigned int NyLPC_debug_counter;\r
140 \r
141 /**\r
142  * GOTO方式のエラーハンドラを記述するためのマクロです。\r
143  * @param l\r
144  * 指定ラベルへジャンプします。\r
145  */\r
146 #define NyLPC_OnErrorGoto(l) goto l\r
147 \r
148 \r
149 \r
150 /**********************************************************************\r
151  *\r
152  * Basic type\r
153  *\r
154  **********************************************************************/\r
155 \r
156 /**\r
157  * 真偽値型です。\r
158  */\r
159 typedef long NyLPC_TBool;\r
160 \r
161 /**\r
162  * TRUEを表します。この値は、ifで評価したときに真を返すことを保障します。\r
163  */\r
164 #define NyLPC_TBool_TRUE (0==0)\r
165 /**\r
166  * FALSEを表します。この値は、ifで評価したときに偽を返すことを保障します。\r
167  */\r
168 #define NyLPC_TBool_FALSE (0!=0)\r
169 \r
170 /**\r
171  * ウェーイを表します。この値は、NyLPC_TBool_FALSEと同じです。\r
172  */\r
173 #define NyLPC_TBool_VEII NyLPC_TBool_FALSE\r
174 \r
175 \r
176 \r
177 /**\r
178  * 8bit長のバイト文字の型です。\r
179  */\r
180 typedef char NyLPC_TChar;\r
181 /**\r
182  * 符号有り8bit型です。\r
183  */\r
184 typedef char NyLPC_TInt8;\r
185 /**\r
186  * 符号有り16bit型です。\r
187  */\r
188 typedef short NyLPC_TInt16;\r
189 /**\r
190  * 符号有り32bit型です。\r
191  */\r
192 typedef long NyLPC_TInt32;\r
193 \r
194 //----------------------------------------------------------------------\r
195 // NyLPC_TUInt8\r
196 //----------------------------------------------------------------------\r
197 \r
198 /**\r
199  * 符号無し8bit型です。\r
200  */\r
201 typedef unsigned char NyLPC_TUInt8;\r
202 \r
203 /**\r
204  * ビット操作関数です。bfのビット番号bに、1をセットします。\r
205  * @bf\r
206  * 操作対象の変数です。\r
207  * @b\r
208  * 操作するビット番号です。\r
209  */\r
210 #define NyLPC_TUInt8_setBit(bf,b) NyLPC_TUInt32_setBit(bf,b)\r
211 /**\r
212  * ビット操作関数です。bfのビット番号bに、0をセットします。\r
213  * @bf\r
214  * 操作対象の変数です。\r
215  * @b\r
216  * 操作するビット番号です。\r
217  */\r
218 #define NyLPC_TUInt8_unsetBit(bf,b) NyLPC_TUInt32_unsetBit(bf,b)\r
219 /**\r
220  * ビット判定関数です。bfのビット番号bが1であるかを確認します。\r
221  * @bf\r
222  * 判定する変数です。\r
223  * @b\r
224  * 判定するビット番号です。\r
225  * @return\r
226  * ビットが1なら真を返します。\r
227  */\r
228 #define NyLPC_TUInt8_isBitOn(bf,b) NyLPC_TUInt32_isBitOn(bf,b)\r
229 \r
230 /**\r
231  * 8bit長のTRUE値です。\r
232  */\r
233 #define NyLPC_TUInt8_TRUE NyLPC_TBool_TRUE\r
234 /**\r
235  * 8bit長のFALSE値です。\r
236  */\r
237 #define NyLPC_TUInt8_FALSE NyLPC_TBool_FALSE\r
238 /**\r
239  * 8bit長のFALSEをNyLPC_TBoolへ変換します。\r
240  * @param a\r
241  * 変換する変数です。\r
242  * @return\r
243  * 変換した値です。\r
244  */\r
245 #define NyLPC_TUInt8_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
246 \r
247 //----------------------------------------------------------------------\r
248 // NyLPC_TUInt16\r
249 //----------------------------------------------------------------------\r
250 \r
251 /**\r
252  * 符号無し16bit型です。\r
253  */\r
254 typedef unsigned short NyLPC_TUInt16;\r
255 \r
256 /**\r
257  * INTMAX\r
258  */\r
259 #define NyLPC_TUInt16_MAX 0xFFFF\r
260 \r
261 /**\r
262  * ビット操作関数です。bfのビット番号bに、1をセットします。\r
263  * @bf\r
264  * 操作対象の変数です。\r
265  * @b\r
266  * 操作するビット番号です。\r
267  */\r
268 #define NyLPC_TUInt16_setBit(bf,b) NyLPC_TUInt32_setBit(bf,b)\r
269 /**\r
270  * ビット操作関数です。bfのビット番号bに、0をセットします。\r
271  * @bf\r
272  * 操作対象の変数です。\r
273  * @b\r
274  * 操作するビット番号です。\r
275  */\r
276 #define NyLPC_TUInt16_unsetBit(bf,b) NyLPC_TUInt32_unsetBit(bf,b)\r
277 /**\r
278  * ビット判定関数です。bfのビット番号bが1であるかを確認します。\r
279  * @bf\r
280  * 判定する変数です。\r
281  * @b\r
282  * 判定するビット番号です。\r
283  * @return\r
284  * ビットが1なら真を返します。\r
285  */\r
286 #define NyLPC_TUInt16_isBitOn(bf,b) NyLPC_TUInt32_isBitOn(bf,b)\r
287 \r
288 /**\r
289  * バイトオーダーを入れ替えます。\r
290  * @param n\r
291  * 変換もとの変数です。\r
292  * @return\r
293  * 入れ替えた16ビット値を返します。\r
294  *\r
295  */\r
296 #define NyLPC_TUInt16_BSWAP(n) (((((NyLPC_TUInt16)(n))<< 8)&0xff00)|((((NyLPC_TUInt16)(n))>> 8)&0x00ff))\r
297 \r
298 \r
299 \r
300 /**\r
301  * バイトオーダーを入れ替えます。\r
302  * NyLPC_TUInt16_BSWAPとの違いは、関数であることです。\r
303  * @param n\r
304  * 変換もとの変数です。\r
305  * @return\r
306  * 入れ替えた16ビット値を返します。\r
307  */\r
308 NyLPC_TUInt16 NyLPC_TUInt16_bswap(NyLPC_TUInt16 n);\r
309 /**\r
310  * 16bit長のTRUE値です。\r
311  */\r
312 #define NyLPC_TUInt16_TRUE NyLPC_TBool_TRUE\r
313 /**\r
314  * 16bit長のFALSE値です。\r
315  */\r
316 #define NyLPC_TUInt16_FALSE NyLPC_TBool_FALSE\r
317 /**\r
318  * 16bit長のFALSEをNyLPC_TBoolへ変換します。\r
319  * @param a\r
320  * 変換する変数です。\r
321  * @return\r
322  * 変換した値です。\r
323  */\r
324 #define NyLPC_TUInt16_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
325 \r
326 //----------------------------------------------------------------------\r
327 \r
328 /**\r
329  * 符号無し32bit型です。\r
330  */\r
331 typedef unsigned long NyLPC_TUInt32;\r
332 /**\r
333  * ビット操作関数です。bfのビットパターンbに、1をセットします。\r
334  * @bf\r
335  * 操作対象の変数です。\r
336  * @b\r
337  * 操作するビットパターンです。\r
338  */\r
339 #define NyLPC_TUInt32_setBit(bf,b) bf=(bf|b)\r
340 /**\r
341  * ビット操作関数です。bfのビットパターンbに、0をセットします。\r
342  * @bf\r
343  * 操作対象の変数です。\r
344  * @b\r
345  * 操作するビットパターンです。\r
346  */\r
347 #define NyLPC_TUInt32_unsetBit(bf,b) bf=(bf&(~b))\r
348 /**\r
349  * ビット判定関数です。bfのビットパターンbが1であるかを確認します。\r
350  * @bf\r
351  * 判定する変数です。\r
352  * @b\r
353  * 判定するビットパターンです。\r
354  * @return\r
355  * ビットが1なら真を返します。\r
356  */\r
357 #define NyLPC_TUInt32_isBitOn(bf,b) ((bf&b)==(b))\r
358 \r
359 /**\r
360  * バイトオーダーを入れ替えます。\r
361  * @param n\r
362  * 変換もとの変数です。\r
363  * @return\r
364  * 入れ替えた32ビット値を返します。\r
365  *\r
366  */\r
367 #define NyLPC_TUInt32_BSWAP(n) (((((NyLPC_TUInt32)(n))<<24)&0xff000000)|((((NyLPC_TUInt32)(n))<< 8)&0x00ff0000)|((((NyLPC_TUInt32)(n))>> 8)&0x0000ff00)|((((NyLPC_TUInt32)(n))>>24)&0x000000ff))\r
368 /**\r
369  * バイトオーダーを入れ替えます。\r
370  * NyLPC_TUInt32_BSWAPとの違いは、関数であることです。\r
371  * @param n\r
372  * 変換もとの変数です。\r
373  * @return\r
374  * 入れ替えた32ビット値を返します。\r
375  */\r
376 NyLPC_TUInt32 NyLPC_TUInt32_bswap(NyLPC_TUInt32 n);\r
377 \r
378 /**\r
379  * 32bit長のTRUE値です。\r
380  */\r
381 #define NyLPC_TUInt32_TRUE NyLPC_TBool_TRUE\r
382 /**\r
383  * 32bit長のFALSE値です。\r
384  */\r
385 #define NyLPC_TUInt32_FALSE NyLPC_TBool_FALSE\r
386 /**\r
387  * 32bit長のFALSEをNyLPC_TBoolへ変換します。\r
388  * @param a\r
389  * 変換する変数です。\r
390  * @return\r
391  * 変換した値です。\r
392  */\r
393 #define NyLPC_TUInt32_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
394 \r
395 \r
396 //----------------------------------------------------------------------\r
397 \r
398 /**\r
399  * 長さ付TChar配列の構造体です。\r
400  *\r
401  */\r
402 struct NyLPC_TCharArrayPtr\r
403 {\r
404         /** 配列のポインタ */\r
405         NyLPC_TChar* ptr;\r
406         /** 配列の長さ */\r
407         NyLPC_TUInt16 len;\r
408 };\r
409 /**\r
410  * ptrの位置をi_seekだけ進行します。\r
411  * @param i_struct\r
412  * 操作する構造体\r
413  * @param i_seek\r
414  * シークするバイト長\r
415  */\r
416 NyLPC_TBool NyLPC_TCharArrayPtr_seek(struct NyLPC_TCharArrayPtr* i_struct,NyLPC_TUInt16 i_seek);\r
417 \r
418 \r
419 /**\r
420  * 長さ付TUInt32配列の構造体です。\r
421  *\r
422  */\r
423 struct NyLPC_TUInt32ArrayPtr\r
424 {\r
425         /** 配列のポインタ */\r
426         NyLPC_TUInt32* ptr;\r
427         /** 要素数 */\r
428         NyLPC_TUInt16 len;\r
429 };\r
430 /**\r
431  * ptrの位置をi_seekだけ進行します。\r
432  * 進行すると、len要素がi_seekだけ減少します。\r
433  * @param i_struct\r
434  * 操作する構造体\r
435  * @param i_seek\r
436  * シークする要素長\r
437  */\r
438 NyLPC_TBool NyLPC_TUInt32ArrayPtr_seek(struct NyLPC_TUInt32ArrayPtr* i_struct,NyLPC_TUInt16 i_seek);\r
439 /**\r
440  * 構造体に、参照するバッファの初期位置とサイズをセットします。\r
441  * セットしたバッファは、前方シークの可能な書き込みバッファとして使用できます。\r
442  */\r
443 void NyLPC_TUInt32ArrayPtr_setBuf(struct NyLPC_TUInt32ArrayPtr* i_struct,NyLPC_TUInt32* i_ptr,NyLPC_TUInt16 i_len);\r
444 \r
445 \r
446 /**\r
447  * TextとIDのテーブルです。\r
448  */\r
449 struct NyLPC_TTextIdTbl{\r
450         const char* n;\r
451         NyLPC_TUInt8 id;\r
452 };\r
453 \r
454 /**\r
455  * テーブルを検索してマッチしたIDを返します。テーブルのnがNULLの要素で愁嘆します。\r
456  */\r
457 NyLPC_TUInt8 NyLPC_TTextIdTbl_getMatchId(const NyLPC_TChar* i_str,const struct NyLPC_TTextIdTbl i_tbl[]);\r
458 \r
459 /*********************************************************************************\r
460  * standard function\r
461  *********************************************************************************/\r
462 void NyLPC_itoa(int i_n,char* o_out,int i_digit);\r
463 void NyLPC_reverse(char* s);\r
464 \r
465 \r
466 \r
467 \r
468 #ifdef __cplusplus\r
469 }\r
470 #endif /* __cplusplus */\r
471 \r
472 \r
473 \r
474 /*********************************************************************************\r
475  *\r
476  *********************************************************************************/\r
477 \r
478 #include "../NyLPC_cMiMicEnv.h"\r
479 #include "../NyLPC_cRingBuffer.h"\r
480 #include "../NyLPC_cPtrTbl.h"\r
481 #include "../NyLPC_cFifoBuffer.h"\r
482 #include "../NyLPC_cPtrStream.h"\r
483 #include "../NyLPC_cStr.h"\r
484 \r
485 \r
486 #include "../os/NyLPC_cStopwatch.h"\r
487 #include "../os/NyLPC_cMutex.h"\r
488 #include "../os/NyLPC_cThread.h"\r
489 #include "../os/NyLPC_cSemaphore.h"\r
490 #include "../os/NyLPC_cIsr.h"\r
491 \r
492 \r
493 \r
494 #endif\r