/* applefile.h - Data structures used by AppleSingle/AppleDouble
* file format
*
* Written by Lee Jones, 22-Oct-1993
*
* For definitive information, see "AppleSingle/AppleDouble
* Formats for Foreign Files Developer's Note"; Apple Computer
* Inc.; (c) 1990.
*
* Other details were added from:
* Inside Macintosh [old version], volumes II to VI,
* Apple include files supplied with Think C 5.0.1,
* Microsoft MS-DOS Programmer's Reference, version 5, and
* Microsoft C 6.00a's dos.h include file.
*
* I don't have ProDOS or AFP Server documentation so related
* entries may be a bit skimpy.
*
* Edit history:
*
* when who why
* --------- --- ------------------------------------------
* 22-Oct-93 LMJ Pull together from Inside Macintosh,
* Developer's Note, etc
* 26-Oct-93 LMJ Finish writing first version and list
* references
* 06-Feb-94 EEF Very minor cleanup
*/
/* Following items define machine specific size (for porting). */
typedef char xchar8; /* 8-bit field */
typedef char schar8; /* signed 8-bit field */
typedef unsigned char uchar8; /* unsigned 8-bit field */
typedef short xint16; /* 16-bit field */
typedef unsigned short uint16; /* unsigned 16-bit field */
typedef long xint32; /* 32-bit field */
typedef long sint32; /* signed 32-bit field */
typedef unsigned long uint32; /* unsigned 32-bit field */
/* REMINDER: the Motorola 680x0 is a big-endian architecture! */
typedef uint32 OSType; /* 32 bit field */
/* In the QuickDraw coordinate plane, each coordinate is
* -32767..32767. Each point is at the intersection of a
* horizontal grid line and a vertical grid line. Horizontal
* coordinates increase from left to right. Vertical
* coordinates increase from top to bottom. This is the way
* both a TV screen and page of English text are scanned:
* from top left to bottom right.
*/
struct Point /* spot in QuickDraw 2-D grid */
{
xint16 v; /* vertical coordinate */
xint16 h; /* horizontal coordinate */
}; /* Point */
typedef struct Point Point;
/* See older Inside Macintosh, Volume II page 84 or Volume IV
* page 104.
*/
struct FInfo /* Finder information */
{
OSType fdType; /* File type, 4 ASCII chars */
OSType fdCreator; /* File's creator, 4 ASCII chars */
uint16 fdFlags; /* Finder flag bits */
Point fdLocation; /* file's location in folder */
xint16 fdFldr; /* file 's folder (aka window) */
}; /* FInfo */
typedef struct FInfo FInfo;
/*
* Masks for finder flag bits (field fdFlags in struct
* FInfo).
*/
#define F_fOnDesk 0x0001 /* file is on desktop (HFS only) */
#define F_maskColor 0x000E /* color coding (3 bits) */
/* 0x0010 /* reserved (System 7) */
#define F_fSwitchLaunch 0x0020 /* reserved (System 7) */
#define F_fShared 0x0040 /* appl available to multiple users */
#define F_fNoINITs 0x0080 /* file contains no INIT resources */
#define F_fBeenInited 0x0100 /* Finder has loaded bundle res. */
/* 0x0200 /* reserved (System 7) */
#define F_fCustomIcom 0x0400 /* file contains custom icon */
#define F_fStationary 0x0800 /* file is a stationary pad */
#define F_fNameLocked 0x1000 /* file can't be renamed by Finder */
#define F_fHasBundle 0x2000 /* file has a bundle */
#define F_fInvisible 0x4000 /* file's icon is invisible */
#define F_fAlias 0x8000 /* file is an alias file (System 7) */
/* See older Inside Macintosh, Volume IV, page 105.
*/
struct FXInfo /* Extended finder information */
{
xint16 fdIconID; /* icon ID number */
xint16 fdUnused[3]; /* spare */
schar8 fdScript; /* scrip flag and code */
schar8 fdXFlags; /* reserved */
xint16 fdComment; /* comment ID number */
xint32 fdPutAway; /* home directory ID */
}; /* FXInfo */
typedef struct FXInfo FXInfo;
/* Pieces used by AppleSingle & AppleDouble (defined later). */
struct ASHeader /* header portion of AppleSingle */
{
/* AppleSingle = 0x00051600; AppleDouble = 0x00051607 */
uint32 magicNum; /* internal file type tag */
uint32 versionNum; /* format version: 2 = 0x00020000 */
uchar8 filler[16]; /* filler, currently all bits 0 */
uint16 numEntries; /* number of entries which follow */
}; /* ASHeader */
typedef struct ASHeader ASHeader;
struct ASEntry /* one AppleSingle entry descriptor */
{
uint32 entryID; /* entry type: see list, 0 invalid */
uint32 entryOffset; /* offset, in octets, from beginning */
/* of file to this entry's data */
uint32 entryLength; /* length of data in octets */
}; /* ASEntry */
typedef struct ASEntry ASEntry;
/* Apple reserves the range of entry IDs from 1 to 0x7FFFFFFF.
* Entry ID 0 is invalid. The rest of the range is available
* for applications to define their own entry types. "Apple does
* not arbitrate the use of the rest of the range."
*/
#define AS_DATA 1 /* data fork */
#define AS_RESOURCE 2 /* resource fork */
#define AS_REALNAME 3 /* File's name on home file system */
#define AS_COMMENT 4 /* standard Mac comment */
#define AS_ICONBW 5 /* Mac black & white icon */
#define AS_ICONCOLOR 6 /* Mac color icon */
/* 7 /* not used */
#define AS_FILEDATES 8 /* file dates; create, modify, etc */
#define AS_FINDERINFO 9 /* Mac Finder info & extended info */
#define AS_MACINFO 10 /* Mac file info, attributes, etc */
#define AS_PRODOSINFO 11 /* Pro-DOS file info, attrib., etc */
#define AS_MSDOSINFO 12 /* MS-DOS file info, attributes, etc */
#define AS_AFPNAME 13 /* Short name on AFP server */
#define AS_AFPINFO 14 /* AFP file info, attrib., etc */
#define AS_AFPDIRID 15 /* AFP directory ID */
/* matrix of entry types and their usage:
*
* Macintosh Pro-DOS MS-DOS AFP server
* --------- ------- ------ ----------
* 1 AS_DATA xxx xxx xxx xxx
* 2 AS_RESOURCE xxx xxx
* 3 AS_REALNAME xxx xxx xxx xxx
*
* 4 AS_COMMENT xxx
* 5 AS_ICONBW xxx
* 6 AS_ICONCOLOR xxx
*
* 8 AS_FILEDATES xxx xxx xxx xxx
* 9 AS_FINDERINFO xxx
* 10 AS_MACINFO xxx
*
* 11 AS_PRODOSINFO xxx
* 12 AS_MSDOSINFO xxx
*
* 13 AS_AFPNAME xxx
* 14 AS_AFPINFO xxx
* 15 AS_AFPDIRID xxx
*/
/* entry ID 1, data fork of file - arbitrary length octet string */
/* entry ID 2, resource fork - arbitrary length opaque octet string;
* as created and managed by Mac O.S. resoure manager
*/
/* entry ID 3, file's name as created on home file system - arbitrary
* length octet string; usually short, printable ASCII
*/
/* entry ID 4, standard Macintosh comment - arbitrary length octet
* string; printable ASCII, claimed 200 chars or less
*/
/* This is probably a simple duplicate of the 128 octet bitmap
* stored as the 'ICON' resource or the icon element from an 'ICN#'
* resource.
*/
struct ASIconBW /* entry ID 5, standard Mac black and white icon */
{
uint32 bitrow[32]; /* 32 rows of 32 1-bit pixels */
}; /* ASIconBW */
typedef struct ASIconBW ASIconBW;
/* entry ID 6, "standard" Macintosh color icon - several competing
* color icons are defined. Given the copyright dates
* of the Inside Macintosh volumes, the 'cicn' resource predominated
* when the AppleSingle Developer's Note was written (most probable
* candidate). See Inside Macintosh, Volume V, pages 64 & 80-81 for
* a description of 'cicn' resources.
*
* With System 7, Apple introduced icon families. They consist of:
* large (32x32) B&W icon, 1-bit/pixel, type 'ICN#',
* small (16x16) B&W icon, 1-bit/pixel, type 'ics#',
* large (32x32) color icon, 4-bits/pixel, type 'icl4',
* small (16x16) color icon, 4-bits/pixel, type 'ics4',
* large (32x32) color icon, 8-bits/pixel, type 'icl8', and
* small (16x16) color icon, 8-bits/pixel, type 'ics8'.
* If entry ID 6 is one of these, take your pick. See Inside
* Macintosh, Volume VI, pages 2-18 to 2-22 and 9-9 to 9-13, for
* descriptions.
*/
/* entry ID 7, not used */
/* Times are stored as a "signed number of seconds before of after
* 12:00 a.m. (midnight), January 1, 2000 Greenwich Mean Time (GMT).
* Applications must convert to their native date and time
* conventions." Any unknown entries are set to 0x80000000
* (earliest reasonable time).
*/
struct ASFileDates /* entry ID 8, file dates info */
{
sint32 create; /* file creation date/time */
sint32 modify; /* last modification date/time */
sint32 backup; /* last backup date/time */
sint32 access; /* last access date/time */
}; /* ASFileDates */
typedef struct ASFileDates ASFileDates;
/* See older Inside Macintosh, Volume II, page 115 for
* PBGetFileInfo(), and Volume IV, page 155, for PBGetCatInfo().
*/
/* entry ID 9, Macintosh Finder info & extended info */
struct ASFinderInfo
{
FInfo ioFlFndrInfo; /* PBGetFileInfo() or PBGetCatInfo() */
FXInfo ioFlXFndrInfo; /* PBGetCatInfo() (HFS only) */
}; /* ASFinderInfo */
typedef struct ASFinderInfo ASFinderInfo;
struct ASMacInfo /* entry ID 10, Macintosh file information */
{
uchar8 filler[3]; /* filler, currently all bits 0 */
uchar8 ioFlAttrib; /* PBGetFileInfo() or PBGetCatInfo() */
}; /* ASMacInfo */
typedef struct ASMacInfo ASMacInfo;
#define AS_PROTECTED 0x0002 /* protected bit */
#define AS_LOCKED 0x0001 /* locked bit */
/* NOTE: ProDOS-16 and GS/OS use entire fields. ProDOS-8 uses low
* order half of each item (low byte in access & filetype, low word
* in auxtype); remainder of each field should be zero filled.
*/
struct ASProdosInfo /* entry ID 11, ProDOS file information */
{
uint16 access; /* access word */
uint16 filetype; /* file type of original file */
uint32 auxtype; /* auxiliary type of the orig file */
}; /* ASProDosInfo */
typedef struct ASProdosInfo ASProdosInfo;
/* MS-DOS file attributes occupy 1 octet; since the Developer Note
* is unspecific, I've placed them in the low order portion of the
* field (based on example of other ASMacInfo & ASProdosInfo).
*/
struct ASMsdosInfo /* entry ID 12, MS-DOS file information */
{
uchar8 filler; /* filler, currently all bits 0 */
uchar8 attr; /* _dos_getfileattr(), MS-DOS */
/* interrupt 21h function 4300h */
}; /* ASMsdosInfo */
typedef struct ASMsdosInfo ASMsdosInfo;
#define AS_DOS_NORMAL 0x00 /* normal file (all bits clear) */
#define AS_DOS_READONLY 0x01 /* file is read-only */
#define AS_DOS_HIDDEN 0x02 /* hidden file (not shown by DIR) */
#define AS_DOS_SYSTEM 0x04 /* system file (not shown by DIR) */
#define AS_DOS_VOLID 0x08 /* volume label (only in root dir) */
#define AS_DOS_SUBDIR 0x10 /* file is a subdirectory */
#define AS_DOS_ARCHIVE 0x20 /* new or modified (needs backup) */
/* entry ID 13, short file name on AFP server - arbitrary length
* octet string; usualy printable ASCII starting with
* '!' (0x21)
*/
struct ASAfpInfo /* entry ID 12, AFP server file information */
{
uchar8 filler[3]; /* filler, currently all bits 0 */
uchar8 attr; /* file attributes */
}; /* ASAfpInfo */
typedef struct ASAfpInfo ASAfpInfo;
#define AS_AFP_Invisible 0x01 /* file is invisible */
#define AS_AFP_MultiUser 0x02 /* simultaneous access allowed */
#define AS_AFP_System 0x04 /* system file */
#define AS_AFP_BackupNeeded 0x40 /* new or modified (needs backup) */
struct ASAfpDirId /* entry ID 15, AFP server directory ID */
{
uint32 dirid; /* file's directory ID on AFP server */
}; /* ASAfpDirId */
typedef struct ASAfpDirId ASAfpDirId;
/*
* The format of an AppleSingle/AppleDouble header
*/
struct AppleSingle /* format of disk file */
{
ASHeader header; /* AppleSingle header part */
ASEntry entry[1]; /* array of entry descriptors */
/* uchar8 filedata[]; /* followed by rest of file */
}; /* AppleSingle */
typedef struct AppleSingle AppleSingle;
/*
* FINAL REMINDER: the Motorola 680x0 is a big-endian architecture!
*/
/* End of applefile.h */