1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - include - ENV
3 File: env_system.h
4
5 Copyright 2005-2008 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2008-10-29#$
14 $Rev: 9144 $
15 $Author: okajima_manabu $
16 *---------------------------------------------------------------------------*/
17 #ifndef NITRO_ENV_SYSTEM_H_
18 #define NITRO_ENV_SYSTEM_H_
19
20 #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
21 #include <nitro.h>
22 #endif
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 //================================================================================
29 //---- limitation of name length
30 #define ENV_CLASS_NAME_MAX 64
31 #define ENV_MEMBER_NAME_MAX 64
32
33 //---- resource type mask
34 #define ENV_RESTYPE_RES_MASK 0xff
35 #define ENV_RESTYPE_OFFSET_MASK 0x100
36
37 //---- resource type
38 #define ENV_RESTYPE_NONE ((ENVType)0x0)
39 #define ENV_RESTYPE_STRING ((ENVType)0x1)
40 #define ENV_RESTYPE_BINARY ((ENVType)0x2)
41 #define ENV_RESTYPE_S8 ((ENVType)0x3)
42 #define ENV_RESTYPE_U8 ((ENVType)0x4)
43 #define ENV_RESTYPE_S16 ((ENVType)0x5)
44 #define ENV_RESTYPE_U16 ((ENVType)0x6)
45 #define ENV_RESTYPE_S32 ((ENVType)0x7)
46 #define ENV_RESTYPE_U32 ((ENVType)0x8)
47 #define ENV_RESTYPE_BOOL ((ENVType)0x9)
48 #define ENV_RESTYPE_S64 ((ENVType)0xa)
49 #define ENV_RESTYPE_U64 ((ENVType)0xb)
50 #define ENV_RESTYPE_OFFSET_STRING ((ENVType)(ENV_RESTYPE_OFFSET_MASK | ENV_RESTYPE_STRING)) // 0x101
51 #define ENV_RESTYPE_OFFSET_BINARY ((ENV_RESTYPE_OFFSET_MASK | ENV_RESTYPE_BINARY)) // 0x102
52 #define ENV_RESTYPE_OFFSET_S64 ((ENVType)(ENV_RESTYPE_OFFSET_MASK | ENV_RESTYPE_S64)) // 0x10a
53 #define ENV_RESTYPE_OFFSET_U64 ((ENVType)(ENV_RESTYPE_OFFSET_MASK | ENV_RESTYPE_U64)) // 0x10b
54
55 #define ENVi_RESTYPE_U64HALF 100 // For system. Don't use this.
56 #define ENVi_RESTYPE_LINK 255 // For resource array link. Don't use this.
57
58
59 #define ENVi_DUMMY_FOR_U64 "@DUMMY@"
60
61 //---- for description resource value
62 #define ENV_STRING(X) sizeof(X), ENV_RESTYPE_STRING, (void*)(X)
63 #define ENV_BINARY(X) sizeof(X)-1, ENV_RESTYPE_BINARY, (void*)(X)
64 #define ENV_S8(X) sizeof(s8), ENV_RESTYPE_S8, (void*)(X)
65 #define ENV_U8(X) sizeof(u8), ENV_RESTYPE_U8, (void*)(X)
66 #define ENV_S16(X) sizeof(s16), ENV_RESTYPE_S16, (void*)(X)
67 #define ENV_U16(X) sizeof(u16), ENV_RESTYPE_U16, (void*)(X)
68 #define ENV_S32(X) sizeof(s32), ENV_RESTYPE_S32, (void*)(X)
69 #define ENV_U32(X) sizeof(u32), ENV_RESTYPE_U32, (void*)(X)
70 #define ENV_BOOL(X) sizeof(BOOL), ENV_RESTYPE_BOOL, (void*)(X)
71
72 #define ENV_S64(X) sizeof(u32), ENV_RESTYPE_S64, (void*)((X)&0xffffffff), \
73 ENVi_DUMMY_FOR_U64, sizeof(u32), ENVi_RESTYPE_U64HALF, (void*)((X)>>32)
74
75 #define ENV_U64(X) sizeof(u32), ENV_RESTYPE_U64, (void*)((X)&0xffffffff), \
76 ENVi_DUMMY_FOR_U64, sizeof(u32), ENVi_RESTYPE_U64HALF, (void*)((X)>>32)
77
78 //---- start / end mark of resource set
79 #define ENV_RESOURCE_START { NULL, 0, ENVi_RESTYPE_LINK, NULL }
80 #define ENV_RESOURCE_END { NULL, 0, ENV_RESTYPE_NONE, NULL }
81
82 //---- max resource set to register
83 #define ENV_RESOURCE_SET_MAX 8
84
85 //---- typedef
86 typedef u16 ENVType;
87
88 //---- resource struct
89 typedef struct ENVResource ENVResource;
90 struct ENVResource
91 {
92 char *name;
93 u16 len;
94 ENVType type;
95 void *ptr;
96 };
97
98 //---- resource set
99 typedef struct ENVResourceSetLink ENVResourceSetLink;
100 struct ENVResourceSetLink
101 {
102 ENVResourceSetLink *next;
103 ENVResource *array;
104 };
105
106 //---- resource iterator
107 typedef struct ENVResourceIter ENVResourceIter;
108 struct ENVResourceIter
109 {
110 ENVResourceSetLink *link;
111 ENVResource *ptr;
112 int count;
113
114 void *supData;
115 };
116
117 //================================================================================
118 // Convinience functions
119 //================================================================================
ENV_GetResourceName(ENVResource * res)120 static inline char *ENV_GetResourceName(ENVResource * res)
121 {
122 return res->name;
123 }
ENV_GetResourceLen(ENVResource * res)124 static inline u16 ENV_GetResourceLen(ENVResource * res)
125 {
126 return res->len;
127 }
ENV_GetResourceType(ENVResource * res)128 static inline ENVType ENV_GetResourceType(ENVResource * res)
129 {
130 return res->type;
131 }
ENV_GetResourcePtr(ENVResource * res)132 static inline void *ENV_GetResourcePtr(ENVResource * res)
133 {
134 return res->ptr;
135 }
136
137 //================================================================================
138 // Initialize and Setting
139 //================================================================================
140 /*---------------------------------------------------------------------------*
141 Name: ENV_Init
142
143 Description: Initialize EnvSystem
144
145 Arguments: resSet : pointer to resource array
146
147 Returns: None.
148 *---------------------------------------------------------------------------*/
149 //extern void ENV_Init( ENVResource* resSet );
150 extern void ENV_Init(void);
151
152 /*---------------------------------------------------------------------------*
153 Name: ENV_AppendResourceSet
154
155 Description: append resource set
156
157 Arguments: resSet : pointer to resource array
158
159 Returns: None.
160 *---------------------------------------------------------------------------*/
161 extern void ENV_AppendResourceSet(ENVResource * resSet);
162
163 /*---------------------------------------------------------------------------*
164 Name: ENV_PrependResourceSet
165
166 Description: prepend resource set
167
168 Arguments: resSet : pointer to resource array
169
170 Returns: None.
171 *---------------------------------------------------------------------------*/
172 extern void ENV_PrependResourceSet(ENVResource * resSet);
173
174 /*---------------------------------------------------------------------------*
175 Name: ENV_InsertResourceSet
176
177 Description: insert resource set
178
179 Arguments: standardResSet : pointer to standard resource array
180 resSet : pointer to resource array
181
182 Returns: None.
183 *---------------------------------------------------------------------------*/
184 extern void ENV_InsertResourceSet(ENVResource * standardResSet, ENVResource * resSet);
185
186 /*---------------------------------------------------------------------------*
187 Name: ENV_SetResourceSet
188
189 Description: set new resource array
190
191 Arguments: resSet : pointer to resource set
192
193 Returns: None.
194 *---------------------------------------------------------------------------*/
195 extern void ENV_SetResourceSet(ENVResource * resSet);
196
197 /*---------------------------------------------------------------------------*
198 Name: ENV_GetResourceSetLinkHead
199
200 Description: get pointer to first resource set
201
202 Arguments: None.
203
204 Returns: pointer to first resource set link
205 *---------------------------------------------------------------------------*/
206 extern ENVResourceSetLink *ENV_GetResourceSetLinkHead(void);
207
208 /*---------------------------------------------------------------------------*
209 Name: ENV_GetNextResourceSet
210
211 Description: get next link resource link of specified resource link
212
213 Arguments: link: resource set link.
214
215 Returns: next resource set link
216 *---------------------------------------------------------------------------*/
217 extern ENVResourceSetLink *ENV_GetNextResourceSet(ENVResourceSetLink * link);
218
219 //================================================================================
220 // Class
221 //================================================================================
222 /*---------------------------------------------------------------------------*
223 Name: ENV_SetClass
224
225 Description: set current class.
226 this value is used to omit the class name
227 in getting the resource value.
228
229 Arguments: className : pointer to resource set
230
231 Returns: None.
232 *---------------------------------------------------------------------------*/
233 extern void ENV_SetClass(const char *className);
234
235 /*---------------------------------------------------------------------------*
236 Name: ENV_GetClass
237
238 Description: get current class.
239
240 Arguments: None.
241
242 Returns: pointer to current class name
243 *---------------------------------------------------------------------------*/
244 extern char *ENV_GetClass(void);
245
246 //================================================================================
247 // Search
248 //================================================================================
249 /*---------------------------------------------------------------------------*
250 Name: ENVi_SearchByMemberName
251
252 Description: search a resource by specifying member name.
253 use current class name.
254 get pointer to resource set.
255
256 Arguments: memberName : member name
257 resSetPtr : pointer to resource set
258
259 Returns: pointer to resource.
260 NULL if not found.
261 *---------------------------------------------------------------------------*/
262 extern ENVResource *ENVi_SearchByMemberName(const char *memberName, ENVResource ** resSetPtr);
263
264 /*---------------------------------------------------------------------------*
265 Name: ENV_SearchByMemberName
266
267 Description: search a resource by specifying member name.
268 use current class name.
269
270 Arguments: memberName : member name
271
272 Returns: pointer to specified resource.
273 NULL if not found.
274 *---------------------------------------------------------------------------*/
ENV_SearchByMemberName(const char * memberName)275 static inline ENVResource *ENV_SearchByMemberName(const char *memberName)
276 {
277 return ENVi_SearchByMemberName(memberName, NULL);
278 }
279
280 /*---------------------------------------------------------------------------*
281 Name: ENVi_SearchByFullName
282
283 Description: search a resource by specifying full name.
284 get pointer to resource set.
285
286 Arguments: fullName : name (full name)
287 resSetPtr : pointer to resource set
288
289 Returns: pointer to resource.
290 NULL if not found.
291 *---------------------------------------------------------------------------*/
292 extern ENVResource *ENVi_SearchByFullName(const char *fullName, ENVResource ** resSetPtr);
293
294 /*---------------------------------------------------------------------------*
295 Name: ENV_SearchByFullName
296
297 Description: search a resource by specifying full name.
298
299 Arguments: fullName : name (full name)
300
301 Returns: pointer to resource.
302 NULL if not found.
303 *---------------------------------------------------------------------------*/
ENV_SearchByFullName(const char * fullName)304 static inline ENVResource *ENV_SearchByFullName(const char *fullName)
305 {
306 return ENVi_SearchByFullName(fullName, NULL);
307 }
308
309 /*---------------------------------------------------------------------------*
310 Name: ENVi_Search
311
312 Description: search a resource by specifying name.
313 if name begins by ".", it will be added to current class
314 get pointer to resource set.
315
316 Arguments: name : full name or member name of class
317 resSetPtr : pointer to resource set
318
319 Returns: pointer to resource.
320 NULL if not found.
321 *---------------------------------------------------------------------------*/
322 extern ENVResource *ENVi_Search(const char *name, ENVResource ** resSetPtr);
323
324 /*---------------------------------------------------------------------------*
325 Name: ENV_Search
326
327 Description: search a resource by specifying name from all resoruce set.
328 if name begins by ".", it will be added to current class
329
330 Arguments: name (full name or member name of class)
331
332 Returns: pointer to resource.
333 NULL if not found.
334 *---------------------------------------------------------------------------*/
ENV_Search(const char * name)335 static inline ENVResource *ENV_Search(const char *name)
336 {
337 return ENVi_Search(name, NULL);
338 }
339
340
341 //================================================================================
342 // Get value
343 //================================================================================
344 //---- internal function
345 extern void *ENVi_GetPtrAndLength(const char *name, int *len);
346
347 /*---------------------------------------------------------------------------*
348 Name: ENV_GetPtr
349
350 Description: get resource pointer
351 data length is stored to len.
352
353 Arguments: name : full name or member name of class
354 len : pointer to length
355
356 Returns: pointer
357 *---------------------------------------------------------------------------*/
ENV_GetPtr(const char * name)358 static inline void *ENV_GetPtr(const char *name)
359 {
360 return ENVi_GetPtrAndLength(name, NULL);
361 }
362
363 /*---------------------------------------------------------------------------*
364 Name: ENV_GetType
365
366 Description: get resource type
367
368 Arguments: name : full name or member name of class
369
370 Returns: resource type. ENV_RESTYPE_xxx.
371 *---------------------------------------------------------------------------*/
372 extern ENVType ENV_GetType(const char *name);
373
374 /*---------------------------------------------------------------------------*
375 Name: ENV_GetSize
376
377 Description: get resource size
378
379 Arguments: name : full name or member name of class
380
381 Returns: resource size
382 *---------------------------------------------------------------------------*/
383 extern int ENV_GetSize(const char *name);
384
385 /*---------------------------------------------------------------------------*
386 Name: ENV_GetBelogingResourceSet
387
388 Description: get resource set which res is belong to
389
390 Arguments: res : pointer to resource
391
392 Returns: pointer to resoruce set
393 *---------------------------------------------------------------------------*/
394 extern ENVResource *ENV_GetBelongingResourceSet(ENVResource * res);
395
396 /*---------------------------------------------------------------------------*
397 Name: ENV_GetString / GetStringAndLength
398
399 Description: get pointer of specified member name.
400
401 Arguments: name : full name or member name of class
402 retPtr : pointer to pointer to resource string data
403 len : length of string data
404
405 Returns: TRUE if got. FALSE if never exist.
406 *---------------------------------------------------------------------------*/
ENV_GetString(const char * name,char ** retPtr)407 static inline BOOL ENV_GetString(const char *name, char **retPtr)
408 {
409 char *strPtr = (char *)ENV_GetPtr(name);
410 *retPtr = strPtr;
411 return (strPtr != NULL);
412 }
413
414 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetStringAndLength(const char * name,char ** retPtr,int * len)415 static inline BOOL ENV_GetStringAndLength(const char *name, char **retPtr, int *len)
416 {
417 char *strPtr = (char *)ENVi_GetPtrAndLength(name, len);
418 *retPtr = strPtr;
419 return (strPtr != NULL);
420 }
421
422 /*---------------------------------------------------------------------------*
423 Name: ENV_GetBinary / GetBinaryAndSize
424
425 Description: get pointer of specified member name.
426
427 Arguments: name : full name or member name of class
428 retPtr : pointer to pointer to resource binary data
429 size : length of binary data
430
431 Returns: TRUE if got. FALSE if never exist.
432 *---------------------------------------------------------------------------*/
ENV_GetBinary(const char * name,void ** retPtr)433 static inline BOOL ENV_GetBinary(const char *name, void **retPtr)
434 {
435 void *binPtr = (void *)ENV_GetPtr(name);
436 *retPtr = binPtr;
437 return (binPtr != NULL);
438 }
439
440 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetBinaryAndSize(const char * name,void ** retPtr,int * size)441 static inline BOOL ENV_GetBinaryAndSize(const char *name, void **retPtr, int *size)
442 {
443 void *binPtr = (void *)ENVi_GetPtrAndLength(name, size);
444 *retPtr = binPtr;
445 return (binPtr != NULL);
446 }
447
448 /*---------------------------------------------------------------------------*
449 Name: ENV_GetU8 / S8 / U16 / S16 / U32 / S32 / BOOL
450
451 Description: get value of the specified resource
452
453 Arguments: name : full name or member name of class
454 retVal : pointer to store resource value
455
456 Returns: TRUE if got. FALSE if never exist.
457 *---------------------------------------------------------------------------*/
ENV_GetU8(const char * name,u8 * retVal)458 static inline BOOL ENV_GetU8(const char *name, u8 *retVal)
459 {
460 int len;
461 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
462 if (!len)
463 {
464 return FALSE;
465 }
466 else
467 {
468 *retVal = (u8)val;
469 return TRUE;
470 }
471 }
472
473 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetS8(const char * name,s8 * retVal)474 static inline BOOL ENV_GetS8(const char *name, s8 *retVal)
475 {
476 int len;
477 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
478 if (!len)
479 {
480 return FALSE;
481 }
482 else
483 {
484 *retVal = (s8)val;
485 return TRUE;
486 }
487 }
488
489 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetU16(const char * name,u16 * retVal)490 static inline BOOL ENV_GetU16(const char *name, u16 *retVal)
491 {
492 int len;
493 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
494 if (!len)
495 {
496 return FALSE;
497 }
498 else
499 {
500 *retVal = (u16)val;
501 return TRUE;
502 }
503 }
504
505 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetS16(const char * name,s16 * retVal)506 static inline BOOL ENV_GetS16(const char *name, s16 *retVal)
507 {
508 int len;
509 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
510 if (!len)
511 {
512 return FALSE;
513 }
514 else
515 {
516 *retVal = (s16)val;
517 return TRUE;
518 }
519 }
520
521 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetU32(const char * name,u32 * retVal)522 static inline BOOL ENV_GetU32(const char *name, u32 *retVal)
523 {
524 int len;
525 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
526 if (!len)
527 {
528 return FALSE;
529 }
530 else
531 {
532 *retVal = (u32)val;
533 return TRUE;
534 }
535 }
536
537 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetS32(const char * name,s32 * retVal)538 static inline BOOL ENV_GetS32(const char *name, s32 *retVal)
539 {
540 int len;
541 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
542 if (!len)
543 {
544 return FALSE;
545 }
546 else
547 {
548 *retVal = (s32)val;
549 return TRUE;
550 }
551 }
552
553 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetBOOL(const char * name,BOOL * retVal)554 static inline BOOL ENV_GetBOOL(const char *name, BOOL *retVal)
555 {
556 int len;
557 u32 val = (u32)ENVi_GetPtrAndLength(name, &len);
558 if (!len)
559 {
560 return FALSE;
561 }
562 else
563 {
564 *retVal = (BOOL)(val ? TRUE : FALSE);
565 return TRUE;
566 }
567 }
568
569 /*---------------------------------------------------------------------------*
570 Name: ENV_GetU64 / S64
571
572 Description: get value of the specified resource
573
574 Arguments: name : full name or member name of class
575 retVal : pointer to store resource value
576
577 Returns: resource value
578 *---------------------------------------------------------------------------*/
579 extern BOOL ENV_GetU64(const char *name, u64 *retVal);
580
581 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENV_GetS64(const char * name,s64 * retVal)582 static inline BOOL ENV_GetS64(const char *name, s64 *retVal)
583 {
584 return ENV_GetU64(name, (u64 *)retVal);
585 }
586
587 //================================================================================
588 // search by using iterator
589 //================================================================================
590 /*---------------------------------------------------------------------------*
591 Name: ENV_InitIter
592
593 Description: Initialize iterator
594
595 Arguments: iter : pointer to iterator
596
597 Returns: None.
598 *---------------------------------------------------------------------------*/
599 extern void ENV_InitIter(ENVResourceIter * iter);
600
601 /*---------------------------------------------------------------------------*
602 Name: ENV_SearchByClass
603
604 Description: search resource which has specified class
605
606 Arguments: iter : pointer to iterator
607 className : class name
608
609 Returns: pointer to resource.
610 NULL if not found.
611 *---------------------------------------------------------------------------*/
612 extern ENVResource *ENV_SearchByClass(ENVResourceIter * iter, const char *className);
613
614 /*---------------------------------------------------------------------------*
615 Name: ENV_SearchByMember
616
617 Description: search resource which has specified member
618
619 Arguments: iter : pointer to iterator
620 memberName : member name
621
622 Returns: pointer to resource.
623 NULL if not found.
624 *---------------------------------------------------------------------------*/
625 extern ENVResource *ENV_SearchByMember(ENVResourceIter * iter, const char *memberName);
626
627 /*---------------------------------------------------------------------------*
628 Name: ENV_SearchByType
629
630 Description: search resource which is specified type
631
632 Arguments: iter : pointer to iterator
633 type : resource type
634
635 Returns: pointer to resource.
636 NULL if not found.
637 *---------------------------------------------------------------------------*/
638 extern ENVResource *ENV_SearchByType(ENVResourceIter * iter, ENVType type);
639
640 /*---------------------------------------------------------------------------*
641 Name: ENV_SearchByPartialName
642
643 Description: search resource whose name contains specified string
644
645 Arguments: iter : pointer to iterator
646 partialName : string to search in resource name
647
648 Returns: pointer to resource.
649 NULL if not found.
650 *---------------------------------------------------------------------------*/
651 extern ENVResource *ENV_SearchByPartialName(ENVResourceIter * iter, const char *partialName);
652
653 /*---------------------------------------------------------------------------*
654 Name: ENV_SetResourceSetArray
655
656 Description: insert all resoruce set
657
658 Arguments: array : pointer to resource array array
659
660 Returns: None.
661 *---------------------------------------------------------------------------*/
662 #define ENV_SetResoruceSetArray ENV_SetResourceSetArray
663 extern void ENV_SetResourceSetArray(ENVResource * array[]);
664
665 /*---------------------------------------------------------------------------*
666 Name: ENV_GetLastResourceSetFromIter
667
668 Description: get last resource set from iter
669
670 Arguments: iter : pointer to iterator
671
672 Returns: None.
673 *---------------------------------------------------------------------------*/
ENV_GetLastResourceSetFromIter(ENVResourceIter * iter)674 static inline ENVResource *ENV_GetLastResourceSetFromIter(ENVResourceIter * iter)
675 {
676 SDK_ASSERT(iter);
677 return (iter->link) ? iter->link->array : NULL;
678 }
679
680
681 #ifdef __cplusplus
682 } /* extern "C" */
683 #endif
684
685 /* NITRO_ENV_SYSTEM_H_ */
686 #endif
687