| // 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 uint32, cap uint32, width uint32) (ary *[]any); |
| void |
| sys·newarray(uint32 nel, uint32 cap, uint32 width, Array* ret) |
| { |
| Array *d; |
| uint64 size; |
| |
| if(cap < nel) |
| cap = nel; |
| size = cap*width; |
| |
| d = mal(sizeof(*d) - sizeof(d->b) + size); |
| d->nel = nel; |
| d->cap = cap; |
| d->array = d->b; |
| |
| ret = d; |
| FLUSH(&d); |
| |
| if(debug) { |
| prints("newarray: nel="); |
| sys·printint(nel); |
| prints("; cap="); |
| sys·printint(cap); |
| prints("; width="); |
| sys·printint(width); |
| prints("; ret="); |
| sys·printpointer(ret); |
| prints("\n"); |
| } |
| } |
| |
| // arraysliced(old *[]any, lb uint32, hb uint32, width uint32) (ary *[]any); |
| void |
| sys·arraysliced(Array* old, uint32 lb, uint32 hb, uint32 width, Array* ret) |
| { |
| Array *d; |
| |
| if(hb > old->cap || lb > hb) { |
| if(debug) { |
| prints("sys·arrayslices: old="); |
| sys·printpointer(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"); |
| } |
| throw("sys·arraysliced: new size exceeds old size"); |
| } |
| |
| // new array is inside old array |
| d = mal(sizeof(*d) - sizeof(d->b)); |
| d->nel = hb-lb; |
| d->cap = old->cap - lb; |
| d->array = old->array + lb*width; |
| |
| ret = d; |
| FLUSH(&d); |
| |
| if(debug) { |
| prints("sys·arrayslices: old="); |
| sys·printpointer(old); |
| prints("; lb="); |
| sys·printint(lb); |
| prints("; hb="); |
| sys·printint(hb); |
| prints("; width="); |
| sys·printint(width); |
| prints("; ret="); |
| sys·printpointer(ret); |
| prints("\n"); |
| } |
| } |
| |
| // arrayslices(old *any, nel uint32, lb uint32, hb uint32, width uint32) (ary *[]any); |
| void |
| sys·arrayslices(byte* old, uint32 nel, uint32 lb, uint32 hb, uint32 width, Array* ret) |
| { |
| Array *d; |
| |
| 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"); |
| } |
| throw("sys·arrayslices: new size exceeds cap"); |
| } |
| |
| // new array is inside old array |
| d = mal(sizeof(*d) - sizeof(d->b)); |
| d->nel = hb-lb; |
| d->cap = nel-lb; |
| d->array = old + lb*width; |
| |
| ret = d; |
| FLUSH(&d); |
| |
| 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·printpointer(ret); |
| prints("\n"); |
| } |
| } |
| |
| // arrays2d(old *any, nel uint32) (ary *[]any) |
| void |
| sys·arrays2d(byte* old, uint32 nel, Array* ret) |
| { |
| Array *d; |
| |
| // new dope to old array |
| d = mal(sizeof(*d) - sizeof(d->b)); |
| d->nel = nel; |
| d->cap = nel; |
| d->array = old; |
| |
| ret = d; |
| FLUSH(&d); |
| |
| if(debug) { |
| prints("sys·arrays2d: old="); |
| sys·printpointer(old); |
| prints("; nel="); |
| sys·printint(nel); |
| prints("; ret="); |
| sys·printpointer(ret); |
| prints("\n"); |
| } |
| } |