1 /*
2 * (C) Copyright 2005- ECMWF.
3 *
4 * This software is licensed under the terms of the Apache Licence Version 2.0
5 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6 *
7 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
8 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
9 */
10
11 #include "grib_api_internal.h"
12
grib_op_eq(long a,long b)13 long grib_op_eq(long a, long b)
14 {
15 return a == b;
16 }
grib_op_ne(long a,long b)17 long grib_op_ne(long a, long b)
18 {
19 return a != b;
20 }
grib_op_lt(long a,long b)21 long grib_op_lt(long a, long b)
22 {
23 return a < b;
24 }
grib_op_gt(long a,long b)25 long grib_op_gt(long a, long b)
26 {
27 return a > b;
28 }
grib_op_and(long a,long b)29 long grib_op_and(long a, long b)
30 {
31 return a && b;
32 }
grib_op_or(long a,long b)33 long grib_op_or(long a, long b)
34 {
35 return a || b;
36 }
grib_op_ge(long a,long b)37 long grib_op_ge(long a, long b)
38 {
39 return a >= b;
40 }
grib_op_le(long a,long b)41 long grib_op_le(long a, long b)
42 {
43 return a <= b;
44 }
45
grib_op_bit(long a,long b)46 long grib_op_bit(long a, long b)
47 {
48 return a & (1 << b);
49 }
grib_op_bitoff(long a,long b)50 long grib_op_bitoff(long a, long b)
51 {
52 return !grib_op_bit(a, b);
53 }
54
grib_op_not(long a)55 long grib_op_not(long a)
56 {
57 return !a;
58 }
grib_op_neg(long a)59 long grib_op_neg(long a)
60 {
61 return -a;
62 }
63
grib_op_neg_d(double a)64 double grib_op_neg_d(double a)
65 {
66 return -a;
67 }
68
grib_op_pow(long a,long b)69 long grib_op_pow(long a, long b)
70 {
71 /* Note: This is actually 'a' to the power 'b' */
72 return grib_power(b, a);
73 }
74
grib_op_add(long a,long b)75 long grib_op_add(long a, long b)
76 {
77 return a + b;
78 }
grib_op_sub(long a,long b)79 long grib_op_sub(long a, long b)
80 {
81 return a - b;
82 }
grib_op_div(long a,long b)83 long grib_op_div(long a, long b)
84 {
85 return a / b;
86 }
grib_op_mul(long a,long b)87 long grib_op_mul(long a, long b)
88 {
89 return a * b;
90 }
grib_op_modulo(long a,long b)91 long grib_op_modulo(long a, long b)
92 {
93 return a % b;
94 }
95
grib_op_mul_d(double a,double b)96 double grib_op_mul_d(double a, double b)
97 {
98 return a * b;
99 }
grib_op_div_d(double a,double b)100 double grib_op_div_d(double a, double b)
101 {
102 return a / b;
103 }
104
grib_op_add_d(double a,double b)105 double grib_op_add_d(double a, double b)
106 {
107 return a + b;
108 }
grib_op_sub_d(double a,double b)109 double grib_op_sub_d(double a, double b)
110 {
111 return a - b;
112 }
113
grib_op_eq_d(double a,double b)114 double grib_op_eq_d(double a, double b)
115 {
116 return a == b;
117 }
grib_op_ne_d(double a,double b)118 double grib_op_ne_d(double a, double b)
119 {
120 return a != b;
121 }
grib_op_lt_d(double a,double b)122 double grib_op_lt_d(double a, double b)
123 {
124 return a < b;
125 }
grib_op_gt_d(double a,double b)126 double grib_op_gt_d(double a, double b)
127 {
128 return a > b;
129 }
grib_op_ge_d(double a,double b)130 double grib_op_ge_d(double a, double b)
131 {
132 return a >= b;
133 }
grib_op_le_d(double a,double b)134 double grib_op_le_d(double a, double b)
135 {
136 return a <= b;
137 }
138
139 #define LOOKUP(a) \
140 if (proc == a) { \
141 return "&" #a; \
142 }
grib_binop_long_proc_name(grib_binop_long_proc proc)143 const char* grib_binop_long_proc_name(grib_binop_long_proc proc)
144 {
145 if (!proc)
146 return "NULL";
147 LOOKUP(grib_op_eq);
148 LOOKUP(grib_op_ne);
149 LOOKUP(grib_op_lt);
150 LOOKUP(grib_op_gt);
151 LOOKUP(grib_op_and);
152 LOOKUP(grib_op_or);
153 LOOKUP(grib_op_ge);
154 LOOKUP(grib_op_le);
155 LOOKUP(grib_op_bit);
156 LOOKUP(grib_op_bitoff);
157 LOOKUP(grib_op_pow);
158 LOOKUP(grib_op_add);
159 LOOKUP(grib_op_sub);
160 LOOKUP(grib_op_div);
161 LOOKUP(grib_op_mul);
162 LOOKUP(grib_op_modulo);
163 fprintf(stderr, "Cannot find grib_binop_long_proc\n");
164 Assert(0);
165 return NULL;
166 }
167
grib_binop_double_proc_name(grib_binop_double_proc proc)168 const char* grib_binop_double_proc_name(grib_binop_double_proc proc)
169 {
170 if (!proc)
171 return "NULL";
172 LOOKUP(grib_op_mul_d);
173 LOOKUP(grib_op_div_d);
174 LOOKUP(grib_op_add_d);
175 LOOKUP(grib_op_sub_d);
176 LOOKUP(grib_op_eq_d);
177 LOOKUP(grib_op_ne_d);
178 LOOKUP(grib_op_lt_d);
179 LOOKUP(grib_op_gt_d);
180 LOOKUP(grib_op_ge_d);
181 LOOKUP(grib_op_le_d);
182 fprintf(stderr, "Cannot find grib_binop_double_proc_name\n");
183 Assert(0);
184 return NULL;
185 }
186
grib_unop_long_proc_name(grib_unop_long_proc proc)187 const char* grib_unop_long_proc_name(grib_unop_long_proc proc)
188 {
189 if (!proc)
190 return "NULL";
191 LOOKUP(grib_op_not);
192 LOOKUP(grib_op_neg);
193 fprintf(stderr, "Cannot find grib_unop_long_proc_name\n");
194 Assert(0);
195 return NULL;
196 }
197
grib_unop_double_proc_name(grib_unop_double_proc proc)198 const char* grib_unop_double_proc_name(grib_unop_double_proc proc)
199 {
200 if (!proc)
201 return "NULL";
202 LOOKUP(grib_op_neg_d);
203 fprintf(stderr, "Cannot find grib_unop_double_proc_name\n");
204 Assert(0);
205 return NULL;
206 }
207