1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - ENV -
3 File: env_system.c
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-12-16#$
14 $Rev: 9661 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17
18 #include <nitro.h>
19
20 //---- all ENVResource
21 SDK_WEAK_SYMBOL ENVResource *resourceArray[] = { NULL };
22
23 //---- whether if initialized already
24 static BOOL sInitialized = FALSE;
25
26 //---- class name
27 static char sCurrentClass[ENV_CLASS_NAME_MAX + 1];
28
29 //---- top of resource set list
30 static ENVResourceSetLink *sResourceSetLinkHead = NULL;
31
32 //---- resource set list
33 static ENVResourceSetLink sResourceSetLink[ENV_RESOURCE_SET_MAX];
34
35
36 //---- static functions
37 static void ENVi_InitResourceSet(ENVResource * resSet);
38
39 static ENVResource *ENVi_SearchByMemberNameFromResourceSet(ENVResource * resSet,
40 const char *memberName);
41 static ENVResource *ENVi_SearchByFullNameFromResourceSet(ENVResource * resSet,
42 const char *fullName);
43
44 static void ENVi_SetNextSetForIter(ENVResourceIter * iter);
45
46
47
ENVi_ClearLinkList(void)48 static void ENVi_ClearLinkList(void)
49 {
50 //---- clear resource link list
51 MI_CpuClear8(&sResourceSetLink[0], sizeof(sResourceSetLink));
52
53 sResourceSetLinkHead = NULL;
54 }
55
ENVi_SearchBlankLink(void)56 static ENVResourceSetLink *ENVi_SearchBlankLink(void)
57 {
58 int n;
59 for (n = 0; n < ENV_RESOURCE_SET_MAX; n++)
60 {
61 if (!sResourceSetLink[n].array)
62 {
63 return &sResourceSetLink[n];
64 }
65 }
66 return NULL;
67 }
68
69 //================================================================================
70 // Initialize and Setting
71 //================================================================================
72 /*---------------------------------------------------------------------------*
73 Name: ENV_Init
74
75 Description: Initialize ENV library
76
77 Arguments: resSet : pointer to resource array
78
79 Returns: None.
80 *---------------------------------------------------------------------------*/
81 //void ENV_Init( ENVResource* resSet )
ENV_Init(void)82 void ENV_Init(void)
83 {
84 if (!sInitialized)
85 {
86 sInitialized = TRUE;
87
88 //---- clear resource link list
89 ENVi_ClearLinkList();
90
91 //(void)ENV_SetResourceSet( resSet );
92 ENV_SetResourceSetArray(resourceArray);
93 }
94 }
95
96 /*---------------------------------------------------------------------------*
97 Name: ENV_AppendResourceSet
98
99 Description: append resource set
100
101 Arguments: resSet : pointer to resource array
102
103 Returns: None.
104 *---------------------------------------------------------------------------*/
ENV_AppendResourceSet(ENVResource * resSet)105 void ENV_AppendResourceSet(ENVResource * resSet)
106 {
107 ENVResourceSetLink *p = sResourceSetLinkHead;
108 ENVResourceSetLink *lastp = NULL;
109 ENVResourceSetLink *blank = ENVi_SearchBlankLink();
110
111 //---- no space to register new set
112 if (!blank)
113 {
114 return;
115 }
116
117 //---- search last pointer
118 while (p)
119 {
120 lastp = p;
121 p = p->next;
122 }
123
124 blank->array = resSet;
125 blank->next = NULL;
126
127 //---- link
128 if (lastp)
129 {
130 lastp->next = blank;
131 }
132 else
133 {
134 sResourceSetLinkHead = blank;
135 }
136 }
137
138 /*---------------------------------------------------------------------------*
139 Name: ENV_PrependResourceSet
140
141 Description: prepend resource set
142
143 Arguments: resSet : pointer to resource array
144
145 Returns: None.
146 *---------------------------------------------------------------------------*/
ENV_PrependResourceSet(ENVResource * resSet)147 void ENV_PrependResourceSet(ENVResource * resSet)
148 {
149 ENV_InsertResourceSet(NULL, resSet);
150 }
151
152 /*---------------------------------------------------------------------------*
153 Name: ENV_InsertResourceSet
154
155 Description: insert resource set
156
157 Arguments: standardResSet : pointer to standard resource array
158 resSet : pointer to resource array
159
160 Returns: None.
161 *---------------------------------------------------------------------------*/
ENV_InsertResourceSet(ENVResource * standardResSet,ENVResource * resSet)162 void ENV_InsertResourceSet(ENVResource * standardResSet, ENVResource * resSet)
163 {
164 ENVResourceSetLink *blank = ENVi_SearchBlankLink();
165
166 //---- no space to register new set
167 if (!blank)
168 {
169 return;
170 }
171
172 blank->array = resSet;
173
174 if (!standardResSet)
175 {
176 blank->next = sResourceSetLinkHead;
177 sResourceSetLinkHead = blank;
178 }
179 else
180 {
181 ENVResourceSetLink *p = sResourceSetLinkHead;
182 ENVResourceSetLink *lastp = NULL;
183
184 //---- search standard resource set
185 while (p)
186 {
187 if (p->array == standardResSet)
188 {
189 break;
190 }
191
192 p = p->next;
193 }
194
195 //---- not found standard resource set
196 if (!p)
197 {
198 return;
199 }
200
201 blank->next = p->next;
202 p->next = blank;
203 }
204 }
205
206 /*---------------------------------------------------------------------------*
207 Name: ENV_SetResourceSet
208
209 Description: set resource set.
210 other sets before set will be expired
211
212 Arguments: resSet : pointer to resource array
213
214 Returns: None.
215 *---------------------------------------------------------------------------*/
ENV_SetResourceSet(ENVResource * resSet)216 void ENV_SetResourceSet(ENVResource * resSet)
217 {
218 //---- clear resource link list
219 ENVi_ClearLinkList();
220
221 ENV_AppendResourceSet(resSet);
222 }
223
224 /*---------------------------------------------------------------------------*
225 Name: ENV_GetResourceSetLinkHead
226
227 Description: get pointer to first resource link
228
229 Arguments: None.
230
231 Returns: pointer to first resource set link
232 *---------------------------------------------------------------------------*/
ENV_GetResourceSetLinkHead(void)233 ENVResourceSetLink *ENV_GetResourceSetLinkHead(void)
234 {
235 return sResourceSetLinkHead;
236 }
237
238 /*---------------------------------------------------------------------------*
239 Name: ENV_GetNextResourceSetLink
240
241 Description: get next resource link of specified resource link
242
243 Arguments: link: resource set link.
244
245 Returns: next resource set link
246 *---------------------------------------------------------------------------*/
ENV_GetNextResourceSet(ENVResourceSetLink * link)247 ENVResourceSetLink *ENV_GetNextResourceSet(ENVResourceSetLink * link)
248 {
249 SDK_ASSERT(link);
250 return link->next;
251 }
252
253
254 //================================================================================
255 // Class
256 //================================================================================
257 /*---------------------------------------------------------------------------*
258 Name: ENV_SetClass
259
260 Description: set current class.
261 this value is used to omit the class name
262 in getting the resource value.
263
264 Arguments: className : pointer to resource set
265
266 Returns: None.
267 *---------------------------------------------------------------------------*/
ENV_SetClass(const char * className)268 void ENV_SetClass(const char *className)
269 {
270 SDK_WARNING(STD_GetStringLength(className) <= ENV_CLASS_NAME_MAX, "class name is too long");
271
272 //---- remember class name
273 (void)STD_CopyLString(sCurrentClass, className, ENV_CLASS_NAME_MAX);
274 sCurrentClass[ENV_CLASS_NAME_MAX] = '\0';
275 }
276
277 /*---------------------------------------------------------------------------*
278 Name: ENV_GetClass
279
280 Description: get current class.
281
282 Arguments: None.
283
284 Returns: pointer to current class name
285 *---------------------------------------------------------------------------*/
ENV_GetClass(void)286 char *ENV_GetClass(void)
287 {
288 return sCurrentClass;
289 }
290
291 //================================================================================
292 // compare string
293 //================================================================================
294 /*---------------------------------------------------------------------------*
295 Name: ENVi_CheckIfSameClass
296
297 Description: check if resource belongs to the class
298
299 Arguments: name : resource name
300 className : class name
301
302 Returns: NULL if not belong.
303 return pointer to member name if belong.
304 *---------------------------------------------------------------------------*/
ENVi_CheckIfSameClass(char * name,char * className)305 static char *ENVi_CheckIfSameClass(char *name, char *className)
306 {
307 char *s1 = className;
308 char *s2 = name;
309
310 while (*s1)
311 {
312 if (*s1++ != *s2++)
313 {
314 return NULL;
315 }
316 }
317
318 //---- check if s2 reaches to the end of class name
319 if (*s2 != '.')
320 {
321 return NULL;
322 }
323
324 return s2 + 1;
325 }
326
327 /*---------------------------------------------------------------------------*
328 Name: ENVi_CheckIfSameMember
329
330 Description: check if resource is same to the specified member
331
332 Arguments: name : resource name
333 memberName : member name
334
335 Returns: NULL if not same
336 return pointer to member name if same
337 *---------------------------------------------------------------------------*/
ENVi_CheckIfSameMember(char * name,char * memberName)338 static char *ENVi_CheckIfSameMember(char *name, char *memberName)
339 {
340 char *s1 = memberName;
341 char *s2 = name;
342
343 //---- skip class
344 while (*s2 && *s2 != '.')
345 {
346 s2++;
347 }
348
349 if (!*s2)
350 {
351 return NULL;
352 }
353 s2++;
354
355 //----
356 while (*s1)
357 {
358 if (*s1++ != *s2++)
359 {
360 return NULL;
361 }
362 }
363
364 //---- check if s2 reaches to the end of member name
365 if (*s2 != '.' && *s2 != '\0')
366 {
367 return NULL;
368 }
369
370 return s2 + 1;
371 }
372
373 //================================================================================
374 // Search
375 //================================================================================
376 /*---------------------------------------------------------------------------*
377 Name: ENVi_SearchByMemberNameFromResourceSet
378
379 Description: search a resource by specifying member name from a resource set.
380 use current class name.
381
382 Arguments: resSet : pointer to resource set
383 memberName : member name
384
385 Returns: pointer to specified resource.
386 NULL if not found.
387 *---------------------------------------------------------------------------*/
ENVi_SearchByMemberNameFromResourceSet(ENVResource * resSet,const char * memberName)388 static ENVResource *ENVi_SearchByMemberNameFromResourceSet(ENVResource * resSet,
389 const char *memberName)
390 {
391 ENVResource *ir = resSet;
392
393 for (; ir->name; ir++)
394 {
395 //---- check class name (if differ, return NULL)
396 char *memberPtr = ENVi_CheckIfSameClass(ir->name, sCurrentClass);
397
398 //---- check member name
399 if (memberPtr && !STD_CompareString(memberPtr, memberName))
400 {
401 return ir;
402 }
403 }
404
405 return NULL;
406 }
407
408 /*---------------------------------------------------------------------------*
409 Name: ENVi_SearchByMemberName
410
411 Description: search a resource by specifying member name.
412 use current class name.
413 get pointer to resource set.
414
415 Arguments: memberName : member name
416 resSetPtr : pointer to resource set
417
418 Returns: pointer to specified resource.
419 NULL if not found.
420 *---------------------------------------------------------------------------*/
ENVi_SearchByMemberName(const char * memberName,ENVResource ** resSetPtr)421 ENVResource *ENVi_SearchByMemberName(const char *memberName, ENVResource ** resSetPtr)
422 {
423 ENVResourceSetLink *link = sResourceSetLinkHead;
424
425 if (link && memberName && *memberName != '\0')
426 {
427 while (link)
428 {
429 ENVResource *p = ENVi_SearchByMemberNameFromResourceSet(link->array, memberName);
430 if (p)
431 {
432 if (resSetPtr)
433 {
434 *resSetPtr = link->array;
435 }
436 return p;
437 }
438 link = link->next;
439 }
440 }
441
442 return NULL;
443 }
444
445 /*---------------------------------------------------------------------------*
446 Name: ENVi_SearchByFullNameFromResourceSet
447
448 Description: search a resource by specifying full name from a resource set.
449
450 Arguments: resSet : pointer to resource set
451 fullName : name (full name)
452
453 Returns: pointer to resource.
454 NULL if not found.
455 *---------------------------------------------------------------------------*/
ENVi_SearchByFullNameFromResourceSet(ENVResource * resSet,const char * fullName)456 static ENVResource *ENVi_SearchByFullNameFromResourceSet(ENVResource * resSet, const char *fullName)
457 {
458 ENVResource *ir = resSet;
459 #if 0
460 OS_Printf("set=%x\n", ir);
461 #endif
462 for (; ir->name; ir++)
463 {
464 #if 0
465 OS_Printf("comp %x %x\n", ir->name, fullName);
466 #endif
467 if (!STD_CompareString(ir->name, fullName))
468 {
469 return ir;
470 }
471 }
472
473 return NULL;
474 }
475
476 /*---------------------------------------------------------------------------*
477 Name: ENVi_SearchByFullName
478
479 Description: search a resource by specifying full name.
480 get pointer to resource set.
481
482 Arguments: fullName : name (full name)
483 resSetPtr : pointer to resource set
484
485 Returns: pointer to resource.
486 NULL if not found.
487 *---------------------------------------------------------------------------*/
ENVi_SearchByFullName(const char * fullName,ENVResource ** resSetPtr)488 ENVResource *ENVi_SearchByFullName(const char *fullName, ENVResource ** resSetPtr)
489 {
490 ENVResourceSetLink *link = sResourceSetLinkHead;
491
492 if (link && fullName && *fullName != '\0')
493 {
494 while (link)
495 {
496 ENVResource *p = ENVi_SearchByFullNameFromResourceSet(link->array, fullName);
497 if (p)
498 {
499 if (resSetPtr)
500 {
501 *resSetPtr = link->array;
502 }
503 return p;
504 }
505 link = link->next;
506 }
507 }
508
509 return NULL;
510 }
511
512 /*---------------------------------------------------------------------------*
513 Name: ENVi_Search
514
515 Description: search a resource by specifying name from all resoruce set.
516 if name begins by ".", it will be added to current class.
517 get pointer to resource set.
518
519 Arguments: name (full name or member name of class)
520 resSetPtr : pointer to resource set
521
522 Returns: pointer to resource.
523 NULL if not found.
524 *---------------------------------------------------------------------------*/
ENVi_Search(const char * name,ENVResource ** resSetPtr)525 ENVResource *ENVi_Search(const char *name, ENVResource ** resSetPtr)
526 {
527 ENVResourceSetLink *link = sResourceSetLinkHead;
528
529 if (link && name && *name != '\0')
530 {
531 if (*name == '.')
532 {
533 return ENVi_SearchByMemberName(name + 1, resSetPtr);
534 }
535 else
536 {
537 return ENVi_SearchByFullName(name, resSetPtr);
538 }
539 }
540
541 return NULL;
542 }
543
544 //================================================================================
545 // Get value
546 //================================================================================
547 /*---------------------------------------------------------------------------*
548 Name: ENVi_GetPtrAndLength
549
550 Description: get pointer of specified member name.
551 data length is stored to len.
552
553 Arguments: name : full name or member name of class
554 len : pointer to length
555
556 Returns: pointer
557 *---------------------------------------------------------------------------*/
ENVi_GetPtrAndLength(const char * name,int * len)558 void *ENVi_GetPtrAndLength(const char *name, int *len)
559 {
560 ENVResource *resSetPtr;
561 ENVResource *p = ENVi_Search(name, &resSetPtr);
562
563 if (!p)
564 {
565 if (len)
566 {
567 *len = 0;
568 }
569 return NULL;
570 }
571
572 if (len)
573 {
574 *len = p->len - ((p->type == ENV_RESTYPE_STRING) ? 1 : 0);
575 }
576
577 if (p->type & ENV_RESTYPE_OFFSET_MASK)
578 {
579 return (void *)((u32)resSetPtr + (u32)(p->ptr));
580 }
581 else
582 {
583 return p->ptr;
584 }
585 }
586
587 /*---------------------------------------------------------------------------*
588 Name: ENV_GetType
589
590 Description: get resource type
591
592 Arguments: name : full name or member name of class
593
594 Returns: resource type. ENV_RESTYPE_xxx.
595 *---------------------------------------------------------------------------*/
ENV_GetType(const char * name)596 ENVType ENV_GetType(const char *name)
597 {
598 ENVResource *p = ENV_Search(name);
599 return (ENVType)((p) ? p->type : ENV_RESTYPE_NONE);
600 }
601
602 /*---------------------------------------------------------------------------*
603 Name: ENV_GetSize
604
605 Description: get resource size
606
607 Arguments: name : full name or member name of class
608
609 Returns: resource size
610 *---------------------------------------------------------------------------*/
ENV_GetSize(const char * name)611 int ENV_GetSize(const char *name)
612 {
613 ENVResource *p = ENV_Search(name);
614 return (p) ? p->len : 0;
615 }
616
617 /*---------------------------------------------------------------------------*
618 Name: ENV_GetBelogingResourceSet
619
620 Description: get resource set which res is belong to
621
622 Arguments: res : pointer to resource
623
624 Returns: pointer to resoruce set
625 *---------------------------------------------------------------------------*/
ENV_GetBelongingResourceSet(ENVResource * res)626 ENVResource *ENV_GetBelongingResourceSet(ENVResource * res)
627 {
628 ENVResourceSetLink *link = sResourceSetLinkHead;
629
630 while (link)
631 {
632 ENVResource *resSet = link->array;
633 ENVResource *p = resSet;
634
635 while (p->name)
636 {
637 p++;
638 }
639
640 if ((u32)resSet <= (u32)res && (u32)res <= (u32)p)
641 {
642 return resSet;
643 }
644
645 link = link->next;
646 }
647
648 return NULL;
649 }
650
651 /*---------------------------------------------------------------------------*
652 Name: ENV_GetU64
653
654 Description: get u64 value
655
656 Arguments: name : full name or member name of class
657 retVal : pointer to store resource value
658
659 Returns: u64 value
660 *---------------------------------------------------------------------------*/
ENV_GetU64(const char * name,u64 * retVal)661 BOOL ENV_GetU64(const char *name, u64 *retVal)
662 {
663 ENVResource *resSetPtr;
664 ENVResource *p = ENVi_Search(name, &resSetPtr);
665
666 if (!p)
667 {
668 *retVal = 0;
669 return FALSE;
670 }
671
672 if (p->type & ENV_RESTYPE_OFFSET_MASK)
673 {
674 *retVal = *(u64 *)((u32)resSetPtr + (u32)(p->ptr));
675 }
676 else
677 {
678 //---- check if resource has 64bit value
679 SDK_WARNING((p + 1)->name && !STD_CompareString((p + 1)->name, ENVi_DUMMY_FOR_U64),
680 "64bit resource is stored illegally");
681
682 //---- combine 2 resources to u64 value
683 *retVal = (u64)(((u64)((p + 1)->ptr) << 32) | (u32)(p->ptr));
684 }
685
686 return TRUE;
687 }
688
689 //================================================================================
690 // search by using iterator
691 //================================================================================
692 /*---------------------------------------------------------------------------*
693 Name: ENV_InitIter
694
695 Description: Initialize iterator
696
697 Arguments: iter : pointer to iterator
698
699 Returns: None.
700 *---------------------------------------------------------------------------*/
ENV_InitIter(ENVResourceIter * iter)701 void ENV_InitIter(ENVResourceIter * iter)
702 {
703 iter->link = sResourceSetLinkHead;
704 iter->ptr = iter->link->array;
705
706 iter->count = 0;
707 }
708
709 /*---------------------------------------------------------------------------*
710 Name: ENVi_SetNextSetForIter
711
712 Description: set next resource set
713
714 Arguments: iter : pointer to iterator
715
716 Returns: None.
717 *---------------------------------------------------------------------------*/
ENVi_SetNextSetForIter(ENVResourceIter * iter)718 static void ENVi_SetNextSetForIter(ENVResourceIter * iter)
719 {
720 iter->link = iter->link->next;
721
722 if (!iter->link)
723 {
724 return;
725 }
726
727 iter->ptr = iter->link->array;
728 }
729
730 /*---------------------------------------------------------------------------*
731 Name: ENV_SearchByClass
732
733 Description: search resource which has specified class
734
735 Arguments: iter : pointer to iterator
736 className : class name
737
738 Returns: pointer to resource.
739 NULL if not found.
740 *---------------------------------------------------------------------------*/
ENV_SearchByClass(ENVResourceIter * iter,const char * className)741 ENVResource *ENV_SearchByClass(ENVResourceIter * iter, const char *className)
742 {
743 while (iter->link)
744 {
745 if (!iter->ptr->name)
746 {
747 ENVi_SetNextSetForIter(iter);
748 if (!iter->link)
749 {
750 break;
751 }
752 }
753
754 if (iter->ptr->name)
755 {
756 char *memberPtr;
757
758 //---- increase ptr
759 ENVResource *p = iter->ptr;
760 iter->ptr++;
761
762 //---- check if specified class
763 if ((memberPtr = ENVi_CheckIfSameClass(p->name, (char *)className)) != 0)
764 {
765 iter->supData = (void *)memberPtr;
766 iter->count++;
767 return p;
768 }
769 }
770 }
771
772 return NULL;
773 }
774
775 /*---------------------------------------------------------------------------*
776 Name: ENV_SearchByMember
777
778 Description: search resource which has specified member
779
780 Arguments: iter : pointer to iterator
781 memberName : member name
782
783 Returns: pointer to resource.
784 NULL if not found.
785 *---------------------------------------------------------------------------*/
ENV_SearchByMember(ENVResourceIter * iter,const char * memberName)786 ENVResource *ENV_SearchByMember(ENVResourceIter * iter, const char *memberName)
787 {
788 while (iter->link)
789 {
790 if (!iter->ptr->name)
791 {
792 ENVi_SetNextSetForIter(iter);
793 if (!iter->link)
794 {
795 break;
796 }
797 }
798
799 if (iter->ptr->name)
800 {
801 //---- increase ptr
802 ENVResource *p = iter->ptr;
803 iter->ptr++;
804
805 //---- check if specified member
806 if (ENVi_CheckIfSameMember(p->name, (char *)memberName))
807 {
808 iter->supData = (void *)p;
809 iter->count++;
810 return p;
811 }
812 }
813 }
814
815 return NULL;
816 }
817
818 /*---------------------------------------------------------------------------*
819 Name: ENV_SearchByType
820
821 Description: search resource which is specified type
822
823 Arguments: iter : pointer to iterator
824 type : resource type
825
826 Returns: pointer to resource.
827 NULL if not found.
828 *---------------------------------------------------------------------------*/
ENV_SearchByType(ENVResourceIter * iter,ENVType type)829 ENVResource *ENV_SearchByType(ENVResourceIter * iter, ENVType type)
830 {
831 while (iter->link)
832 {
833 if (!iter->ptr->name)
834 {
835 ENVi_SetNextSetForIter(iter);
836 if (!iter->link)
837 {
838 break;
839 }
840 }
841
842 if (iter->ptr->name)
843 {
844 //---- increase ptr
845 ENVResource *p = iter->ptr;
846 iter->ptr++;
847
848 //---- check if specified member
849 if (p->type == type)
850 {
851 iter->count++;
852 return p;
853 }
854 }
855 }
856
857 return NULL;
858 }
859
860 /*---------------------------------------------------------------------------*
861 Name: ENV_SearchByPartialName
862
863 Description: search resource whose name contains specified string
864
865 Arguments: iter : pointer to iterator
866 partialName : string to search in resource name
867
868 Returns: pointer to resource.
869 NULL if not found.
870 *---------------------------------------------------------------------------*/
ENV_SearchByPartialName(ENVResourceIter * iter,const char * partialName)871 ENVResource *ENV_SearchByPartialName(ENVResourceIter * iter, const char *partialName)
872 {
873 while (iter->link)
874 {
875 if (!iter->ptr->name)
876 {
877 ENVi_SetNextSetForIter(iter);
878 if (!iter->link)
879 {
880 break;
881 }
882 }
883
884 if (iter->ptr->name)
885 {
886 //---- increase ptr
887 ENVResource *p = iter->ptr;
888 iter->ptr++;
889
890 //---- check if specified member
891 if (STD_SearchString(p->name, partialName) != NULL)
892 {
893 iter->count++;
894 return p;
895 }
896 }
897 }
898
899 return NULL;
900 }
901
902 /*---------------------------------------------------------------------------*
903 Name: ENV_SetResourceSetArray
904
905 Description: set all resoruce set
906
907 Arguments: array : pointer to resource array array
908
909 Returns: None.
910 *---------------------------------------------------------------------------*/
ENV_SetResourceSetArray(ENVResource * array[])911 void ENV_SetResourceSetArray(ENVResource * array[])
912 {
913 int n = 0;
914 ENVResource *p = array[n];
915 while (p != NULL)
916 {
917 if (n == 0)
918 {
919 ENV_SetResourceSet(p);
920 }
921 else
922 {
923 ENV_AppendResourceSet(p);
924 }
925 p = array[++n];
926 }
927 }
928