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