blob: f12124ecc5b9461b0b3b07b71da141348e03d2e3 [file] [log] [blame]
/*
* 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_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_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);
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);
FIXED_WIDE_INT(128) get_power_of_ten(int n);
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(const ec_type_t ec);
#define CHECK_FOR_FRACTIONAL_DIGITS true
void get_integer_value(tree value, // This is always a LONG
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,
const 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(const cbl_refer_t &refer);
tree refer_offset(const cbl_refer_t &refer,
int *pflags=NULL);
tree refer_size_source(const cbl_refer_t &refer);
tree refer_size_dest(const cbl_refer_t &refer);
tree qualified_data_location(const 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);
void get_depending_on_value_from_odo(tree retval, cbl_field_t *odo);
uint64_t get_time_nanoseconds();
#endif