executor/src/resGetinfo.c

171 lines
3.8 KiB
C

/* Copyright 1986, 1989, 1990 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_resGetinfo[] =
"$Id: resGetinfo.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in ResourceMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "ResourceMgr.h"
#include "FileMgr.h"
#include "rsys/resource.h"
#include "rsys/glue.h"
#include "rsys/file.h"
#include "rsys/prefs.h"
#define STEF_GetResInfoFix
P1(PUBLIC pascal trap, INTEGER, UniqueID, ResType, typ)
{
static INTEGER startid = 0;
INTEGER curmap;
resmaphand map;
resref *rr;
curmap = CurMap;
CurMap = ((resmap *) STARH(MR(TopMapHndl)))->resfn;
while (ROMlib_typidtop(typ, ++startid, &map, &rr) != resNotFound)
;
CurMap = curmap;
return(startid);
}
P1(PUBLIC pascal trap, INTEGER, Unique1ID, ResType, typ) /* IMIV-16 */
{
resmaphand map;
static INTEGER startid = 0;
resref *rr;
map = ROMlib_rntohandl(Cx(CurMap), (Handle *)0);
if (!map) {
ROMlib_setreserr(resFNotFound);
/*-->*/ return 0;
}
while (ROMlib_maptypidtop(map, typ, ++startid, &rr) != resNotFound)
;
return(startid);
}
P4(PUBLIC pascal trap, void, GetResInfo, Handle, res, INTEGER *, id,
ResType *, typ, StringPtr, name)
{
resmaphand map;
typref *tr;
resref *rr;
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
#if !defined (STEF_GetResInfoFix)
if (ResErr != noErr)
return;
#else
if (ResErr != noErr)
{
if (id)
*id = -1;
if (typ)
*typ = (ResType) 0;
if (name)
name[0] = 0;
/*-->*/ return;
}
#endif
if (id)
*id = rr->rid;
if (typ)
*typ = tr->rtyp;
if (name) {
if (rr->noff != -1)
str255assign(name,
(StringPtr)((char *)STARH(map) +Hx(map, namoff) + Cx(rr->noff)));
else
name[0] = 0;
}
}
P1(PUBLIC pascal trap, INTEGER, GetResAttrs, Handle, res)
{
resmaphand map;
typref *tr;
resref *rr;
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
if (ResErr != noErr)
/*-->*/ return 0;
return(Cx(rr->ratr));
}
A2(PUBLIC, LONGINT, ROMlib_SizeResource, Handle, res, BOOLEAN, usehandle)
{
resmaphand map;
typref *tr;
resref *rr;
Size retval;
LONGINT loc, lc;
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
if (ResErr != noErr)
/*-->*/ return -1;
if (usehandle && (*res).p) /* STARH is overkill */
retval = GetHandleSize(res);
else {
loc = Hx(map, rh.rdatoff) + B3TOLONG(rr->doff);
ROMlib_setreserr(SetFPos(Hx(map, resfn), fsFromStart, loc));
if (ResErr != noErr)
/*-->*/ return -1;
/* If the resource is compressed and we want the memory size, not
the disk size, we have to look at more than the length on the
disk */
if (usehandle && (rr->ratr & resCompressed) && system_version >= 0x700)
{
LONGINT l[4]; /* [0] == diskSize,
[1] == compressedResourceTag,
[2] == typeFlags,
[3] == uncompressedSize */
LONGINT master_save_pos;
lc = sizeof (l);
GetFPos (Hx(map, resfn), &master_save_pos);
ROMlib_setreserr(FSReadAll(Hx(map, resfn), &lc, (Ptr) l));
if (ResErr != noErr || l[1] != CLC (COMPRESSED_TAG))
{
SetFPos (Hx(map, resfn), fsFromStart, master_save_pos);
goto not_compressed_after_all;
}
else
{
if (l[2] != CLC (COMPRESSED_FLAGS))
{
ROMlib_setreserr (CantDecompress);
return -1;
}
else
retval = CL (l[3]);
}
}
else
{
not_compressed_after_all:
lc = sizeof(retval);
ROMlib_setreserr(FSReadAll(Hx(map, resfn), &lc, (Ptr) &retval));
retval = CL(retval);
if (ResErr != noErr)
/*-->*/ return -1;
}
}
return retval;
}
P1(PUBLIC pascal trap, LONGINT, SizeResource, Handle, res)
{
return ROMlib_SizeResource(res, TRUE);
}