aboutsummaryrefslogtreecommitdiff
path: root/gcc/cobol/genutil.h
blob: b2868f7c1f8521da1caa06283ca9267497e545e3 (plain)
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * 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 _GENUTIL_H_
#define _GENUTIL_H_

#define EBCDIC_MINUS (0x60)
#define EBCDIC_PLUS  (0x4E)
#define EBCDIC_ZERO  (0xF0)
#define EBCDIC_NINE  (0xF9)

bool internal_codeset_is_ebcdic();

extern bool exception_location_active;
extern bool skip_exception_processing;

extern bool suppress_dest_depends;

extern std::vector<std::string>current_filename;

extern tree var_decl_exception_code;         // int         __gg__exception_code;
extern tree var_decl_exception_handled;      // int         __gg__exception_handled;
extern tree var_decl_exception_file_number;  // int         __gg__exception_file_number;
extern tree var_decl_exception_file_status;  // int         __gg__exception_file_status;
extern tree var_decl_exception_file_name;    // const char *__gg__exception_file_name;
extern tree var_decl_exception_statement;    // const char *__gg__exception_statement;
extern tree var_decl_exception_source_file;  // const char *__gg__exception_source_file;
extern tree var_decl_exception_line_number;  // int         __gg__exception_line_number;
extern tree var_decl_exception_program_id;   // const char *__gg__exception_program_id;
extern tree var_decl_exception_section;      // const char *__gg__exception_section;
extern tree var_decl_exception_paragraph;    // const char *__gg__exception_paragraph;

extern tree var_decl_default_compute_error;  // int         __gg__default_compute_error;
extern tree var_decl_rdigits;                // int         __gg__rdigits;
extern tree var_decl_odo_violation;          // int         __gg__odo_violation;
extern tree var_decl_unique_prog_id;         // size_t      __gg__unique_prog_id;

extern tree var_decl_entry_location;         // This is for managing ENTRY statements
extern tree var_decl_exit_address;           // This is for implementing pseudo_return_pop

extern tree var_decl_call_parameter_signature; // char   *__gg__call_parameter_signature
extern tree var_decl_call_parameter_count;     // int __gg__call_parameter_count
extern tree var_decl_call_parameter_lengths;   // size_t *var_decl_call_parameter_lengths

extern tree var_decl_return_code;            // short __gg__data_return_code

extern tree var_decl_arithmetic_rounds_size;  // size_t __gg__arithmetic_rounds_size;
extern tree var_decl_arithmetic_rounds;       // int*   __gg__arithmetic_rounds;
extern tree var_decl_fourplet_flags_size;     // size_t __gg__fourplet_flags_size;
extern tree var_decl_fourplet_flags;          // int*   __gg__fourplet_flags;

extern tree var_decl_treeplet_1f; // cblc_field_pp_type_node , "__gg__treeplet_1f"
extern tree var_decl_treeplet_1o; // SIZE_T_P                , "__gg__treeplet_1o"
extern tree var_decl_treeplet_1s; // SIZE_T_P                , "__gg__treeplet_1s"
extern tree var_decl_treeplet_2f; // cblc_field_pp_type_node , "__gg__treeplet_2f"
extern tree var_decl_treeplet_2o; // SIZE_T_P                , "__gg__treeplet_2o"
extern tree var_decl_treeplet_2s; // SIZE_T_P                , "__gg__treeplet_2s"
extern tree var_decl_treeplet_3f; // cblc_field_pp_type_node , "__gg__treeplet_3f"
extern tree var_decl_treeplet_3o; // SIZE_T_P                , "__gg__treeplet_3o"
extern tree var_decl_treeplet_3s; // SIZE_T_P                , "__gg__treeplet_3s"
extern tree var_decl_treeplet_4f; // cblc_field_pp_type_node , "__gg__treeplet_4f"
extern tree var_decl_treeplet_4o; // SIZE_T_P                , "__gg__treeplet_4o"
extern tree var_decl_treeplet_4s; // SIZE_T_P                , "__gg__treeplet_4s"

extern tree var_decl_nop;         // int __gg__nop
extern tree var_decl_main_called; // int __gg__main_called

int       get_scaled_rdigits(cbl_field_t *field);
int       get_scaled_digits(cbl_field_t *field);
tree      tree_type_from_digits(size_t digits, int signable);
tree      tree_type_from_size(size_t bytes, int signable);
tree      tree_type_from_field(cbl_field_t *field);
void      get_binary_value( tree value,
                            tree rdigits,
                            cbl_field_t *field,
                            tree         field_offset,
                            tree         hilo = NULL);
tree      get_data_address( cbl_field_t *field,
                            tree         offset);

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
__int128  get_power_of_ten(int n);
#pragma GCC diagnostic pop
void      scale_by_power_of_ten_N(tree value,
                                int N,
                                bool check_for_fractional = false);
tree      scale_by_power_of_ten(tree value,
                                tree N,
                                bool check_for_fractional = false);
void      scale_and_round(tree value,
                          int  value_rdigits,
                          bool target_is_signable,
                          int  target_rdigits,
                          cbl_round_t rounded);
void      hex_dump(tree data, size_t bytes);
void      set_exception_code_func(ec_type_t ec,
                                  int line,
                                  int from_raise_statement=0);
#define set_exception_code(ec) set_exception_code_func(ec, __LINE__)
bool      process_this_exception(ec_type_t ec);
#define   CHECK_FOR_FRACTIONAL_DIGITS true
void      get_integer_value(tree value,
                            cbl_field_t *field,
                            tree         offset=NULL,  // size_t
                            bool check_for_fractional_digits=false);
void      rt_error(const char *msg);
void      copy_little_endian_into_place(cbl_field_t *dest,
                                        tree         dest_offset,
                                        tree value,
                                        int rhs_rdigits,
                                        bool check_for_error,
                                        tree &size_error);
tree      build_array_of_size_t( size_t  N,
                                 const size_t *values);
void      parser_display_internal_field(tree file_descriptor,
                                        cbl_field_t *field,
                                        bool advance=DISPLAY_NO_ADVANCE);
char     *get_literal_string(cbl_field_t *field);

bool      refer_is_clean(cbl_refer_t &refer);

tree      refer_offset_source(cbl_refer_t &refer,
                              int *pflags=NULL);
tree      refer_size_source(cbl_refer_t &refer);
tree      refer_offset_dest(cbl_refer_t &refer);
tree      refer_size_dest(cbl_refer_t &refer);

void     REFER_CHECK( const char *func,
                      int         line,
                      cbl_refer_t &refer
                      );
#define refer_check(a) REFER_CHECK(__func__, __LINE__, a)

tree      qualified_data_source(cbl_refer_t &refer);

tree      qualified_data_dest(cbl_refer_t &refer);

void      build_array_of_treeplets( int ngroup,
                                    size_t N,
                                    cbl_refer_t *refers);

void      build_array_of_fourplets( int ngroup,
                                    size_t N,
                                    cbl_refer_t *refers);
#endif