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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*
* 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 _UTIL_H_
#define _UTIL_H_
void cbl_message(int fd, const char *format_string, ...)
ATTRIBUTE_PRINTF_2;
void cbl_internal_error(const char *format_string, ...)
ATTRIBUTE_GCOBOL_DIAG(1, 2);
void cbl_err(const char *format_string, ...) ATTRIBUTE_GCOBOL_DIAG(1, 2);
void cbl_errx(const char *format_string, ...) ATTRIBUTE_GCOBOL_DIAG(1, 2);
bool fisdigit(int c);
bool fisspace(int c);
int ftolower(int c);
int ftoupper(int c);
bool fisprint(int c);
void cobol_set_pp_option(int opt);
void cobol_filename_restore();
const char * cobol_lineno( int );
int cobol_lineno();
unsigned long gb4( size_t input );
template <typename P>
static inline const void *
as_voidp( P p ) {
return static_cast<const void *>(p);
}
/*
* The default source format, whether free or fixed, is determined
* heuristically by examining the PROGRAM-ID line, if it exists, in the first
* input file. If that file does not have such a line, the default is free
* format. Else the format is set to fixed if anything appears on that line
* that would prohibit parsing it as free format,
*/
class source_format_t {
bool first_file, explicitly;
int left, right;
public:
source_format_t()
: first_file(true), explicitly(false), left(0), right(0)
{}
void indicator_column_set( int column ) {
explicitly = true;
if( column == 0 ) right = 0;
if( column < 0 ) {
column = -column;
right = 73;
}
left = column;
}
bool inference_pending() {
bool tf = first_file && !explicitly;
first_file = false;
return tf;
}
void infer( const char *bol, bool want_reference_format );
inline bool is_fixed() const { return left == 7; }
inline bool is_reffmt() const { return is_fixed() && right == 73; }
inline bool is_free() const { return ! is_fixed(); }
const char * description() const {
if( is_reffmt() ) return "REFERENCE";
if( is_fixed() ) return "FIXED";
if( is_free() ) return "FREE";
gcc_unreachable();
}
inline int left_margin() {
return left == 0? left : left - 1;
}
inline int right_margin() {
return right == 0? right : right - 1;
}
};
void cdf_push();
void cdf_push_call_convention();
void cdf_push_current_tokens();
void cdf_push_dictionary();
void cdf_push_enabled_exceptions();
void cdf_push_source_format();
void cdf_pop();
void cdf_pop_call_convention();
void cdf_pop_current_tokens();
void cdf_pop_dictionary();
void cdf_pop_source_format();
void cdf_pop_enabled_exceptions();
#endif
|