示例#1
0
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 */
示例#2
0
文件: wraddres.c 项目: JWasm/JWlink
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 );
}
示例#3
0
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 */