static int readTypeList( WResFileID handle, WResDirHead * currdir, uint_16 ver, void *fileinfo ) { WResTypeNode * newnode; WResTypeInfo newtype; int error; int typenum; int extrabytes; /* loop through the list of types */ for (error = FALSE, typenum = 0; typenum < currdir->NumTypes && !error; typenum++) { /* read a type record from disk */ if( ver < 3 ) { error = WResReadFixedTypeRecord2( &newtype, handle ); } else { error = WResReadFixedTypeRecord( &newtype, handle ); } if( !error ) { /* allocate a new node */ extrabytes = WResIDExtraBytes( &(newtype.TypeName) ); newnode = WRESALLOC( sizeof(WResTypeNode) + extrabytes ); if( newnode == NULL ) { error = TRUE; WRES_ERROR( WRS_MALLOC_FAILED ); } } if( !error ) { /* initialize the linked list of resources */ newnode->Head = NULL; newnode->Tail = NULL; /* copy the new type info into the new node */ memcpy( &(newnode->Info), &newtype, sizeof(WResTypeInfo) ); /* read the extra bytes (if any) */ if( extrabytes > 0 ) { error = WResReadExtraWResID( &(newnode->Info.TypeName), handle ); } } if( !error ) { /* add the type node to the linked list */ ResAddLLItemAtEnd( (void **)&(currdir->Head), (void **)&(currdir->Tail), newnode ); /* read in the list of resources of this type */ error = readResList( handle, newnode, ver, fileinfo ); } } return( error ); } /* readTypeList */
static WResTypeNode *newTypeNode( const WResID *type ) { WResTypeNode *newnode; int extrabytes; extrabytes = WResIDExtraBytes( type ); newnode = WRESALLOC( sizeof( WResTypeNode ) + extrabytes ); if (newnode != NULL) { newnode->Next = NULL; newnode->Prev = NULL; newnode->Head = NULL; newnode->Tail = NULL; newnode->Info.NumResources = 0; memcpy( &(newnode->Info.TypeName), type, sizeof(WResID) + extrabytes ); } else { WRES_ERROR( WRS_MALLOC_FAILED ); } return( newnode ); }
static int readResList( WResFileID handle, WResTypeNode * currtype, uint_16 ver, void *fileinfo ) { WResResNode *newnode; WResResInfo newres; WResResInfo1 newres1; WResLangNode *langnode; WResID *resid; WResID tmpresid; int error; int resnum; int extrabytes; /* loop through the list of resources of this type */ for (resnum = 0, error = FALSE; resnum < currtype->Info.NumResources && !error; resnum++) { /* read a resource record from disk */ if( ver < 2 ) { error = WResReadFixedResRecord1( &newres1, handle ); resid = &tmpresid; tmpresid.IsName = newres1.ResName.IsName; if( tmpresid.IsName ) { tmpresid.ID.Name.Name[0] = newres1.ResName.ID.Name.Name[0]; tmpresid.ID.Name.NumChars = newres1.ResName.ID.Name.NumChars; } else { tmpresid.ID.Num = newres1.ResName.ID.Num; } } else if( ver == 2 ) { error = WResReadFixedResRecord2( &newres, handle ); resid = &( newres.ResName ); } else { error = WResReadFixedResRecord( &newres, handle ); resid = &( newres.ResName ); } if( !error ) { /* allocate a new node */ extrabytes = WResIDExtraBytes( resid ); newnode = WRESALLOC( sizeof(WResResNode) + extrabytes ); if( newnode == NULL ) { error = TRUE; WRES_ERROR( WRS_MALLOC_FAILED ); } } if( !error ) { newnode->Head = NULL; newnode->Tail = NULL; /* copy the new resource info into the new node */ if( ver < 2 ) { newnode->Info.NumResources = 1; memcpy( &(newnode->Info.ResName), &( newres1.ResName ), sizeof( WResID ) ); } else { memcpy( &(newnode->Info), &newres, sizeof(WResResInfo) ); } /* read the extra bytes (if any) */ if( extrabytes > 0 ) { error = WResReadExtraWResID( &(newnode->Info.ResName), handle ); } if( ver < 2 ) { langnode = WRESALLOC( sizeof(WResLangNode) ); if( langnode == NULL ) { error = TRUE; WRES_ERROR( WRS_MALLOC_FAILED ); } if( !error ) { langnode->data = NULL; langnode->fileInfo = fileinfo; langnode->Info.MemoryFlags = newres1.MemoryFlags; langnode->Info.Offset = newres1.Offset; langnode->Info.Length = newres1.Length; langnode->Info.lang.lang = DEF_LANG; langnode->Info.lang.sublang = DEF_SUBLANG; ResAddLLItemAtEnd( (void **)&(newnode->Head), (void **)&(newnode->Tail), langnode ); } } else { error = readLangInfoList( handle, newnode, fileinfo ); } } if( !error ) { /* add the resource node to the linked list */ ResAddLLItemAtEnd( (void **)&(currtype->Head), (void **)&(currtype->Tail), newnode ); } } return( error ); } /* readResList */