⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libhfs.h

📁 OpenBIOS是一个开源的BIOS实现
💻 H
字号:
/* * libhfs - library for reading and writing Macintosh HFS volumes * Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: libhfs.h,v 1.7 1998/11/02 22:09:02 rob Exp $ */# include "hfs.h"# include "apple.h"extern int errno;# define ERROR(code, str)  \    do { hfs_error = (str), errno = (code); goto fail; } while (0)# ifdef DEBUG#  define ASSERT(cond)	do { if (! (cond)) abort(); } while (0)# else#  define ASSERT(cond)	/* nothing */# endif# define SIZE(type, n)		((size_t) (sizeof(type) * (n)))# define ALLOC(type, n)		((type *) malloc(SIZE(type, n)))# define ALLOCX(type, n)	((n) ? ALLOC(type, n) : (type *) 0)# define FREE(ptr)		((ptr) ? (void) free((void *) ptr) : (void) 0)# define REALLOC(ptr, type, n)  \    ((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n))))# define REALLOCX(ptr, type, n)  \    ((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0))# define BMTST(bm, num)  \    (((const byte *) (bm))[(num) >> 3]  &  (0x80 >> ((num) & 0x07)))# define BMSET(bm, num)  \          (((byte *) (bm))[(num) >> 3] |=  (0x80 >> ((num) & 0x07)))# define BMCLR(bm, num)  \          (((byte *) (bm))[(num) >> 3] &= ~(0x80 >> ((num) & 0x07)))# define STRINGIZE(x)		#x# define STR(x)			STRINGIZE(x)typedef unsigned char byte;typedef byte block[HFS_BLOCKSZ];typedef struct _bucket_ {  int flags;			/* bit flags */  unsigned int count;		/* number of times this block is requested */  unsigned long bnum;		/* logical block number */  block *data;			/* pointer to block contents */  struct _bucket_ *cnext;	/* next bucket in cache chain */  struct _bucket_ *cprev;	/* previous bucket in cache chain */  struct _bucket_ *hnext;	/* next bucket in hash chain */  struct _bucket_ **hprev;	/* previous bucket's pointer to this bucket */} bucket;# define HFS_BUCKET_INUSE	0x01# define HFS_BUCKET_DIRTY	0x02# define HFS_CACHESZ		128# define HFS_HASHSZ		32# define HFS_BLOCKBUFSZ		16typedef struct {  struct _hfsvol_ *vol;		/* volume to which cache belongs */  bucket *tail;			/* end of bucket chain */  unsigned int hits;		/* number of cache hits */  unsigned int misses;		/* number of cache misses */  bucket chain[HFS_CACHESZ];	/* cache bucket chain */  bucket *hash[HFS_HASHSZ];	/* hash table for bucket chain */  block pool[HFS_CACHESZ];	/* physical blocks in cache */} bcache;# define HFS_MAP1SZ  256# define HFS_MAPXSZ  492# define HFS_NODEREC(nd, rnum)	((nd).data + (nd).roff[rnum])# define HFS_RECLEN(nd, rnum)	((nd).roff[(rnum) + 1] - (nd).roff[rnum])# define HFS_RECKEYLEN(ptr)	(*(const byte *) (ptr))# define HFS_RECKEYSKIP(ptr)	((size_t) ((1 + HFS_RECKEYLEN(ptr) + 1) & ~1))# define HFS_RECDATA(ptr)	((ptr) + HFS_RECKEYSKIP(ptr))# define HFS_SETKEYLEN(ptr, x)	(*(byte *) (ptr) = (x))# define HFS_CATDATALEN		sizeof(CatDataRec)# define HFS_EXTDATALEN		sizeof(ExtDataRec)# define HFS_MAX_DATALEN	(HFS_CATDATALEN > HFS_EXTDATALEN ?  \				 HFS_CATDATALEN : HFS_EXTDATALEN)# define HFS_CATKEYLEN		sizeof(CatKeyRec)# define HFS_EXTKEYLEN		sizeof(ExtKeyRec)# define HFS_MAX_KEYLEN		(HFS_CATKEYLEN > HFS_EXTKEYLEN ?  \				 HFS_CATKEYLEN : HFS_EXTKEYLEN)# define HFS_MAX_CATRECLEN	(HFS_CATKEYLEN + HFS_CATDATALEN)# define HFS_MAX_EXTRECLEN	(HFS_EXTKEYLEN + HFS_EXTDATALEN)# define HFS_MAX_RECLEN		(HFS_MAX_KEYLEN + HFS_MAX_DATALEN)# define HFS_SIGWORD		0x4244# define HFS_SIGWORD_MFS	((Integer) 0xd2d7)# define HFS_ATRB_BUSY		(1 <<  6)# define HFS_ATRB_HLOCKED	(1 <<  7)# define HFS_ATRB_UMOUNTED	(1 <<  8)# define HFS_ATRB_BBSPARED	(1 <<  9)# define HFS_ATRB_BVINCONSIS	(1 << 11)# define HFS_ATRB_COPYPROT	(1 << 14)# define HFS_ATRB_SLOCKED	(1 << 15)struct _hfsfile_ {  struct _hfsvol_ *vol;		/* pointer to volume descriptor */  unsigned long parid;		/* parent directory ID of this file */  char name[HFS_MAX_FLEN + 1];	/* catalog name of this file */  CatDataRec cat;		/* catalog information */  ExtDataRec ext;		/* current extent record */  unsigned int fabn;		/* starting file allocation block number */  int fork;			/* current selected fork for I/O */  unsigned long pos;		/* current file seek pointer */  int flags;			/* bit flags */  struct _hfsfile_ *prev;  struct _hfsfile_ *next;};# define HFS_FILE_UPDATE_CATREC	0x01# define HFS_MAX_NRECS	35	/* maximum based on minimum record size */typedef struct _node_ {  struct _btree_ *bt;		/* btree to which this node belongs */  unsigned long nnum;		/* node index */  NodeDescriptor nd;		/* node descriptor */  int rnum;			/* current record index */  UInteger roff[HFS_MAX_NRECS + 1];				/* record offsets */  block data;			/* raw contents of node */} node;struct _hfsdir_ {  struct _hfsvol_ *vol;		/* associated volume */  unsigned long dirid;		/* directory ID of interest (or 0) */  node n;			/* current B*-tree node */  struct _hfsvol_ *vptr;	/* current volume pointer */  struct _hfsdir_ *prev;  struct _hfsdir_ *next;};typedef void (*keyunpackfunc)(const byte *, void *);typedef int (*keycomparefunc)(const void *, const void *);typedef struct _btree_ {  hfsfile f;			/* subset file information */  node hdrnd;			/* header node */  BTHdrRec hdr;			/* header record */  byte *map;			/* usage bitmap */  unsigned long mapsz;		/* number of bytes in bitmap */  int flags;			/* bit flags */  keyunpackfunc keyunpack;	/* key unpacking function */  keycomparefunc keycompare;	/* key comparison function */} btree;# define HFS_BT_UPDATE_HDR	0x01struct _hfsvol_ {  int os_fd;		/* OS-dependent private descriptor data */  int flags;		/* bit flags */  int pnum;		/* ordinal HFS partition number */  unsigned long vstart;	/* logical block offset to start of volume */  unsigned long vlen;	/* number of logical blocks in volume */  unsigned int lpa;	/* number of logical blocks per allocation block */  bcache *cache;	/* cache of recently used blocks */  MDB mdb;		/* master directory block */  block *vbm;		/* volume bitmap */  unsigned short vbmsz;	/* number of blocks in bitmap */  btree ext;		/* B*-tree control block for extents overflow file */  btree cat;		/* B*-tree control block for catalog file */  unsigned long cwd;	/* directory id of current working directory */  int refs;		/* number of external references to this volume */  hfsfile *files;	/* list of open files */  hfsdir *dirs;		/* list of open directories */  struct _hfsvol_ *prev;  struct _hfsvol_ *next;};# define HFS_VOL_OPEN		0x0001# define HFS_VOL_MOUNTED	0x0002# define HFS_VOL_READONLY	0x0004# define HFS_VOL_USINGCACHE	0x0008# define HFS_VOL_UPDATE_MDB	0x0010# define HFS_VOL_UPDATE_ALTMDB	0x0020# define HFS_VOL_UPDATE_VBM	0x0040# define HFS_VOL_OPT_MASK	0xff00extern hfsvol *hfs_mounts;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -