typedef struct Macho Macho;
typedef struct MachoCmd MachoCmd;

enum
{
	MachoCpuVax = 1,
	MachoCpu68000 = 6,
	MachoCpu386 = 7,
	MachoCpuMips = 8,
	MachoCpu98000 = 10,
	MachoCpuHppa = 11,
	MachoCpuArm = 12,
	MachoCpu88000 = 13,
	MachoCpuSparc = 14,
	MachoCpu860 = 15,
	MachoCpuAlpha = 16,
	MachoCpuPower = 18,

	MachoCmdSegment = 1,
	MachoCmdSymtab = 2,
	MachoCmdSymseg = 3,
	MachoCmdThread = 4,

	MachoFileObject = 1,
	MachoFileExecutable = 2,
	MachoFileFvmlib = 3,
	MachoFileCore = 4,
	MachoFilePreload = 5
};

struct MachoCmd
{
	int type;
	ulong off;
	ulong size;
	struct {
		char name[16+1];
		ulong vmaddr;
		ulong vmsize;
		ulong fileoff;
		ulong filesz;
		ulong maxprot;
		ulong initprot;
		ulong nsect;
		ulong flags;
	} seg;
	struct {
		ulong symoff;
		ulong nsyms;
		ulong stroff;
		ulong strsize;
	} sym;
};

struct Macho
{
	int fd;
	uint cputype;
	uint subcputype;
	ulong filetype;
	ulong flags;
	MachoCmd *cmd;
	uint ncmd;
	u32int (*e4)(uchar*);
	int (*coreregs)(Macho*, uchar**);
};

Macho *machoopen(char*);
Macho *machoinit(int);
void machoclose(Macho*);
int coreregsmachopower(Macho*, uchar**);
