// 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;
}
