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