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
 	rpn_if_default_data_t *data;
7
 	rpn_if_default_data_t *data;
8
 	rpn_value_t *values;
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
 	switch(data->pos_flag)
12
 	switch(data->pos_flag)
13
 	{
13
 	{
24
 			cur_arg = *(data->size_lim);
24
 			cur_arg = *(data->size_lim);
25
 			break;
25
 			break;
26
 	}
26
 	}
27
-	if(cur_arg > rif->params.rpn_argc)
27
+	if(cur_arg > rif->params->rpn_argc)
28
 	{
28
 	{
29
 		/* Too many arguments for given rif !! */
29
 		/* Too many arguments for given rif !! */
30
 		return -1;
30
 		return -1;
50
 			}
50
 			}
51
 			break;
51
 			break;
52
 		case RPN_IF_RES_XFUN:
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
 				args[cur_arg+i] = values[i];
55
 				args[cur_arg+i] = values[i];
56
 			}
56
 			}
62
 	return -1;
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
 	rpn_if_default_data_t *data;
67
 	rpn_if_default_data_t *data;
68
 	size_t cur_arg, i, rgb_imax;
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
 	switch(data->pos_flag)
73
 	switch(data->pos_flag)
73
 	{
74
 	{
74
 		case RPN_IF_POSITION_LINEAR:
75
 		case RPN_IF_POSITION_LINEAR:
75
-			rpn_if_resf_linear(rif, pos, data);
76
+			rpn_if_resf_linear(rif, pos, res);
76
 			cur_arg = 1;
77
 			cur_arg = 1;
77
 			break;
78
 			break;
78
 		case RPN_IF_POSITION_XY:
79
 		case RPN_IF_POSITION_XY:
79
-			rpn_if_resf_xy(rif, pos, data);
80
+			rpn_if_resf_xy(rif, pos, res);
80
 			cur_arg = 2;
81
 			cur_arg = 2;
81
 			break;
82
 			break;
82
 		case RPN_IF_POSITION_XDIM:
83
 		case RPN_IF_POSITION_XDIM:
83
-			rpn_if_resf_xdim(rif, pos, data);
84
+			rpn_if_resf_xdim(rif, pos, res);
84
 			cur_arg = *(data->size_lim);
85
 			cur_arg = *(data->size_lim);
85
 			break;
86
 			break;
86
 	}
87
 	}
87
-	if(cur_arg > rif->params.rpn_argc)
88
+	if(cur_arg > rif->params->rpn_argc)
88
 	{
89
 	{
89
 		/** LOG ERROR ! should never append... */
90
 		/** LOG ERROR ! should never append... */
90
 		return -1;
91
 		return -1;
91
 	}
92
 	}
92
 	rgb_imax = 3; /* rgba */
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
 		case RPN_IF_RES_BOOL:
98
 		case RPN_IF_RES_BOOL:
97
 			*values = 1;
99
 			*values = 1;
102
 			break;
104
 			break;
103
 
105
 
104
 		case RPN_IF_RES_COUNT:
106
 		case RPN_IF_RES_COUNT:
105
-			*values++;
106
-			beak;
107
+			(*values)++;
108
+			break;
107
 
109
 
108
 		case RPN_IF_RES_CONST_RGBA:
110
 		case RPN_IF_RES_CONST_RGBA:
109
 			rgb_imax = 4;
111
 			rgb_imax = 4;
110
-		case RPN_IF_RES_CONST_RGB:
112
+		//case RPN_IF_RES_CONST_RGB:
111
 			for(i=0;i<rgb_imax;i++)
113
 			for(i=0;i<rgb_imax;i++)
112
 			{
114
 			{
113
 				values[i] = data->const_val[i];
115
 				values[i] = data->const_val[i];
124
 			break;
126
 			break;
125
 
127
 
126
 		case RPN_IF_RES_XFUN:
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
 				values[i] = rif->rpn_res[cur_arg+i];
131
 				values[i] = rif->rpn_res[cur_arg+i];
130
 			}
132
 			}
134
 			/* LOG ERROR */
136
 			/* LOG ERROR */
135
 			return -1;
137
 			return -1;
136
 	}
138
 	}
139
+	return 0;
137
 }
140
 }
138
 
141
 
139
 int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
142
 int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
140
 {
143
 {
141
 	rpn_if_default_data_t *data;
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
 	if(data->size_lim && pos >= *data->size_lim)
146
 	if(data->size_lim && pos >= *data->size_lim)
144
 	{
147
 	{
145
 		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
148
 		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
156
 {
159
 {
157
 	rpn_if_default_data_t *data;
160
 	rpn_if_default_data_t *data;
158
 	size_t res;
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
 	res = rif->rpn_res[0];
163
 	res = rif->rpn_res[0];
161
 	if(data->size_lim && res >= *data->size_lim)
164
 	if(data->size_lim && res >= *data->size_lim)
162
 	{
165
 	{
174
 {
177
 {
175
 	rpn_if_default_data_t *data;
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
 	if(!data->size_lim)
181
 	if(!data->size_lim)
179
 	{
182
 	{
180
 		return -1;
183
 		return -1;
197
 	rpn_if_default_data_t *data;
200
 	rpn_if_default_data_t *data;
198
 	size_t xy[2];
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
 	xy[0] = rif->rpn_res[0];
205
 	xy[0] = rif->rpn_res[0];
203
 	xy[1] = rif->rpn_res[1];
206
 	xy[1] = rif->rpn_res[1];
225
 	rpn_if_default_data_t *data;
228
 	rpn_if_default_data_t *data;
226
 	size_t i, curdim_sz, curpos;
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
 	if(!data->size_lim)
233
 	if(!data->size_lim)
231
 	{
234
 	{
262
 	rpn_if_default_data_t *data;
265
 	rpn_if_default_data_t *data;
263
 	size_t i, res, cur, curlim, prevlim;
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
 	res = 0;
269
 	res = 0;
267
 	
270
 	
268
 	if(!data->size_lim)
271
 	if(!data->size_lim)

+ 97
- 0
rpn_ifs.c View File

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