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

// The tar package implements access to tar archives.
// It aims to cover most of the variations, including those produced
// by GNU and BSD tars.
//
// References:
//   http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5
//   http://www.gnu.org/software/tar/manual/html_node/Standard.html
package tar

const (
	blockSize	= 512;

	// Types
	TypeReg			= '0';
	TypeRegA		= '\x00';
	TypeLink		= '1';
	TypeSymlink		= '2';
	TypeChar		= '3';
	TypeBlock		= '4';
	TypeDir			= '5';
	TypeFifo		= '6';
	TypeCont		= '7';
	TypeXHeader		= 'x';
	TypeXGlobalHeader	= 'g';
)

// A Header represents a single header in a tar archive.
// Some fields may not be populated.
type Header struct {
	Name		string;
	Mode		int64;
	Uid		int64;
	Gid		int64;
	Size		int64;
	Mtime		int64;
	Typeflag	byte;
	Linkname	string;
	Uname		string;
	Gname		string;
	Devmajor	int64;
	Devminor	int64;
	Atime		int64;
	Ctime		int64;
}

var zeroBlock = make([]byte, blockSize)

// POSIX specifies a sum of the unsigned byte values, but the Sun tar uses signed byte values.
// We compute and return both.
func checksum(header []byte) (unsigned int64, signed int64) {
	for i := 0; i < len(header); i++ {
		if i == 148 {
			// The chksum field (header[148:156]) is special: it should be treated as space bytes.
			unsigned += ' ' * 8;
			signed += ' ' * 8;
			i += 7;
			continue;
		}
		unsigned += int64(header[i]);
		signed += int64(int8(header[i]));
	}
	return;
}

type slicer []byte

func (sp *slicer) next(n int) (b []byte) {
	s := *sp;
	b, *sp = s[0:n], s[n:len(s)];
	return;
}
