// 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.

package proc

import (
	"os"
	"strconv"
	"syscall"
)

type _386Regs struct {
	syscall.PtraceRegs
	setter func(*syscall.PtraceRegs) os.Error
}

var names = [...]string{
	"eax",
	"ebx",
	"ecx",
	"edx",
	"esi",
	"edi",
	"ebp",
	"esp",
	"eip",
	"eflags",
	"cs",
	"ss",
	"ds",
	"es",
	"fs",
	"gs",
}

func (r *_386Regs) PC() Word { return Word(r.Eip) }

func (r *_386Regs) SetPC(val Word) os.Error {
	r.Eip = int32(val)
	return r.setter(&r.PtraceRegs)
}

func (r *_386Regs) Link() Word {
	// TODO(austin)
	panic("No link register")
}

func (r *_386Regs) SetLink(val Word) os.Error { panic("No link register") }

func (r *_386Regs) SP() Word { return Word(r.Esp) }

func (r *_386Regs) SetSP(val Word) os.Error {
	r.Esp = int32(val)
	return r.setter(&r.PtraceRegs)
}

func (r *_386Regs) Names() []string { return &names }

func (r *_386Regs) Get(i int) Word {
	switch i {
	case 0:
		return Word(uint32(r.Eax))
	case 1:
		return Word(uint32(r.Ebx))
	case 2:
		return Word(uint32(r.Ecx))
	case 3:
		return Word(uint32(r.Edx))
	case 4:
		return Word(uint32(r.Esi))
	case 5:
		return Word(uint32(r.Edi))
	case 6:
		return Word(uint32(r.Ebp))
	case 7:
		return Word(uint32(r.Esp))
	case 8:
		return Word(uint32(r.Eip))
	case 9:
		return Word(uint32(r.Eflags))
	case 10:
		return Word(r.Cs)
	case 11:
		return Word(r.Ss)
	case 12:
		return Word(r.Ds)
	case 13:
		return Word(r.Es)
	case 14:
		return Word(r.Fs)
	case 15:
		return Word(r.Gs)
	}
	panic("invalid register index " + strconv.Itoa(i))
}

func (r *_386Regs) Set(i int, val Word) os.Error {
	switch i {
	case 0:
		r.Eax = int32(val)
	case 1:
		r.Ebx = int32(val)
	case 2:
		r.Ecx = int32(val)
	case 3:
		r.Edx = int32(val)
	case 4:
		r.Esi = int32(val)
	case 5:
		r.Edi = int32(val)
	case 6:
		r.Ebp = int32(val)
	case 7:
		r.Esp = int32(val)
	case 8:
		r.Eip = int32(val)
	case 9:
		r.Eflags = int32(val)
	case 10:
		r.Cs = uint16(val)
	case 11:
		r.Ss = uint16(val)
	case 12:
		r.Ds = uint16(val)
	case 13:
		r.Es = uint16(val)
	case 14:
		r.Fs = uint16(val)
	case 15:
		r.Gs = uint16(val)
	default:
		panic("invalid register index " + strconv.Itoa(i))
	}
	return r.setter(&r.PtraceRegs)
}

func newRegs(regs *syscall.PtraceRegs, setter func(*syscall.PtraceRegs) os.Error) Regs {
	res := _386Regs{}
	res.PtraceRegs = *regs
	res.setter = setter
	return &res
}
