bes  Updated for version 3.20.6
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 
33 FreeForm 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 
43 FreeForm 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 
50 If you are using Microsoft Visual C++ 4.0 then define MSVC4 in addition to
51 defining PC.
52 
53 To compile FreeForm on your machine you must define one of the
54 following preprocessor names:
55 
56 
57  PC
58  LINUX
59  SUN
60  IRIS4
61  MAC
62  IBM6000
63  HP9000
64  DEC_ALPHA
65  IRIX
66 
67 One of the above should be defined as a compiler preprocessor definition, such as on the
68 cc 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"
298 You 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"
314 You 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 
382 typedef signed char int8;
383 typedef unsigned char uint8;
384 typedef signed short int int16;
385 typedef unsigned short int uint16;
386 typedef float float32;
387 typedef 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 
407 typedef double big_var_type;
408 typedef 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 
429 extern const char *fft_cnv_flags[FFNT_ENOTE + 1];
430 extern const char *fft_cnv_flags_width[FFNT_ENOTE + 1];
431 extern const char *fft_cnv_flags_prec[FFNT_ENOTE + 1];
432 extern 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 
443 typedef signed long int int32;
444 typedef unsigned long int uint32;
445 typedef char int64; /* not a real type for the PC */
446 typedef 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 
470 typedef signed int int32;
471 typedef unsigned int uint32;
472 typedef signed long int int64;
473 typedef 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 
488 typedef 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 
624 typedef 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 
629 typedef struct
630 {
631  char *string;
632  FF_TYPES_t number;
634 
635 #define NUM_VARIABLE_TYPES 25
636 extern 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
719 extern 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__) )
741 void _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 
800 typedef char HUGE *FF_DATA_BUFFER;
801 typedef void HUGE *FF_DATA_PTR;
802 
803 typedef 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 
838 typedef unsigned FF_BSS_t; /* FreeForm bufsize size type */
839 
840 /*
841  * FF_BUFSIZE
842  */
843 
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 
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 
923 
924 typedef DLL_NODE_PTR FORMAT_LIST,
932 
941 
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 
962 typedef 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 
972 typedef struct struct_ff_format FORMAT, *FORMAT_PTR, **FORMAT_HANDLE;
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 
1004 typedef 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;
1015 
1017 
1018 /* Define MAX_MIN structure */
1019 
1020 typedef 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 
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 
1079 typedef FORMAT_DATA NAME_TABLE,
1080  *NAME_TABLE_PTR,
1082 
1085 
1086 #include <name_tab.h>
1087 
1088 /*
1089  * FORMAT_DATA_MAPPING
1090  */
1091 
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 
1103 typedef 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 
1116 {
1117  union union_u
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  */
1133 typedef unsigned long FF_ARRAY_OFFSET_t;
1134 
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 
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 
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 
1209 typedef struct struct_ff_data_flag
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;
1219 
1220 
1221 #ifdef FF_DBG
1222 VARIABLE_PTR FF_VARIABLE(VARIABLE_LIST);
1223 FORMAT_PTR FF_FORMAT(FORMAT_LIST);
1224 FORMAT_DATA_PTR FD_FORMAT_DATA(FORMAT_DATA_LIST);
1229 
1230 DLL_NODE_PTR dll_next(DLL_NODE_PTR node);
1231 DLL_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 
1247 DLL_NODE_PTR dll_first(DLL_NODE_PTR node);
1248 DLL_NODE_PTR dll_last(DLL_NODE_PTR node);
1249 
1250 typedef 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 
1264 {
1266  {
1267  VARIABLE_PTR var;
1268  FORMAT_PTR fmt;
1269  FORMAT_DATA_PTR fd;
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 
1294 typedef 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;
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;
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 
1490 void dll_assign(void *data, FF_DLL_DATA_TYPES type, DLL_NODE_PTR node);
1491 
1492 typedef BOOLEAN (*pgenobj_cmp_t)(void *, void *); /* pointer to generic object comparison function */
1493 
1494 int list_replace_items(pgenobj_cmp_t lmi_cmp, DLL_NODE_PTR list);
1495 
1496 /* Function Prototypes */
1497 
1498 size_t ffv_type_size(FF_TYPES_t var_type);
1499 
1500 DLL_NODE_PTR dll_init(void);
1501 DLL_NODE_PTR dll_add(DLL_NODE_PTR);
1502 DLL_NODE_PTR dll_insert(DLL_NODE_PTR next_node);
1503 void dll_delete(DLL_NODE_PTR);
1504 void dll_delete_node(DLL_NODE_PTR);
1505 int dll_free_list(DLL_NODE_PTR head);
1506 int dll_free_holdings(DLL_NODE_PTR head);
1507 void dll_rewind(DLL_NODE_HANDLE head_handle);
1508 
1509 /* Format Attributes and object types */
1510 #define FFF_NAME_CASE (FF_TYPES_t)2
1511 
1512 int db_set(DATA_BIN_PTR, int, ...);
1513 int db_ask(DATA_BIN_PTR, int, ...);
1514 int db_do(DATA_BIN_PTR, int, ...);
1515 
1516 /* Format List Functions */
1517 FORMAT_DATA_PTR fd_get_header(DATA_BIN_PTR dbin, FF_TYPES_t header_type);
1518 FORMAT_DATA_PTR fd_get_data(DATA_BIN_PTR dbin, FF_TYPES_t data_type);
1519 
1520 void db_format_list_mark_io(FORMAT_LIST f_list, FF_TYPES_t format_type, char *input_file_name, char *output_file_name);
1521 FORMAT_DATA_PTR fd_find_format_data(FORMAT_DATA_LIST, ...);
1522 FORMAT_PTR db_find_format(FORMAT_LIST, ...);
1523 
1524 int nt_ask(DATA_BIN_PTR, FF_TYPES_t origin, char *name, FF_TYPES_t value_type, void *value);
1525 int nt_put(DATA_BIN_PTR, FF_TYPES_t origin, char *name, FF_TYPES_t value_type, void *value);
1526 BOOLEAN nt_askexist(DATA_BIN_PTR, FF_TYPES_t, char *);
1527 char *nt_find_user_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type, char *value_name, NAME_TABLE_HANDLE);
1528 char *nt_find_geovu_name(DATA_BIN_PTR dbin, FF_TYPES_t origin_type, char *geovu_name, NAME_TABLE_HANDLE);
1529 
1530 int db_init(FF_STD_ARGS_PTR, DATA_BIN_HANDLE, int (*error_cb)(int));
1531 
1532 void db_destroy(DATA_BIN_PTR);
1533 BOOLEAN endian(void);
1534 
1535 int 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 
1542 char *ff_lookup_string(FFF_LOOKUP_PTR, FF_TYPES_t);
1543 FF_TYPES_t ff_lookup_number(FFF_LOOKUP_PTR, char *);
1544 int ff_file_to_bufsize(char *fname, FF_BUFSIZE_HANDLE);
1545 int ff_bufsize_to_textfile_overwrite(char *, FF_BUFSIZE_PTR);
1546 int ff_bufsize_to_textfile_append(char *, FF_BUFSIZE_PTR);
1547 
1548 int parse_command_line(int, char **, FF_STD_ARGS_PTR);
1549 
1550 int 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);
1551 int calculate_variable(VARIABLE_PTR var, FORMAT_PTR format, char *input_ptr, double *d);
1552 int ff_get_double(VARIABLE_PTR, void *, double *, FF_TYPES_t);
1553 int ff_binary_to_string(void *source, FF_TYPES_t data_type, int precision, char *target);
1554 
1555 int ff_copy_variable(VARIABLE_PTR source, VARIABLE_PTR target);
1556 FORMAT_PTR ff_copy_format(FORMAT_PTR format);
1557 
1558 BOOLEAN ff_format_comp(FORMAT_PTR, FORMAT_PTR);
1559 int ff_text_pre_parser(char *origin, FF_BUFSIZE_PTR, PP_OBJECT_PTR pp_object);
1560 VARIABLE_PTR ff_make_variable(VARIABLE_PTR);
1561 FORMAT_PTR ff_create_format(char *name, char *origin);
1562 void ff_destroy_format(FORMAT_PTR);
1563 void ff_destroy_variable(VARIABLE_PTR);
1564 VARIABLE_PTR ff_create_variable(char *name);
1565 
1566 FF_STD_ARGS_PTR ff_create_std_args(void);
1567 void ff_destroy_std_args(FF_STD_ARGS_PTR);
1568 
1569 void fd_destroy_format_data_list(FORMAT_DATA_LIST format_data_list);
1570 
1571 FF_DATA_FLAG_PTR ff_create_data_flag(void);
1572 void ff_destroy_data_flag(FF_DATA_FLAG_PTR);
1573 
1574 FORMAT_PTR ff_find_format(FORMAT_LIST, ...);
1575 FORMAT_PTR ff_afm2bfm(FORMAT_PTR, char *new_name);
1576 FORMAT_PTR ff_xfm2struct(FORMAT_PTR, char *new_name);
1577 size_t ffv_ascii_type_size(VARIABLE_PTR var);
1578 FORMAT_PTR ff_bfm2dfm(FORMAT_PTR format, char *new_name);
1579 int format_to_ISO8211DDR(FORMAT_PTR format, const char *first_fields, FF_BUFSIZE_HANDLE ddf);
1580 VARIABLE_PTR ff_find_variable(char *, FORMAT_PTR);
1581 VARIABLE_PTR ff_new_name(FORMAT_PTR, char *, char *);
1582 unsigned char ff_var_length(VARIABLE_PTR);
1583 int btype_to_btype(void *src_value, FF_TYPES_t src_type, void *dest_value, FF_TYPES_t dest_type);
1584 BOOLEAN type_cmp(FF_TYPES_t type, void *value0, void *value1);
1585 
1586 /* Other */
1587 FF_BUFSIZE_PTR ff_create_bufsize(long total_bytes);
1588 int ff_resize_bufsize(long new_size, FF_BUFSIZE_HANDLE hbufsize);
1589 void ff_destroy_bufsize(FF_BUFSIZE_PTR bufsize);
1590 void ff_destroy_array_conduit(FF_ARRAY_CONDUIT_PTR conduit);
1591 void ff_destroy_array_pole(FF_ARRAY_DIPOLE_PTR pole);
1592 void ff_destroy_error(FF_ERROR_PTR error);
1593 void fd_destroy_format_data(FORMAT_DATA_PTR fd);
1594 FORMAT_DATA_PTR fd_create_format_data(FORMAT_PTR format, long data_size, char *name);
1595 
1596 void ff_destroy_process_info_list(PROCESS_INFO_LIST);
1597 void ff_destroy_process_info(PROCESS_INFO_PTR);
1598 
1599 int ff_create_format_data_mapping
1600  (
1601  FORMAT_DATA_PTR input,
1602  FORMAT_DATA_PTR output,
1604  );
1605 
1606 void ff_destroy_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1607 
1608 void ff_destroy_array_conduit_list(FF_ARRAY_CONDUIT_LIST conduit_list);
1609 
1610 int new_name_string__(const char *new_name, FF_STRING_HANDLE name_h);
1611 
1612 int 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 
1620 int initialize_middle_data
1621  (
1622  FORMAT_DATA_PTR input,
1623  FORMAT_DATA_PTR output,
1624  FORMAT_DATA_PTR middle
1625  );
1626 
1627 int ff_process_format_data_mapping(FORMAT_DATA_MAPPING_PTR pd);
1628 
1629 void 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 
1637 int 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 */
1649 int mm_free(MAX_MIN_PTR);
1650 double mm_getmx(VARIABLE_PTR);
1651 double mm_getmn(VARIABLE_PTR);
1652 int mm_make(VARIABLE_PTR);
1653 int mm_print(VARIABLE_PTR);
1654 int mm_set(VARIABLE_PTR, ...);
1655 
1656 /* Conversion Function Prototypes */
1657 
1658 typedef int FF_CVF(VARIABLE_PTR, double*, FORMAT_PTR, FF_DATA_BUFFER);
1659 
1660 /* ndarray-dbin prototype */
1661 
1662 ARRAY_DESCRIPTOR_PTR ndarr_create_from_str(DATA_BIN_PTR dbin, char *arraystr);
1663 
1664 
1665 FF_CVF cv_abs;
1666 FF_CVF cv_abs_sign_to_value;
1667 FF_CVF cv_units;
1668 FF_CVF cv_date_string;
1669 FF_CVF cv_time_string;
1670 FF_CVF cv_deg;
1671 FF_CVF cv_deg_nsew;
1672 FF_CVF cv_degabs;
1673 FF_CVF cv_degabs_nsew;
1674 FF_CVF cv_deg_abs;
1675 FF_CVF cv_dms;
1676 FF_CVF cv_feet_to_meters;
1677 FF_CVF cv_geo44tim;
1678 FF_CVF cv_geog_quad;
1679 FF_CVF cv_geog_sign;
1680 FF_CVF cv_ipe2ser;
1681 FF_CVF cv_lon_east;
1682 FF_CVF cv_long2mag;
1683 FF_CVF cv_mag2long;
1684 FF_CVF cv_meters_to_feet;
1685 FF_CVF cv_nsew;
1686 FF_CVF cv_ser2ymd;
1687 FF_CVF cv_ser2ipe;
1688 FF_CVF cv_sea_flags;
1689 FF_CVF cv_slu_flags;
1690 FF_CVF cv_ymd2ser;
1691 FF_CVF cv_ydec2ymd;
1692 FF_CVF cv_ymd2ipe;
1693 FF_CVF cv_noaa_eq;
1694 
1695 /* Application function prototypes */
1696 
1697 int do_log(FF_BUFSIZE_PTR log_bufsize, char *format, ...);
1698 int wfprintf(FILE *stream, const char *format, ...);
1699 
1700 int newform(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1701 
1702 int checkvar(FF_STD_ARGS_PTR std_args, FF_BUFSIZE_PTR log, FILE *to_user);
1703 
1704 int ff_lock(PROCESS_INFO_PTR pinfo, void **hbuffer, unsigned long *psize);
1705 int ff_unlock(PROCESS_INFO_PTR pinfo, void **hbuffer);
1706 
1707 FF_DATA_BUFFER ff_strnstr(char *pcPattern, FF_DATA_BUFFER pcText, size_t uTextLen);
1708 
1709 int 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 
struct_ff_data_flag
Definition: freeform.h:1209
struct_ff_std_args
Definition: freeform.h:867
struct_ff_array_dipole::struct_connect
Definition: freeform.h:1146
struct_ff_dll_node
Definition: freeform.h:1278
struct_ff_format_data_mapping
Definition: freeform.h:1093
struct_ff_error
Definition: freeform.h:943
struct_ff_process_info
Definition: freeform.h:1193
struct_ff_variable
Definition: freeform.h:1034
struct_ff_array_dipole::struct_connect::struct_file_info
Definition: freeform.h:1162
struct_ff_array_dipole
Definition: freeform.h:1136
struct_ff_bufsize
Definition: freeform.h:845
struct_ff_translator
Definition: freeform.h:1004
struct_ff_array_conduit
Definition: freeform.h:1178
struct_ff_pp_object
Definition: freeform.h:1115
struct_ff_std_args::struct_std_args_user
Definition: freeform.h:905
struct_databin
Definition: freeform.h:1294
struct_ff_format_data::struct_fd_state
Definition: freeform.h:1070
array_descriptor_struct
Definition: ndarray.h:43
eqninfstruct
Definition: eval_eqn.h:57
struct_ff_format_data
Definition: freeform.h:1060
FFF_LOOKUP
Definition: freeform.h:629
struct_ff_array_dipole::struct_connect::union_locus
Definition: freeform.h:1156
array_mapping_struct
Definition: ndarray.h:74
struct_ff_dll_data
Definition: freeform.h:1263
struct_ff_array_dim_info
Definition: freeform.h:1308
struct_ff_format
Definition: freeform.h:973
struct_ff_dll_data::union_struct_ff_dll_data_u
Definition: freeform.h:1265
struct_ff_max_min
Definition: freeform.h:1020
struct_ff_pp_object::union_u::struct_nt_list
Definition: freeform.h:1120
struct_ff_pp_object::union_u
Definition: freeform.h:1117