bes Updated for version 3.21.1
The Backend Server (BES) is the lower two tiers of the Hyrax data server
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
73extern "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"
350You should define one of the following:
351
352PC
353LINUX
354SUN
355IRIS4
356MAC
357IBM6000
358HP9000
359DEC_ALPHA
360IRIX
361
362#endif
363
364#ifndef FF_OS
365#error "An operating system has not been defined"
366You should define one of the following:
367
368PC
369LINUX
370SUN
371IRIS4
372MAC
373IBM6000
374HP9000
375DEC_ALPHA
376IRIX
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
434typedef signed char int8;
435typedef unsigned char uint8;
436typedef signed short int int16;
437typedef unsigned short int uint16;
438typedef float float32;
439typedef 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
459typedef double big_var_type;
460typedef 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
481extern const char *fft_cnv_flags[FFNT_ENOTE + 1];
482extern const char *fft_cnv_flags_width[FFNT_ENOTE + 1];
483extern const char *fft_cnv_flags_prec[FFNT_ENOTE + 1];
484extern 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
495typedef signed long int int32;
496typedef unsigned long int uint32;
497typedef char int64; /* not a real type for the PC */
498typedef 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
522typedef signed int int32;
523typedef unsigned int uint32;
524typedef signed long int int64;
525typedef 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
540typedef 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
676typedef 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
681typedef struct {
682 char *fff_info;
683 FF_TYPES_t number;
684} FFF_LOOKUP, *FFF_LOOKUP_PTR;
685
686#define NUM_VARIABLE_TYPES 25
687extern 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
770extern 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
822extern "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
842typedef char HUGE *FF_DATA_BUFFER;
843typedef void HUGE *FF_DATA_PTR;
844
845typedef 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
880typedef unsigned FF_BSS_t; /* FreeForm bufsize size type */
881
882/*
883 * FF_BUFSIZE
884 */
885
886typedef struct struct_ff_bufsize FF_BUFSIZE, *FF_BUFSIZE_PTR,
887 **FF_BUFSIZE_HANDLE;
888struct 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
906extern "C" {
907/*
908 * FF_STD_ARGS
909 */
910
911typedef struct struct_ff_std_args FF_STD_ARGS, *FF_STD_ARGS_PTR,
912 **FF_STD_ARGS_HANDLE;
913struct 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
960typedef struct struct_ff_dll_node DLL_NODE, *DLL_NODE_PTR, **DLL_NODE_HANDLE;
961
962typedef DLL_NODE_PTR FORMAT_LIST, VARIABLE_LIST, FORMAT_DATA_LIST,
963 PROCESS_INFO_LIST, FORMAT_DATA_MAP_LIST, FF_ARRAY_CONDUIT_LIST,
964 FF_ERROR_LIST, FF_DATA_FLAG_LIST;
965
966typedef DLL_NODE_HANDLE FORMAT_LIST_HANDLE, VARIABLE_LIST_HANDLE,
967 FORMAT_DATA_LIST_HANDLE, PROCESS_INFO_LIST_HANDLE,
968 FORMAT_DATA_MAP_LIST_HANDLE, FF_ARRAY_CONDUIT_LIST_HANDLE,
969 FF_ERROR_LIST_HANDLE, FF_DATA_FLAG_LIST_HANDLE;
970
971typedef struct struct_ff_error FF_ERROR, *FF_ERROR_PTR, **FF_ERROR_HANDLE;
972struct 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
990typedef 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
1000typedef struct struct_ff_format FORMAT, *FORMAT_PTR, **FORMAT_HANDLE;
1001struct 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
1031typedef 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;
1041} TRANSLATOR, *TRANSLATOR_PTR;
1042
1043typedef struct struct_ff_variable VARIABLE, *VARIABLE_PTR, **VARIABLE_HANDLE;
1044
1045/* Define MAX_MIN structure */
1046
1047typedef 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
1060struct 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
1083typedef struct struct_ff_format_data FORMAT_DATA, *FORMAT_DATA_PTR,
1084 **FORMAT_DATA_HANDLE;
1085struct 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
1102typedef FORMAT_DATA NAME_TABLE, *NAME_TABLE_PTR, **NAME_TABLE_HANDLE;
1103
1104typedef FORMAT_DATA_LIST NAME_TABLE_LIST, *NAME_TABLE_LIST_HANDLE;
1105
1106#include <name_tab.h>
1107
1108/*
1109 * FORMAT_DATA_MAPPING
1110 */
1111
1112typedef struct struct_ff_format_data_mapping FORMAT_DATA_MAPPING,
1113 *FORMAT_DATA_MAPPING_PTR, **FORMAT_DATA_MAPPING_HANDLE;
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
1123typedef 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
1131typedef struct struct_ff_pp_object PP_OBJECT, *PP_OBJECT_PTR,
1132 **PP_OBJECT_HANDLE;
1133struct 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 */
1148typedef unsigned long FF_ARRAY_OFFSET_t;
1149
1150typedef struct struct_ff_array_dipole FF_ARRAY_DIPOLE, *FF_ARRAY_DIPOLE_PTR,
1151 **FF_ARRAY_DIPOLE_HANDLE;
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
1189typedef struct struct_ff_array_conduit FF_ARRAY_CONDUIT,
1190 *FF_ARRAY_CONDUIT_PTR, **FF_ARRAY_CONDUIT_HANDLE;
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
1204typedef struct struct_ff_process_info PROCESS_INFO, *PROCESS_INFO_PTR,
1205 **PROCESS_INFO_HANDLE;
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
1221typedef 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;
1229} FF_DATA_FLAG, *FF_DATA_FLAG_PTR;
1230
1231#ifdef FF_DBG
1232VARIABLE_PTR FF_VARIABLE(VARIABLE_LIST);
1233FORMAT_PTR FF_FORMAT(FORMAT_LIST);
1234FORMAT_DATA_PTR FD_FORMAT_DATA(FORMAT_DATA_LIST);
1235FF_ARRAY_CONDUIT_PTR FF_AC(FF_ARRAY_CONDUIT_LIST);
1236PROCESS_INFO_PTR FF_PI(PROCESS_INFO_LIST);
1237FF_ERROR_PTR FF_EP(FF_ERROR_LIST);
1238FF_DATA_FLAG_PTR FF_DF(FF_DATA_FLAG_LIST);
1239
1240DLL_NODE_PTR dll_next(DLL_NODE_PTR node);
1241DLL_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
1257DLL_NODE_PTR dll_first(DLL_NODE_PTR node);
1258DLL_NODE_PTR dll_last(DLL_NODE_PTR node);
1259
1260typedef 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
1271typedef struct struct_ff_dll_data DLL_DATA, *DLL_DATA_PTR, **DLL_DATA_HANDLE;
1272struct struct_ff_dll_data {
1274 VARIABLE_PTR var;
1275 FORMAT_PTR fmt;
1276 FORMAT_DATA_PTR fd;
1277 FF_ARRAY_CONDUIT_PTR ac;
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
1285struct 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
1300typedef 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;
1311} DATA_BIN, *DATA_BIN_PTR, **DATA_BIN_HANDLE;
1312
1313typedef 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;
1323} FF_ARRAY_DIM_INFO, *FF_ARRAY_DIM_INFO_PTR, **FF_ARRAY_DIM_INFO_HANDLE;
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
1492void dll_assign(void *data, FF_DLL_DATA_TYPES type, DLL_NODE_PTR node);
1493
1494typedef BOOLEAN (*pgenobj_cmp_t)(void *, void *); /* pointer to generic object comparison function */
1495
1496int list_replace_items(pgenobj_cmp_t lmi_cmp, DLL_NODE_PTR list);
1497
1498/* Function Prototypes */
1499
1500size_t ffv_type_size(FF_TYPES_t var_type);
1501
1502DLL_NODE_PTR dll_init(void);
1503DLL_NODE_PTR dll_add(DLL_NODE_PTR);
1504DLL_NODE_PTR dll_insert(DLL_NODE_PTR next_node);
1505void dll_delete(DLL_NODE_PTR);
1506void dll_delete_node(DLL_NODE_PTR);
1507int dll_free_list(DLL_NODE_PTR head);
1508int dll_free_holdings(DLL_NODE_PTR head);
1509void dll_rewind(DLL_NODE_HANDLE head_handle);
1510
1511/* Format Attributes and object types */
1512#define FFF_NAME_CASE (FF_TYPES_t)2
1513
1514int db_set(DATA_BIN_PTR, int, ...);
1515int db_ask(DATA_BIN_PTR, int, ...);
1516int db_do(DATA_BIN_PTR, int, ...);
1517DATA_BIN_PTR db_make(char *title);
1518
1519/* Format List Functions */
1520FORMAT_DATA_PTR fd_get_header(DATA_BIN_PTR dbin, FF_TYPES_t header_type);
1521FORMAT_DATA_PTR fd_get_data(DATA_BIN_PTR dbin, FF_TYPES_t data_type);
1522
1523void db_format_list_mark_io(FORMAT_LIST f_list, FF_TYPES_t format_type,
1524 char *input_file_name, char *output_file_name);
1525FORMAT_DATA_PTR fd_find_format_data(FORMAT_DATA_LIST, ...);
1526FORMAT_PTR db_find_format(FORMAT_LIST, ...);
1527
1528int nt_ask(DATA_BIN_PTR, FF_TYPES_t origin, char *name,
1529 FF_TYPES_t value_type, void *value);
1530int nt_put(DATA_BIN_PTR, FF_TYPES_t origin, char *name,
1531 FF_TYPES_t value_type, void *value);
1532BOOLEAN nt_askexist(DATA_BIN_PTR, FF_TYPES_t, char *);
1533char *nt_find_user_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type,
1534 char *value_name, NAME_TABLE_HANDLE);
1535char *nt_find_geovu_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type,
1536 char *geovu_name, NAME_TABLE_HANDLE);
1537
1538int db_init(FF_STD_ARGS_PTR, DATA_BIN_HANDLE, int(*error_cb)(int));
1539
1540void db_destroy(DATA_BIN_PTR);
1541BOOLEAN endian(void);
1542
1543int 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
1547char *ff_lookup_string(FFF_LOOKUP_PTR, FF_TYPES_t);
1548FF_TYPES_t ff_lookup_number(FFF_LOOKUP_PTR, char *);
1549int ff_file_to_bufsize(char *fname, FF_BUFSIZE_HANDLE);
1550int ff_bufsize_to_textfile_overwrite(char *, FF_BUFSIZE_PTR);
1551int ff_bufsize_to_textfile_append(char *, FF_BUFSIZE_PTR);
1552
1553int parse_command_line(int, char **, FF_STD_ARGS_PTR);
1554
1555int 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);
1558int calculate_variable(VARIABLE_PTR var, FORMAT_PTR format, char *input_ptr,
1559 double *d);
1560int ff_get_double(VARIABLE_PTR, void *, double *, FF_TYPES_t);
1561int ff_binary_to_string(void *source, FF_TYPES_t data_type, int precision,
1562 char *target);
1563
1564int ff_copy_variable(VARIABLE_PTR source, VARIABLE_PTR target);
1565FORMAT_PTR ff_copy_format(FORMAT_PTR format);
1566
1567BOOLEAN ff_format_comp(FORMAT_PTR, FORMAT_PTR);
1568int ff_text_pre_parser(char *origin, FF_BUFSIZE_PTR, PP_OBJECT_PTR pp_object);
1569VARIABLE_PTR ff_make_variable(VARIABLE_PTR);
1570FORMAT_PTR ff_create_format(char *name, char *origin);
1571void ff_destroy_format(FORMAT_PTR);
1572void ff_destroy_variable(VARIABLE_PTR);
1573VARIABLE_PTR ff_create_variable(char *name);
1574
1575FF_STD_ARGS_PTR ff_create_std_args(void);
1576void ff_destroy_std_args(FF_STD_ARGS_PTR);
1577
1578void fd_destroy_format_data_list(FORMAT_DATA_LIST format_data_list);
1579
1580FF_DATA_FLAG_PTR ff_create_data_flag(void);
1581void ff_destroy_data_flag(FF_DATA_FLAG_PTR);
1582
1583FORMAT_PTR ff_find_format(FORMAT_LIST, ...);
1584FORMAT_PTR ff_afm2bfm(FORMAT_PTR);
1585size_t ffv_ascii_type_size(VARIABLE_PTR var);
1586FORMAT_PTR ff_bfm2dfm(FORMAT_PTR format);
1587int format_to_ISO8211DDR(FORMAT_PTR format, const char *first_fields,
1588 FF_BUFSIZE_HANDLE ddf);
1589VARIABLE_PTR ff_find_variable(char *, FORMAT_PTR);
1590VARIABLE_PTR ff_new_name(FORMAT_PTR, char *, char *);
1591unsigned char ff_var_size(VARIABLE_PTR);
1592int btype_to_btype(void *src_value, FF_TYPES_t src_type, void *dest_value,
1593 FF_TYPES_t dest_type);
1594BOOLEAN type_cmp(FF_TYPES_t type, void *value0, void *value1);
1595
1596/* Other */
1597FF_BUFSIZE_PTR ff_create_bufsize(long total_bytes);
1598int ff_resize_bufsize(long new_size, FF_BUFSIZE_HANDLE hbufsize);
1599void ff_destroy_bufsize(FF_BUFSIZE_PTR bufsize);
1600void ff_destroy_array_conduit(FF_ARRAY_CONDUIT_PTR conduit);
1601void ff_destroy_array_pole(FF_ARRAY_DIPOLE_PTR pole);
1602void ff_destroy_error(FF_ERROR_PTR error);
1603void fd_destroy_format_data(FORMAT_DATA_PTR fd);
1604FORMAT_DATA_PTR fd_create_format_data(FORMAT_PTR format, long data_size,
1605 char *name);
1606
1607void ff_destroy_process_info_list(PROCESS_INFO_LIST);
1608void ff_destroy_process_info(PROCESS_INFO_PTR);
1609
1610int ff_create_format_data_mapping(FORMAT_DATA_PTR input,
1611 FORMAT_DATA_PTR output, FORMAT_DATA_MAPPING_HANDLE pd_h);
1612
1613void ff_destroy_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1614
1615void ff_destroy_array_conduit_list(FF_ARRAY_CONDUIT_LIST conduit_list);
1616
1617int new_name_string__(const char *new_name, FF_STRING_HANDLE name_h);
1618
1619int make_tabular_format_array_mapping(PROCESS_INFO_PTR pinfo,
1620 long num_records, long start_record, long end_record);
1621
1622int initialize_middle_data(FORMAT_DATA_PTR input, FORMAT_DATA_PTR output,
1623 FORMAT_DATA_PTR middle);
1624
1625int ff_process_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1626
1627void update_format_var(FF_TYPES_t data_type, FF_NDX_t bytes_per_pixel,
1628 VARIABLE_PTR var, FORMAT_PTR format);
1629
1630int 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 */
1638int mm_free(MAX_MIN_PTR);
1639double mm_getmx(VARIABLE_PTR);
1640double mm_getmn(VARIABLE_PTR);
1641int mm_make(VARIABLE_PTR);
1642int mm_print(VARIABLE_PTR);
1643int mm_set(VARIABLE_PTR, ...);
1644
1645/* Conversion Function Prototypes */
1646
1647typedef int FF_CVF(VARIABLE_PTR, double*, FORMAT_PTR, FF_DATA_BUFFER);
1648
1649/* ndarray-dbin prototype */
1650
1651ARRAY_DESCRIPTOR_PTR ndarr_create_from_str(DATA_BIN_PTR dbin, char *arraystr);
1652
1653FF_CVF cv_abs;
1654FF_CVF cv_abs_sign_to_value;
1655FF_CVF cv_units;
1656FF_CVF cv_date_string;
1657FF_CVF cv_time_string;
1658FF_CVF cv_deg;
1659FF_CVF cv_deg_nsew;
1660FF_CVF cv_degabs;
1661FF_CVF cv_degabs_nsew;
1662FF_CVF cv_deg_abs;
1663FF_CVF cv_dms;
1664FF_CVF cv_feet_to_meters;
1665FF_CVF cv_geo44tim;
1666FF_CVF cv_geog_quad;
1667FF_CVF cv_geog_sign;
1668FF_CVF cv_ipe2ser;
1669FF_CVF cv_lon_east;
1670FF_CVF cv_long2mag;
1671FF_CVF cv_mag2long;
1672FF_CVF cv_meters_to_feet;
1673FF_CVF cv_nsew;
1674FF_CVF cv_ser2ymd;
1675FF_CVF cv_ser2ipe;
1676FF_CVF cv_sea_flags;
1677FF_CVF cv_slu_flags;
1678FF_CVF cv_ymd2ser;
1679FF_CVF cv_ydec2ymd;
1680FF_CVF cv_ymd2ipe;
1681FF_CVF cv_noaa_eq;
1682
1683/* Application function prototypes */
1684
1685int do_log(FF_BUFSIZE_PTR log_bufsize, char *format, ...);
1686int wfprintf(FILE *stream, const char *format, ...);
1687
1688int newform(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1689
1690int checkvar(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1691
1692int ff_lock(PROCESS_INFO_PTR pinfo, void **hbuffer, unsigned long *psize);
1693int ff_unlock(PROCESS_INFO_PTR pinfo, void **hbuffer);
1694
1695FF_DATA_BUFFER ff_strnstr(char *pcPattern, FF_DATA_BUFFER pcText,
1696 size_t uTextLen);
1697
1698int 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
STL class.