Browse Source

Adds ifs function implementations (begining)

Yann Weber 4 years ago
parent
commit
61e74e7ab2
2 changed files with 121 additions and 21 deletions
  1. 24
    21
      rpn_if_default.c
  2. 97
    0
      rpn_ifs.c

+ 24
- 21
rpn_if_default.c View File

@@ -7,7 +7,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
7 7
 	rpn_if_default_data_t *data;
8 8
 	rpn_value_t *values;
9 9
 
10
-	data = (rpn_if_default_data_t*)rif->params.data;
10
+	data = (rpn_if_default_data_t*)rif->params->data;
11 11
 
12 12
 	switch(data->pos_flag)
13 13
 	{
@@ -24,7 +24,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
24 24
 			cur_arg = *(data->size_lim);
25 25
 			break;
26 26
 	}
27
-	if(cur_arg > rif->params.rpn_argc)
27
+	if(cur_arg > rif->params->rpn_argc)
28 28
 	{
29 29
 		/* Too many arguments for given rif !! */
30 30
 		return -1;
@@ -50,7 +50,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
50 50
 			}
51 51
 			break;
52 52
 		case RPN_IF_RES_XFUN:
53
-			for(i=0; i < rif->params.rpn_sz - cur_arg; i++)
53
+			for(i=0; i < rif->params->rpn_sz - cur_arg; i++)
54 54
 			{
55 55
 				args[cur_arg+i] = values[i];
56 56
 			}
@@ -62,36 +62,38 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
62 62
 	return -1;
63 63
 }
64 64
 
65
-int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data)
65
+int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *res)
66 66
 {
67 67
 	rpn_if_default_data_t *data;
68 68
 	size_t cur_arg, i, rgb_imax;
69
+	rpn_value_t *values;
69 70
 
70
-	data = (rpn_if_default_data_t*)rif->params.data;
71
+	data = (rpn_if_default_data_t*)rif->params->data;
71 72
 
72 73
 	switch(data->pos_flag)
73 74
 	{
74 75
 		case RPN_IF_POSITION_LINEAR:
75
-			rpn_if_resf_linear(rif, pos, data);
76
+			rpn_if_resf_linear(rif, pos, res);
76 77
 			cur_arg = 1;
77 78
 			break;
78 79
 		case RPN_IF_POSITION_XY:
79
-			rpn_if_resf_xy(rif, pos, data);
80
+			rpn_if_resf_xy(rif, pos, res);
80 81
 			cur_arg = 2;
81 82
 			break;
82 83
 		case RPN_IF_POSITION_XDIM:
83
-			rpn_if_resf_xdim(rif, pos, data);
84
+			rpn_if_resf_xdim(rif, pos, res);
84 85
 			cur_arg = *(data->size_lim);
85 86
 			break;
86 87
 	}
87
-	if(cur_arg > rif->params.rpn_argc)
88
+	if(cur_arg > rif->params->rpn_argc)
88 89
 	{
89 90
 		/** LOG ERROR ! should never append... */
90 91
 		return -1;
91 92
 	}
92 93
 	rgb_imax = 3; /* rgba */
93
-	values = rpn_if_getimtem(rif, pos);
94
-	siwtch(data->res-flag)
94
+	values = rpn_if_getitem(rif, *pos);
95
+	/**@todo if(res) set the values in res too ! */
96
+	switch(data->res_flag)
95 97
 	{
96 98
 		case RPN_IF_RES_BOOL:
97 99
 			*values = 1;
@@ -102,12 +104,12 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data)
102 104
 			break;
103 105
 
104 106
 		case RPN_IF_RES_COUNT:
105
-			*values++;
106
-			beak;
107
+			(*values)++;
108
+			break;
107 109
 
108 110
 		case RPN_IF_RES_CONST_RGBA:
109 111
 			rgb_imax = 4;
110
-		case RPN_IF_RES_CONST_RGB:
112
+		//case RPN_IF_RES_CONST_RGB:
111 113
 			for(i=0;i<rgb_imax;i++)
112 114
 			{
113 115
 				values[i] = data->const_val[i];
@@ -124,7 +126,7 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data)
124 126
 			break;
125 127
 
126 128
 		case RPN_IF_RES_XFUN:
127
-			for(i=0; i<rif->params.rpn_sz - cur_arg; i++)
129
+			for(i=0; i<rif->params->rpn_sz - cur_arg; i++)
128 130
 			{
129 131
 				values[i] = rif->rpn_res[cur_arg+i];
130 132
 			}
@@ -134,12 +136,13 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data)
134 136
 			/* LOG ERROR */
135 137
 			return -1;
136 138
 	}
139
+	return 0;
137 140
 }
138 141
 
139 142
 int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
140 143
 {
141 144
 	rpn_if_default_data_t *data;
142
-	data = (rpn_if_default_data_t*)rif->params.data;
145
+	data = (rpn_if_default_data_t*)rif->params->data;
143 146
 	if(data->size_lim && pos >= *data->size_lim)
144 147
 	{
145 148
 		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
@@ -156,7 +159,7 @@ int rpn_if_resf_linear(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
156 159
 {
157 160
 	rpn_if_default_data_t *data;
158 161
 	size_t res;
159
-	data = (rpn_if_default_data_t*)rif->params.data;
162
+	data = (rpn_if_default_data_t*)rif->params->data;
160 163
 	res = rif->rpn_res[0];
161 164
 	if(data->size_lim && res >= *data->size_lim)
162 165
 	{
@@ -174,7 +177,7 @@ int rpn_if_argf_xy(rpn_if_t *rif, size_t pos, rpn_value_t *args)
174 177
 {
175 178
 	rpn_if_default_data_t *data;
176 179
 
177
-	data = (rpn_if_default_data_t*)rif->params.data;
180
+	data = (rpn_if_default_data_t*)rif->params->data;
178 181
 	if(!data->size_lim)
179 182
 	{
180 183
 		return -1;
@@ -197,7 +200,7 @@ int rpn_if_resf_xy(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
197 200
 	rpn_if_default_data_t *data;
198 201
 	size_t xy[2];
199 202
 
200
-	data = (rpn_if_default_data_t*)rif->params.data;
203
+	data = (rpn_if_default_data_t*)rif->params->data;
201 204
 	
202 205
 	xy[0] = rif->rpn_res[0];
203 206
 	xy[1] = rif->rpn_res[1];
@@ -225,7 +228,7 @@ int rpn_if_argf_xdim(rpn_if_t *rif, size_t pos, rpn_value_t *args)
225 228
 	rpn_if_default_data_t *data;
226 229
 	size_t i, curdim_sz, curpos;
227 230
 
228
-	data = (rpn_if_default_data_t*)rif->params.data;
231
+	data = (rpn_if_default_data_t*)rif->params->data;
229 232
 
230 233
 	if(!data->size_lim)
231 234
 	{
@@ -262,7 +265,7 @@ int rpn_if_resf_xdim(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
262 265
 	rpn_if_default_data_t *data;
263 266
 	size_t i, res, cur, curlim, prevlim;
264 267
 
265
-	data = (rpn_if_default_data_t*)rif->params.data;
268
+	data = (rpn_if_default_data_t*)rif->params->data;
266 269
 	res = 0;
267 270
 	
268 271
 	if(!data->size_lim)

+ 97
- 0
rpn_ifs.c View File

@@ -0,0 +1,97 @@
1
+#include "rpn_ifs.h"
2
+
3
+rpn_ifs_t* rpn_ifs_new(rpn_if_param_t *params, rpn_value_t *memmap)
4
+{
5
+	rpn_ifs_t *res;
6
+	int err;
7
+
8
+	if(!(res = malloc(sizeof(rpn_ifs_t))))
9
+	{
10
+		goto error;
11
+	}
12
+	bzero(res, sizeof(rpn_ifs_t));
13
+
14
+	memcpy(&(res->params), params, sizeof(rpn_if_param_t));
15
+
16
+	if(memmap)
17
+	{
18
+		res->self_mem = 0;
19
+		res->mem = memmap;
20
+	}
21
+	else
22
+	{
23
+		res->self_mem = 1;
24
+		res->mem = mmap(NULL, params->mem_sz, PROT_READ|PROT_WRITE, MAP_ANON,
25
+			-1, 0);
26
+		if(res->mem == (void*)-1)
27
+		{
28
+			goto mmap_err;
29
+		}
30
+	}
31
+
32
+	return res;
33
+
34
+	mmap_err:
35
+		err = errno;
36
+		free(res);
37
+	error:
38
+		err = errno;
39
+		errno = err;
40
+		return NULL;
41
+}
42
+
43
+void rpn_ifs_free(rpn_ifs_t *rifs)
44
+{
45
+	while(rifs->if_sz)
46
+	{
47
+		rpn_if_free(rifs->rpn_if[--(rifs->if_sz)]);
48
+	}
49
+	if(rifs->self_mem)
50
+	{
51
+		munmap(rifs->mem, rifs->params.mem_sz);
52
+	}
53
+	if(rifs->rpn_if)
54
+	{
55
+		free(rifs->rpn_if);
56
+	}
57
+	if(rifs->weight)
58
+	{
59
+		free(rifs->weight);
60
+	}
61
+}
62
+
63
+size_t rpn_ifs_add_if(rpn_ifs_t *rifs, rpn_expr_t **exprs, unsigned int weight)
64
+{
65
+	size_t res;
66
+	void *tmp;
67
+
68
+	res = rifs->if_sz + 1;
69
+
70
+	if(!(tmp = realloc(rifs->rpn_if, sizeof(rpn_if_t*) * res)))
71
+	{
72
+		return 0;
73
+	}
74
+	rifs->rpn_if = tmp;
75
+
76
+	if(!(tmp = realloc(rifs->weight, sizeof(unsigned int) * res)))
77
+	{
78
+		return 0;
79
+	}
80
+	rifs->weight = tmp;
81
+
82
+	rifs->weight[rifs->if_sz] = weight;
83
+	//WRONG expr ARGUMENT !!!
84
+	rifs->rpn_if[rifs->if_sz] = rpn_if_new(&(rifs->params), *exprs, rifs->mem);
85
+	if(!rifs->rpn_if[rifs->if_sz])
86
+	{
87
+		return 0;
88
+	}
89
+
90
+	rifs->if_sz++;
91
+	if(rpn_ifs_weight_update(rifs) < 0)
92
+	{
93
+		rpn_ifs_del_if(rifs, res); // don't attempt to ceck for errors..
94
+		return 0;
95
+	}
96
+	return res;
97
+}

Loading…
Cancel
Save