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

#include "runtime.h"

static	int32	debug	= 0;

// newarray(nel int, cap int, width int) (ary []any);
void
sys·newarray(uint32 nel, uint32 cap, uint32 width, Array ret)
{
	uint64 size;

	if(cap < nel)
		cap = nel;
	size = cap*width;

	ret.nel = nel;
	ret.cap = cap;
	ret.array = mal(size);

	FLUSH(&ret);

	if(debug) {
		prints("newarray: nel=");
		sys·printint(nel);
		prints("; cap=");
		sys·printint(cap);
		prints("; width=");
		sys·printint(width);
		prints("; ret=");
		sys·printarray(ret);
		prints("\n");
	}
}

static void
throwslice(uint32 lb, uint32 hb, uint32 n)
{
	prints("slice[");
	sys·printint(lb);
	prints(":");
	sys·printint(hb);
	prints("] of [");
	sys·printint(n);
	prints("] array\n");
	throw("array slice");
}

// arraysliced(old []any, lb int, hb int, width int) (ary []any);
void
sys·arraysliced(Array old, uint32 lb, uint32 hb, uint32 width, Array ret)
{

	if(hb > old.cap || lb > hb) {
		if(debug) {
			prints("sys·arraysliced: old=");
			sys·printarray(old);
			prints("; lb=");
			sys·printint(lb);
			prints("; hb=");
			sys·printint(hb);
			prints("; width=");
			sys·printint(width);
			prints("\n");

			prints("oldarray: nel=");
			sys·printint(old.nel);
			prints("; cap=");
			sys·printint(old.cap);
			prints("\n");
		}
		throwslice(lb, hb, old.cap);
	}

	// new array is inside old array
	ret.nel = hb-lb;
	ret.cap = old.cap - lb;
	ret.array = old.array + lb*width;

	FLUSH(&ret);

	if(debug) {
		prints("sys·arraysliced: old=");
		sys·printarray(old);
		prints("; lb=");
		sys·printint(lb);
		prints("; hb=");
		sys·printint(hb);
		prints("; width=");
		sys·printint(width);
		prints("; ret=");
		sys·printarray(ret);
		prints("\n");
	}
}

// arrayslices(old *any, nel int, lb int, hb int, width int) (ary []any);
void
sys·arrayslices(byte* old, uint32 nel, uint32 lb, uint32 hb, uint32 width, Array ret)
{

	if(hb > nel || lb > hb) {
		if(debug) {
			prints("sys·arrayslices: old=");
			sys·printpointer(old);
			prints("; nel=");
			sys·printint(nel);
			prints("; lb=");
			sys·printint(lb);
			prints("; hb=");
			sys·printint(hb);
			prints("; width=");
			sys·printint(width);
			prints("\n");
		}
		throwslice(lb, hb, nel);
	}

	// new array is inside old array
	ret.nel = hb-lb;
	ret.cap = nel-lb;
	ret.array = old + lb*width;

	FLUSH(&ret);

	if(debug) {
		prints("sys·arrayslices: old=");
		sys·printpointer(old);
		prints("; nel=");
		sys·printint(nel);
		prints("; lb=");
		sys·printint(lb);
		prints("; hb=");
		sys·printint(hb);
		prints("; width=");
		sys·printint(width);
		prints("; ret=");
		sys·printarray(ret);
		prints("\n");
	}
}

// arrays2d(old *any, nel int) (ary []any)
void
sys·arrays2d(byte* old, uint32 nel, Array ret)
{

	// new dope to old array
	ret.nel = nel;
	ret.cap = nel;
	ret.array = old;

	FLUSH(&ret);

	if(debug) {
		prints("sys·arrays2d: old=");
		sys·printpointer(old);
		prints("; ret=");
		sys·printarray(ret);
		prints("\n");
	}
}

void
sys·printarray(Array a)
{
	prints("[");
	sys·printint(a.nel);
	prints("/");
	sys·printint(a.cap);
	prints("]");
	sys·printpointer(a.array);
}
