bes  Updated for version 3.20.6
FreeFormCPP.h
1 // -*- mode: c++; c-basic-offset:4 -*-
2 
3 // This file is part of ff_handler a FreeForm API handler for the OPeNDAP
4 // DAP2 data server.
5 
6 // Copyright (c) 2005 OPeNDAP, Inc.
7 // Author: James Gallagher <jgallagher@opendap.org>
8 //
9 // This is free software; you can redistribute it and/or modify it under the
10 // terms of the GNU Lesser General Public License as published by the Free
11 // Software Foundation; either version 2.1 of the License, or (at your
12 // option) any later version.
13 //
14 // This software is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 // License for more details.
18 //
19 // You should have received a copy of the GNU Lesser General Public
20 // License along with this library; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 //
23 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
24 
25 /*
26  * HISTORY:
27  *
28  * DODS C++ header file for FreeFrom library.
29  *
30  * ReZa (Reza Nekovei URI/GSO) 7/10/98
31 
32  * $Log: FreeForm.h,v $
33  * Revision 1.6 2004/07/09 17:54:24 jimg
34  * Merged with release-3-4-3FCS.
35  *
36  * Revision 1.5.16.2 2004/03/08 04:35:24 rmorris
37  * Mod to port to win32. VC++ doesn't understand 'extern "C"' within
38  * C code (and it doesn't make sense there). If #if defined(__cplusplus)
39  * around extern C declarations.
40  *
41  * Revision 1.5.16.1 2003/06/29 06:04:14 rmorris
42  * Close -DLINUX related code to -DNETBSD and tweek to get ff server to compile
43  * under OS X.
44  *
45  * Revision 1.5 1999/05/27 17:02:23 jimg
46  * Merge with alpha-3-0-0
47  *
48  * Revision 1.4.2.1 1999/05/20 21:42:50 edavis
49  * Fix spelling of COPYRIGHT and remove some #if 0 stuff.
50  *
51  * Revision 1.4 1999/05/04 02:55:37 jimg
52  * Merge with no-gnu
53  *
54  * Revision 1.3.12.1 1999/05/01 04:40:31 brent
55  * converted old String.h to the new std C++ <string> code
56  *
57  * Revision 1.3 1998/08/12 21:21:01 jimg
58  * Massive changes from Reza. Compatible with the new FFND library
59  *
60  *
61  * r fozzard 7/28/95 -rf03
62  * CodeWarrior doesn't need unix.h
63  * r fozzard 8/3/95 -rf04
64  * Redefine FF_TYPES_t to unsigned int to solve var_args stack problem; apparently
65  * on the Mac, (and maybe Unix), a 4-byte value is pushed, even when you request only
66  * 2 bytes.
67  * Also, a fix to the TRUE/FALSE definitions to properly define them if not defined.
68  */
69 
70 #ifndef FREEFORM_H__
71 #define FREEFORM_H__
72 
73 extern "C" {
74 
75 #define FFND_LIB_VER "4.2.3"
76 
77 #ifndef FREEFORM
78 #error "You must define FREEFORM as a preprocessor name."
79 #error "You must do this for the benefit of files in the FreeForm project"
80 #error "which do not include freeform.h"
81 #endif
82 
83 /*
84 
85  FreeForm ND has been compiled on the following platforms:
86 
87  PC running DOS
88  PC running LINUX
89  Macintosh running MacOS
90  Sun Sparcstations running SUNOS
91  SGI workstations running IRIX
92  and various other Unix workstations, like:
93  IBM6000, HP9000, DEC-Alpha, and SGI PowerChallenge
94 
95  FreeForm ND compiles with these C compilers:
96 
97  Microsoft Visual C++ Versions 1.0 and 1.52
98  Microsoft Visual C++ Version 4.0 (define MSVC4)
99  Metroworks CodeWarrior Version 6 -- for Macintosh
100  generic ANSI Unix C compilers
101 
102  If you are using Microsoft Visual C++ 4.0 then define MSVC4 in addition to
103  defining PC.
104 
105  To compile FreeForm on your machine you must define one of the
106  following preprocessor names:
107 
108 
109  PC
110  LINUX
111  SUN
112  IRIS4
113  MAC
114  IBM6000
115  HP9000
116  DEC_ALPHA
117  IRIX
118 
119  One of the above should be defined as a compiler preprocessor definition, such as on the
120  cc command line, or within your project settings.
121 
122  */
123 
124 #define FF_OS_UNIX 1
125 #define FF_OS_MAC 2
126 #define FF_OS_DOS 3
127 
128 #define FF_CC_MSVC1 1
129 #define FF_CC_MSVC4 2
130 #define FF_CC_MACCW 3
131 #define FF_CC_UNIX 4
132 
133 #ifdef GOT_MACHINE
134 #undef GOT_MACHINE
135 #endif
136 
137 #ifdef PC
138 
139 #ifdef GOT_MACHINE
140 #define TOO_MANY_MACHINES
141 #else
142 #define GOT_MACHINE
143 #endif
144 
145 #ifndef LONGS_ARE_32
146 #define LONGS_ARE_32
147 #endif
148 
149 #define FF_OS FF_OS_DOS
150 
151 #ifdef MSVC1
152 #define FF_CC FF_CC_MSVC1
153 #endif
154 
155 #ifdef MSVC4
156 #ifdef FF_CC
157 #error "A PC compiler has already been defined"
158 #endif
159 #define FF_CC FF_CC_MSVC4
160 #endif
161 
162 #ifndef FF_CC
163 /* Assume MSVC1 unless MSVC4 is defined */
164 #define FF_CC FF_CC_MSVC1
165 #endif
166 
167 #endif /* PC */
168 
169 #ifdef LINUX
170 
171 #ifdef GOT_MACHINE
172 #define TOO_MANY_MACHINES
173 #else
174 #define GOT_MACHINE
175 #endif
176 
177 #ifndef LONGS_ARE_32
178 #define LONGS_ARE_32
179 #endif
180 
181 #define FF_OS FF_OS_UNIX
182 #define FF_CC FF_CC_UNIX
183 
184 #endif /* LINUX */
185 
186 #ifdef SUN
187 
188 #ifdef GOT_MACHINE
189 #define TOO_MANY_MACHINES
190 #else
191 #define GOT_MACHINE
192 #endif
193 
194 #ifndef LONGS_ARE_32
195 #define LONGS_ARE_32
196 #endif
197 
198 #define FF_OS FF_OS_UNIX
199 #define FF_CC FF_CC_UNIX
200 
201 #endif /* SUN */
202 
203 #ifdef IRIS4
204 
205 #ifdef GOT_MACHINE
206 #define TOO_MANY_MACHINES
207 #else
208 #define GOT_MACHINE
209 #endif
210 
211 #ifndef LONGS_ARE_32
212 #define LONGS_ARE_32
213 #endif
214 
215 #define FF_OS FF_OS_UNIX
216 #define FF_CC FF_CC_UNIX
217 
218 #endif /* IRIS4 */
219 
220 #ifdef MAC
221 
222 #ifdef GOT_MACHINE
223 #define TOO_MANY_MACHINES
224 #else
225 #define GOT_MACHINE
226 #endif
227 
228 #ifndef LONGS_ARE_32
229 #define LONGS_ARE_32
230 #endif
231 
232 #define FF_OS FF_OS_MAC
233 #define FF_CC FF_CC_MACCW
234 
235 #endif /* MAC */
236 
237 #ifdef IBM6000
238 
239 #ifdef GOT_MACHINE
240 #define TOO_MANY_MACHINES
241 #else
242 #define GOT_MACHINE
243 #endif
244 
245 #ifndef LONGS_ARE_32
246 #define LONGS_ARE_32
247 #endif
248 
249 #define FF_OS FF_OS_UNIX
250 #define FF_CC FF_CC_UNIX
251 
252 #endif /* IBM6000 */
253 
254 #ifdef HP9000
255 
256 #ifdef GOT_MACHINE
257 #define TOO_MANY_MACHINES
258 #else
259 #define GOT_MACHINE
260 #endif
261 
262 #ifndef LONGS_ARE_32
263 #define LONGS_ARE_32
264 #endif
265 
266 #define FF_OS FF_OS_UNIX
267 #define FF_CC FF_CC_UNIX
268 
269 #endif /* HP9000 */
270 
271 #ifdef DEC_ALPHA
272 
273 #ifdef GOT_MACHINE
274 #define TOO_MANY_MACHINES
275 #else
276 #define GOT_MACHINE
277 #endif
278 
279 #ifndef LONGS_ARE_64
280 #define LONGS_ARE_64
281 #endif
282 
283 #define FF_OS FF_OS_UNIX
284 #define FF_CC FF_CC_UNIX
285 
286 #endif /* DEC_ALPHA */
287 
288 #ifdef IRIX
289 
290 // #ifndef IRIX
291 // #define IRIX
292 // #endif
293 
294 #ifdef GOT_MACHINE
295 #define TOO_MANY_MACHINES
296 #else
297 #define GOT_MACHINE
298 #endif
299 
300 #ifndef LONGS_ARE_64
301 #define LONGS_ARE_64
302 #endif
303 
304 #define FF_OS FF_OS_UNIX
305 #define FF_CC FF_CC_UNIX
306 
307 #endif /* IRIX */
308 
309 #ifndef GOT_MACHINE
310 #error "Machine type has not been defined."
311 #error "Please define one in your makefile or project."
312 #endif
313 
314 #ifdef TOO_MANY_MACHINES
315 #error "More than one machine type has been defined"
316 #ifdef PC
317 #error "PC is currently defined"
318 #endif
319 #ifdef SUN
320 #error "SUN is currently defined"
321 #endif
322 #ifdef IRIS4
323 #error "IRIS4 is currently defined"
324 #endif
325 #ifdef MAC
326 #error "MAC is currently defined"
327 #endif
328 #ifdef IBM6000
329 #error "IBM6000 is currently defined"
330 #endif
331 #ifdef HP9000
332 #error "HP9000 is currently defined"
333 #endif
334 #ifdef DEC_ALPHA
335 #error "DEC_ALPHA is currently defined"
336 #endif
337 #ifdef IRIX
338 #error "IRIX is currently defined"
339 #endif
340 #error "Please check your makefile or project."
341 #endif /* TOO_MANY_MACHINES */
342 
343 #if !defined(LONGS_ARE_32) && !defined(LONGS_ARE_64)
344 #error "longs have not been defined as either 32 or 64 bits"
345 #error "This should never happen, contact support"
346 #endif
347 
348 #ifndef FF_CC
349 #error "A C compiler has not been defined"
350 You should define one of the following:
351 
352 PC
353 LINUX
354 SUN
355 IRIS4
356 MAC
357 IBM6000
358 HP9000
359 DEC_ALPHA
360 IRIX
361 
362 #endif
363 
364 #ifndef FF_OS
365 #error "An operating system has not been defined"
366 You should define one of the following:
367 
368 PC
369 LINUX
370 SUN
371 IRIS4
372 MAC
373 IBM6000
374 HP9000
375 DEC_ALPHA
376 IRIX
377 
378 #endif
379 
380 /* Directory Separators: specifically for the three currently supported
381  general operating systems, for path names in menu files (same as DOS) --
382  NATIVE_DIR_SEPARATOR is set to one of the three os-specific separators
383  at compile-time.
384  */
385 
386 #define UNIX_DIR_SEPARATOR '/'
387 #define UNIX_DIR_SEPARATOR_STRING "/"
388 
389 #define MAC_DIR_SEPARATOR ':'
390 #define MAC_DIR_SEPARATOR_STRING ":"
391 
392 #define DOS_DIR_SEPARATOR '\\'
393 #define DOS_DIR_SEPARATOR_STRING "\\"
394 
395 #ifndef MAX_PATH
396 #define MAX_PATH 260
397 #endif
398 
399 #if FF_OS == FF_OS_MACOS
400 
401 #define NATIVE_DIR_SEPARATOR MAC_DIR_SEPARATOR
402 #define NATIVE_DIR_SEPARATOR_STRING MAC_DIR_SEPARATOR_STRING
403 
404 #endif
405 
406 #if FF_OS == FF_OS_DOS
407 
408 #define NATIVE_DIR_SEPARATOR DOS_DIR_SEPARATOR
409 #define NATIVE_DIR_SEPARATOR_STRING DOS_DIR_SEPARATOR_STRING
410 
411 #endif
412 
413 #if FF_OS == FF_OS_UNIX
414 
415 #define NATIVE_DIR_SEPARATOR UNIX_DIR_SEPARATOR
416 #define NATIVE_DIR_SEPARATOR_STRING UNIX_DIR_SEPARATOR_STRING
417 
418 #endif
419 
420 #define FFNT_INT8 0
421 #define FFNT_UINT8 1
422 #define FFNT_INT16 2
423 #define FFNT_UINT16 3
424 #define FFNT_INT32 4
425 #define FFNT_UINT32 5
426 #define FFNT_INT64 6
427 #define FFNT_UINT64 7
428 #define FFNT_FLOAT32 8
429 #define FFNT_FLOAT64 9
430 #define FFNT_ENOTE 10
431 
432 #ifdef WANT_NCSA_TYPES
433 
434 typedef signed char int8;
435 typedef unsigned char uint8;
436 typedef signed short int int16;
437 typedef unsigned short int uint16;
438 typedef float float32;
439 typedef double float64;
440 
441 #endif
442 
443 #define SIZE_INT8 1
444 #define SIZE_UINT8 1
445 #define SIZE_INT16 2
446 #define SIZE_UINT16 2
447 #define SIZE_INT32 4
448 #define SIZE_UINT32 4
449 #define SIZE_INT64 8
450 #define SIZE_UINT64 8
451 #define SIZE_INT128 16 /* No current plans for support */
452 #define SIZE_UINT128 16 /* No current plans for support */
453 
454 #define SIZE_FLOAT32 4
455 #define SIZE_FLOAT64 8
456 #define SIZE_ENOTE SIZE_FLOAT64
457 #define SIZE_FLOAT128 16 /* No current plans for support */
458 
459 typedef double big_var_type;
460 typedef big_var_type align_var_type;
461 
462 #define FFV_INT8_MIN (-SCHAR_MAX-1)
463 #define FFV_INT8_MAX SCHAR_MAX
464 #define FFV_UINT8_MIN 0
465 #define FFV_UINT8_MAX UCHAR_MAX
466 #define FFV_INT16_MIN (-SHRT_MAX-1)
467 #define FFV_INT16_MAX SHRT_MAX
468 #define FFV_UINT16_MIN 0
469 #define FFV_UINT16_MAX USHRT_MAX
470 #define FFV_FLOAT32_MIN -FLT_MAX
471 #define FFV_FLOAT32_MAX FLT_MAX
472 #define FFV_FLOAT64_MIN -DBL_MAX
473 #define FFV_FLOAT64_MAX DBL_MAX
474 #define FFV_ENOTE_MIN FFV_FLOAT64_MIN
475 #define FFV_ENOTE_MAX FFV_FLOAT64_MAX
476 
477 #define FFV_FLOAT32_EPSILON FLT_EPSILON
478 #define FFV_FLOAT64_EPSILON DBL_EPSILON
479 #define FFV_ENOTE_EPSILON FFV_FLOAT64_EPSILON
480 
481 extern const char *fft_cnv_flags[FFNT_ENOTE + 1];
482 extern const char *fft_cnv_flags_width[FFNT_ENOTE + 1];
483 extern const char *fft_cnv_flags_prec[FFNT_ENOTE + 1];
484 extern const char *fft_cnv_flags_width_prec[FFNT_ENOTE + 1];
485 
486 #ifdef LONGS_ARE_32
487 
488 #ifdef LONGS_ARE_64
489 #error "longs have been defined as both 32 and 64 bits"
490 #error "This should never happen, contact support"
491 #endif
492 
493 #ifdef WANT_NCSA_TYPES
494 
495 typedef signed long int int32;
496 typedef unsigned long int uint32;
497 typedef char int64; /* not a real type for the PC */
498 typedef char uint64; /* not a real type for the PC */
499 
500 #endif
501 
502 #define FFV_INT32_MIN (-LONG_MAX-1)
503 #define FFV_INT32_MAX LONG_MAX
504 #define FFV_UINT32_MIN 0
505 #define FFV_UINT32_MAX ULONG_MAX
506 #define FFV_INT64_MIN 0
507 #define FFV_INT64_MAX 0
508 #define FFV_UINT64_MIN 0
509 #define FFV_UINT64_MAX 0
510 
511 #endif /* LONGS_ARE_32 */
512 
513 #ifdef LONGS_ARE_64
514 
515 #ifdef LONGS_ARE_32
516 #error "longs have been defined as both 32 and 64 bits"
517 #error "This should never happen, contact support"
518 #endif
519 
520 #ifdef WANT_NCSA_TYPES
521 
522 typedef signed int int32;
523 typedef unsigned int uint32;
524 typedef signed long int int64;
525 typedef unsigned long int uint64;
526 
527 #endif
528 
529 #define FFV_INT32_MIN (-INT_MAX-1)
530 #define FFV_INT32_MAX INT_MAX
531 #define FFV_UINT32_MIN 0
532 #define FFV_UINT32_MAX UINT_MAX
533 #define FFV_INT64_MIN (-LONG_MAX-1)
534 #define FFV_INT64_MAX LONG_MAX
535 #define FFV_UINT64_MIN 0
536 #define FFV_UINT64_MAX ULONG_MAX
537 
538 #endif /* LONGS_ARE_64 */
539 
540 typedef double ff_enote;
541 
542 /* Variable Types */
543 /* FFV_NULL MUST BE zero -- NOTHING else can be zero */
544 #define FFV_NULL (FF_TYPES_t)0x00000000
545 
546 #define FFV_SIZE_1 (FF_TYPES_t)0x00000001
547 #define FFV_SIZE_2 (FF_TYPES_t)0x00000002
548 #define FFV_UNSIGNED (FF_TYPES_t)0x00000004
549 #define FFV_INTEGER (FF_TYPES_t)0x00000008
550 #define FFV_REAL (FF_TYPES_t)0x00000010
551 #define FFV_TEXT (FF_TYPES_t)0x00000020
552 /* FFV_CHAR is used for strings, but I think FFV_TEXT is a better name.
553  */
554 #define FFV_CHAR FFV_TEXT
555 
556 #define FFV_CONSTANT (FF_TYPES_t)0x00000040 /* if you change this bit pattern, change FFV_EOL too! */
557 #define FFV_INITIAL (FF_TYPES_t)0x00000080
558 #define FFV_EOL (FF_TYPES_t)0x00000140 /* |= FFV_CONSTANT */
559 
560 /* above are masked by FFV_DATA_TYPES */
561 #define FFV_DATA_TYPES (FF_TYPES_t)0x000001FF
562 
563 #define FFV_CONVERT (FF_TYPES_t)0x00000200
564 #define FFV_EQUATION (FF_TYPES_t)0x00000400
565 #define FFNT_CONSTANT (FF_TYPES_t)0x00000800
566 #define FFNT_EQUIV (FF_TYPES_t)0x00001000
567 #define FFV_TRANSLATOR (FF_TYPES_t)0x00002000
568 #define FFV_ORPHAN (FF_TYPES_t)0x00004000
569 #define FFV_EQN (FF_TYPES_t)0x00008000
570 #define FFV_BIT_FIELD (FF_TYPES_t)0x00010000
571 
572 #define FFV_RECORD (FF_TYPES_t)0x00010000
573 #define FFV_INTERNAL (FF_TYPES_t)0x00020000
574 #define FFV_DELIM_VALUE (FF_TYPES_t)0x00040000
575 #define FFV_DELIM_ITEM (FF_TYPES_t)0x00080000
576 #define FFV_PARAM_NAME (FF_TYPES_t)0x00100000
577 #define FFV_PARAM_VALUE (FF_TYPES_t)0x00200000
578 
579 #define DONT_USE_THIS_BIT_PATTERN 0x40000000 /* This is used by FF_ARRAY for both formats and variables */
580 
581 #define FFV_INT8 ( FFV_INTEGER)
582 #define FFV_UINT8 (FFV_UNSIGNED | FFV_INTEGER)
583 #define FFV_INT16 ( FFV_INTEGER | FFV_SIZE_1)
584 #define FFV_UINT16 (FFV_UNSIGNED | FFV_INTEGER | FFV_SIZE_1)
585 #define FFV_INT32 ( FFV_INTEGER | FFV_SIZE_2)
586 #define FFV_UINT32 (FFV_UNSIGNED | FFV_INTEGER | FFV_SIZE_2)
587 #define FFV_INT64 ( FFV_INTEGER | FFV_SIZE_1 | FFV_SIZE_2)
588 #define FFV_UINT64 (FFV_UNSIGNED | FFV_INTEGER | FFV_SIZE_1 | FFV_SIZE_2)
589 #define FFV_FLOAT32 ( FFV_REAL | FFV_SIZE_2)
590 #define FFV_FLOAT64 ( FFV_REAL | FFV_SIZE_1 | FFV_SIZE_2)
591 #define FFV_ENOTE ( FFV_REAL)
592 
593 #define FFV_UCHAR FFV_UINT8
594 #define FFV_SHORT FFV_INT16
595 #define FFV_USHORT FFV_UINT16
596 
597 #ifdef LONGS_ARE_32
598 #define FFV_LONG FFV_INT32
599 #define FFV_ULONG FFV_UINT32
600 #endif
601 
602 #ifdef LONGS_ARE_64
603 #define FFV_LONG FFV_INT64
604 #define FFV_ULONG FFV_UINT64
605 #endif
606 
607 #define FFV_FLOAT FFV_FLOAT32
608 #define FFV_DOUBLE FFV_FLOAT64
609 
610 #define IS_TEXT_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_TEXT)
611 #define IS_INT8_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_INT8)
612 #define IS_UINT8_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_UINT8)
613 #define IS_INT16_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_INT16)
614 #define IS_UINT16_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_UINT16)
615 #define IS_INT32_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_INT32)
616 #define IS_UINT32_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_UINT32)
617 #define IS_INT64_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_INT64)
618 #define IS_UINT64_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_UINT64)
619 #define IS_FLOAT32_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_FLOAT32)
620 #define IS_FLOAT64_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_FLOAT64)
621 #define IS_ENOTE_TYPE(t) (FFV_DATA_TYPE_TYPE(t) == FFV_ENOTE)
622 #define IS_EQN_TYPE(t) ((t) & FFV_EQN)
623 #define IS_CONSTANT_TYPE(t)((t) ? (((t) & FFV_CONSTANT) == FFV_CONSTANT) : FALSE)
624 #define IS_INITIAL_TYPE(t) ((t) ? (((t) & FFV_INITIAL) == FFV_INITIAL) : FALSE)
625 
626 #define IS_RECORD_TYPE(t) ((t) & FFV_RECORD)
627 
628 #define IS_INTERNAL_TYPE(t) ((t) & FFV_INTERNAL)
629 
630 #define IS_DELIM_VALUE_TYPE(t) ((t) & FFV_DELIM_VALUE)
631 #define IS_DELIM_ITEM_TYPE(t) ((t) & FFV_DELIM_ITEM)
632 #define IS_PARAM_NAME_TYPE(t) ((t) & FFV_PARAM_NAME)
633 #define IS_PARAM_VALUE_TYPE(t) ((t) & FFV_PARAM_VALUE)
634 
635 #define IS_TEXT(v) IS_TEXT_TYPE(FFV_DATA_TYPE(v))
636 #define IS_INT8(v) IS_INT8_TYPE(FFV_DATA_TYPE(v))
637 #define IS_UINT8(v) IS_UINT8_TYPE((FFV_DATA_TYPE(v))
638 #define IS_INT16(v) IS_INT16_TYPE(FFV_DATA_TYPE(v))
639 #define IS_UINT16(v) IS_UINT16_TYPE(FFV_DATA_TYPE(v))
640 #define IS_INT32(v) IS_INT32_TYPE(FFV_DATA_TYPE(v))
641 #define IS_UINT32(v) IS_UINT32_TYPE(FFV_DATA_TYPE(v))
642 #define IS_INT64(v) IS_INT64_TYPE(FFV_DATA_TYPE(v))
643 #define IS_UINT64(v) IS_UINT64_TYPE(FFV_DATA_TYPE(v))
644 #define IS_FLOAT32(v) IS_FLOAT32_TYPE(FFV_DATA_TYPE(v))
645 #define IS_FLOAT64(v) IS_FLOAT64_TYPE(FFV_DATA_TYPE(v))
646 #define IS_ENOTE(v) IS_ENOTE_TYPE(FFV_DATA_TYPE(v))
647 #define IS_EQN(v) IS_EQN_TYPE(FFV_TYPE(v))
648 
649 #define IS_RECORD_VAR(v) IS_RECORD_TYPE(FFV_TYPE(v))
650 
651 #define IS_INTERNAL_VAR(v) IS_INTERNAL_TYPE(FFV_TYPE(v))
652 
653 #define IS_DELIM_VALUE_VAR(v) IS_DELIM_VALUE_TYPE(FFV_TYPE(v))
654 #define IS_DELIM_ITEM_VAR(v) IS_DELIM_ITEM_TYPE(FFV_TYPE(v))
655 #define IS_PARAM_NAME_VAR(v) IS_PARAM_NAME_TYPE(FFV_TYPE(v))
656 #define IS_PARAM_VALUE_VAR(v) IS_PARAM_VALUE_TYPE(FFV_TYPE(v))
657 
658 #define IS_UNSIGNED(v) (FFV_DATA_TYPE(v) & FFV_UNSIGNED)
659 #define IS_INTEGER(v) (FFV_DATA_TYPE(v) & FFV_INTEGER)
660 #define IS_REAL(v) (FFV_DATA_TYPE(v) & FFV_REAL)
661 
662 #define IS_UNSIGNED_TYPE(t) (FFV_DATA_TYPE_TYPE(t) & FFV_UNSIGNED)
663 #define IS_INTEGER_TYPE(t) (FFV_DATA_TYPE_TYPE(t) & FFV_INTEGER)
664 #define IS_REAL_TYPE(t) (FFV_DATA_TYPE_TYPE(t) & FFV_REAL)
665 
666 #define IS_BIT_FIELD(v) ((v) ? (((v)->type & FFV_BIT_FIELD) == FFV_BIT_FIELD) : FALSE)
667 #define IS_CONVERT(v) ((v) ? (((v)->type & FFV_CONVERT) == FFV_CONVERT) : FALSE)
668 #define IS_CONSTANT(v) ((v) ? IS_CONSTANT_TYPE(FFV_TYPE(v)) : FALSE)
669 #define IS_INITIAL(v) ((v) ? IS_INITIAL_TYPE(FFV_TYPE(v)) : FALSE)
670 #define IS_EQUATION(v) ((v) ? ((v)->type & FFV_EQUATION) == FFV_EQUATION : FALSE)
671 #define IS_TRANSLATOR(v) ((v) ? ((v)->type & FFV_TRANSLATOR) == FFV_TRANSLATOR : FALSE)
672 #define IS_ORPHAN_VAR(v) ((v) ? ((v)->type & FFV_ORPHAN) == FFV_ORPHAN : FALSE)
673 #define IS_EOL(v) ((v) ? ((v)->type & FFV_EOL) == FFV_EOL : FALSE)
674 #define IS_FLAG(v) ((v) ? (v)->type == FF_VAR_TYPE_FLAG : FALSE)
675 
676 typedef unsigned long FF_TYPES_t;
677 #define FF_VAR_TYPE_FLAG (FF_TYPES_t)0xffffffff
678 
679 #define IS_KEYWORDED_PARAMETER(p) ((p)[0] == '$')
680 
681 typedef struct {
682  char *fff_info;
683  FF_TYPES_t number;
685 
686 #define NUM_VARIABLE_TYPES 25
687 extern FFF_LOOKUP variable_types[NUM_VARIABLE_TYPES];
688 
689 /* FreeForm Format bit field masks */
690 #define FFF_FILE_TYPES (FFF_BINARY | FFF_ASCII | FFF_FLAT)
691 #define FFF_DATA_TYPES (FFF_DATA | FFF_HEADER | FFF_FILE | FFF_REC)
692 #define FFF_GROUP (FFF_FILE_TYPES | FFF_DATA_TYPES)
693 /* FD_TYPES == FFF_TABLE | FFF_DATA | FFF_HEADER | FFF_INPUT | FFF_OUTPUT */
694 
695 /* FreeForm Format bit field constants */
696 /* FFF_NULL MUST BE zero -- NOTHING else can be zero */
697 #define FFF_NULL (FF_TYPES_t)0x00000000
698 #define FFF_BINARY (FF_TYPES_t)0x00000001
699 #define FFF_ASCII (FF_TYPES_t)0x00000002
700 #define FFF_FLAT (FF_TYPES_t)0x00000004
701 
702 /* The order of the following must be preserved!!! See sort_format_data_list */
703 #define FFF_TABLE (FF_TYPES_t)0x00000008
704 #define FFF_HEADER (FF_TYPES_t)0x00000010
705 #define FFF_FILE (FF_TYPES_t)0x00000020
706 #define FFF_REC (FF_TYPES_t)0x00000040
707 #define FFF_DATA (FF_TYPES_t)0x00000080
708 
709 #define FFF_SEPARATE (FF_TYPES_t)0x00000100
710 #define FFF_VARIED (FF_TYPES_t)0x00000200
711 #define FFF_INPUT (FF_TYPES_t)0x00000400
712 #define FFF_OUTPUT (FF_TYPES_t)0x00000800
713 #define FFF_IO (FF_TYPES_t)0x00000C00
714 
715 #define FFF_SCALE (FF_TYPES_t)0x00001000
716 #define FFF_ADD_HERE (FF_TYPES_t)0x00002000
717 #define FFF_DELETE_ME (FF_TYPES_t)0X00008000
718 
719 #define FF_ARRAY (FF_TYPES_t)0x40000000
720 #define FFF_RECORD (FF_TYPES_t)0x80000000
721 
722 /* IS_ARRAY used for either variables or formats */
723 #define IS_ARRAY_TYPE(t) ((t) & FF_ARRAY)
724 #define IS_ARRAY(x) IS_ARRAY_TYPE(FFF_TYPE(x))
725 
726 #define FFF_ALL_TYPES (FF_TYPES_t)0x0000FFFF
727 /* above masked by FFF_ALL_TYPES */
728 
729 #define IS_BINARY_TYPE(t) ((t) & FFF_BINARY)
730 #define IS_ASCII_TYPE(t) ((t) & FFF_ASCII)
731 #define IS_FLAT_TYPE(t) ((t) & FFF_FLAT)
732 
733 #define IS_TABLE_TYPE(t) ((t) & FFF_TABLE)
734 #define IS_DATA_TYPE(t) ((t) & FFF_DATA)
735 #define IS_HEADER_TYPE(t) ((t) & FFF_HEADER)
736 #define IS_FILE_TYPE(t) ((t) & FFF_FILE)
737 #define IS_REC_TYPE(t) ((t) & FFF_REC)
738 #define IS_FILE_HEADER_TYPE(t) (IS_FILE_TYPE(t) && IS_HEADER_TYPE(t))
739 #define IS_REC_HEADER_TYPE(t) (IS_REC_TYPE(t) && IS_HEADER_TYPE(t))
740 #define IS_SEPARATE_TYPE(t) ((t) & FFF_SEPARATE)
741 #define IS_EMBEDDED_TYPE(t) (!IS_SEPARATE_TYPE(t))
742 #define IS_VARIED_TYPE(t) ((t) & FFF_VARIED)
743 #define IS_INPUT_TYPE(t) ((t) & FFF_INPUT)
744 #define IS_OUTPUT_TYPE(t) ((t) & FFF_OUTPUT)
745 #define IS_SCALE_TYPE(t) ((t) & FFF_SCALE)
746 
747 #define IS_RECORD_FORMAT_TYPE(t) ((t) & FFF_RECORD)
748 
749 #define IS_BINARY(f) IS_BINARY_TYPE(FFF_TYPE(f))
750 #define IS_ASCII(f) IS_ASCII_TYPE(FFF_TYPE(f))
751 #define IS_FLAT(f) IS_FLAT_TYPE(FFF_TYPE(f))
752 
753 #define IS_TABLE(f) IS_TABLE_TYPE(FFF_TYPE(f))
754 #define IS_DATA(f) IS_DATA_TYPE(FFF_TYPE(f))
755 #define IS_HEADER(f) IS_HEADER_TYPE(FFF_TYPE(f))
756 #define IS_FILE(f) IS_FILE_TYPE(FFF_TYPE(f))
757 #define IS_FILE_HEADER(f) (IS_FILE_HEADER_TYPE(FFF_TYPE(f)))
758 #define IS_REC_HEADER(f) (IS_REC_HEADER_TYPE(FFF_TYPE(f)))
759 #define IS_REC(f) IS_REC_TYPE(FFF_TYPE(f))
760 #define IS_SEPARATE(f) IS_SEPARATE_TYPE(FFF_TYPE(f))
761 #define IS_EMBEDDED(f) (!IS_SEPARATE(f))
762 #define IS_VARIED(f) IS_VARIED_TYPE(FFF_TYPE(f))
763 #define IS_INPUT(f) IS_INPUT_TYPE(FFF_TYPE(f))
764 #define IS_OUTPUT(f) IS_OUTPUT_TYPE(FFF_TYPE(f))
765 #define IS_SCALE(f) IS_SCALE_TYPE(FFF_TYPE(f))
766 
767 #define IS_RECORD_FORMAT(f) IS_RECORD_FORMAT_TYPE(FFF_TYPE(f))
768 
769 #define NUM_FORMAT_TYPES 71
770 extern FFF_LOOKUP format_types[NUM_FORMAT_TYPES];
771 
772 #define FF_DBG_LOG "ff_debug.log"
773 #define FF_DBG_LOG_SIZE 10240
774 
775 } // extern C
776 
777 #include <cassert>
778 
779 #if defined(DEBUG) || defined(_DEBUG) && !defined(FF_DBG)
780 #define FF_DBG
781 #endif
782 
783 /* FF_CHK_ADDR is independent of NDEBUG */
784 #ifdef FF_CHK_ADDR
785 #define FF_VALIDATE(o) (((o) && ((void *)(o) == (o)->check_address)) ? (void)0 : _ff_err_assert(#o, __FILE__, __LINE__))
786 #else
787 #define FF_VALIDATE(o) 0
788 #endif
789 
790 #include <errno.h>
791 
792 /* Following are to be used when converting a floating point type to an
793  integer type -- this should avoid the occasional truncation error */
794 
795 #include <float.h>
796 #include <cmath>
797 #include <fcntl.h>
798 
799 #define DOUBLE_UP DBL_EPSILON
800 #define FLOAT_UP FLT_EPSILON
801 #define STR_END '\0' /* NULL-terminator for the C-string data type */
802 
803 #if FF_CC == FF_CC_UNIX
804 
805 #include <sys/uio.h>
806 #include <sys/types.h>
807 #include <sys/stat.h>
808 
809 #define O_BINARY 0
810 
811 #endif /* #if FF_CC == FF_CC_UNIX */
812 
813 #if FF_CC == FF_CC_MSVC1 || FF_CC == FF_CC_MSVC4
814 
815 #include <malloc.h>
816 #include <io.h>
817 #include <sys\types.h>
818 #include <sys\stat.h>
819 
820 #endif /* FF_CC == FF_CC_MSVC1 || FF_CC == FF_CC_MSVC4 */
821 
822 extern "C" {
823 
824 #include <dl_lists.h>
825 #include <os_utils.h>
826 #include <memtrack.h>
827 
828 #include <ndarray.h>
829 
830 #ifdef HUGE
831 #undef HUGE
832 #endif /* HUGE */
833 
834 #if FF_CC == FF_CC_MSVC1
835 #define HUGE huge
836 #else
837 #define HUGE
838 #endif /* (ELSE) FF_CC == FF_CC_MSVC1 */
839 
840 
841 
842 typedef char HUGE *FF_DATA_BUFFER;
843 typedef void HUGE *FF_DATA_PTR;
844 
845 typedef char **FF_STRING_HANDLE;
846 
847 /* Utility macros */
848 #define FD_FORMAT(fd) ((fd)->format)
849 #define FFF_FIRST(fl) dll_first(fl)
850 #define FFF_NEXT(fl) dll_next(fl)
851 #define FD_FIRST(fdl) dll_first(fdl)
852 #define FD_LAST(fdl) dll_last(fdl)
853 #define FFV_FIRST_VARIABLE(f) ((VARIABLE_LIST)dll_first((f)->variables))
854 #define FFV_NEXT_VARIABLE(vl) dll_next(vl)
855 #define FORMAT_LENGTH(f) ((size_t)(f)->length)
856 #define FF_VAR_LENGTH(v) ((size_t)(v)->end_pos - (size_t)(v)->start_pos + (size_t)1)
857 
858 #define FFV_TYPE(v) ((v)->type)
859 #define FFV_DATA_TYPE_TYPE(t) ((t) & FFV_DATA_TYPES)
860 #define FFV_DATA_TYPE(v) FFV_DATA_TYPE_TYPE(FFV_TYPE(v))
861 #define FFF_TYPE(f) ((f)->type)
862 #define FFF_FORMAT_TYPE(f) (FFF_TYPE(f) & FFF_ALL_TYPES)
863 #define FD_TYPE(fd) (FFF_TYPE((fd)->format) & FFF_DATA_TYPES)
864 
865 #define FD_IS_NATIVE_BYTE_ORDER(fd) (endian() == (BOOLEAN)(fd)->state.byte_order)
866 
867 #define MAX_PV_LENGTH MAX_PATH /* Maximum parameter or parameter-value length */
868 #define MAX_NAME_LENGTH MAX_PV_LENGTH
869 #define TMP_BUFFER_SIZE 1024
870 #define LOGGING_QUANTA 10240U
871 #define SCRATCH_QUANTA 1024U
872 
873 #define FMT_BUFSIZE_BUFFER_SIZE 4096 /* pick a reasonable size... */
874 
875 /* even though ff_bss_t is an unsigned (long, in Unix) there will be problems
876  if bytes_used or total_bytes ever takes on a value greater than LONG_MAX */
877 
878 #define FFBS_GRAFT 0
879 
880 typedef unsigned FF_BSS_t; /* FreeForm bufsize size type */
881 
882 /*
883  * FF_BUFSIZE
884  */
885 
888 struct struct_ff_bufsize {
889 #ifdef FF_CHK_ADDR
890  void *check_address;
891 #endif
892  char HUGE *buffer;
893  unsigned short usage;
894  FF_BSS_t bytes_used;
895  FF_BSS_t total_bytes;
896 };
897 
898 } // extern C
899 
900 #ifndef INT_MAX
901 #include <limits.h>
902 #endif /* INT_MAX */
903 
904 #define BUFSIZE_TOTAL_BYTES_UNKNOWN INT_MAX
905 
906 extern "C" {
907 /*
908  * FF_STD_ARGS
909  */
910 
913 struct struct_ff_std_args {
914 #ifdef FF_CHK_ADDR
915  void *check_address;
916 #endif
917  char *input_file; /* string: name of input file */
918  FF_BUFSIZE_PTR input_bufsize; /* bufsize containing input data */
919  char *input_format_file; /* string: name of input format file */
920  char *input_format_title; /* string: input format title */
921  char *input_format_buffer; /* string: input format description */
922  char *output_file; /* string: name of output file */
923  char *log_file; /* string: name of log file */
924  FF_BUFSIZE_PTR output_bufsize; /* bufsize to contain output data */
925  char *output_format_file; /* string: name of output format file */
926  char *output_format_title; /* string: output forma title */
927  char *output_format_buffer; /* string: output format description */
928  char *var_file; /* string: name of variable file */
929  char *query_file; /* string: name of query file */
930  unsigned long cache_size; /* integer: default data cacheing size */
931  long records_to_read; /* integer: if negative, file tail */
932 
933  char *error_log; /* string: file name to send error messages */
934  BOOLEAN error_prompt;
935 
936  /* Checkvar specific option flags */
937  char *cv_list_file_dir;
938  int cv_precision;
939  int cv_maxbins;
940  BOOLEAN cv_maxmin_only;
941  BOOLEAN cv_subset;
942 
943  char *sdts_terms_file;
944 
945  struct struct_std_args_user {
946  unsigned int set_cv_precision :1;
947  unsigned int is_stdin_redirected :1;
948  unsigned int is_stdout_redirected :1;
949  unsigned int format_title :1;
950  unsigned int format_file :1;
951  } user;
952 };
953 
954 #include <err.h>
955 
956 /* ff_copy_variable depends on the contents of the VARIABLE structure, below.
957  If you change this structure, you must also change ff_copy_variable
958  */
959 
961 
965 
970 
972 struct struct_ff_error {
973 #ifdef FF_CHK_ADDR
974  void *check_address;
975 #endif
976 
977  int code;
978 
979  char *message;
980  char *problem;
981 
982  int warning_ord;
983  int error_ord;
984 };
985 
986 #define FF_MAX_NAME MAX_PATH
987 
988 #define FFV_MISC_INIT NULL
989 
990 typedef unsigned long FF_NDX_t;
991 
992 /* ff_copy_format depends on the contents of the FORMAT structure, below.
993  If you change this structure, you must also change ff_copy_format
994  */
995 
996 /*
997  * FORMAT
998  */
999 
1000 typedef struct struct_ff_format FORMAT, *FORMAT_PTR, **FORMAT_HANDLE;
1001 struct struct_ff_format {
1002 #ifdef FF_CHK_ADDR
1003  void *check_address; /* assert(format->check_address == format); */
1004 #endif
1005  VARIABLE_LIST variables; /* the DLL of variable structures */
1006  char *name; /* title if given in a format file or menu section */
1007  char *locus; /* path-name or menu section title of format */
1008  FF_TYPES_t type; /* format type, see FFF_LOOKUP format_types */
1009  unsigned int num_vars; /* number of variables in format */
1010  FF_NDX_t length; /* record length in bytes */
1011 };
1012 
1013 #define FORMAT_NAME_INIT "Format Was Untitled"
1014 #define FORMAT_LOCUS_INIT "Unknown Origin"
1015 #define FORMAT_LOCUS_GV_EDIT "GeoVu Format Editor"
1016 
1017 /* ff_copy_variable depends on the contents of the VARIABLE structure, below.
1018  If you change this structure, you must also change ff_copy_variable
1019  */
1020 
1021 /* I don't know if I should copy the EQUATION_INFO or not... */
1022 
1023 /*
1024  * VARIABLE
1025  */
1026 
1027 #include <eval_eqn.h>
1028 
1029 /* define the conversion between user's variable name and value to geovu name and value */
1030 
1031 typedef struct struct_ff_translator /* define value translation table */
1032 {
1033 #ifdef FF_CHK_ADDR
1034  void *check_address;
1035 #endif
1036  FF_TYPES_t gtype; /* corresponding geovu data type */
1037  void *gvalue; /* corresponding geovu data value */
1038  FF_TYPES_t utype; /* define the user's data type */
1039  void *uvalue; /* define the user's data value */
1040  struct struct_ff_translator *next;
1042 
1044 
1045 /* Define MAX_MIN structure */
1046 
1047 typedef struct struct_ff_max_min {
1048 #ifdef FF_CHK_ADDR
1049  void* check_address; /* MAX_MIN address in memory */
1050 #endif
1051  unsigned long cur_record; /* Current record being processed */
1052  unsigned long min_record; /* Record where min occurs */
1053  unsigned long max_record; /* Record where max occurs */
1054  void *minimum; /* Minimum variable value */
1055  void *maximum; /* Maximum variable value */
1056  void *max_flag; /* Upper missing data limit */
1057  void *min_flag; /* Lower missing data limit */
1058 } MAX_MIN, *MAX_MIN_PTR;
1059 
1060 struct struct_ff_variable {
1061 #ifdef FF_CHK_ADDR
1062  void *check_address; /* assert(variable->check_address == variable); */
1063 #endif
1064  EQUATION_INFO_PTR eqn_info; /* For derived output variables */
1065  union {
1066  TRANSLATOR_PTR nt_trans; /* TRANSLATOR_PTR */
1067  int cv_var_num; /* conversion function number */
1068  MAX_MIN_PTR mm;
1069  } misc;
1070  char *name; /* the variable name */
1071  FF_TYPES_t type; /* variable type, see FFF_LOOKUP variable_types */
1072  FF_NDX_t start_pos; /* starting byte of variable in a record, counting from 1 (one) */
1073  FF_NDX_t end_pos; /* ending byte of variable in a record */
1074  short precision; /* implied (if integer) or real (if floating point) precision, i.e., number of decimal places */
1075  char *array_desc_str;
1076  char *record_title; /* if type == FF_VAR_TYPE_FLAG */
1077 };
1078 
1079 /*
1080  * FORMAT_DATA
1081  */
1082 
1085 struct struct_ff_format_data {
1086  /* generic io_element suitable for name tables, headers, and caches --
1087  anything that contains data in a dynamic buffer described by a format
1088  */
1089 #ifdef FF_CHK_ADDR
1090  void *check_address;
1091 #endif
1092  FORMAT_PTR format;
1093  FF_BUFSIZE_PTR data;
1094  struct struct_fd_state {
1095  unsigned int byte_order; /* 1=big endian (Unix), 0=little endian */
1096  unsigned int new_record; /* 1=new data that hasn't been accessed yet */
1097  unsigned int locked;
1098  unsigned int unused; /* Not sure we need this. jhrg */
1099  } state;
1100 };
1101 
1103 
1105 
1106 #include <name_tab.h>
1107 
1108 /*
1109  * FORMAT_DATA_MAPPING
1110  */
1111 
1115 #ifdef FF_CHK_ADDR
1116  void *check_address;
1117 #endif
1118  FORMAT_DATA_PTR input;
1119  FORMAT_DATA_PTR middle;
1120  FORMAT_DATA_PTR output;
1121 };
1122 
1123 typedef enum enum_pp_object {
1124  PPO_FORMAT_LIST = 0, PPO_NT_LIST = 1, ADD_YOUR_TYPE_HERE = 2
1125 } PP_OBJECT_TYPES;
1126 
1127 /*
1128  * PP_OBJECT
1129  */
1130 
1132  **PP_OBJECT_HANDLE;
1133 struct struct_ff_pp_object {
1134  union union_u {
1135  FORMAT_LIST_HANDLE hf_list;
1136  struct struct_nt_list {
1137  FF_TYPES_t nt_io_type;
1138  NAME_TABLE_LIST_HANDLE hnt_list;
1139  } nt_list;
1140  void *add_your_object_here;
1141  } u;
1142  PP_OBJECT_TYPES ppo_type;
1143 };
1144 
1145 /*
1146  * FF_ARRAY_DIPOLE
1147  */
1148 typedef unsigned long FF_ARRAY_OFFSET_t;
1149 
1152 struct struct_ff_array_dipole {
1153 #ifdef FF_CHK_ADDR
1154  void *check_address;
1155 #endif
1156  char *name; /* the array variable name */
1157  FF_ARRAY_DIPOLE_PTR mate;
1158  FORMAT_DATA_MAPPING_PTR format_data_mapping;
1159  ARRAY_MAPPING_PTR array_mapping;
1160  FORMAT_DATA_PTR fd;
1161  struct struct_connect {
1162  NDARR_SOURCE id; /* NDARRS_FILE or NDARRS_BUFFER */
1163 #if defined(_DEBUG) || defined(DEBUG)
1164  struct struct_locus
1165  {
1166  char *filename; /* file name if NDARRS_FILE */
1167  FF_BUFSIZE_PTR bufsize; /* FF_BUFSIZE_PTR if NDARRS_BUFFER */
1168  }locus;
1169 #else
1170  union union_locus {
1171  char *filename; /* file name if NDARRS_FILE */
1172  FF_BUFSIZE_PTR bufsize; /* FF_BUFSIZE_PTR if NDARRS_BUFFER */
1173  } locus;
1174 #endif
1175  struct struct_file_info {
1176  FF_ARRAY_OFFSET_t first_array_offset; /* file header size if NDARRS_FILE */
1177  FF_ARRAY_OFFSET_t current_array_offset; /* file header size if NDARRS_FILE */
1178  } file_info;
1179  unsigned long bytes_left;
1180  unsigned long bytes_done; /* read for input, converted for output */
1181  int array_done;
1182  } connect;
1183 };
1184 
1185 /*
1186  * FF_ARRAY_CONDUIT
1187  */
1188 
1191 struct struct_ff_array_conduit {
1192 #ifdef FF_CHK_ADDR
1193  void *check_address;
1194 #endif
1195  char name[FF_MAX_NAME]; /* the array variable name */
1196  FF_ARRAY_DIPOLE_PTR input;
1197  FF_ARRAY_DIPOLE_PTR output;
1198 };
1199 
1200 /*
1201  * PROCESS_INFO
1202  */
1203 
1206 struct struct_ff_process_info {
1207 #ifdef FF_CHK_ADDR
1208  void *check_address;
1209  void *locked_buffer;
1210 #endif
1211  char *name;
1212  FF_ARRAY_DIPOLE_PTR pole;
1213 
1214  PROCESS_INFO_PTR mate;
1215 };
1216 
1217 /*
1218  * DATA_FLAG
1219  */
1220 
1221 typedef struct struct_ff_data_flag {
1222 #ifdef FF_CHK_ADDR
1223  void *check_address;
1224 #endif
1225  double value;
1226  double temp_dvar;
1227  VARIABLE_PTR var;
1228  char value_exists;
1230 
1231 #ifdef FF_DBG
1232 VARIABLE_PTR FF_VARIABLE(VARIABLE_LIST);
1233 FORMAT_PTR FF_FORMAT(FORMAT_LIST);
1234 FORMAT_DATA_PTR FD_FORMAT_DATA(FORMAT_DATA_LIST);
1239 
1240 DLL_NODE_PTR dll_next(DLL_NODE_PTR node);
1241 DLL_NODE_PTR dll_previous(DLL_NODE_PTR node);
1242 
1243 #else
1244 #define FF_VARIABLE(vl) ((VARIABLE_PTR)(vl)->data.u.var)
1245 #define FF_FORMAT(fl) ((FORMAT_PTR)(fl)->data.u.fmt)
1246 #define FD_FORMAT_DATA(fdl) ((FORMAT_DATA_PTR)(fdl)->data.u.fd)
1247 #define FF_AC(acl) ((FF_ARRAY_CONDUIT_PTR)(acl)->data.u.ac)
1248 #define FF_PI(pil) ((PROCESS_INFO_PTR)(pil)->data.u.pi)
1249 #define FF_EP(el) ((FF_ERROR_PTR)(el)->data.u.err)
1250 #define FF_DF(dfl) ((FF_DATA_FLAG_PTR)(dfl)->data.u.df)
1251 
1252 #define dll_next(n) ((n)->next)
1253 #define dll_previous(n) ((n)->previous)
1254 
1255 #endif
1256 
1257 DLL_NODE_PTR dll_first(DLL_NODE_PTR node);
1258 DLL_NODE_PTR dll_last(DLL_NODE_PTR node);
1259 
1260 typedef enum enum_ff_dll_data_types {
1261  DLL_VAR = 1,
1262  DLL_FMT = 2,
1263  DLL_FD = 3,
1264  DLL_AC = 4,
1265  DLL_PI = 5,
1266  DLL_ERR = 6,
1267  DLL_DF = 7,
1268  DLL_HEAD_NODE = SHRT_MAX
1269 } FF_DLL_DATA_TYPES;
1270 
1272 struct struct_ff_dll_data {
1273  union union_struct_ff_dll_data_u {
1274  VARIABLE_PTR var;
1275  FORMAT_PTR fmt;
1276  FORMAT_DATA_PTR fd;
1278  PROCESS_INFO_PTR pi;
1279  FF_ERROR_PTR err;
1280  FF_DATA_FLAG_PTR df;
1281  } u;
1282  FF_DLL_DATA_TYPES type;
1283 };
1284 
1285 struct struct_ff_dll_node {
1286 #ifdef FF_CHK_ADDR
1287  void *check_address;
1288 #endif
1289  DLL_DATA data;
1290  DLL_NODE_PTR previous;
1291  DLL_NODE_PTR next;
1292 #ifdef DLL_CHK
1293  unsigned int status;
1294  size_t count; /* head node: count of non-head nodes */
1295 #endif
1296 };
1297 
1298 /* Define BIN structures */
1299 
1300 typedef struct struct_databin {
1301 #ifdef FF_CHK_ADDR
1302  void *check_address;
1303 #endif
1304  char *title;
1305 
1306  EQUATION_INFO_PTR eqn_info;
1307 
1308  FF_ARRAY_CONDUIT_LIST array_conduit_list;
1309 
1310  NAME_TABLE_LIST table_list;
1312 
1313 typedef struct struct_ff_array_dim_info {
1314 #ifdef FF_CHK_ADDR
1315  void *check_address;
1316 #endif
1317  long start_index;
1318  long end_index;
1319  long granularity;
1320  long separation;
1321  long grouping;
1322  long num_array_elements;
1324 
1325 #define DEFAULT_CACHE_SIZE 16384L
1326 
1327 #define FF_MAX_CACHE_SIZE (unsigned long)UINT_MAX
1328 
1329 #define DBSET_INPUT_FORMATS 1
1330 #define DBSET_OUTPUT_FORMATS 2
1331 #define DBSET_HEADERS 3
1332 #define DBSET_READ_EQV 4
1333 #define DBSET_CACHE_SIZE 5
1334 #define DBSET_HEADER_FILE_NAMES 6
1335 #define DBSET_QUERY_RESTRICTION 7
1336 #define DBSET_VARIABLE_RESTRICTION 8
1337 #define DBSET_BYTE_ORDER 9
1338 #define DBSET_CREATE_CONDUITS 10
1339 #define DBSET_USER_UPDATE_FORMATS 11
1340 #define DBSET_INIT_CONDUITS 12
1341 #define DBSET_FORMAT_MAPPINGS 13
1342 #define DBSET_EQUATION_VARIABLES 14
1343 #define DBSET_SETUP_STDIN 15
1344 #define DBSET_VAR_MINMAX 16
1345 
1346 #define DBASK_FORMAT_SUMMARY 1
1347 #define DBASK_PROCESS_INFO 2
1348 #define DBASK_VAR_NAMES 3
1349 #define DBASK_VAR_MINS 4
1350 #define DBASK_VAR_MAXS 5
1351 #define DBASK_VAR_UNITS 6
1352 #define DBASK_VAR_FLAGS 7
1353 #define DBASK_ARRAY_DIM_NAMES 8
1354 #define DBASK_ARRAY_DIM_INFO 9
1355 #define DBASK_BYTES_TO_PROCESS 10
1356 #define DBASK_FORMAT_DESCRIPTION 11
1357 #define DBASK_FORMAT_LIST_DESCRIPTION 12
1358 #define DBASK_TAB_TO_ARRAY_FORMAT_DESCRIPTION 13
1359 #define DBASK_FORMAT_DESCRIPTION_TO_USER 14
1360 #define DBASK_FORMAT_LIST_DESCRIPTION_TO_USER 15
1361 
1362 #define DBDO_READ_FORMATS 1
1363 #define DBDO_WRITE_FORMATS 2
1364 #define DBDO_CONVERT_DATA 3
1365 #define DBDO_BYTE_SWAP 4
1366 #define DBDO_FILTER_ON_QUERY 5
1367 #define DBDO_CONVERT_FORMATS 6
1368 #define DBDO_PROCESS_FORMATS 7
1369 #define DBDO_READ_STDIN 8
1370 #define DBDO_CHECK_STDOUT 9
1371 #define DBDO_PROCESS_DATA 10
1372 
1373 /* not needed */
1374 #define DBDO_WRITE_OUTPUT_FMT_FILE 255
1375 
1376 #ifdef NT_ANYWHERE
1377 #error "NT_ANYWHERE is already defined!"
1378 #endif
1379 #define NT_HEADERS FFF_FILE | FFF_REC | FFF_HEADER
1380 #define NT_TABLE FFF_TABLE /* Don't change this w/o looking at every occurrence of IS_TABLE! */
1381 
1382 #define NT_INPUT FFF_INPUT | NT_HEADERS | NT_TABLE
1383 #define NT_OUTPUT FFF_OUTPUT | NT_HEADERS | NT_TABLE
1384 
1385 #define NT_ANYWHERE FFF_FILE | FFF_REC | FFF_HEADER | FFF_TABLE
1386 
1387 /* Internal stuff */
1388 #define PINFO_POLE(pi) ((pi)->pole)
1389 #define PINFO_FD(pi) (PINFO_POLE(pi)->fd)
1390 #define PINFO_DATA(pi) (PINFO_FD(pi)->data)
1391 #define PINFO_BUFFER(pi) (PINFO_DATA(pi)->buffer)
1392 #define PINFO_BYTES_USED(pi) (PINFO_DATA(pi)->bytes_used)
1393 #define PINFO_TOTAL_BYTES(pi) (PINFO_DATA(pi)->total_bytes)
1394 #define PINFO_STATE(pi) (PINFO_FD(pi)->state)
1395 #define PINFO_LOCKED(pi) (PINFO_STATE(pi).locked)
1396 #define PINFO_NEW_RECORD(pi) (PINFO_STATE(pi).new_record)
1397 #define PINFO_BYTE_ORDER(pi) (PINFO_STATE(pi).byte_order)
1398 #define PINFO_FORMAT(pi) (PINFO_FD(pi)->format)
1399 
1400 #define PINFO_SUPER_ARRAY_BYTES(pi) (PINFO_ARRAY_MAP(pi)->super_array->contig_size)
1401 #define PINFO_SUB_ARRAY_BYTES(pi) (PINFO_ARRAY_MAP(pi)->sub_array->contig_size)
1402 
1403 #define PINFO_SUPER_ARRAY_ELS(pi) (PINFO_ARRAY_MAP(pi)->super_array->total_elements)
1404 #define PINFO_SUB_ARRAY_ELS(pi) (PINFO_ARRAY_MAP(pi)->sub_array->total_elements)
1405 
1406 #define PINFO_ARRAY_BYTES(pi) (PINFO_ARRAY_MAP(pi)->super_array->contig_size)
1407 
1408 #define PINFO_ARRAY_DIMS(pi) (PINFO_ARRAY_MAP(pi)->super_array->num_dim)
1409 #define PINFO_ARRAY_NAME(pi, dim) (PINFO_ARRAY_MAP(pi)->super_array->dim_name[dim])
1410 #define PINFO_ARRAY_DIM_SIZE(pi, dim) (PINFO_ARRAY_MAP(pi)->super_array->dim_size[dim])
1411 
1412 /* External stuff */
1413 #define PINFO_TYPE(pi) (PINFO_FORMAT(pi)->type)
1414 #define PINFO_NAME(pi) (PINFO_FORMAT(pi)->name)
1415 #define PINFO_ORIGIN(pi) (PINFO_FORMAT(pi)->locus)
1416 #define PINFO_RECL(pi) (FORMAT_LENGTH(PINFO_FORMAT(pi)))
1417 #define PINFO_CACHEL(pi) (PINFO_TOTAL_BYTES(pi) - 1)
1418 #define PINFO_NUMVARS(pi) (PINFO_FORMAT(pi)->num_vars)
1419 #define PINFO_IS_FILE(pi) (PINFO_POLE(pi)->connect.id & NDARRS_FILE)
1420 #define PINFO_IS_ARRAY(pi) (IS_ARRAY(PINFO_FORMAT(pi)))
1421 #define PINFO_IS_BROKEN(pi) (PINFO_ARRAY_MAP(pi)->sub_array->type == NDARRT_BROKEN)
1422 #define PINFO_FNAME(pi) (PINFO_POLE(pi)->connect.locus.filename)
1423 #define PINFO_LOCUS_BUFSIZE(pi) (PINFO_POLE(pi)->connect.locus.bufsize)
1424 #define PINFO_LOCUS_BUFFER(pi) (PINFO_POLE(pi)->connect.locus.bufsize->buffer)
1425 #define PINFO_LOCUS_SIZE(pi) (PINFO_POLE(pi)->connect.locus.bufsize->total_bytes)
1426 #define PINFO_LOCUS_FILLED(pi) (PINFO_POLE(pi)->connect.locus.bufsize->bytes_used)
1427 #define PINFO_FIRST_ARRAY_OFFSET(pi) (PINFO_POLE(pi)->connect.file_info.first_array_offset)
1428 #define PINFO_CURRENT_ARRAY_OFFSET(pi) (PINFO_POLE(pi)->connect.file_info.current_array_offset)
1429 #define PINFO_ARRAY_DONE(pi) (PINFO_POLE(pi)->connect.array_done)
1430 #define PINFO_BYTES_LEFT(pi) (PINFO_POLE(pi)->connect.bytes_left)
1431 #define PINFO_BYTES_DONE(pi) (PINFO_POLE(pi)->connect.bytes_done)
1432 #define PINFO_ARRAY_MAP(pi) (PINFO_POLE(pi)->array_mapping)
1433 #define PINFO_ID(pi) (PINFO_POLE(pi)->connect.id)
1434 #define PINFO_FORMAT_MAP(pi) (PINFO_POLE(pi)->format_data_mapping)
1435 
1436 #define PINFO_SUPER_ARRAY(pi) (PINFO_ARRAY_MAP(pi)->super_array)
1437 #define PINFO_SUB_ARRAY(pi) (PINFO_ARRAY_MAP(pi)->sub_array)
1438 
1439 #define PINFO_NUM_DIMS(pi) (PINFO_ARRAY_MAP(pi)->super_array->num_dim)
1440 
1441 #define PINFO_DIM_NAME(pi,i) (PINFO_ARRAY_MAP(pi)->super_array->dim_name[i])
1442 #define PINFO_DIM_START_INDEX(pi, i) (PINFO_ARRAY_MAP(pi)->super_array->start_index[i])
1443 #define PINFO_DIM_END_INDEX(pi, i) (PINFO_ARRAY_MAP(pi)->super_array->end_index[i])
1444 #define PINFO_DIM_GRANULARITY(pi, i) (PINFO_ARRAY_MAP(pi)->super_array->granularity[i])
1445 #define PINFO_DIM_SEPARATION(pi, i) (PINFO_ARRAY_MAP(pi)->super_array->separation[i])
1446 #define PINFO_DIM_GROUPING(pi, i) (PINFO_ARRAY_MAP(pi)->super_array->grouping[i])
1447 
1448 #define PINFO_MATE(pi) ((pi)->mate)
1449 
1450 /* Internal stuff */
1451 #define PINFO_MATE_POLE(pi) PINFO_POLE(PINFO_MATE(pi))
1452 #define PINFO_MATE_FD(pi) PINFO_FD(PINFO_MATE(pi))
1453 #define PINFO_MATE_DATA(pi) PINFO_DATA(PINFO_MATE(pi))
1454 #define PINFO_MATE_BUFFER(pi) PINFO_BUFFER(PINFO_MATE(pi))
1455 #define PINFO_MATE_BYTES_USED(pi) PINFO_BYTES_USED(PINFO_MATE(pi))
1456 #define PINFO_MATE_TOTAL_BYTES(pi) PINFO_TOTAL_BYTES(PINFO_MATE(pi))
1457 #define PINFO_MATE_STATE(pi) PINFO_STATE(PINFO_MATE(pi))
1458 #define PINFO_MATE_LOCKED(pi) PINFO_LOCKED(PINFO_MATE(pi))
1459 #define PINFO_MATE_NEW_RECORD(pi) PINFO_NEW_RECORD(PINFO_MATE(pi))
1460 #define PINFO_MATE_BYTE_ORDER(pi) PINFO_BYTE_ORDER(PINFO_MATE(pi))
1461 #define PINFO_MATE_FORMAT(pi) PINFO_FORMAT(PINFO_MATE(pi))
1462 
1463 #define PINFO_MATE_SUPER_ARRAY_BYTES(pi) PINFO_SUPER_ARRAY_BYTES(PINFO_MATE(pi))
1464 #define PINFO_MATE_SUB_ARRAY_BYTES(pi) PINFO_SUB_ARRAY_BYTES(PINFO_MATE(pi))
1465 
1466 #define PINFO_MATE_SUPER_ARRAY_ELS(pi) PINFO_SUPER_ARRAY_ELS(PINFO_MATE(pi))
1467 #define PINFO_MATE_SUB_ARRAY_ELS(pi) PINFO_SUB_ARRAY_ELS(PINFO_MATE(pi))
1468 
1469 #define PINFO_MATE_ARRAY_BYTES(pi) (PINFO_MATE_ARRAY_MAP(pi)->sub_array->contig_size)
1470 
1471 #define PINFO_MATE_SUPER_ARRAY(pi) (PINFO_MATE_ARRAY_MAP(pi)->super_array)
1472 #define PINFO_MATE_SUB_ARRAY(pi) (PINFO_MATE_ARRAY_MAP(pi)->sub_array)
1473 
1474 /* External stuff */
1475 #define PINFO_MATE_TYPE(pi) PINFO_TYPE(PINFO_MATE(pi))
1476 #define PINFO_MATE_NAME(pi) PINFO_NAME(PINFO_MATE(pi))
1477 #define PINFO_MATE_ORIGIN(pi) PINFO_ORIGIN(PINFO_MATE(pi))
1478 #define PINFO_MATE_RECL(pi) PINFO_RECL(PINFO_MATE(pi))
1479 #define PINFO_MATE_CACHEL(pi) PINFO_CACHEL(PINFO_MATE(pi))
1480 #define PINFO_MATE_NUMVARS(pi) PINFO_NUMVARS(PINFO_MATE(pi))
1481 #define PINFO_MATE_IS_FILE(pi) PINFO_IS_FILE(PINFO_MATE(pi))
1482 #define PINFO_MATE_FNAME(pi) PINFO_FNAME(PINFO_MATE(pi))
1483 #define PINFO_MATE_LOCUS(pi) PINFO_LOCUS(PINFO_MATE(pi))
1484 #define PINFO_MATE_ARRAY_OFFSET(pi) PINFO_ARRAY_OFFSET(PINFO_MATE(pi))
1485 #define PINFO_MATE_ARRAY_DONE(pi) PINFO_ARRAY_DONE(PINFO_MATE(pi))
1486 #define PINFO_MATE_BYTES_LEFT(pi) PINFO_BYTES_LEFT(PINFO_MATE(pi))
1487 #define PINFO_MATE_BYTES_DONE(pi) PINFO_BYTES_DONE(PINFO_MATE(pi))
1488 #define PINFO_MATE_BUFFER_SIZE(pi) PINFO_BUFFER_SIZE(PINFO_MATE(pi))
1489 #define PINFO_MATE_ARRAY_MAP(pi) PINFO_ARRAY_MAP(PINFO_MATE(pi))
1490 #define PINFO_MATE_ID(pi) PINFO_ID(PINFO_MATE(pi))
1491 
1492 void dll_assign(void *data, FF_DLL_DATA_TYPES type, DLL_NODE_PTR node);
1493 
1494 typedef BOOLEAN (*pgenobj_cmp_t)(void *, void *); /* pointer to generic object comparison function */
1495 
1496 int list_replace_items(pgenobj_cmp_t lmi_cmp, DLL_NODE_PTR list);
1497 
1498 /* Function Prototypes */
1499 
1500 size_t ffv_type_size(FF_TYPES_t var_type);
1501 
1502 DLL_NODE_PTR dll_init(void);
1503 DLL_NODE_PTR dll_add(DLL_NODE_PTR);
1504 DLL_NODE_PTR dll_insert(DLL_NODE_PTR next_node);
1505 void dll_delete(DLL_NODE_PTR);
1506 void dll_delete_node(DLL_NODE_PTR);
1507 int dll_free_list(DLL_NODE_PTR head);
1508 int dll_free_holdings(DLL_NODE_PTR head);
1509 void dll_rewind(DLL_NODE_HANDLE head_handle);
1510 
1511 /* Format Attributes and object types */
1512 #define FFF_NAME_CASE (FF_TYPES_t)2
1513 
1514 int db_set(DATA_BIN_PTR, int, ...);
1515 int db_ask(DATA_BIN_PTR, int, ...);
1516 int db_do(DATA_BIN_PTR, int, ...);
1517 DATA_BIN_PTR db_make(char *title);
1518 
1519 /* Format List Functions */
1520 FORMAT_DATA_PTR fd_get_header(DATA_BIN_PTR dbin, FF_TYPES_t header_type);
1521 FORMAT_DATA_PTR fd_get_data(DATA_BIN_PTR dbin, FF_TYPES_t data_type);
1522 
1523 void db_format_list_mark_io(FORMAT_LIST f_list, FF_TYPES_t format_type,
1524  char *input_file_name, char *output_file_name);
1525 FORMAT_DATA_PTR fd_find_format_data(FORMAT_DATA_LIST, ...);
1526 FORMAT_PTR db_find_format(FORMAT_LIST, ...);
1527 
1528 int nt_ask(DATA_BIN_PTR, FF_TYPES_t origin, char *name,
1529  FF_TYPES_t value_type, void *value);
1530 int nt_put(DATA_BIN_PTR, FF_TYPES_t origin, char *name,
1531  FF_TYPES_t value_type, void *value);
1532 BOOLEAN nt_askexist(DATA_BIN_PTR, FF_TYPES_t, char *);
1533 char *nt_find_user_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type,
1534  char *value_name, NAME_TABLE_HANDLE);
1535 char *nt_find_geovu_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type,
1536  char *geovu_name, NAME_TABLE_HANDLE);
1537 
1538 int db_init(FF_STD_ARGS_PTR, DATA_BIN_HANDLE, int(*error_cb)(int));
1539 
1540 void db_destroy(DATA_BIN_PTR);
1541 BOOLEAN endian(void);
1542 
1543 int create_array_conduit_list(FORMAT_DATA_LIST format_data_list,
1544  FF_STD_ARGS_PTR std_args,
1545  FF_ARRAY_CONDUIT_LIST_HANDLE array_conduit_list_handle);
1546 
1547 char *ff_lookup_string(FFF_LOOKUP_PTR, FF_TYPES_t);
1548 FF_TYPES_t ff_lookup_number(FFF_LOOKUP_PTR, char *);
1549 int ff_file_to_bufsize(char *fname, FF_BUFSIZE_HANDLE);
1550 int ff_bufsize_to_textfile_overwrite(char *, FF_BUFSIZE_PTR);
1551 int ff_bufsize_to_textfile_append(char *, FF_BUFSIZE_PTR);
1552 
1553 int parse_command_line(int, char **, FF_STD_ARGS_PTR);
1554 
1555 int ff_put_binary_data(VARIABLE_PTR var, void *in_data_ptr,
1556  size_t in_var_length, FF_TYPES_t in_data_type, void *out_data_ptr,
1557  FF_TYPES_t out_format_type);
1558 int calculate_variable(VARIABLE_PTR var, FORMAT_PTR format, char *input_ptr,
1559  double *d);
1560 int ff_get_double(VARIABLE_PTR, void *, double *, FF_TYPES_t);
1561 int ff_binary_to_string(void *source, FF_TYPES_t data_type, int precision,
1562  char *target);
1563 
1564 int ff_copy_variable(VARIABLE_PTR source, VARIABLE_PTR target);
1565 FORMAT_PTR ff_copy_format(FORMAT_PTR format);
1566 
1567 BOOLEAN ff_format_comp(FORMAT_PTR, FORMAT_PTR);
1568 int ff_text_pre_parser(char *origin, FF_BUFSIZE_PTR, PP_OBJECT_PTR pp_object);
1569 VARIABLE_PTR ff_make_variable(VARIABLE_PTR);
1570 FORMAT_PTR ff_create_format(char *name, char *origin);
1571 void ff_destroy_format(FORMAT_PTR);
1572 void ff_destroy_variable(VARIABLE_PTR);
1573 VARIABLE_PTR ff_create_variable(char *name);
1574 
1575 FF_STD_ARGS_PTR ff_create_std_args(void);
1576 void ff_destroy_std_args(FF_STD_ARGS_PTR);
1577 
1578 void fd_destroy_format_data_list(FORMAT_DATA_LIST format_data_list);
1579 
1580 FF_DATA_FLAG_PTR ff_create_data_flag(void);
1581 void ff_destroy_data_flag(FF_DATA_FLAG_PTR);
1582 
1583 FORMAT_PTR ff_find_format(FORMAT_LIST, ...);
1584 FORMAT_PTR ff_afm2bfm(FORMAT_PTR);
1585 size_t ffv_ascii_type_size(VARIABLE_PTR var);
1586 FORMAT_PTR ff_bfm2dfm(FORMAT_PTR format);
1587 int format_to_ISO8211DDR(FORMAT_PTR format, const char *first_fields,
1588  FF_BUFSIZE_HANDLE ddf);
1589 VARIABLE_PTR ff_find_variable(char *, FORMAT_PTR);
1590 VARIABLE_PTR ff_new_name(FORMAT_PTR, char *, char *);
1591 unsigned char ff_var_length(VARIABLE_PTR);
1592 int btype_to_btype(void *src_value, FF_TYPES_t src_type, void *dest_value,
1593  FF_TYPES_t dest_type);
1594 BOOLEAN type_cmp(FF_TYPES_t type, void *value0, void *value1);
1595 
1596 /* Other */
1597 FF_BUFSIZE_PTR ff_create_bufsize(long total_bytes);
1598 int ff_resize_bufsize(long new_size, FF_BUFSIZE_HANDLE hbufsize);
1599 void ff_destroy_bufsize(FF_BUFSIZE_PTR bufsize);
1600 void ff_destroy_array_conduit(FF_ARRAY_CONDUIT_PTR conduit);
1601 void ff_destroy_array_pole(FF_ARRAY_DIPOLE_PTR pole);
1602 void ff_destroy_error(FF_ERROR_PTR error);
1603 void fd_destroy_format_data(FORMAT_DATA_PTR fd);
1604 FORMAT_DATA_PTR fd_create_format_data(FORMAT_PTR format, long data_size,
1605  char *name);
1606 
1607 void ff_destroy_process_info_list(PROCESS_INFO_LIST);
1608 void ff_destroy_process_info(PROCESS_INFO_PTR);
1609 
1610 int ff_create_format_data_mapping(FORMAT_DATA_PTR input,
1612 
1613 void ff_destroy_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1614 
1615 void ff_destroy_array_conduit_list(FF_ARRAY_CONDUIT_LIST conduit_list);
1616 
1617 int new_name_string__(const char *new_name, FF_STRING_HANDLE name_h);
1618 
1619 int make_tabular_format_array_mapping(PROCESS_INFO_PTR pinfo,
1620  long num_records, long start_record, long end_record);
1621 
1622 int initialize_middle_data(FORMAT_DATA_PTR input, FORMAT_DATA_PTR output,
1623  FORMAT_DATA_PTR middle);
1624 
1625 int ff_process_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1626 
1627 void update_format_var(FF_TYPES_t data_type, FF_NDX_t bytes_per_pixel,
1628  VARIABLE_PTR var, FORMAT_PTR format);
1629 
1630 int update_following_offsets_or_size(PROCESS_INFO_PTR updater,
1631  PROCESS_INFO_LIST updater_list, long adjustment);
1632 
1633 /* Define MAX_MIN Attributes/messages */
1634 #define MM_MAX_MIN 101
1635 #define MM_MISSING_DATA_FLAGS 102
1636 
1637 /* MAX_MIN prototypes */
1638 int mm_free(MAX_MIN_PTR);
1639 double mm_getmx(VARIABLE_PTR);
1640 double mm_getmn(VARIABLE_PTR);
1641 int mm_make(VARIABLE_PTR);
1642 int mm_print(VARIABLE_PTR);
1643 int mm_set(VARIABLE_PTR, ...);
1644 
1645 /* Conversion Function Prototypes */
1646 
1647 typedef int FF_CVF(VARIABLE_PTR, double*, FORMAT_PTR, FF_DATA_BUFFER);
1648 
1649 /* ndarray-dbin prototype */
1650 
1651 ARRAY_DESCRIPTOR_PTR ndarr_create_from_str(DATA_BIN_PTR dbin, char *arraystr);
1652 
1653 FF_CVF cv_abs;
1654 FF_CVF cv_abs_sign_to_value;
1655 FF_CVF cv_units;
1656 FF_CVF cv_date_string;
1657 FF_CVF cv_time_string;
1658 FF_CVF cv_deg;
1659 FF_CVF cv_deg_nsew;
1660 FF_CVF cv_degabs;
1661 FF_CVF cv_degabs_nsew;
1662 FF_CVF cv_deg_abs;
1663 FF_CVF cv_dms;
1664 FF_CVF cv_feet_to_meters;
1665 FF_CVF cv_geo44tim;
1666 FF_CVF cv_geog_quad;
1667 FF_CVF cv_geog_sign;
1668 FF_CVF cv_ipe2ser;
1669 FF_CVF cv_lon_east;
1670 FF_CVF cv_long2mag;
1671 FF_CVF cv_mag2long;
1672 FF_CVF cv_meters_to_feet;
1673 FF_CVF cv_nsew;
1674 FF_CVF cv_ser2ymd;
1675 FF_CVF cv_ser2ipe;
1676 FF_CVF cv_sea_flags;
1677 FF_CVF cv_slu_flags;
1678 FF_CVF cv_ymd2ser;
1679 FF_CVF cv_ydec2ymd;
1680 FF_CVF cv_ymd2ipe;
1681 FF_CVF cv_noaa_eq;
1682 
1683 /* Application function prototypes */
1684 
1685 int do_log(FF_BUFSIZE_PTR log_bufsize, char *format, ...);
1686 int wfprintf(FILE *stream, const char *format, ...);
1687 
1688 int newform(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1689 
1690 int checkvar(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1691 
1692 int ff_lock(PROCESS_INFO_PTR pinfo, void **hbuffer, unsigned long *psize);
1693 int ff_unlock(PROCESS_INFO_PTR pinfo, void **hbuffer);
1694 
1695 FF_DATA_BUFFER ff_strnstr(char *pcPattern, FF_DATA_BUFFER pcText,
1696  size_t uTextLen);
1697 
1698 int get_output_delims(DATA_BIN_PTR dbin, char *delim_item, short *distance,
1699  char *delim_value);
1700 } // extern C
1701 
1702 #endif /* (NOT) FREEFORM_H__ */
1703 
struct_ff_data_flag
Definition: freeform.h:1209
struct_ff_std_args
Definition: freeform.h:867
struct_ff_dll_node
Definition: freeform.h:1278
struct_ff_format_data_mapping
Definition: freeform.h:1093
struct_ff_error
Definition: freeform.h:943
struct_ff_process_info
Definition: freeform.h:1193
struct_ff_variable
Definition: freeform.h:1034
struct_ff_array_dipole
Definition: freeform.h:1136
struct_ff_bufsize
Definition: freeform.h:845
struct_ff_translator
Definition: freeform.h:1004
struct_ff_array_conduit
Definition: freeform.h:1178
struct_ff_pp_object
Definition: freeform.h:1115
struct_databin
Definition: freeform.h:1294
array_descriptor_struct
Definition: ndarray.h:43
eqninfstruct
Definition: eval_eqn.h:57
struct_ff_format_data
Definition: freeform.h:1060
FFF_LOOKUP
Definition: freeform.h:629
array_mapping_struct
Definition: ndarray.h:74
struct_ff_dll_data
Definition: freeform.h:1263
struct_ff_array_dim_info
Definition: freeform.h:1308
struct_ff_format
Definition: freeform.h:973
struct_ff_max_min
Definition: freeform.h:1020