-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathruntime.c
More file actions
120 lines (110 loc) · 2.57 KB
/
runtime.c
File metadata and controls
120 lines (110 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdlib.h>
#include <stdarg.h>
#include "codegen.h"
#define ALLOC(p, t) p = (t*)malloc(sizeof(t)); if(!p) return NULL;
#define ALLOCN(p, n) p = (char*)malloc(n); if(!p) return NULL;
int *ialloc(int n) {
return (int*)malloc(n * sizeof(int));
}
void ifree(int *arr) {
free(arr);
}
void *carralloc_helper(int dim, IntListNode *sizes) {
void *ptr;
if(sizes) {
int elem_size = ( dim > 0 ) ? SIZE_P : SIZE_CHAR;
ALLOCN(ptr, sizes->n * elem_size);
if(sizes->next) {
void **ptr2;
int i;
ptr2 = (void**)ptr;
for(i = 0; i < sizes->n; i++)
ptr2[i] = carralloc_helper(dim - 1, sizes->next);
}
}
return ptr;
}
void arrfree_helper(void *ptr, IntListNode *sizes) {
if(sizes) {
if(sizes->next) {
void **ptr2;
int i;
ptr2 = (void**)ptr;
for(i = 0; i < sizes->n; i++)
arrfree_helper(ptr2[i], sizes->next);
}
}
free(ptr);
}
void *iarralloc_helper(int dim, IntListNode *sizes) {
void *ptr;
if(sizes) {
int elem_size = ( dim > 0 ) ? SIZE_P : SIZE_INT;
ALLOCN(ptr, sizes->n * elem_size);
if(sizes->next) {
void **ptr2;
int i;
ptr2 = (void**)ptr;
for(i = 0; i < sizes->n; i++)
ptr2[i] = iarralloc_helper(dim - 1, sizes->next);
}
}
return ptr;
}
void *iarralloc(int dim, int nsizes, ...) {
va_list sizes;
IntListNode *lsizes, *list;
va_start(sizes, nsizes);
ALLOC(lsizes, IntListNode);
lsizes->n = va_arg(sizes, int);
lsizes->next = NULL;
list = lsizes;
nsizes--;
while(nsizes) {
ALLOC(list->next, IntListNode);
list = list->next;
list->n = va_arg(sizes, int);
list->next = NULL;
nsizes--;
}
va_end(sizes);
return iarralloc_helper(dim, lsizes);
}
void *carralloc(int dim, int nsizes, ...) {
va_list sizes;
IntListNode *lsizes, *list;
va_start(sizes, nsizes);
ALLOC(lsizes, IntListNode);
lsizes->n = va_arg(sizes, int);
lsizes->next = NULL;
list = lsizes;
nsizes--;
while(nsizes) {
ALLOC(list->next, IntListNode);
list = list->next;
list->n = va_arg(sizes, int);
list->next = NULL;
nsizes--;
}
va_end(sizes);
return iarralloc_helper(dim, lsizes);
}
void* arrfree(void *ptr, int nsizes, ...) {
va_list sizes;
IntListNode *lsizes, *list;
va_start(sizes, nsizes);
ALLOC(lsizes, IntListNode);
lsizes->n = va_arg(sizes, int);
lsizes->next = NULL;
list = lsizes;
nsizes--;
while(nsizes) {
ALLOC(list->next, IntListNode);
list = list->next;
list->n = va_arg(sizes, int);
list->next = NULL;
nsizes--;
}
va_end(sizes);
arrfree_helper(ptr, lsizes);
}