// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Mach-O header data structures
// http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html

package macho

import "strconv"

// A FileHeader represents a Mach-O file header.
type FileHeader struct {
	Magic	uint32;
	Cpu	Cpu;
	SubCpu	uint32;
	Type	Type;
	Ncmd	uint32;
	Cmdsz	uint32;
	Flags	uint32;
}

const (
	fileHeaderSize32	= 7 * 4;
	fileHeaderSize64	= 8 * 4;
)

const (
	Magic32	uint32	= 0xfeedface;
	Magic64	uint32	= 0xfeedfacf;
)

// A Type is a Mach-O file type, either an object or an executable.
type Type uint32

const (
	TypeObj		Type	= 1;
	TypeExec	Type	= 2;
)

// A Cpu is a Mach-O cpu type.
type Cpu uint32

const (
	Cpu386		Cpu	= 7;
	CpuAmd64	Cpu	= Cpu386 + 1<<24;
)

var cpuStrings = []intName{
	intName{uint32(Cpu386), "Cpu386"},
	intName{uint32(CpuAmd64), "CpuAmd64"},
}

func (i Cpu) String() string	{ return stringName(uint32(i), cpuStrings, false) }
func (i Cpu) GoString() string	{ return stringName(uint32(i), cpuStrings, true) }

// A LoadCmd is a Mach-O load command.
type LoadCmd uint32

const (
	LoadCmdSegment		LoadCmd	= 1;
	LoadCmdSegment64	LoadCmd	= 25;
	LoadCmdThread		LoadCmd	= 4;
	LoadCmdUnixThread	LoadCmd	= 5;	// thread+stack
)

var cmdStrings = []intName{
	intName{uint32(LoadCmdSegment), "LoadCmdSegment"},
	intName{uint32(LoadCmdSegment64), "LoadCmdSegment64"},
	intName{uint32(LoadCmdThread), "LoadCmdThread"},
	intName{uint32(LoadCmdUnixThread), "LoadCmdUnixThread"},
}

func (i LoadCmd) String() string	{ return stringName(uint32(i), cmdStrings, false) }
func (i LoadCmd) GoString() string	{ return stringName(uint32(i), cmdStrings, true) }

// A Segment64 is a 64-bit Mach-O segment load command.
type Segment64 struct {
	Cmd	LoadCmd;
	Len	uint32;
	Name	[16]byte;
	Addr	uint64;
	Memsz	uint64;
	Offset	uint64;
	Filesz	uint64;
	Maxprot	uint32;
	Prot	uint32;
	Nsect	uint32;
	Flag	uint32;
}

// A Segment32 is a 32-bit Mach-O segment load command.
type Segment32 struct {
	Cmd	LoadCmd;
	Len	uint32;
	Name	[16]byte;
	Addr	uint32;
	Memsz	uint32;
	Offset	uint32;
	Filesz	uint32;
	Maxprot	uint32;
	Prot	uint32;
	Nsect	uint32;
	Flag	uint32;
}

// A Section32 is a 32-bit Mach-O section header.
type Section32 struct {
	Name		[16]byte;
	Seg		[16]byte;
	Addr		uint32;
	Size		uint32;
	Offset		uint32;
	Align		uint32;
	Reloff		uint32;
	Nreloc		uint32;
	Flags		uint32;
	Reserve1	uint32;
	Reserve2	uint32;
}

// A Section32 is a 64-bit Mach-O section header.
type Section64 struct {
	Name		[16]byte;
	Seg		[16]byte;
	Addr		uint64;
	Size		uint64;
	Offset		uint32;
	Align		uint32;
	Reloff		uint32;
	Nreloc		uint32;
	Flags		uint32;
	Reserve1	uint32;
	Reserve2	uint32;
	Reserve3	uint32;
}

// A Thread is a Mach-O thread state command.
type Thread struct {
	Cmd	LoadCmd;
	Len	uint32;
	Type	uint32;
	Data	[]uint32;
}

// Regs386 is the Mach-O 386 register structure.
type Regs386 struct {
	AX	uint32;
	BX	uint32;
	CX	uint32;
	DX	uint32;
	DI	uint32;
	SI	uint32;
	BP	uint32;
	SP	uint32;
	SS	uint32;
	FLAGS	uint32;
	IP	uint32;
	CS	uint32;
	DS	uint32;
	ES	uint32;
	FS	uint32;
	GS	uint32;
}

// RegsAMD64 is the Mach-O AMD64 register structure.
type RegsAMD64 struct {
	AX	uint64;
	BX	uint64;
	CX	uint64;
	DX	uint64;
	DI	uint64;
	SI	uint64;
	BP	uint64;
	SP	uint64;
	R8	uint64;
	R9	uint64;
	R10	uint64;
	R11	uint64;
	R12	uint64;
	R13	uint64;
	R14	uint64;
	R15	uint64;
	IP	uint64;
	FLAGS	uint64;
	CS	uint64;
	FS	uint64;
	GS	uint64;
}

type intName struct {
	i	uint32;
	s	string;
}

func stringName(i uint32, names []intName, goSyntax bool) string {
	for _, n := range names {
		if n.i == i {
			if goSyntax {
				return "macho." + n.s
			}
			return n.s;
		}
	}
	return strconv.Uitoa64(uint64(i));
}

func flagName(i uint32, names []intName, goSyntax bool) string {
	s := "";
	for _, n := range names {
		if n.i&i == n.i {
			if len(s) > 0 {
				s += "+"
			}
			if goSyntax {
				s += "macho."
			}
			s += n.s;
			i -= n.i;
		}
	}
	if len(s) == 0 {
		return "0x" + strconv.Uitob64(uint64(i), 16)
	}
	if i != 0 {
		s += "+0x" + strconv.Uitob64(uint64(i), 16)
	}
	return s;
}
