Browse Source

Continuing implementation of rpn_if, adding default if functions implementation

Yann Weber 4 years ago
parent
commit
eeac401bb3
6 changed files with 460 additions and 178 deletions
  1. 4
    1
      Makefile
  2. 1
    0
      python_rpnexpr.h
  3. 52
    84
      rpn_if.c
  4. 43
    93
      rpn_if.h
  5. 233
    0
      rpn_if_default.c
  6. 127
    0
      rpn_if_default.h

+ 4
- 1
Makefile View File

@@ -21,7 +21,7 @@ PYTHON_LDFLAGS=-shared  -fPIC `$(PYTHON_CONFIG) --libs` `$(PYTHON_CONFIG) --ldfl
21 21
 
22 22
 all: .deps pyrpn.so
23 23
 
24
-pyrpn.so: python_pyrpn.o python_rpnexpr.o rpn_lib.o rpn_jit.o rpn_parse.o rpn_mutation.o rpn_if.o
24
+pyrpn.so: python_pyrpn.o python_rpnexpr.o rpn_lib.o rpn_jit.o rpn_parse.o rpn_mutation.o rpn_if.o rpn_if_default.o
25 25
 	$(LD) $(LDFLAGS) $(PYTHON_LDFLAGS) -o $@ $^
26 26
 
27 27
 python_pyrpn.o: python_pyrpn.c python_rpnexpr.h python_rpnexpr.o rpn_jit.o
@@ -42,6 +42,9 @@ rpn_mutation.o: rpn_mutation.c rpn_mutation.h rpn_parse.o
42 42
 rpn_if.o: rpn_if.c rpn_if.h rpn_jit.o
43 43
 	$(CC) $(CFLAGS) -c $<
44 44
 
45
+rpn_if_default.o: rpn_if_default.c rpn_if_default.h rpn_if.o
46
+	$(CC) $(CFLAGS) -c $<
47
+
45 48
 rpn_lib.o: rpn_lib.asm rpn_lib.h
46 49
 	$(NASM) $(NASMCFLAGS) -o $@ $<
47 50
 

+ 1
- 0
python_rpnexpr.h View File

@@ -92,6 +92,7 @@ PyObject* rpnexpr_new(PyTypeObject *subtype, PyObject *args, PyObject* kwds);
92 92
  * @ingroup python_type
93 93
  */
94 94
 int rpnexpr_init(PyObject *self, PyObject *args, PyObject *kwds);
95
+
95 96
 /**@brief RPNExpr __del__ method 
96 97
  * @param self RPNExpr instance
97 98
  * @ingroup python_type

+ 52
- 84
rpn_if.c View File

@@ -18,81 +18,7 @@
18 18
  */
19 19
 #include "rpn_if.h"
20 20
 
21
-rpn_if_t* rpn_if_new(size_t mem_sz, rpn_if_transfo_t *if2rpn,
22
-	rpn_if_transfo_t *rpn2if, rpn_expr_t *rpn)
23
-{
24
-	rpn_if_t *res;
25
-	if(mem_sz != 0)
26
-	{
27
-		if((if2rpn->mem_sz != 0 && if2rpn->mem_sz != mem_sz) ||
28
-			(rpn2if->mem_sz != 0 && rpn2if->mem_sz != mem_sz))
29
-		{
30
-			errno = EINVAL;
31
-			return NULL;
32
-		}
33
-	}
34
-	else
35
-	{
36
-		if(if2rpn->mem_sz == 0 && rpn2if->mem_sz == 0)
37
-		{
38
-			errno = EINVAL;
39
-			return NULL;
40
-		}
41
-		if(if2rpn->mem_sz != rpn2if->mem_sz && if2rpn->mem_sz != 0 &&
42
-			rpn2if->mem_sz != 0)
43
-		{
44
-			errno = EINVAL;
45
-			return NULL;
46
-		}
47
-		mem_sz = if2rpn->mem_sz != 0?if2rpn->mem_sz:rpn2if->mem_sz;
48
-	}
49
-	if(if2rpn->data_sz != rpn2if->data_sz || if2rpn->data_sz == 0)
50
-	{
51
-		errno = EINVAL;
52
-		return NULL;
53
-	}
54
-	res = _rpn_if_new(mem_sz, if2rpn->argc, rpn2if->argc, rpn2if->data_sz);
55
-	if(!res)
56
-	{
57
-		return NULL;
58
-	}
59
-	res->if2rpn = if2rpn->if2rpn;
60
-	res->rpn2if = rpn2if->rpn2if;
61
-	res->rpn = rpn;
62
-	return res;
63
-}
64
-
65
-void rpn_if_free(rpn_if_t* rif)
66
-{
67
-	size_t i;
68
-	for(i=0; i<rif->rpn_sz; i++)
69
-	{
70
-		rpn_expr_close(&(rif->rpn[i]));
71
-	}
72
-	free(rif->rpn);
73
-	free(rif->rpn_res);
74
-	munmap(rif->mem, rif->mem_sz);
75
-	free(rif);
76
-}
77
-
78
-int rpn_if_rpn_upd(rpn_if_t *rif, rpn_tokenized_t *rpns)
79
-{
80
-	return rpn_if_rpn_upd_rng(rif, rpns, rif->rpn_sz, 0);
81
-}
82
-
83
-int rpn_if_rpn_upd_rng(rpn_if_t *rif, rpn_tokenized_t *rpns, size_t sz,
84
-	size_t offset)
85
-{
86
-	size_t i;
87
-	for(i=offset; i<offset+sz; i++)
88
-	{
89
-		/**@todo continue implementation */
90
-	}
91
-	return 0;
92
-}
93
-
94
-rpn_if_t* _rpn_if_new(size_t mem_sz, size_t rpn_argc, size_t rpn_count, size_t
95
-	value_sz)
21
+rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_expr_t *rpn)
96 22
 {
97 23
 	rpn_if_t *res;
98 24
 	int err;
@@ -103,25 +29,24 @@ rpn_if_t* _rpn_if_new(size_t mem_sz, size_t rpn_argc, size_t rpn_count, size_t
103 29
 		goto error;
104 30
 	}
105 31
 	
106
-	res->rpn_sz = rpn_count;
107
-	res->rpn_argc = rpn_argc;
108
-	res->mem_sz = mem_sz;
109
-	res->value_sz = value_sz;
32
+	memcpy(&res->params, params, sizeof(rpn_if_param_t));
110 33
 
111
-	res->mem = mmap(NULL, mem_sz, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
34
+	res->mem = mmap(NULL, params->mem_sz, PROT_READ|PROT_WRITE, MAP_ANON,
35
+		-1, 0);
112 36
 	if(res->mem == (void*)-1)
113 37
 	{
114 38
 		goto mmap_err;
115 39
 	}
116 40
 
117
-	res->rpn_res = malloc(sizeof(unsigned long) * (rpn_count +rpn_argc));
41
+	res->rpn_res = malloc(sizeof(rpn_value_t) *
42
+		(params->rpn_sz + params->rpn_argc));
118 43
 	if(!res->rpn_res)
119 44
 	{
120 45
 		goto rpn_malloc_err;
121 46
 	}
122
-	res->rpn_args = &(res->rpn_res[res->rpn_sz]);
47
+	res->rpn_args = &(res->rpn_res[params->rpn_sz]);
123 48
 
124
-	res->rpn = malloc(sizeof(rpn_expr_t) * res->rpn_sz);
49
+	res->rpn = malloc(sizeof(rpn_expr_t) * params->rpn_sz);
125 50
 	if(!res->rpn)
126 51
 	{
127 52
 		goto rpn_expr_err;
@@ -134,7 +59,7 @@ rpn_if_t* _rpn_if_new(size_t mem_sz, size_t rpn_argc, size_t rpn_count, size_t
134 59
 		free(res->rpn_res);
135 60
 	rpn_malloc_err:
136 61
 		err = errno;
137
-		munmap(res->mem, mem_sz);
62
+		munmap(res->mem, params->mem_sz);
138 63
 	mmap_err:
139 64
 		err = errno;
140 65
 		free(res);
@@ -143,3 +68,46 @@ rpn_if_t* _rpn_if_new(size_t mem_sz, size_t rpn_argc, size_t rpn_count, size_t
143 68
 		errno = err;
144 69
 		return NULL;
145 70
 }
71
+
72
+void rpn_if_free(rpn_if_t* rif)
73
+{
74
+	size_t i;
75
+	for(i=0; i<rif->params.rpn_sz; i++)
76
+	{
77
+		rpn_expr_close(&(rif->rpn[i]));
78
+	}
79
+	free(rif->rpn);
80
+	free(rif->rpn_res);
81
+	munmap(rif->mem, rif->params.mem_sz);
82
+	free(rif);
83
+}
84
+
85
+size_t rpn_if_step(rpn_if_t *rif, size_t pos)
86
+{
87
+	size_t i;
88
+	size_t newpos;
89
+	rif->params.arg_f(rif, pos, rif->rpn_args);
90
+	for(i=0; i<rif->params.rpn_sz; i++)
91
+	{
92
+		rif->rpn_res[i] = rpn_expr_eval(&(rif->rpn[i]), rif->rpn_args);
93
+	}
94
+	rif->params.res_f(rif, &newpos, rif->rpn_res);
95
+	return newpos;
96
+}
97
+
98
+int rpn_if_rpn_upd(rpn_if_t *rif, rpn_tokenized_t *rpns)
99
+{
100
+	return rpn_if_rpn_upd_rng(rif, rpns, rif->params.rpn_sz, 0);
101
+}
102
+
103
+int rpn_if_rpn_upd_rng(rpn_if_t *rif, rpn_tokenized_t *rpns, size_t sz,
104
+	size_t offset)
105
+{
106
+	size_t i;
107
+	for(i=offset; i<offset+sz; i++)
108
+	{
109
+		/**@todo continue implementation */
110
+	}
111
+	return 0;
112
+}
113
+

+ 43
- 93
rpn_if.h View File

@@ -34,120 +34,69 @@
34 34
  * For more details about IF see dedicated page : @ref doc_ifs_if
35 35
  */
36 36
 
37
-typedef void* rpn_if_arg_t;
38
-typedef unsigned long rpn_arg_t;
37
+/**@brief Shortcut for struct @ref rpn_if_s */
39 38
 typedef struct rpn_if_s rpn_if_t;
40
-typedef struct rpn_if_res_s rpn_if_res_t;
41
-typedef struct rpn_if_state_s rpn_if_state_t;
42
-typedef struct rpn_if_transfo_s rpn_if_transfo_t;
43
-typedef enum rpn_if_transfo_type_e rpn_if_transfo_type_t;
44
-/**@brief IF state to RPN arguments transformation */
45
-typedef void (*if2rpn_f)(rpn_if_t *rif, rpn_if_state_t, rpn_arg_t*);
46
-/**@brief RPN arguments to IF state transformation */
47
-typedef rpn_if_res_t (*rpn2if_f)(rpn_if_t *rif, rpn_arg_t, rpn_if_state_t);
48
-
49
-/**@brief IF state
50
- *
51
- * Will always be something like :
52
- * - memory adress/offset/index
53
- * - value
54
- */
55
-struct rpn_if_state_s
56
-{
57
-	/**@brief Data address */
58
-	size_t i;
59
-	/**@brief Data value(s) */
60
-	void *val;
61
-};
62
-
63
-/**@brief Indicate function type for @ref rpn_if_transfo_s */
64
-enum rpn_if_transfo_type_e
65
-{
66
-	/**@brief No transformation
67
-	 *
68
-	 * Default behavior is to copy data in args directly assuming
69
-	 * argc * sizeof(unsigned long) =  data_sz */
70
-	RPN_f_null,
71
-	/**@brief Transform RPN result into data */
72
-	RPN_f_rpn2if,
73
-	/**@brief Transform data into RPN result */
74
-	RPN_f_if2rpn
75
-};
76
-/**@brief Represent an IF transformation function
77
- *
78
- * Can transform data into arguments or arguments into data, depending
79
- * on function type.
80
- */
81
-struct rpn_if_transfo_s
82
-{
83
-	/**@brief Function pointer type
84
-	 * @note optionnal, for type checking
85
-	 */
86
-	rpn_if_transfo_type_t type;
87
-	/**@brief Data size (a @ref rpn_if_s::mem item ) in bytes */
88
-	size_t data_sz;
89
-	/**@brief Memory size in byte */
90
-	size_t mem_sz;
91
-	/**@brief RPN arg/result size
92
-	 *
93
-	 * - if type is RPN_if2rpn argc is the rpn expression argc
94
-	 * - if type is RPN_rpn2if argc is the rpn expression count (results
95
-	 * count)
96
-	 */
97
-	size_t argc;
98
-	union {
99
-		/**@brief IF state to RPN arguments transformation */
100
-		if2rpn_f if2rpn;
101
-		/**@brief RPN arguments to IF state transformation */
102
-		rpn2if_f rpn2if;
103
-	};
104
-};
39
+/**@brief Shortcut for struct @ref rpn_if_param_s */
40
+typedef struct rpn_if_param_s rpn_if_param_t;
105 41
 
106
-/**@brief Generic Iterated function implementation */
107
-struct rpn_if_s
42
+/**@brief Stores IF parameters and transformations function pointers */
43
+struct rpn_if_param_s
108 44
 {
109
-	/**@brief Memory map in wich data are fetch & stored */
110
-	void *mem;
111
-	/**@brief Memory map size in bytes */
45
+	/**@brief Memory map size in items */
112 46
 	size_t mem_sz;
113 47
 	/**@brief Size of a memory item */
114 48
 	size_t value_sz;
115
-
116
-	/**@brief IF last position + value buffer */
117
-	rpn_if_state_t state;
118
-	/**@brief RPN expression(s) result(s) buffer */
119
-	unsigned long *rpn_res;
120
-	/**@brief Arguments given to RPN expression(s) buffer */
121
-	rpn_arg_t *rpn_args;
49
+	/**@brief RPN expression count */
50
+	size_t rpn_sz;
122 51
 	/**@brief Number of arguments expected by RPN expressions */
123 52
 	size_t rpn_argc;
124 53
 
125
-	/**@brief RPN expression(s) pointer(s) */
126
-	rpn_expr_t *rpn;
127
-	/**@brief RPN expression count */
128
-	size_t rpn_sz;
54
+	/**@brief Position to RPN argument transformation */
55
+	int (*arg_f)(rpn_if_t *rif, size_t pos, rpn_value_t *args);
56
+	/**@brief RPN results to data and position transformation
57
+	 * @note set memory maps with converted data */
58
+	int (*res_f)(rpn_if_t *rif, size_t *pos,
59
+		rpn_value_t *data);
129 60
 
130
-	/**@brief IF state to RPN arguments transformation */
131
-	if2rpn_f if2rpn;
132
-	/**@brief RPN arguments to IF state transformation */
133
-	rpn2if_f rpn2if;
61
+	void *data;
62
+};
134 63
 
64
+/**@brief Generic Iterated function implementation */
65
+struct rpn_if_s
66
+{
67
+	/**@brief IF parameters */
68
+	rpn_if_param_t params;
69
+	/**@brief RPN expression(s) pointer(s) */
70
+	rpn_expr_t *rpn;
71
+	/**@brief RPN expression(s) result(s) buffer */
72
+	rpn_value_t *rpn_res;
73
+	/**@brief Arguments given to RPN expression(s) buffer */
74
+	rpn_value_t *rpn_args;
75
+	/**@brief Memory map in wich data are fetch & stored */
76
+	rpn_value_t *mem;
135 77
 };
136 78
 
79
+#define rpn_if_getitem(rif, pos) (rif->mem + (rif->params.value_sz * pos))
80
+
137 81
 /**@brief Alloc a new @ref rpn_if_s from two transformation functions
138
- * @param if2rpn informations about data to rpn args transformation
139
- * @param rpn2if informations about rpn args to data transformation 
140
- * @param rpn list of RPN expresions ( must be of rpn2if->argc size !!!)
82
+ * @param params IF parameters
83
+ * @param rpn list of RPN expresions of params->rpn_sz size
141 84
  * @return A pointer on an allocated @ref rpn_if_s
142 85
  */
143
-rpn_if_t* rpn_if_new(size_t mem_sz, rpn_if_transfo_t *if2rpn,
144
-	rpn_if_transfo_t *rpn2if, rpn_expr_t *rpn);
86
+rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_expr_t *rpn);
145 87
 
146
-/**@brief Deallocate an @ref rpn_ifs_s and close associated @ref rpn_expr_s
88
+/**@brief Deallocate an @ref rpn_ifs_s and its ressources and close associated 
89
+ * @ref rpn_expr_s
147 90
  * @param rif The IF to deallocate
148 91
  */
149 92
 void rpn_if_free(rpn_if_t *rif);
150 93
 
94
+/**@brief Run an IF
95
+ * @param rif Pointer on IF
96
+ * @param pos Input position
97
+ * @return new position
98
+ */
99
+size_t rpn_if_step(rpn_if_t *rif, size_t pos);
151 100
 
152 101
 /**@brief Update all RPN expressions
153 102
  * @param rif The concerned IF
@@ -156,6 +105,7 @@ void rpn_if_free(rpn_if_t *rif);
156 105
  * @note Shortcut for @ref rpn_if_rpn_upd_rng(rif, rpns, rif->rpn_sz, 0);
157 106
  */
158 107
 int rpn_if_rpn_upd(rpn_if_t *rif, rpn_tokenized_t *rpns);
108
+
159 109
 /**@brief Update a range of RPN expressions
160 110
  * @param rif The concerned IF
161 111
  * @param rpn A list of tokenized expressions

+ 233
- 0
rpn_if_default.c View File

@@ -0,0 +1,233 @@
1
+#include "rpn_if_default.h"
2
+
3
+
4
+int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
5
+{
6
+	size_t cur_arg, i, rgb_imax;
7
+	rpn_if_default_data_t *data;
8
+	rpn_value_t *values;
9
+
10
+	data = (rpn_if_default_data_t*)rif->params.data;
11
+
12
+	switch(data->pos_flag)
13
+	{
14
+		case RPN_IF_POSITION_LINEAR:
15
+			rpn_if_argf_linear(rif, pos, args);
16
+			cur_arg = 1;
17
+			break;
18
+		case RPN_IF_POSITION_XY:
19
+			rpn_if_argf_xy(rif, pos, args);
20
+			cur_arg = 2;
21
+			break;
22
+		case RPN_IF_POSITION_XDIM:
23
+			rpn_if_argf_xdim(rif, pos, args);
24
+			cur_arg = *(data->size_lim);
25
+			break;
26
+	}
27
+	if(cur_arg >= rif->params.rpn_argc)
28
+	{
29
+		/* Too many arguments for given rif !! */
30
+		return -1;
31
+	}
32
+	rgb_imax = 4; /* rgba */
33
+	values = rpn_if_getitem(rif, pos);
34
+	switch(data->res_flag)
35
+	{
36
+		case RPN_IF_RES_BOOL:
37
+			args[cur_arg] = values[0]?1:0;
38
+			break;
39
+		case RPN_IF_RES_CONST:
40
+		case RPN_IF_RES_COUNT:
41
+			args[cur_arg] = *values;
42
+			break;
43
+		case RPN_IF_RES_RGB:
44
+			rgb_imax = 3;
45
+		case RPN_IF_RES_CONST_RGBA:
46
+		case RPN_IF_RES_RGBA:
47
+			for(i=0; i<rgb_imax; i++)
48
+			{
49
+				args[cur_arg+i] = values[i];
50
+			}
51
+			break;
52
+		case RPN_IF_RES_XFUN:
53
+			for(i=0; i < rif->params.rpn_sz - cur_arg; i++)
54
+			{
55
+				args[cur_arg+i] = values[i];
56
+			}
57
+			break;
58
+		default:
59
+			return -1;
60
+	}
61
+	return -1;
62
+}
63
+
64
+int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data);
65
+
66
+int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
67
+{
68
+	rpn_if_default_data_t *data;
69
+	data = (rpn_if_default_data_t*)rif->params.data;
70
+	if(data->size_lim && pos >= *data->size_lim)
71
+	{
72
+		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
73
+		{
74
+			return -1;
75
+		}
76
+		pos %= *(data->size_lim);
77
+	}
78
+	args[0] = pos;
79
+	return 0;
80
+}
81
+
82
+int rpn_if_resf_linear(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
83
+{
84
+	rpn_if_default_data_t *data;
85
+	size_t res;
86
+	data = (rpn_if_default_data_t*)rif->params.data;
87
+	res = rif->rpn_res[0];
88
+	if(data->size_lim && res >= *data->size_lim)
89
+	{
90
+		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
91
+		{
92
+			return -1;
93
+		}
94
+		res %= *(data->size_lim);
95
+	}
96
+	*pos = res;
97
+	return 0;
98
+}
99
+
100
+int rpn_if_argf_xy(rpn_if_t *rif, size_t pos, rpn_value_t *args)
101
+{
102
+	rpn_if_default_data_t *data;
103
+
104
+	data = (rpn_if_default_data_t*)rif->params.data;
105
+	if(!data->size_lim)
106
+	{
107
+		return -1;
108
+	}
109
+	args[0] = pos % data->size_lim[0];
110
+	args[1] = pos / data->size_lim[0];
111
+	if(args[1] > data->size_lim[1])
112
+	{
113
+		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
114
+		{
115
+			return -1;
116
+		}
117
+		args[1] %= data->size_lim[1];
118
+	}
119
+	return 0;
120
+}
121
+
122
+int rpn_if_resf_xy(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
123
+{
124
+	rpn_if_default_data_t *data;
125
+	size_t xy[2];
126
+
127
+	data = (rpn_if_default_data_t*)rif->params.data;
128
+	
129
+	xy[0] = rif->rpn_res[0];
130
+	xy[1] = rif->rpn_res[1];
131
+
132
+	if(!data->size_lim)
133
+	{
134
+		return -1;
135
+	}
136
+
137
+	if(xy[0] >= data->size_lim[0] || xy[1] >= data->size_lim[1])
138
+	{
139
+		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
140
+		{
141
+			return -1;
142
+		}
143
+		xy[0] %= data->size_lim[0];
144
+		xy[1] %= data->size_lim[1];
145
+	}
146
+	*pos = xy[0]+(xy[1]*data->size_lim[0]);
147
+	return 0;
148
+}
149
+
150
+int rpn_if_argf_xdim(rpn_if_t *rif, size_t pos, rpn_value_t *args)
151
+{
152
+	rpn_if_default_data_t *data;
153
+	size_t i, curdim_sz, curpos;
154
+
155
+	data = (rpn_if_default_data_t*)rif->params.data;
156
+
157
+	if(!data->size_lim)
158
+	{
159
+		return -1;
160
+	}
161
+	if(*(data->size_lim) < 1)
162
+	{
163
+		return -1;
164
+	}
165
+	/**@todo check if *(data->size_lim) overflow rif->params->rpn_argc */
166
+
167
+	curdim_sz = 1;
168
+	curpos = pos;
169
+	for(i=0; i<*(data->size_lim)-1; i++)
170
+	{
171
+		curdim_sz *= data->size_lim[i+1];
172
+		args[i] = curpos % curdim_sz;
173
+		curpos /= curdim_sz;
174
+	}
175
+	args[i] = curpos;
176
+	if(args[i] >= curdim_sz)
177
+	{
178
+		if(data->pos_flag && RPN_IF_POSITION_OF_ERR)
179
+		{
180
+			return -1;
181
+		}
182
+		args[i] %= curdim_sz;
183
+	}
184
+	return 0;
185
+}
186
+
187
+int rpn_if_resf_xdim(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
188
+{
189
+	rpn_if_default_data_t *data;
190
+	size_t i, res, cur, curlim, prevlim;
191
+
192
+	data = (rpn_if_default_data_t*)rif->params.data;
193
+	res = 0;
194
+	
195
+	if(!data->size_lim)
196
+	{
197
+		return -1;
198
+	}
199
+	if(*(data->size_lim) < 1)
200
+	{
201
+		return -1;
202
+	}
203
+	/**@todo check if *(data->size_lim) overflow rif->params->rpn_argc */
204
+
205
+	res = rif->rpn_res[0];
206
+	if(res >= data->size_lim[1])
207
+	{
208
+		if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
209
+		{
210
+			return -1;
211
+		}
212
+		res %= data->size_lim[1];
213
+	}
214
+
215
+	for(i=1; i < *(data->size_lim); i++)
216
+	{
217
+		cur = rif->rpn_res[i];
218
+		prevlim = data->size_lim[i];
219
+		curlim = data->size_lim[i+1];
220
+		if(cur >= curlim)
221
+		{
222
+			if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
223
+			{
224
+				return -1;
225
+			}
226
+			cur %= curlim;
227
+		}
228
+		res += cur * prevlim;
229
+	}
230
+	*pos = res;
231
+	return 0;
232
+}
233
+

+ 127
- 0
rpn_if_default.h View File

@@ -0,0 +1,127 @@
1
+/*
2
+ * Copyright (C) 2020 Weber Yann
3
+ * 
4
+ * This file is part of pyrpn.
5
+ * 
6
+ * pyrpn is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * any later version.
10
+ * 
11
+ * pyrpn is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+ * GNU General Public License for more details.
15
+ * 
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with pyrpn.  If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+#ifndef __rpn_if_default__h__
20
+#define __rpn_if_default__h__
21
+
22
+/**@file rpn_if_default.h Defines default IF
23
+ * @brief Default IF definitions
24
+ */
25
+/**@defgroup ifs_if_default Default functions
26
+ * @brief Simple iterated functions functions
27
+ */
28
+
29
+#include "config.h"
30
+#include "rpn_if.h"
31
+
32
+#define RPN_IF_POSITION_LINEAR 0 // One expr for position
33
+#define RPN_IF_POSITION_XY 1 // two expr for poisition
34
+#define RPN_IF_POSITION_XDIM 2 // X expr for position
35
+
36
+#define RPN_IF_POSITION_OF_LOOP 0 // Loop on position overflow
37
+#define RPN_IF_POSITION_OF_ERR 16 // Trigger error on position overflow
38
+
39
+#define RPN_IF_RES_BOOL 0 // Set to one when position occurs
40
+#define RPN_IF_RES_CONST 1 // Set to a constant value
41
+#define RPN_IF_RES_CONST_RGBA 2 // Set to a constant RGB using alpha channel
42
+#define RPN_IF_RES_COUNT 3 // Count number of time position occurs
43
+#define RPN_IF_RES_XFUN 4 // Set to result of rpn_expr
44
+#define RPN_IF_RES_RGB 5 // Set result to RGB color from rpn_expr
45
+#define RPN_IF_RES_RGBA 6 // Set result to RGB using alpha channel from rpn_expr
46
+
47
+typedef struct rpn_if_default_data_s rpn_if_default_data_t;
48
+
49
+/**@brief Stores default IF data
50
+ *
51
+ * Stores flags and size limit
52
+ */
53
+struct rpn_if_default_data_s
54
+{
55
+	short pos_flag;
56
+	short res_flag;
57
+	/**@brief Stores size limits given pos_flag
58
+	 *
59
+	 * @note If NULL no limit
60
+	 * - For @ref RPN_IF_POSITION_LINEAR size_lim is a single size_t
61
+	 * - For @ref RPN_IF_POSITION_XY size_lim is two size_t (height and width)
62
+	 * - For @ref RPN_IF_POSITION_XDIM *size_lim is the size of size_lim
63
+	 */
64
+	size_t *size_lim;
65
+
66
+	/**@brief Store constant values to set mem giver res_flag
67
+	 * - For @ref RPN_IF_CONST_RGBA const_val points on a single value
68
+	 * - For @ref RPN_IF_RES_CONST_RGBA const_val points on 4 values
69
+	 */
70
+	rpn_value_t *const_val;
71
+};
72
+
73
+int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args);
74
+int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data);
75
+
76
+/**@brief Set the first expression argument from position
77
+ * @params rif Expressions
78
+ * @params pos Memory map offset
79
+ * @params args pointer on expressions arguments
80
+ * @note Other arguments are set using the generic @ref rpn_if_argf_default
81
+ * function
82
+ */
83
+int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args);
84
+/**@brief Transform 1st expression result to position 
85
+ * @params rif Expressions
86
+ * @params pos Pointer on resulting position in memory map
87
+ * @params data Pointer on resulting data
88
+ * @note Data from position fecth is done by generic @ref rpn_if_resf_default
89
+ * function
90
+ */
91
+int rpn_if_resf_linear(rpn_if_t *rif, size_t *pos, rpn_value_t *data);
92
+
93
+/**@brief Set the 1st & 2nd argument from position
94
+ * @params rif Expressions
95
+ * @params pos Memory map offset
96
+ * @params args pointer on expression arguments
97
+ * @note Other arguments are set using the generic @ref rpn_if_argf_default
98
+ * function
99
+ */
100
+int rpn_if_argf_xy(rpn_if_t *rif, size_t pos, rpn_value_t *args);
101
+/**@brief Transform 1st and 2nd result into a memory map's offset
102
+ * @params rif Expressions
103
+ * @param pos Memory map offset pointer
104
+ * @params data Pointer on resulting data
105
+ * @note Data from position fetch is done by generic @ref rpn_if_resf_default
106
+ * function
107
+ */
108
+int rpn_if_resf_xy(rpn_if_t *rif, size_t *pos, rpn_value_t *data);
109
+
110
+/**@brief Set X first arguments from position
111
+ * @params rif Expressions
112
+ * @params pos Memory map offset
113
+ * @params args Pointer on expression arguments
114
+ * @note Other arguments are set using the generic @ref rpn_if_argf_default
115
+ * function
116
+ */
117
+int rpn_if_argf_xdim(rpn_if_t *rif, size_t pos, rpn_value_t *args);
118
+/**@brief Transform X arguments into a memory map's offset
119
+ * @params rif Expressions
120
+ * @param pos Memory map offset pointer
121
+ * @param data Pointer on resulting data
122
+ * @note Data from position fetch is done by generic @ref rpn_if_resf_default
123
+ * function
124
+ */
125
+int rpn_if_resf_xdim(rpn_if_t *rif, size_t *pos, rpn_value_t *data);
126
+
127
+#endif

Loading…
Cancel
Save