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:: 2009-06-19#$
14   $Rev: 10786 $
15   $Author: okajima_manabu $
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_TPrintf("set=%x\n", ir);
461 #endif
462     for (; ir->name; ir++)
463     {
464 #if 0
465         OS_TPrintf("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