Browse Source

Add default rpn_if resf function implementation

Yann Weber 4 years ago
parent
commit
8bbee65ff8
3 changed files with 87 additions and 4 deletions
  1. 6
    1
      rpn_if.c
  2. 6
    1
      rpn_if.h
  3. 75
    2
      rpn_if_default.c

+ 6
- 1
rpn_if.c View File

@@ -87,11 +87,16 @@ size_t rpn_if_step(rpn_if_t *rif, size_t pos)
87 87
 	size_t i;
88 88
 	size_t newpos;
89 89
 	rif->params.arg_f(rif, pos, rif->rpn_args);
90
+	/* WRONG ! rif->rpn_args is in rif structure and do not have to be
91
+	   given as argument... */
90 92
 	for(i=0; i<rif->params.rpn_sz; i++)
91 93
 	{
92 94
 		rif->rpn_res[i] = rpn_expr_eval(&(rif->rpn[i]), rif->rpn_args);
93 95
 	}
94
-	rif->params.res_f(rif, &newpos, rif->rpn_res);
96
+	//rif->params.res_f(rif, &newpos, rif->rpn_res);
97
+	/* MEGA WRONG ! rif->rpn_res is in rif structure and do not have to be
98
+	   given as argument... */
99
+	rif->params.res_f(rif, &newpos, NULL);
95 100
 	return newpos;
96 101
 }
97 102
 

+ 6
- 1
rpn_if.h View File

@@ -51,7 +51,9 @@ struct rpn_if_param_s
51 51
 	/**@brief Number of arguments expected by RPN expressions */
52 52
 	size_t rpn_argc;
53 53
 
54
-	/**@brief Position to RPN argument transformation */
54
+	/**@brief Set RPN arguments given a position
55
+	 * @note transform position to arguments and fetch other arguments
56
+	 * from memory map*/
55 57
 	int (*arg_f)(rpn_if_t *rif, size_t pos, rpn_value_t *args);
56 58
 	/**@brief RPN results to data and position transformation
57 59
 	 * @note set memory maps with converted data */
@@ -76,6 +78,9 @@ struct rpn_if_s
76 78
 	rpn_value_t *mem;
77 79
 };
78 80
 
81
+/**@brief Macro fetching a memory pointer given a position
82
+ * @return rpn_value_t* values
83
+ */
79 84
 #define rpn_if_getitem(rif, pos) (rif->mem + (rif->params.value_sz * pos))
80 85
 
81 86
 /**@brief Alloc a new @ref rpn_if_s from two transformation functions

+ 75
- 2
rpn_if_default.c View File

@@ -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;
@@ -56,12 +56,85 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
56 56
 			}
57 57
 			break;
58 58
 		default:
59
+			/* LOG ERROR */
59 60
 			return -1;
60 61
 	}
61 62
 	return -1;
62 63
 }
63 64
 
64
-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 *data)
66
+{
67
+	rpn_if_default_data_t *data;
68
+	size_t cur_arg, i, rgb_imax;
69
+
70
+	data = (rpn_if_default_data_t*)rif->params.data;
71
+
72
+	switch(data->pos_flag)
73
+	{
74
+		case RPN_IF_POSITION_LINEAR:
75
+			rpn_if_resf_linear(rif, pos, data);
76
+			cur_arg = 1;
77
+			break;
78
+		case RPN_IF_POSITION_XY:
79
+			rpn_if_resf_xy(rif, pos, data);
80
+			cur_arg = 2;
81
+			break;
82
+		case RPN_IF_POSITION_XDIM:
83
+			rpn_if_resf_xdim(rif, pos, data);
84
+			cur_arg = *(data->size_lim);
85
+			break;
86
+	}
87
+	if(cur_arg > rif->params.rpn_argc)
88
+	{
89
+		/** LOG ERROR ! should never append... */
90
+		return -1;
91
+	}
92
+	rgb_imax = 3; /* rgba */
93
+	values = rpn_if_getimtem(rif, pos);
94
+	siwtch(data->res-flag)
95
+	{
96
+		case RPN_IF_RES_BOOL:
97
+			*values = 1;
98
+			break;
99
+
100
+		case RPN_IF_RES_CONST:
101
+			*values = *(data->const_val);
102
+			break;
103
+
104
+		case RPN_IF_RES_COUNT:
105
+			*values++;
106
+			beak;
107
+
108
+		case RPN_IF_RES_CONST_RGBA:
109
+			rgb_imax = 4;
110
+		case RPN_IF_RES_CONST_RGB:
111
+			for(i=0;i<rgb_imax;i++)
112
+			{
113
+				values[i] = data->const_val[i];
114
+			}
115
+			break;
116
+
117
+		case RPN_IF_RES_RGBA:
118
+			rgb_imax = 4;
119
+		case RPN_IF_RES_RGB:
120
+			for(i=0;i<rgb_imax;i++)
121
+			{
122
+				values[i] = rif->rpn_res[cur_arg+i];
123
+			}
124
+			break;
125
+
126
+		case RPN_IF_RES_XFUN:
127
+			for(i=0; i<rif->params.rpn_sz - cur_arg; i++)
128
+			{
129
+				values[i] = rif->rpn_res[cur_arg+i];
130
+			}
131
+			break;
132
+
133
+		default:
134
+			/* LOG ERROR */
135
+			return -1;
136
+	}
137
+}
65 138
 
66 139
 int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
67 140
 {

Loading…
Cancel
Save