|
Revision 11387, 1.3 kB
(checked in by mokehehe, 5 years ago)
|
|
スタックベースに乗せ換え
|
| Line | |
|---|
| 1 | //=============================================================================
|
|---|
| 2 | /// S ������/**
|
|---|
| 3 | mallloc �Ŋm�ۂ����A�h���X�͂S�̔{���Ɖ���*/
|
|---|
| 4 | //=============================================================================
|
|---|
| 5 |
|
|---|
| 6 | #include "svect.h"
|
|---|
| 7 | #include "inner.h"
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 | SExp make_vector(int size) {
|
|---|
| 11 | if (size <= 0)
|
|---|
| 12 | return nil;
|
|---|
| 13 |
|
|---|
| 14 | unsigned int n = size;
|
|---|
| 15 | SVector* p = (SVector*)salloc(sizeof(SVector) + sizeof(SExp) * (n - 1), FALSE);
|
|---|
| 16 | p->type = tVect;
|
|---|
| 17 | p->size = n;
|
|---|
| 18 | for (unsigned int i=0; i<n; ++i) {
|
|---|
| 19 | p->buf[i] = nil;
|
|---|
| 20 | }
|
|---|
| 21 |
|
|---|
| 22 | SExp s;
|
|---|
| 23 | s.ptr = (SExpExtU*)p;
|
|---|
| 24 | return s;
|
|---|
| 25 | }
|
|---|
| 26 |
|
|---|
| 27 | void vector_set(SExp v, int i, SExp val) {
|
|---|
| 28 | type_check(v, tVect);
|
|---|
| 29 | SVector* p = (SVector*)v.ptr;
|
|---|
| 30 | unsigned int idx = i;
|
|---|
| 31 | if (idx < p->size) {
|
|---|
| 32 | p->buf[idx] = val;
|
|---|
| 33 | }
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | SExp vector_ref(SExp v, int i) {
|
|---|
| 37 | type_check(v, tVect);
|
|---|
| 38 | SVector* p = (SVector*)v.ptr;
|
|---|
| 39 | unsigned int idx = i;
|
|---|
| 40 | if (idx < p->size) {
|
|---|
| 41 | return p->buf[idx];
|
|---|
| 42 | } else {
|
|---|
| 43 | return nil;
|
|---|
| 44 | }
|
|---|
| 45 | }
|
|---|
| 46 |
|
|---|
| 47 | int vector_length(SExp v) {
|
|---|
| 48 | type_check(v, tVect);
|
|---|
| 49 | SVector* p = (SVector*)v.ptr;
|
|---|
| 50 | return p->size;
|
|---|
| 51 | }
|
|---|
| 52 |
|
|---|
| 53 |
|
|---|
| 54 | void print_vector(SExp v) {
|
|---|
| 55 | type_check(v, tVect);
|
|---|
| 56 | SVector* p = (SVector*)v.ptr;
|
|---|
| 57 |
|
|---|
| 58 | printf("#(");
|
|---|
| 59 | unsigned int n = p->size;
|
|---|
| 60 | for (unsigned int i = 0; i < n; ++i) {
|
|---|
| 61 | print_rec(p->buf[i]);
|
|---|
| 62 | }
|
|---|
| 63 | printf(")");
|
|---|
| 64 | }
|
|---|