1 /**
2 * Copyright 1981-2016 ECMWF.
3 *
4 * This software is licensed under the terms of the Apache Licence
5 * Version 2.0 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
8 * granted to it by virtue of its status as an intergovernmental organisation
9 * nor does it submit to any jurisdiction.
10 */
11 
12 #include <stdio.h>
13 #include <string.h>
14 #include "getValues.h"
15 
16 #ifdef FORTRAN_NO_UNDERSCORE
17 #define GETINT  getint
18 #define GETREAL getreal
19 #else
20 #define GETINT  getint_
21 #define GETREAL getreal_
22 #endif
23 
getIntegerValue(gribProduct ** grib,unsigned char * request)24 fortint getIntegerValue(
25   gribProduct** grib,
26   unsigned char* request ){
27 
28   return GETINT(grib,request,strlen(request));
29 }
30 
copyName(unsigned char * copy,unsigned char * original,int copyLength,int originalLength)31 void copyName(
32   unsigned char* copy,
33   unsigned char* original,
34   int copyLength,
35   int originalLength) {
36 int length;
37 char *p;
38 
39   length = (originalLength>copyLength)?copyLength:originalLength;
40   memcpy(copy,original,length);
41   copy[length] = '\0';
42 
43   p = copy + length - 1;
44   while( *p == ' ' ) *(p--) = '\0';
45 
46   return;
47 }
48 
GETINT(gribProduct ** grib,unsigned char * request,long requestLength)49 fortint GETINT(
50   gribProduct** grib,
51   unsigned char* request,
52   long requestLength ) {
53 int index;
54 int listLength = sizeof(despatchInteger)/sizeof(despatchI);
55 unsigned char Request[80];
56 
57   copyName(Request,request,(int)sizeof(Request),(int)requestLength);
58 
59   index = binaryChopI(despatchInteger,listLength,Request);
60   if( index < 0 )
61     return -999999;
62   else {
63     return despatchInteger[index].get(grib);
64   }
65 }
66 
getRealValue(gribProduct ** grib,unsigned char * request)67 fortdouble getRealValue(
68   gribProduct** grib,
69   unsigned char* request ) {
70 
71   return GETREAL(grib,request,strlen(request));
72 }
73 
GETREAL(gribProduct ** grib,unsigned char * request,long requestLength)74 fortdouble GETREAL(
75   gribProduct** grib,
76   unsigned char* request,
77   long requestLength ) {
78 int index;
79 int listLength = sizeof(despatchReal)/sizeof(despatchR);
80 char Request[80];
81 
82   copyName(Request,request,(int)sizeof(Request),(int)requestLength);
83 
84   index = binaryChopR(despatchReal,listLength,Request);
85   if( index < 0 )
86     return -999999.0;
87   else {
88     return despatchReal[index].get(grib);
89   }
90 }
91 
IGNWLAT(gribProduct ** grib)92 fortint IGNWLAT(gribProduct** grib) {
93 fortdouble value = GNWLAT(grib);
94 
95   if( value != -999999.0 )
96     return (fortint)(1000.0 * value);
97   else
98     return -999999;
99 }
100 
IGNWLON(gribProduct ** grib)101 fortint IGNWLON(gribProduct** grib) {
102 fortdouble value = GNWLON(grib);
103 
104   if( value != -999999.0 )
105     return (fortint)(1000.0 * value);
106   else
107     return -999999;
108 }
109 
IGSELAT(gribProduct ** grib)110 fortint IGSELAT(gribProduct** grib) {
111 fortdouble value = GSELAT(grib);
112 
113   if( value != -999999.0 )
114     return (fortint)(1000.0 * value);
115   else
116     return -999999;
117 }
118 
IGSELON(gribProduct ** grib)119 fortint IGSELON(gribProduct** grib) {
120 fortdouble value = GSELON(grib);
121 
122   if( value != -999999.0 )
123     return (fortint)(1000.0 * value);
124   else
125     return -999999;
126 }
127 
IGDI(gribProduct ** grib)128 fortint IGDI(gribProduct** grib) {
129 fortdouble value = GDI(grib);
130 
131   if( value != -999999.0 )
132     return (fortint)(1000.0 * value);
133   else
134     return -999999;
135 }
136 
IGDJ(gribProduct ** grib)137 fortint IGDJ(gribProduct** grib) {
138 fortdouble value = GDJ(grib);
139 
140   if( value != -999999.0 )
141     return (fortint)(1000.0 * value);
142   else
143     return -999999;
144 }
145 
IGIP(gribProduct ** grib)146 fortint IGIP(gribProduct** grib) {
147 fortdouble value = GIP(grib);
148 
149   if( value != -999999.0 )
150     return (fortint)(1000.0 * value);
151   else
152     return -999999;
153 }
154 
IGLATRPL(gribProduct ** grib)155 fortint IGLATRPL(gribProduct** grib) {
156 fortdouble value = GLATRPL(grib);
157 
158   if( value != -999999.0 )
159     return (fortint)(1000.0 * value);
160   else
161     return -999999;
162 }
163 
IGLONRPL(gribProduct ** grib)164 fortint IGLONRPL(gribProduct** grib) {
165 fortdouble value = GLONRPL(grib);
166 
167   if( value != -999999.0 )
168     return (fortint)(1000.0 * value);
169   else
170     return -999999;
171 }
172 
IGROTATN(gribProduct ** grib)173 fortint IGROTATN(gribProduct** grib) {
174 fortdouble value = GROTATN(grib);
175 
176   if( value != -999999.0 )
177     return (fortint)(1000.0 * value);
178   else
179     return -999999;
180 }
181 
IGLATSPL(gribProduct ** grib)182 fortint IGLATSPL(gribProduct** grib) {
183 fortdouble value = GLATSPL(grib);
184 
185   if( value != -999999.0 )
186     return (fortint)(1000.0 * value);
187   else
188     return -999999;
189 }
190 
IGLONSPL(gribProduct ** grib)191 fortint IGLONSPL(gribProduct** grib) {
192 fortdouble value = GLONSPL(grib);
193 
194   if( value != -999999.0 )
195     return (fortint)(1000.0 * value);
196   else
197     return -999999;
198 }
199 
IGSFACTR(gribProduct ** grib)200 fortint IGSFACTR(gribProduct** grib) {
201 fortdouble value = GSFACTR(grib);
202 
203   if( value != -999999.0 )
204     return (fortint)(1000000.0 * value);
205   else
206     return -999999;
207 }
208 
IGREFVAL(gribProduct ** grib)209 fortint IGREFVAL(gribProduct** grib) {
210   return (fortint)(1000000.0 * GREFVAL(grib));
211 }
212 
IGDSCALE(gribProduct ** grib)213 fortint IGDSCALE(gribProduct** grib) {
214   return (fortint)(1000000.0 * GDSCALE(grib));
215 }
216 
RGLENGTH(gribProduct ** grib)217 fortdouble RGLENGTH(gribProduct** grib) {
218   return (fortdouble) GLENGTH(grib);
219 }
220 
RGTABLE(gribProduct ** grib)221 fortdouble RGTABLE(gribProduct** grib) {
222   return (fortdouble) GTABLE(grib);
223 }
224 
RGCENTRE(gribProduct ** grib)225 fortdouble RGCENTRE(gribProduct** grib) {
226   return (fortdouble) GCENTRE(grib);
227 }
228 
RGPARAM(gribProduct ** grib)229 fortdouble RGPARAM(gribProduct** grib) {
230   return (fortdouble) GPARAM(grib);
231 }
232 
RGLEVEL(gribProduct ** grib)233 fortdouble RGLEVEL(gribProduct** grib) {
234   return (fortdouble) GLEVEL(grib);
235 }
236 
RGLEVEL1(gribProduct ** grib)237 fortdouble RGLEVEL1(gribProduct** grib) {
238   return (fortdouble) GLEVEL1(grib);
239 }
240 
RGLEVEL2(gribProduct ** grib)241 fortdouble RGLEVEL2(gribProduct** grib) {
242   return (fortdouble) GLEVEL2(grib);
243 }
244 
RGDATE(gribProduct ** grib)245 fortdouble RGDATE(gribProduct** grib) {
246   return (fortdouble) GDATE(grib);
247 }
248 
RGTIME(gribProduct ** grib)249 fortdouble RGTIME(gribProduct** grib) {
250   return (fortdouble) GTIME(grib);
251 }
252 
RGSTEP(gribProduct ** grib)253 fortdouble RGSTEP(gribProduct** grib) {
254   return (fortdouble) GSTEP(grib);
255 }
256 
RGDEFIN(gribProduct ** grib)257 fortdouble RGDEFIN(gribProduct** grib) {
258   return (fortdouble) GDEFIN(grib);
259 }
260 
RGCLASS(gribProduct ** grib)261 fortdouble RGCLASS(gribProduct** grib) {
262   return (fortdouble) GCLASS(grib);
263 }
264 
RGTYPE(gribProduct ** grib)265 fortdouble RGTYPE(gribProduct** grib) {
266   return (fortdouble) GTYPE(grib);
267 }
268 
RGSTREAM(gribProduct ** grib)269 fortdouble RGSTREAM(gribProduct** grib) {
270   return (fortdouble) GSTREAM(grib);
271 }
272 
RGEXPVER(gribProduct ** grib)273 fortdouble RGEXPVER(gribProduct** grib) {
274   return (fortdouble) GEXPVER(grib);
275 }
276 
RGNUMPV(gribProduct ** grib)277 fortdouble RGNUMPV(gribProduct** grib) {
278   return (fortdouble) GNUMPV(grib);
279 }
280 
RGREPRES(gribProduct ** grib)281 fortdouble RGREPRES(gribProduct** grib) {
282   return (fortdouble) GREPRES(grib);
283 }
284 
RGNI(gribProduct ** grib)285 fortdouble RGNI(gribProduct** grib) {
286   return (fortdouble) GNI(grib);
287 }
288 
RGNJ(gribProduct ** grib)289 fortdouble RGNJ(gribProduct** grib) {
290   return (fortdouble) GNJ(grib);
291 }
292 
RGRESCOM(gribProduct ** grib)293 fortdouble RGRESCOM(gribProduct** grib) {
294   return (fortdouble) GRESCOM(grib);
295 }
296 
RGNUMBER(gribProduct ** grib)297 fortdouble RGNUMBER(gribProduct** grib) {
298   return (fortdouble) GNUMBER(grib);
299 }
300 
RGSCAN(gribProduct ** grib)301 fortdouble RGSCAN(gribProduct** grib) {
302   return (fortdouble) GSCAN(grib);
303 }
304 
RGJ(gribProduct ** grib)305 fortdouble RGJ(gribProduct** grib) {
306   return (fortdouble) GJ(grib);
307 }
308 
RGK(gribProduct ** grib)309 fortdouble RGK(gribProduct** grib) {
310   return (fortdouble) GK(grib);
311 }
312 
RGM(gribProduct ** grib)313 fortdouble RGM(gribProduct** grib) {
314   return (fortdouble) GM(grib);
315 }
316 
RGREPMOD(gribProduct ** grib)317 fortdouble RGREPMOD(gribProduct** grib) {
318   return (fortdouble) GREPMOD(grib);
319 }
320 
RGTJ(gribProduct ** grib)321 fortdouble RGTJ(gribProduct** grib) {
322   return (fortdouble) GTJ(grib);
323 }
324 
RGTK(gribProduct ** grib)325 fortdouble RGTK(gribProduct** grib) {
326   return (fortdouble) GTK(grib);
327 }
328 
RGTM(gribProduct ** grib)329 fortdouble RGTM(gribProduct** grib) {
330   return (fortdouble) GTM(grib);
331 }
332 
RGBITSPV(gribProduct ** grib)333 fortdouble RGBITSPV(gribProduct** grib) {
334   return (fortdouble) GBITSPV(grib);
335 }
336 
RGUNUSED(gribProduct ** grib)337 fortdouble RGUNUSED(gribProduct** grib) {
338   return (fortdouble) GUNUSED(grib);
339 }
340 
RGNVALUE(gribProduct ** grib)341 fortdouble RGNVALUE(gribProduct** grib) {
342   return (fortdouble) GNVALUE(grib);
343 }
344 
binaryChopI(despatchI * list,int listLength,unsigned char * test)345 int binaryChopI(despatchI * list, int listLength, unsigned char * test) {
346 int current, oldCurrent = -1;
347 int direction, startRange = 0, endRange = listLength;
348 
349   do {
350     current = (startRange + endRange)/2;
351 
352     if( current == oldCurrent) break;
353 
354     direction = strcmp(test,(*(list+current)).name);
355 
356     if( direction == 0 ) return current;
357 
358     if( direction < 0 )
359       endRange = current;
360     else
361       startRange = current;
362 
363     oldCurrent = current;
364   } while( startRange <= endRange );
365 
366   return -1;
367 }
368 
binaryChopR(despatchR * list,int listLength,unsigned char * test)369 int binaryChopR(despatchR * list, int listLength, unsigned char * test) {
370 int current, oldCurrent = -1;
371 int direction, startRange = 0, endRange = listLength;
372 
373   do {
374     current = (startRange + endRange)/2;
375 
376     if( current == oldCurrent) break;
377 
378     direction = strcmp(test,(*(list+current)).name);
379 
380     if( direction == 0 ) return current;
381 
382     if( direction < 0 )
383       endRange = current;
384     else
385       startRange = current;
386 
387     oldCurrent = current;
388   } while( startRange <= endRange );
389 
390   return -1;
391 }
392