1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/*
* Copyright (c) 2021-2025 Symas Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of the Symas Corporation nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef GCOBOLIO_H_
#define GCOBOLIO_H_
#include <stdio.h>
#include <map>
#include <unordered_map>
#include <vector>
typedef struct cblc_field_t
{
// This structure must match the code in structs.cc
unsigned char *data; // The runtime data. There is no null terminator
size_t capacity; // The size of "data"
size_t allocated; // The number of bytes available for capacity
size_t offset; // Offset from our ancestor (see note below)
char *name; // The null-terminated name of this variable
char *picture; // The null-terminated picture string.
char *initial; // The null_terminated initial value
struct cblc_field_t *parent;// This field's immediate parent field
size_t occurs_lower; // non-zero for a table
size_t occurs_upper; // non-zero for a table
size_t attr; // See cbl_field_attr_t
signed char type; // A one-byte copy of cbl_field_type_t
signed char level; // This variable's level in the naming heirarchy
signed char digits; // Digits specified in PIC string; e.g. 5 for 99v999
signed char rdigits; // Digits to the right of the decimal point. 3 for 99v999
int dummy; // GCC seems to want an even number of 32-bit values
} cblc_field_t;
/*
* Implementation details
*/
class supplemental_t;
enum cblc_file_prior_op_t
{
file_op_none,
file_op_open,
file_op_start,
file_op_read,
file_op_write,
file_op_rewrite,
file_op_delete,
file_op_close,
};
/* end implementation details */
typedef struct cblc_file_t
{
// This structure must match the code in structs.cc
char *name; // This is the name of the structure; might be the name of an environment variable
char *filename; // The name of the file to be opened
FILE *file_pointer; // The FILE *pointer
cblc_field_t *default_record; // The record_area
size_t record_area_min; // The size of the smallest 01 record in the FD
size_t record_area_max; // The size of the largest 01 record in the FD
cblc_field_t **keys; // For relative and indexed files. The first is the primary key. Null-terminated.
int *key_numbers; // One per key -- each key has a number. This table is key_number + 1
int *uniques; // One per key
cblc_field_t *password; //
cblc_field_t *status; // This must exist, and is the cbl_field_t version of io_status
cblc_field_t *user_status; // This might exist, and is another copy See 2014 standard, section 9.1.12
cblc_field_t *vsam_status; //
cblc_field_t *record_length; //
supplemental_t *supplemental; //
void *implementation; // reserved for any implementation
size_t reserve; // From I-O section RESERVE clause
long prior_read_location; // Location of immediately preceding successful read
cbl_file_org_t org; // from ORGANIZATION clause
cbl_file_access_t access; // from ACCESS MODE clause
int mode_char; // 'r', 'w', '+', or 'a' from FILE OPEN statement
int errnum; // most recent errno; can't reuse "errno" as the name
file_status_t io_status; // See 2014 standard, section 9.1.12
int padding; // Actually a char
int delimiter; // ends a record; defaults to '\n'.
int flags; // cblc_file_flags_t
int recent_char; // This is the most recent char sent to the file
int recent_key;
cblc_file_prior_op_t prior_op; // run-time type is INT
int dummy;
} cblc_file_t;
#endif
|