WResResInfo *WResReadResRecord( WResFileID handle ) /*************************************************/ /* reads in the fields of a res info record from the current position in */ /* the file identified by fp */ { WResResInfo newres; WResResInfo *newptr; WResFileSSize numread; int numcharsleft; bool error; error = WResReadFixedResRecord( &newres, handle ); if( error ) { return( NULL ); } if( newres.ResName.IsName ) { numcharsleft = newres.ResName.ID.Name.NumChars - 1; } else { numcharsleft = 0; } newptr = WRESALLOC( sizeof( WResResInfo ) + numcharsleft ); if( newptr == NULL ) { WRES_ERROR( WRS_MALLOC_FAILED ); } else { memcpy( newptr, &newres, sizeof( WResResInfo ) ); if( numcharsleft != 0 ) { numread = WRESREAD( handle, newptr->ResName.ID.Name.Name + 1, numcharsleft ); if( numread != numcharsleft ) { WRES_ERROR( WRESIOERR( handle, numread ) ? WRS_READ_FAILED : WRS_READ_INCOMPLETE ); WRESFREE( newptr ); newptr = NULL; } } } return( newptr ); } /* WResReadResRecord */
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 */