Browse Source

Bugfix & enhancement in rpn_if

Yann Weber 1 year ago
parent
commit
5d0f8519fd
5 changed files with 103 additions and 18 deletions
  1. 3
    2
      rpn_if.c
  2. 2
    1
      rpn_if.h
  3. 77
    12
      rpn_if_default.c
  4. 18
    3
      rpn_if_default.h
  5. 3
    0
      rpn_lib.h

+ 3
- 2
rpn_if.c View File

@@ -46,7 +46,8 @@ rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_value_t *memmap)
46 46
 	else
47 47
 	{
48 48
 		res->self_mem = 1;
49
-		res->mem = mmap(NULL, params->mem_sz, PROT_READ|PROT_WRITE,
49
+		res->mem = mmap(NULL, params->mem_sz * params->value_sz,
50
+			PROT_READ|PROT_WRITE,
50 51
 			MAP_ANON | MAP_PRIVATE, -1, 0);
51 52
 		if(res->mem == (void*)-1)
52 53
 		{
@@ -72,7 +73,7 @@ rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_value_t *memmap)
72 73
 	}
73 74
 	res->rpn_args = &(res->rpn_res[params->rpn_sz]);
74 75
 
75
-	res->rpn = malloc(sizeof(rpn_expr_t*) * params->rpn_sz);
76
+	res->rpn = malloc(sizeof(rpn_expr_t) * params->rpn_sz);
76 77
 	if(!res->rpn)
77 78
 	{
78 79
 		#if DEBUG

+ 2
- 1
rpn_if.h View File

@@ -52,7 +52,8 @@ struct rpn_if_param_s
52 52
 {
53 53
 	/**@brief Memory map size in items */
54 54
 	size_t mem_sz;
55
-	/**@brief Size of a memory item */
55
+	/**@brief Size of a memory item in bytes (should be a multiple of
56
+	   sizeof(rpn_value_t))*/
56 57
 	size_t value_sz;
57 58
 	/**@brief RPN expression count */
58 59
 	size_t rpn_sz;

+ 77
- 12
rpn_if_default.c View File

@@ -5,19 +5,22 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
5 5
 {
6 6
 	rpn_if_param_t *res;
7 7
 	rpn_if_default_data_t *data;
8
-	size_t lim_sz, const_val_sz, param_sz, rpn_sz, mem_sz, argc, i;
8
+	size_t lim_sz, const_val_sz, param_sz, rpn_sz, mem_sz, ndim, value_sz, argc, i;
9 9
 
10 10
 	// Calculating full params + default_data + size_lim + const_val size
11
+	short lim_off = 0;
11 12
 	switch(pos_flag)
12 13
 	{
13 14
 		case RPN_IF_POSITION_LINEAR:
14
-			lim_sz = 1;
15
+			ndim = lim_sz = 1;
15 16
 			break;
16 17
 		case RPN_IF_POSITION_XY:
17
-			lim_sz = 2;
18
+			ndim = lim_sz = 2;
18 19
 			break;
19 20
 		case RPN_IF_POSITION_XDIM:
20
-			lim_sz = *lim;
21
+			ndim = lim_sz = *lim;
22
+			lim_sz++;
23
+			lim_off = 1;
21 24
 			break;
22 25
 		default:
23 26
 			fprintf(stderr,
@@ -26,11 +29,11 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
26 29
 			return NULL;
27 30
 	}
28 31
 	mem_sz = 1;
29
-	for(i=1;i<lim_sz;i++)
32
+	for(i=0;i<ndim;i++)
30 33
 	{
31
-		mem_sz *= lim[i];
34
+		mem_sz *= lim[i+lim_off];
32 35
 	}
33
-	argc = rpn_sz = lim_sz;
36
+	argc = rpn_sz = ndim;
34 37
 	lim_sz *= sizeof(size_t);
35 38
 
36 39
 	const_val_sz = 0;
@@ -39,29 +42,42 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
39 42
 		case RPN_IF_RES_BOOL:
40 43
 			rpn_sz += 1;
41 44
 			argc += 1;
45
+			value_sz = sizeof(rpn_value_t);
42 46
 			break;
43 47
 		case RPN_IF_RES_COUNT:
44 48
 			argc += 1;
49
+			value_sz = sizeof(rpn_value_t);
45 50
 			break;
46 51
 		case RPN_IF_RES_XFUN:
47 52
 			rpn_sz += 1;
48 53
 			argc += 1;
54
+			value_sz = sizeof(rpn_value_t);
49 55
 			break;
50 56
 		case RPN_IF_RES_RGB:
51 57
 			rpn_sz += 3;
52 58
 			argc += 3;
59
+			value_sz = sizeof(rpn_value_t) * 3;
53 60
 			break;
54 61
 		case RPN_IF_RES_RGBA:
55 62
 			rpn_sz += 4;
56 63
 			argc += 4;
64
+			value_sz = sizeof(rpn_value_t) * 4;
57 65
 			break;
58 66
 		case RPN_IF_RES_CONST:
59 67
 			const_val_sz = 1;
60 68
 			argc += 1;
69
+			value_sz = sizeof(rpn_value_t);
61 70
 			break;
71
+		/*
72
+		case RPN_IF_RES_CONST_RGB:
73
+			const_val_sz = 3;
74
+			argc += 3;
75
+			break;
76
+		*/
62 77
 		case RPN_IF_RES_CONST_RGBA:
63 78
 			const_val_sz = 4;
64 79
 			argc += 4;
80
+			value_sz = sizeof(rpn_value_t) * 4;
65 81
 			break;
66 82
 		default:
67 83
 			fprintf(stderr,
@@ -93,14 +109,16 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
93 109
 	}
94 110
 	res->data = data = (rpn_if_default_data_t*)(&(res[1]));
95 111
 
96
-	data->size_lim = (size_t*)&(data[1]);
97 112
 	data->pos_flag = pos_flag;
98 113
 	data->res_flag = res_flag;
114
+	data->ndim = ndim;
115
+	data->size_lim = (size_t*)&(data[1]);
116
+	data->const_val = ((void*)data->size_lim) + lim_sz;
99 117
 
100 118
 	memcpy(data->size_lim, lim, lim_sz);
119
+
101 120
 	if(const_val_sz)
102 121
 	{
103
-		data->const_val = (rpn_value_t*)(&(data->size_lim[1]));
104 122
 		memcpy(data->const_val, val, const_val_sz);
105 123
 	}
106 124
 	else
@@ -113,13 +131,60 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
113 131
 
114 132
 	res->rpn_argc = argc;
115 133
 	res->rpn_stack_sz = rpn_stack_sz;
116
-	res->value_sz = 1; /* @TODO set res->value_sz with a good value.. */
117
-	res->mem_sz = mem_sz * res->value_sz;
134
+	res->value_sz = value_sz;
135
+	res->mem_sz = mem_sz;
118 136
 	res->rpn_sz = rpn_sz;
119 137
 
120 138
 	return res;
121 139
 }
122 140
 
141
+int rpn_if_sizes_from_flag(short pos_flag, short res_flag, short sizes[2])
142
+{
143
+	short *lim_sz = &sizes[0];
144
+	short *const_sz = &sizes[1];
145
+
146
+	*lim_sz = *const_sz = -1;
147
+
148
+	switch(pos_flag)
149
+	{
150
+		case RPN_IF_POSITION_LINEAR:
151
+			*lim_sz = 1;
152
+			break;
153
+		case RPN_IF_POSITION_XY:
154
+			*lim_sz = 2;
155
+			break;
156
+		case RPN_IF_POSITION_XDIM:
157
+			*lim_sz = 1;
158
+			break;
159
+		default:
160
+			return -1;
161
+	}
162
+	switch(res_flag)
163
+	{
164
+		case RPN_IF_RES_CONST:
165
+			*const_sz = 1;
166
+			break;
167
+		/*
168
+		case RPN_IF_RES_CONST_RGB:
169
+			*const_sz = 3;
170
+			break;
171
+		*/
172
+		case RPN_IF_RES_CONST_RGBA:
173
+			*const_sz = 4;
174
+			break;
175
+		case RPN_IF_RES_BOOL:
176
+		case RPN_IF_RES_COUNT:
177
+		case RPN_IF_RES_XFUN:
178
+		case RPN_IF_RES_RGB:
179
+		case RPN_IF_RES_RGBA:
180
+			*const_sz = 0;
181
+			break;
182
+		default:
183
+			return -1;
184
+	}
185
+	return 0;
186
+}
187
+
123 188
 int rpn_if_getarg_default(rpn_if_t *rif, size_t pos)
124 189
 {
125 190
 	size_t cur_arg, i, rgb_imax;
@@ -215,7 +280,7 @@ int rpn_if_setres_default(rpn_if_t *rif, size_t *pos)
215 280
 		/** LOG ERROR ! should never append... */
216 281
 		return -1;
217 282
 	}
218
-	rgb_imax = 3; /* rgba */
283
+	rgb_imax = 3; /* rgb */
219 284
 	values = rpn_if_getitem(rif, *pos);
220 285
 	/**@todo if(res) set the values in res too ! */
221 286
 	switch(data->res_flag)

+ 18
- 3
rpn_if_default.h View File

@@ -81,7 +81,10 @@ struct rpn_if_default_data_s
81 81
 	 */
82 82
 	size_t *size_lim;
83 83
 
84
-	/**@brief Store constant values to set mem giver res_flag
84
+	/** Number of dimention (if XDIM ndim = len(size_lim)-1) */
85
+	size_t ndim;
86
+
87
+	/**@brief Store constant values to set mem given res_flag
85 88
 	 * - For @ref RPN_IF_RES_CONST const_val points on a single value
86 89
 	 * - For @ref RPN_IF_RES_CONST_RGBA const_val points on 4 values
87 90
 	 * - Else const_val is set to NULL
@@ -94,8 +97,8 @@ struct rpn_if_default_data_s
94 97
  *
95 98
  * @param pos_flag Binary OR combination of RPN_IF_POSITION_*
96 99
  *     (@ref ifs_if_default_posflag )
97
- * @param pos_flag Binary OR combination of RPN_IF_RES_*
98
- *     (@ref ifs_if_default_posflag )
100
+ * @param res_flag Binary OR combination of RPN_IF_RES_*
101
+ *     (@ref ifs_if_default_resflag )
99 102
  * @param lim Depends on pos_flag parameter (
100 103
  *	see @ref rpn_if_default_data_s::size_lim )
101 104
  * @param val Depends on res_flag parameter (
@@ -106,6 +109,18 @@ struct rpn_if_default_data_s
106 109
 rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
107 110
 	const size_t *lim, const rpn_value_t *val, unsigned char rpn_stack_sz);
108 111
 
112
+/** Fetch size limit and const values array sizes given flag values
113
+ *  @param pos_flag (@ref ifs_if_default_posflag)
114
+ *  @param res_flag (@ref ifs_if_default_resflag)
115
+ *  @param short[2] size limit array size and constant values array size
116
+ *  @return 0 or -1 if a flag is not valid
117
+ *  @warning returns 1 for size limit when XDIM position, but actually the
118
+ *  limit is given by the 1st number in the limit (example : [2,640,480],
119
+ *  [3,16,640,480], ...)
120
+ *  @todo replace short by int for sizes
121
+ */
122
+int rpn_if_sizes_from_flag(short pos_flag, short res_flag, short sizes[2]);
123
+
109 124
 /**@brief Default argf function ( see @ref rpn_if_param_s.arg_f ) */
110 125
 int rpn_if_getarg_default(rpn_if_t *rif, size_t pos);
111 126
 /**@brief Default result function ( see @ref rpn_if_param_s.res_f ) */

+ 3
- 0
rpn_lib.h View File

@@ -58,6 +58,9 @@
58 58
  * @todo use it */
59 59
 typedef unsigned long int rpn_value_t;
60 60
 
61
+#define PyLong_FromRpnValue_t PyLong_FromUnsignedLong
62
+#define PyLong_AsRpnValue_t PyLong_AsUnsignedLong
63
+
61 64
 /**@brief Function heading code
62 65
  *
63 66
  * - stack frame creation

Loading…
Cancel
Save