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