cobol: Some 1000 small changes in answer to cppcheck diagnostics.

constification per cppcheck. Use STRICT_WARN and fix reported
diagnostics.  Ignore [shadowVariable] in general. Use std::vector to
avoid exposing arrays as raw pointers.

	PR cobol/120621

gcc/cobol/ChangeLog:

	* Make-lang.in: Use STRICT_WARN.
	* cbldiag.h (location_dump): suppress shadowVariable.
	* cdf-copy.cc (esc): Fix shadowVariable.
	(copybook_elem_t::open_file): Do not use %m.
	* cdf.y: suppress invalidPrintfArgType for target format.
	* cdfval.h (struct cdfval_t): Suppress noExplicitConstructor.
	* cobol1.cc (cobol_name_mangler): Use C++ cast.
	* copybook.h (class copybook_elem_t): Same.
	* dts.h: Fixes and suppressions due to cppcheck.
	* except.cc (cbl_enabled_exceptions_t::status): Suppress useStlAlgorithm.
	(cbl_enabled_exceptions_t::turn_on_off): Const parameter.
	(class choose_declarative): Removed.
	* genapi.cc (struct called_tree_t): Explicit constructor.
	(parser_compile_ecs): Cast to void * for %p.
	(parser_compile_dcls): Same.
	(parser_statement_begin): Same.
	(initialize_variable_internal): Use std::vector for subscripts.
	(parser_initialize): Constification.
	(get_string_from): Same.
	(combined_name): Same.
	(parser_perform): Same.
	(psa_FldLiteralN): Same.
	(is_figconst): Const parameter.
	(is_figconst_t): Same.
	(parser_exit): Same.
	(parser_division): Const pointer.
	(parser_perform_conditional): Whitespace.
	(parser_set_conditional88): Const parameter.
	(inspect_tally): Use std::vector.
	(inspect_replacing): Same.
	(parser_inspect): Same.
	(parser_intrinsic_subst): Use std::vector (constuct elements).
	(parser_intrinsic_call_1): Use std::vector for subscripts.
	(is_ascending_key): Const pointer.
	(parser_sort): Use std::vector.
	(parser_file_sort): Same.
	(parser_file_merge): Same.
	(parser_unstring): Same.
	(parser_string): Same.
	(parser_call): Const pointer.
	(parser_program_hierarchy): Use std::vector.
	(conditional_abs): Const paraemeter.
	(float_type_of): Same.
	(initial_from_initial): Set value, quoted or not.
	(parser_symbol_add): Remove redundant nested test.
	* genapi.h (parser_add): Const parameters.
	(parser_subtract): Same.
	(parser_multiply): Same.
	(parser_divide): Same.
	(parser_perform): Same.
	(parser_exit): Same.
	(parser_initialize): Same.
	(parser_set_conditional88): Same.
	(parser_sort): Same.
	(parser_file_sort): Same.
	(parser_file_merge): Same.
	(parser_string): Same.
	(is_ascending_key): Same.
	* genmath.cc (arithmetic_operation): Use std::vector.
	(is_somebody_float): Const parameter.
	(all_results_binary): Const parameter.
	(fast_multiply): Remove redundant nested test.
	(parser_add): Const parameter.
	(parser_multiply): Remove redundant nested test.
	(parser_divide): Const parameter.
	(parser_subtract): Same.
	* genutil.cc (get_depending_on_value): Use std::vector.
	(get_data_offset): Same.
	(tree_type_from_field): Const parameter.
	(refer_has_depends): Const pointers.
	(get_literal_string): RAII.
	(refer_is_clean): Use std::vector.
	(get_time_nanoseconds): Newline at EOF.
	* genutil.h (tree_type_from_field): Remove declaration.
	* inspect.h (struct cbx_inspect_qual_t): Use std::vector.
	(struct cbl_inspect_qual_t): Same.
	(struct cbx_inspect_match_t): Same.
	(class cbl_inspect_match_t): Same.
	(struct cbx_inspect_replace_t): Same.
	(struct cbl_inspect_replace_t): Same.
	(struct cbx_inspect_oper_t): Same.
	(struct cbl_inspect_oper_t): Same.
	(struct cbx_inspect_t): Same.
	(struct cbl_inspect_t): Same.
	(parser_inspect): Same.
	* lexio.cc (indicated): Const pointer.
	(remove_inline_comment): Scope reduction.
	(maybe_add_space): Const pointer.
	(recognize_replacements): C++ cast.
	(check_source_format_directive): Same.
	(struct replacing_term_t): Explicit constructor.
	(parse_replace_pairs): Const reference.
	(location_in): Const reference.
	(parse_copy_directive): C++ cast.
	(parse_replace_last_off): Const parameter.
	(parse_replace_text): Const reference.
	(parse_replace_directive): C++ cast.
	(cdftext::lex_open): Const reference.
	(cdftext::open_output): Scope reduction.
	(cdftext::free_form_reference_format): Remove unused variable.
	(cdftext::process_file): Simplify.
	* lexio.h (struct bytespan_t): Use nullptr.
	(struct filespan_t): Initialize icol in constructor.
	(struct span_t): Suppress confused operatorEqRetRefThis.
	(struct replace_t): Eliminate single-value constructor.
	* parse.y: Many const cppcheck reports, and portable bit-shift.
	* parse_ante.h (reject_refmod): Const parameter.
	(require_pointer): Same.
	(require_integer): Same.
	(struct evaluate_elem_t): Explicit constructor.
	(struct arith_t): Use std::vector.
	(class eval_subject_t): Const parameter.
	(dump_inspect_match): Declare.
	(struct perform_t): Explicit constructor.
	(list_add):  Const parameter.
	(class tokenset_t): Avoid negative array index.
	(struct file_list_t): Explicit constructor.
	(struct field_list_t): Same.
	(struct refer_list_t): Same.
	(struct refer_marked_list_t): Const parameter.
	(struct refer_collection_t): Explicit constructor.
	(struct ast_inspect_oper_t): Remove class.
	(ast_inspect_oper_t): Same.
	(struct ast_inspect_t): Same.
	(struct ast_inspect_list_t): Same.
	(ast_inspect): Add location.
	(struct elem_list_t): Explicit constructor.
	(struct unstring_tgt_t): Same.
	(struct unstring_tgt_list_t): Same.
	(struct unstring_into_t): Same.
	(struct ffi_args_t): Same.
	(struct file_sort_io_t): Same.
	(merge_t): Same.
	(struct vargs_t): Same.
	(class prog_descr_t): Eliminate single-value constructor.
	(class program_stack_t): Suppress useStlAlgorithm.
	(struct rel_part_t): Eliminate single-value constructor.
	(class log_expr_t): Explicit constructor.
	(add_debugging_declarative): Rename local variable.
	(intrinsic_call_2): Const parameter.
	(invalid_key): Use std::find_if.
	(parser_add2): Const parameter.
	(parser_subtract2): Same.
	(stringify): Same.
	(unstringify): Same.
	(anybody_redefines): Same.
	(ast_call): Same.
	* parse_util.h (class cname_cmp): Explicit constructor.
	(intrinsic_inconsistent_parameter): Same.
	* scan_ante.h (struct cdf_status_t): Eliminate single-value constructor.
	(class enter_leave_t): Explicit constructor.
	(update_location): Const pointer, explicit constructor.
	(symbol_function_token): Const pointer.
	(typed_name): Same.
	* scan_post.h (datetime_format_of): Scope reduction.
	* show_parse.h (class ANALYZE): Use std::vector, explicit consstructor.
	* symbols.cc (symbol_table_extend): Scope reduction.
	(cbl_ffi_arg_t::cbl_ffi_arg_t): Define default constructor.
	(end_of_group): Const pointer.
	(symbol_find_odo): Const parameter.
	(rename_not_ok): Same.
	(field_str): Use %u instead of %d.
	(struct capacity_of): Const pointer.
	(symbols_update): Same.
	(symbol_field_parent_set): Same.
	(symbol_file_add): Same.
	(symbol_typedef_add): Same.
	(symbol_field_add): Use new operator=().
	(symbol_field): Suppress CastIntegerToAddressAtReturn.
	(symbol_register): Same.
	(symbol_file): Suppress knownConditionTrueFalse.
	(next_program): Const parameter.
	(symbol_file_record): Same.
	(class is_section): Explicit constructor.
	(cbl_file_t::no_key): Remove.
	(cbl_prog_hier_t::cbl_prog_hier_t): Use std::vector.
	(symbol_label_add): Assert pointer is not NULL.
	(symbol_label_section_exists): Const reference in lambda.
	(expand_picture): Use C++ cast.
	(symbol_program_callables): Const pointer.
	(symbol_currency_add): Suppress nullPointerRedundantCheck.
	(cbl_key_t): Use std::vector.
	(cbl_occurs_t::field_add): Const parameter.
	(cbl_occurs_t::index_add): Explicit constructor.
	(class is_field_at): Same.
	(cbl_file_key_t::deforward): Scope reduction.
	(cbl_file_t::keys_str): Use allocated memory only.
	(file_status_status_of): Const pointer.
	(is_register_field): Const parameter.
	* symbols.h (struct cbl_field_data_t): Eliminate single-value constructor.
	(struct cbl_occurs_bounds_t): Same.
	(struct cbl_refer_t): Use std::vector.
	(valid_move): Const parameter.
	(is_register_field): Same.
	(struct cbl_key_t): Use std::vector.
	(struct cbl_substitute_t): Eliminate single-value constructor.
	(refer_of): Return const reference
	(struct cbl_ffi_arg_t): Eliminate single-value constructor.
	(class temporaries_t): Same.
	(struct cbl_file_key_t): Define default constructor.
	(struct cbl_file_lock_t): Define copy constructor and operator=().
	(struct cbl_file_t): Complete default constructor.
	(struct symbol_elem_t): Explicit constructor.
	(symbol_elem_of): Suppress cstyleCast.
	(symbol_redefines): Const parameter.
	(struct cbl_field_t): Same.
	(cbl_section_of): Test for NULL pointer.
	(cbl_field_of): Same.
	(cbl_label_of): Same.
	(cbl_special_name_of): Same.
	(cbl_alphabet_of): Same.
	(cbl_file_of): Same.
	(is_figconst): Delete extra "struct" keyword.
	(is_figconst_low): Same.
	(is_figconst_zero): Same.
	(is_figconst_space): Same.
	(is_figconst_quote): Same.
	(is_figconst_high): Same.
	(is_space_value): Same.
	(is_quoted): Same.
	(symbol_index): Const parameter.
	(struct cbl_prog_hier_t): Suppress noExplicitConstructor.
	(struct cbl_perform_vary_t): Eliminate single-value constructor.
	(is_signable): Const parameter.
	(is_temporary): Same.
	(rename_not_ok): Same.
	(field_at): Test for NULL pointer.
	(class procref_base_t): Eliminate single-value constructor.
	* symfind.cc (is_data_field): Const pointer.
	(finalize_symbol_map2): Same.
	(class in_scope): Same.
	(symbol_match2): Same.
	* token_names.h: Suppress useInitializationList.
	* util.cc (normalize_picture): Whitespace and remove extra "continue".
	(redefine_field): Const pointer.
	(cbl_field_t::report_invalid_initial_value): Same.
	(literal_subscript_oob): Rename shadow variable.
	(cbl_refer_t::subscripts_set): Use std::vector.
	(cbl_refer_t::str): Same.
	(cbl_refer_t::deref_str): Same.
	(locally_unique): Use explicit constructor.
	(ambiguous_reference): Same.
	(class unique_stack): Use const reference.
	(cobol_filename): Const pointer.
	(verify_format): Scope reduction.
	(class temp_loc_t): Do not derive from YYLTYPE.
	(cobol_parse_files): Const pointer.
	* util.h (as_voidp): Define convenient converter.

libgcobol/ChangeLog:

	* common-defs.h (class cbl_enabled_exceptions_t): Const parameter.
This commit is contained in:
James K. Lowden 2025-06-16 11:43:35 -04:00
parent a26c5fc8fe
commit f298fabf3f
30 changed files with 1119 additions and 1060 deletions

View File

@ -34,6 +34,9 @@
# - the compiler proper (eg: cc1plus)
# - define the names for selecting the language in LANGUAGES.
# Use strict warnings for this front end.
cobol-warn = $(STRICT_WARN)
GCOBOL_INSTALL_NAME := $(shell echo gcobol|sed '$(program_transform_name)')
GCOBOLIO_INSTALL_NAME := $(shell echo gcobol-io|sed '$(program_transform_name)')
GCOBOL_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobol|sed '$(program_transform_name)')

View File

@ -106,7 +106,7 @@ void gcc_location_set( const YYLTYPE& loc );
template <typename LOC>
static void
location_dump( const char func[], int line, const char tag[], const LOC& loc) {
extern int yy_flex_debug;
extern int yy_flex_debug; // cppcheck-suppress shadowVariable
if( yy_flex_debug && gcobol_getenv("update_location") )
fprintf(stderr, "%s:%d: %s location (%d,%d) to (%d,%d)\n",
func, line, tag,

View File

@ -124,13 +124,13 @@ verify_bounds( size_t pos, size_t size, const char input[] ) {
*/
const char *
esc( size_t len, const char input[] ) {
static char spaces[] = "([,;]?[[:space:]])+";
static char spaceD[] = "(\n {6}D" "|" "[,;]?[[:space:]])+";
static const char space[] = "([,;]?[[:space:]])+";
static const char spaceD[] = "(\n {6}D" "|" "[,;]?[[:space:]])+";
static char buffer[64 * 1024];
char *p = buffer;
const char *eoinput = input + len;
const char *spacex = is_reference_format()? spaceD : spaces;
const char *spacex = is_reference_format()? spaceD : space;
for( const char *s=input; *s && s < eoinput; s++ ) {
*p = '\0';
@ -279,7 +279,7 @@ copybook_elem_t::open_file( const char directory[], bool literally ) {
dbgmsg("copybook_elem_t::open_file: trying %s", path);
if( (this->fd = open(path, O_RDONLY)) == -1 ) {
dbgmsg("could not open %s: %m", path);
dbgmsg("could not open %s: %s", path, xstrerror(errno));
return fd;
}
this->source.name = path;

View File

@ -185,6 +185,7 @@ apply_cdf_turn( const exception_turn_t& turn ) {
%printer { fprintf(yyo, "%s '%s'",
keyword_str($$.token),
$$.string? $$.string : "<nil>" ); } <cdfarg>
/* cppcheck-suppress invalidPrintfArgType_sint */
%printer { fprintf(yyo, HOST_SIZE_T_PRINT_DEC " '%s'",
(fmt_size_t)$$.number, $$.string? $$.string : "" ); } <cdfval>
@ -891,9 +892,9 @@ verify_integer( const YDFLTYPE& loc, const cdfval_base_t& val ) {
return true;
}
// cppcheck-suppress returnTempReference
const cdfval_base_t&
cdfval_base_t::operator()( const YDFLTYPE& loc ) {
static cdfval_t zero(0);
// cppcheck-suppress returnTempReference
return verify_integer(loc, *this) ? *this : zero;
}

View File

@ -73,28 +73,28 @@ struct cdfval_t : public cdfval_base_t {
cdfval_base_t::string = NULL;
cdfval_base_t::number = 0;
}
cdfval_t( const char value[] )
cdfval_t( const char value[] ) // cppcheck-suppress noExplicitConstructor
: lineno(yylineno), filename(cobol_filename())
{
cdfval_base_t::off = false;
cdfval_base_t::string = value;
cdfval_base_t::number = 0;
}
cdfval_t( long long value )
cdfval_t( long long value ) // cppcheck-suppress noExplicitConstructor
: lineno(yylineno), filename(cobol_filename())
{
cdfval_base_t::off = false;
cdfval_base_t::string = NULL;
cdfval_base_t::number = value;
}
cdfval_t( long value )
cdfval_t( long value ) // cppcheck-suppress noExplicitConstructor
: lineno(yylineno), filename(cobol_filename())
{
cdfval_base_t::off = false;
cdfval_base_t::string = NULL;
cdfval_base_t::number = value;
}
cdfval_t( int value )
cdfval_t( int value ) // cppcheck-suppress noExplicitConstructor
: lineno(yylineno), filename(cobol_filename())
{
cdfval_base_t::off = false;
@ -109,7 +109,7 @@ struct cdfval_t : public cdfval_base_t {
HOST_WIDE_INT value = real_to_integer(&r);
cdfval_base_t::number = value;
}
cdfval_t( const cdfval_base_t& value )
cdfval_t( const cdfval_base_t& value ) // cppcheck-suppress noExplicitConstructor
: lineno(yylineno), filename(cobol_filename())
{
cdfval_base_t *self(this);

View File

@ -571,7 +571,7 @@ cobol_name_mangler(const char *cobol_name_)
}
// Allocate enough space for a prepended underscore and a final '\0'
char *cobol_name = (char *)xmalloc(strlen(cobol_name_)+2);
char *cobol_name = static_cast<char *>(xmalloc(strlen(cobol_name_)+2));
size_t n = 0;
if( cobol_name_[0] >= '0' && cobol_name_[0] <= '9' )
{

View File

@ -100,7 +100,7 @@ class copybook_elem_t {
}
static char * dequote( const char orig[] ) {
gcc_assert(quoted(orig));
auto name = (char*)xcalloc(1, strlen(orig));
auto name = static_cast<char*>(xcalloc(1, strlen(orig)));
gcc_assert(name);
char *tgt = name;

View File

@ -35,13 +35,13 @@ namespace dts {
{
static regmatch_t empty;
empty.rm_so = empty.rm_eo = -1;
regmatch_t& self(*this);
regmatch_t& self(*this); // cppcheck-suppress constVariableReference
self = empty;
}
csub_match( const char input[], const regmatch_t& m )
: input(input)
{
regmatch_t& self(*this);
regmatch_t& self(*this); // cppcheck-suppress constVariableReference
self = m;
matched = rm_so != -1;
first = rm_so == -1? NULL : input + rm_so;
@ -68,7 +68,6 @@ namespace dts {
#if __cpp_exceptions
throw std::logic_error(msg);
#else
pattern = NULL;
cbl_errx("%s", msg);
#endif
}
@ -78,7 +77,7 @@ namespace dts {
size_t size() const { return nsubexpr; }
bool ready() const { return pattern != NULL; }
private:
regex( const regex& ) {}
regex( const regex& ) = default;
};
inline bool regex_search( const char input[], const char *eoinput,
@ -88,10 +87,10 @@ namespace dts {
static const char msg[] = "input not NUL-terminated";
throw std::domain_error( msg );
#else
eoinput = strchr(input, '\0');
// eoinput terminates input
eoinput = strchr(input, '\0'); // cppcheck-suppress uselessAssignmentPtrArg
#endif
}
if( eoinput == NULL ) eoinput = strchr(input, '\0');
auto ncm = re.size();
cm.resize(ncm);
std::vector <regmatch_t> cms(ncm);

View File

@ -108,14 +108,16 @@ cbl_enabled_exceptions_t::dump() const {
std::swap(debug, yydebug);
}
// cppcheck-suppress-begin [useStlAlgorithm] because why?
uint32_t
cbl_enabled_exceptions_t::status() const {
uint32_t status_word = 0;
for( const auto& ena : *this ) {
status_word |= (EC_ALL_E & ena.ec );
}
}
return status_word;
}
// cppcheck-suppress-end useStlAlgorithm
std::vector<uint64_t>
cbl_enabled_exceptions_t::encode() const {
@ -133,13 +135,13 @@ void
cbl_enabled_exceptions_t::turn_on_off( bool enabled,
bool location,
ec_type_t type,
std::set<size_t> files )
const std::set<size_t>& files )
{
// Update current enabled ECs tree on leaving this function.
class update_parser_t {
const cbl_enabled_exceptions_t& ecs;
public:
update_parser_t(const cbl_enabled_exceptions_t& ecs) : ecs(ecs) {}
explicit update_parser_t(const cbl_enabled_exceptions_t& ecs) : ecs(ecs) {}
~update_parser_t() {
tree ena = parser_compile_ecs(ecs.encode());
current_enabled_ecs(ena);
@ -244,16 +246,6 @@ cbl_enabled_exceptions_t::match( ec_type_t type, size_t file ) const {
return output != end()? &*output : NULL;
}
class choose_declarative {
size_t program;
public:
choose_declarative( size_t program ) : program(program) {}
bool operator()( const cbl_declarative_t& dcl ) {
return dcl.global || program == symbol_at(dcl.section)->program;
}
};
bool
sort_supers_last( const cbl_declarative_t& a, const cbl_declarative_t& b ) {
if( symbol_at(a.section)->program == symbol_at(b.section)->program ) {

View File

@ -694,7 +694,7 @@ struct called_tree_t {
tree node;
public:
match_tree( tree node ) : node(node) {}
explicit match_tree( tree node ) : node(node) {}
bool operator()( const called_tree_t& that ) const {
return this->node == that.node;
}
@ -957,7 +957,8 @@ parser_compile_ecs( const std::vector<uint64_t>& ecs )
{
SHOW_PARSE_HEADER
char ach[64];
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p", ecs.size(), retval);
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
ecs.size(), as_voidp(retval));
SHOW_PARSE_TEXT(ach)
SHOW_PARSE_END
}
@ -965,7 +966,8 @@ parser_compile_ecs( const std::vector<uint64_t>& ecs )
{
TRACE1_HEADER
char ach[64];
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p", ecs.size(), retval);
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
ecs.size(), as_voidp(retval));
TRACE1_TEXT_ABC("", ach, "");
TRACE1_END
}
@ -1004,7 +1006,8 @@ parser_compile_dcls( const std::vector<uint64_t>& dcls )
{
SHOW_PARSE_HEADER
char ach[64];
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p", dcls.size(), retval);
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
dcls.size(), as_voidp(retval));
SHOW_PARSE_TEXT(ach);
SHOW_PARSE_END
}
@ -1012,7 +1015,8 @@ parser_compile_dcls( const std::vector<uint64_t>& dcls )
{
TRACE1_HEADER
char ach[64];
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p", dcls.size(), retval);
snprintf(ach, sizeof(ach), " Size is %ld; retval is %p",
dcls.size(), as_voidp(retval));
TRACE1_TEXT_ABC("", ach, "");
TRACE1_END
}
@ -1091,7 +1095,7 @@ parser_statement_begin( const cbl_name_t statement_name,
{
SHOW_PARSE_INDENT
snprintf( ach, sizeof(ach),
"Sending ecs/dcls %p / %p", ecs, dcls);
"Sending ecs/dcls %p / %p", as_voidp(ecs), as_voidp(dcls));
SHOW_PARSE_TEXT(ach);
}
SHOW_PARSE_END
@ -1100,7 +1104,7 @@ parser_statement_begin( const cbl_name_t statement_name,
{
TRACE1_HEADER
char ach[64];
snprintf(ach, sizeof(ach), " ecs/dcls %p / %p", ecs, dcls);
snprintf(ach, sizeof(ach), " ecs/dcls %p / %p", as_voidp(ecs), as_voidp(dcls));
TRACE1_TEXT_ABC("", ach, "");
TRACE1_END
}
@ -1315,7 +1319,7 @@ initialize_variable_internal( cbl_refer_t refer,
bool is_redefined = false;
cbl_field_t *family_tree = parsed_var;
const cbl_field_t *family_tree = parsed_var;
while(family_tree)
{
if( symbol_redefines(family_tree) )
@ -1336,7 +1340,7 @@ initialize_variable_internal( cbl_refer_t refer,
if( parsed_var->data.initial )
{
bool a_parent_initialized = false;
cbl_field_t *parent = parent_of(parsed_var);
const cbl_field_t *parent = parent_of(parsed_var);
while( parent )
{
if( parent->attr & has_value_e )
@ -1366,7 +1370,7 @@ initialize_variable_internal( cbl_refer_t refer,
flag_bits |= wsclear()
? DEFAULTBYTE_BIT + (*wsclear() & DEFAULT_BYTE_MASK)
: 0;
flag_bits |= (refer.nsubscript << NSUBSCRIPT_SHIFT) & NSUBSCRIPT_MASK;
flag_bits |= (refer.nsubscript() << NSUBSCRIPT_SHIFT) & NSUBSCRIPT_MASK;
flag_bits |= just_once ? JUST_ONCE_BIT : 0 ;
suppress_dest_depends = false; // Set this to false so that refer_is_clean is valid
@ -1531,7 +1535,7 @@ initialize_variable_internal( cbl_refer_t refer,
// }
void
parser_initialize(cbl_refer_t refer, bool like_parser_symbol_add)
parser_initialize(const cbl_refer_t& refer, bool like_parser_symbol_add)
{
//gg_printf("parser_initialize %s\n", gg_string_literal(refer.field->name), NULL_TREE);
if( like_parser_symbol_add )
@ -2475,7 +2479,7 @@ get_string_from(cbl_field_t *field)
gg_cast(CHAR_P,
gg_malloc(build_int_cst_type(SIZE_T,
field->data.capacity+1))));
char *litstring = get_literal_string(field);
const char *litstring = get_literal_string(field);
gg_memcpy(psz,
gg_string_literal(litstring),
build_int_cst_type(SIZE_T, field->data.capacity+1));
@ -2527,8 +2531,8 @@ combined_name(cbl_label_t *label)
{
// This routine returns a pointer to a static, so make sure you use the result
// before calling the routine again
char *para_name = nullptr;
char *sect_name = nullptr;
const char *para_name = nullptr;
const char *sect_name = nullptr;
const char *program_name = current_function->our_unmangled_name;
if( label->type == LblParagraph )
@ -2551,7 +2555,7 @@ combined_name(cbl_label_t *label)
static char *retval= (char *)xmalloc(retval_size);
char *paragraph = cobol_name_mangler(para_name);
char *section = cobol_name_mangler(sect_name);
char *section = cobol_name_mangler(sect_name);
char *mangled_program_name = cobol_name_mangler(program_name);
while( retval_size < (paragraph ? strlen(paragraph) : 0 )
@ -3267,8 +3271,8 @@ parser_perform(cbl_label_t *label, bool suppress_nexting)
// pairs were created, the locations of the goto instruction and the label
// were not known.
char *para_name = nullptr;
char *sect_name = nullptr;
const char *para_name = nullptr;
const char *sect_name = nullptr;
const char *program_name = current_function->our_unmangled_name;
size_t deconflictor = symbol_label_id(label);
@ -4095,7 +4099,7 @@ psa_FldLiteralN(struct cbl_field_t *field )
int rdigit_delta = 0;
int exponent = 0;
char *exp = strchr(p, 'E');
const char *exp = strchr(p, 'E');
if( !exp )
{
exp = strchr(p, 'e');
@ -5659,16 +5663,16 @@ parser_assign( size_t nC, cbl_num_result_t *C,
}
static cbl_figconst_t
is_figconst(cbl_field_t *field)
is_figconst_t(const cbl_field_t *field)
{
cbl_figconst_t figconst = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
return figconst;
}
static cbl_figconst_t
is_figconst(cbl_refer_t &sourceref)
is_figconst(const cbl_refer_t &sourceref)
{
return is_figconst(sourceref.field);
return is_figconst_t(sourceref.field);
}
void
@ -6213,7 +6217,7 @@ pe_stuff(cbl_refer_t refer, ec_type_t ec)
}
void
parser_exit( cbl_refer_t refer, ec_type_t ec )
parser_exit( const cbl_refer_t& refer, ec_type_t ec )
{
Analyze();
SHOW_PARSE
@ -6777,7 +6781,7 @@ parser_division(cbl_division_t division,
// gg_printf("Somebody wants to cancel %s\n",
// gg_string_literal(current_function->our_unmangled_name),
// NULL_TREE);
cbl_label_t *prog = cbl_label_of(symbol_at(current_program_index()));
const cbl_label_t *prog = cbl_label_of(symbol_at(current_program_index()));
size_t initializer_index = prog->initial_section;
cbl_label_t *initializer = cbl_label_of(symbol_at(initializer_index));
parser_perform(initializer, true); // true means suppress nexting
@ -7770,9 +7774,9 @@ parser_classify( cbl_field_t *tgt,
}
void
parser_perform(struct cbl_perform_tgt_t *tgt, struct cbl_refer_t how_many)
parser_perform(const cbl_perform_tgt_t *tgt, cbl_refer_t how_many)
{
cbl_field_t *N = how_many.field;
const cbl_field_t *N = how_many.field;
// No SHOW_PARSE here; we want to fall through:
if( !tgt->to() )
{
@ -7914,8 +7918,8 @@ parser_perform_conditional( struct cbl_perform_tgt_t *tgt )
if( !(i < MAXIMUM_UNTILS) )
{
cbl_internal_error("%s:%d: %u exceeds MAXIMUM_UNTILS of %d, line %d",
__func__, __LINE__,
i, MAXIMUM_UNTILS, CURRENT_LINE_NUMBER);
__func__, __LINE__,
i, MAXIMUM_UNTILS, CURRENT_LINE_NUMBER);
}
gcc_assert(i < MAXIMUM_UNTILS);
@ -9035,7 +9039,7 @@ parser_perform_inline_times(struct cbl_perform_tgt_t *tgt,
}
void
parser_set_conditional88( struct cbl_refer_t refer, bool which_way )
parser_set_conditional88( const cbl_refer_t& refer, bool which_way )
{
Analyze();
struct cbl_field_t *tgt = refer.field;
@ -9917,14 +9921,51 @@ parser_file_start(struct cbl_file_t *file,
static void
inspect_tally(bool backward,
cbl_refer_t identifier_1,
unsigned long n_identifier_2,
cbx_inspect_t<cbl_refer_t>* identifier_2)
cbl_inspect_opers_t& identifier_2)
{
Analyze();
// This is an INSPECT FORMAT 1
SHOW_PARSE
{
SHOW_PARSE_HEADER
char ach[128];
sprintf(ach, "There are %lu identifier_2", identifier_2.size());
SHOW_PARSE_TEXT(ach);
for(size_t i=0; i<identifier_2.size(); i++)
{
SHOW_PARSE_INDENT
sprintf(ach, "%lu: bounds: %lu", i, identifier_2[i].nbound());
SHOW_PARSE_TEXT(ach);
for(size_t j=0; j<identifier_2[i].nbound(); j++)
{
SHOW_PARSE_INDENT
sprintf(ach, " %lu: matches: %lu", j, identifier_2[i][j].matches.size());
SHOW_PARSE_TEXT(ach);
SHOW_PARSE_INDENT
if( identifier_2[i][j].bound == bound_characters_e )
{
SHOW_PARSE_TEXT(" bound_characters");
}
else
{
SHOW_PARSE_TEXT(" bound_leading/all");
}
if( identifier_2[i][j].matches.size() )
{
SHOW_PARSE_INDENT
sprintf(ach, " before %p",
as_voidp(identifier_2.at(i).at(j).matches.at(0).before.identifier_4.field));
SHOW_PARSE_TEXT(ach);
SHOW_PARSE_INDENT
sprintf(ach, " after %p",
as_voidp(identifier_2.at(i).at(j).matches.at(0).after.identifier_4.field));
SHOW_PARSE_TEXT(ach);
}
}
}
SHOW_PARSE_END
}
@ -9934,6 +9975,7 @@ inspect_tally(bool backward,
size_t int_index = 0;
size_t pcbl_index = 0;
unsigned long n_identifier_2 = identifier_2.size();
// The first integer is the all-important controlling count:
int_index++;
@ -9947,12 +9989,11 @@ inspect_tally(bool backward,
pcbl_index++;
// For each FOR there is a count of the loops after the FOR
int_index++;
for(size_t j=0; j<identifier_2[i].nbound; j++)
for(size_t j=0; j<identifier_2[i].nbound(); j++)
{
// After each identifier-2, there is a cbl_inspect_bound_t value:
int_index++;
if( identifier_2[i].opers[j].bound == bound_characters_e)
if( identifier_2[i][j].bound == bound_characters_e)
{
// This is a FOR CHARACTERS PHRASE1, so we will need before/after
// for each:
@ -9963,7 +10004,7 @@ inspect_tally(bool backward,
{
// This is ALL or LEADING. Each has some number of identifier-3
int_index++;
for(size_t k=0; k<identifier_2[i].opers[j].n_identifier_3; k++)
for(size_t k=0; k<identifier_2[i][j].n_identifier_3(); k++)
{
// Put identifier-3 into the array:
pcbl_index++;
@ -9999,8 +10040,8 @@ inspect_tally(bool backward,
}
ENDIF
size_t n_resolveds = pcbl_index;
cbl_refer_t *pcbl_refers = (cbl_refer_t *)xmalloc(n_resolveds * sizeof(cbl_refer_t));
const size_t n_resolveds = pcbl_index;
std::vector<cbl_refer_t> pcbl_refers(n_resolveds);
// Now we make a second pass, populating those arrays:
int_index = 0;
@ -10019,34 +10060,42 @@ inspect_tally(bool backward,
pcbl_refers[pcbl_index++] = identifier_2[i].tally;
// For each FOR there is a count of the loops after the FOR
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, identifier_2[i].nbound) );
for(size_t j=0; j<identifier_2[i].nbound; j++)
build_int_cst_type(SIZE_T, identifier_2[i].nbound()) );
for(size_t j=0; j<identifier_2[i].nbound(); j++)
{
// After each identifier-2, there is a cbl_inspect_bound_t value:
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, identifier_2[i].opers[j].bound));
if( identifier_2[i].opers[j].bound == bound_characters_e)
build_int_cst_type(SIZE_T, identifier_2[i][j].bound));
if( identifier_2[i][j].bound == bound_characters_e)
{
// This is a FOR CHARACTERS PHRASE1, so we will need before/after
// for each:
pcbl_refers[pcbl_index++] = identifier_2[i].opers[j].matches[0].before.identifier_4;
pcbl_refers[pcbl_index++] = identifier_2[i].opers[j].matches[0].after.identifier_4;
const auto& m( identifier_2[i][j].matches );
if( m.empty() )
{
pcbl_index += 2;
}
else
{
pcbl_refers[pcbl_index++] = m[0].before.identifier_4;
pcbl_refers[pcbl_index++] = m[0].after.identifier_4;
}
}
else
{
// This is ALL or LEADING. Each has some number of identifier-3
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, identifier_2[i].opers[j].n_identifier_3));
for(size_t k=0; k<identifier_2[i].opers[j].n_identifier_3; k++)
build_int_cst_type(SIZE_T, identifier_2[i][j].n_identifier_3()));
for(size_t k=0; k<identifier_2[i][j].n_identifier_3(); k++)
{
// Put identifier-3 into the array:
pcbl_refers[pcbl_index++] = identifier_2[i].opers[j].matches[k].matching;
pcbl_refers[pcbl_index++] = identifier_2[i][j].matches[k].matching();
// We need the PHRASE1 for that identifier-3
pcbl_refers[pcbl_index++] = identifier_2[i].opers[j].matches[k].before.identifier_4;
pcbl_refers[pcbl_index++] = identifier_2[i][j].matches[k].before.identifier_4;
pcbl_refers[pcbl_index++] = identifier_2[i].opers[j].matches[k].after.identifier_4;
pcbl_refers[pcbl_index++] = identifier_2[i][j].matches[k].after.identifier_4;
}
}
}
@ -10058,7 +10107,7 @@ inspect_tally(bool backward,
gcc_assert(pcbl_index == n_resolveds);
// We have built up an array of integers, and an array of cbl_refer_t.
build_array_of_treeplets(1, pcbl_index, pcbl_refers);
build_array_of_treeplets(1, pcbl_index, pcbl_refers.data());
// Do the actual call:
gg_call(VOID,
@ -10066,16 +10115,12 @@ inspect_tally(bool backward,
backward ? integer_one_node : integer_zero_node,
integers,
NULL_TREE);
// And free up the memory we allocated
free(pcbl_refers);
}
static void
inspect_replacing(int backward,
cbl_refer_t identifier_1,
unsigned long n_ops,
cbx_inspect_t<cbl_refer_t>* operations)
cbl_inspect_opers_t& operations)
{
Analyze();
// This is an INSPECT FORMAT 2
@ -10086,6 +10131,7 @@ inspect_replacing(int backward,
}
// For REPLACING, unlike TALLY, there can be but one operation
unsigned long n_ops = operations.size();
gcc_assert(n_ops == 1);
size_t n_id_3 = 0;
@ -10096,9 +10142,9 @@ inspect_replacing(int backward,
// Make one pass through the inputs to count up the sizes of the arrays
// we will be passing to the library routines:
for( size_t j=0; j<operations[0].nbound; j++)
for( size_t j=0; j<operations[0].nbound(); j++)
{
if( operations[0].opers[j].bound == bound_characters_e)
if( operations[0][j].bound == bound_characters_e)
{
// This is a FOR CHARACTERS phrase
@ -10117,13 +10163,13 @@ inspect_replacing(int backward,
// The n_identifier-3 values will go into the resolved values; we have to
// leave room for them
n_id_3 += operations[0].opers[j].n_identifier_3;
n_id_3 += operations[0][j].n_identifier_3();
// Likewise identifier-5 values:
n_id_5 += operations[0].opers[j].n_identifier_3;
n_id_5 += operations[0][j].n_identifier_3();
// And each identifier-3 / identifier-5 pair has BEFORE and AFTER phrases:
n_id_4 += 2 * operations[0].opers[j].n_identifier_3;
n_id_4 += 2 * operations[0][j].n_identifier_3();
}
}
@ -10131,8 +10177,8 @@ inspect_replacing(int backward,
// all the integers and cbl_inspect_bound_t values, in a strict sequence so
// that the library routine can peel them off.
size_t n_integers = 1 // Room for operations[0].nbound
+ operations[0].nbound // Room for all the cbl_inspect_bound_t values
size_t n_integers = 1 // Room for operations[0].nbound()
+ operations[0].nbound() // Room for all the cbl_inspect_bound_t values
+ n_all_leading_first; // Room for all of the n_identifier_3 counts
static tree int_size = gg_define_variable(INT, "..pir_size", vs_file_static, 0);
@ -10152,12 +10198,12 @@ inspect_replacing(int backward,
}
ENDIF
size_t n_resolveds = 1 // Room for identifier-1
const size_t n_resolveds = 1 // Room for identifier-1
+ n_id_3 // Room for the identifier-3 variables
+ n_id_4 // Room for the identifier-4 variables
+ n_id_5; // Room for the identifier-5 variables
cbl_refer_t *pcbl_refers = (cbl_refer_t *)xmalloc(n_resolveds * sizeof(cbl_refer_t));
std::vector<cbl_refer_t> pcbl_refers(n_resolveds);
// Now we make a second pass, populating those arrays:
size_t int_index = 0;
@ -10165,28 +10211,28 @@ inspect_replacing(int backward,
// The first integer is the all-important controlling count:
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, operations[0].nbound) );
build_int_cst_type(SIZE_T, operations[0].nbound()) );
// The first refer is for identifier-1
pcbl_refers[pcbl_index++] = identifier_1;
for( size_t j=0; j<operations[0].nbound; j++)
for( size_t j=0; j<operations[0].nbound(); j++)
{
// For each FOR there is a count of the loops after the FOR
// For each operation, there is a cbl_inspect_bound_t value:
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, operations[0].opers[j].bound));
if( operations[0].opers[j].bound == bound_characters_e)
build_int_cst_type(SIZE_T, operations[0][j].bound));
if( operations[0][j].bound == bound_characters_e)
{
// This is a FOR CHARACTERS PHRASE1
// Put in the identifier-5 replacement value:
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[0].replacement;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[0].replacement;
// Each identifier-5 gets a PHRASE1:
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[0].before.identifier_4;
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[0].after.identifier_4;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[0].before.identifier_4;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[0].after.identifier_4;
SHOW_PARSE
{
@ -10194,14 +10240,14 @@ inspect_replacing(int backward,
{
SHOW_PARSE_INDENT
}
SHOW_PARSE_FIELD("ID-5 ", operations[0].opers[j].replaces[0].replacement.field)
if(operations[0].opers[j].replaces[0].before.identifier_4.field)
SHOW_PARSE_FIELD("ID-5 ", operations[0][j].replaces[0].replacement.field)
if(operations[0][j].replaces[0].before.identifier_4.field)
{
SHOW_PARSE_FIELD(" before ", operations[0].opers[j].replaces[0].before.identifier_4.field)
SHOW_PARSE_FIELD(" before ", operations[0][j].replaces[0].before.identifier_4.field)
}
if(operations[0].opers[j].replaces[0].after.identifier_4.field)
if(operations[0][j].replaces[0].after.identifier_4.field)
{
SHOW_PARSE_FIELD(" after ", operations[0].opers[j].replaces[0].after.identifier_4.field)
SHOW_PARSE_FIELD(" after ", operations[0][j].replaces[0].after.identifier_4.field)
}
SHOW_PARSE_END
}
@ -10210,19 +10256,19 @@ inspect_replacing(int backward,
{
// This is ALL or LEADING. Each has some number of identifier-3/identifier-5 pairs
gg_assign( gg_array_value(integers, int_index++),
build_int_cst_type(SIZE_T, operations[0].opers[j].n_identifier_3));
for(size_t k=0; k<operations[0].opers[j].n_identifier_3; k++)
build_int_cst_type(SIZE_T, operations[0][j].n_identifier_3()));
for(size_t k=0; k<operations[0][j].n_identifier_3(); k++)
{
// Put identifier-3 into the array:
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[k].matching;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[k].matching();
// Put in the identifier-5 replacement value:
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[k].replacement;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[k].replacement;
// We need the PHRASE1 for that identifier-3/identifier-5 pair:
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[k].before.identifier_4;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[k].before.identifier_4;
pcbl_refers[pcbl_index++] = operations[0].opers[j].replaces[k].after.identifier_4;
pcbl_refers[pcbl_index++] = operations[0][j].replaces[k].after.identifier_4;
SHOW_PARSE
{
@ -10230,15 +10276,15 @@ inspect_replacing(int backward,
{
SHOW_PARSE_INDENT
}
SHOW_PARSE_FIELD("ID-3 ", operations[0].opers[j].replaces[k].matching.field)
SHOW_PARSE_FIELD(" ID-5 ", operations[0].opers[j].replaces[k].replacement.field)
if( operations[0].opers[j].replaces[k].before.identifier_4.field )
SHOW_PARSE_FIELD("ID-3 ", operations[0][j].replaces[k].matching().field)
SHOW_PARSE_FIELD(" ID-5 ", operations[0][j].replaces[k].replacement.field)
if( operations[0][j].replaces[k].before.identifier_4.field )
{
SHOW_PARSE_FIELD("before ", operations[0].opers[j].replaces[k].before.identifier_4.field)
SHOW_PARSE_FIELD("before ", operations[0][j].replaces[k].before.identifier_4.field)
}
if(operations[0].opers[j].replaces[k].after.identifier_4.field)
if(operations[0][j].replaces[k].after.identifier_4.field)
{
SHOW_PARSE_FIELD("after ", operations[0].opers[j].replaces[k].after.identifier_4.field)
SHOW_PARSE_FIELD("after ", operations[0][j].replaces[k].after.identifier_4.field)
}
SHOW_PARSE_END
}
@ -10263,7 +10309,7 @@ inspect_replacing(int backward,
}
}
build_array_of_treeplets(1, pcbl_index, pcbl_refers);
build_array_of_treeplets(1, pcbl_index, pcbl_refers.data());
// Do the actual call:
gg_call(VOID,
@ -10274,13 +10320,12 @@ inspect_replacing(int backward,
}
void
parser_inspect(cbl_refer_t identifier_1,
parser_inspect(const cbl_refer_t& identifier_1,
bool backward,
size_t n_operations,
cbx_inspect_t<cbl_refer_t>* operations)
cbl_inspect_opers_t& operations)
{
Analyze();
gcc_assert(n_operations);
gcc_assert(! operations.empty());
/* Operating philosophy: We are going to minimize the amount of
GENERIC tag creation here at compile time, mainly by eliminating
@ -10290,12 +10335,12 @@ parser_inspect(cbl_refer_t identifier_1,
if( operations[0].tally.field )
{
// This is a FORMAT 1 "TALLYING"
inspect_tally(backward, identifier_1, n_operations, operations);
inspect_tally(backward, identifier_1, operations);
}
else
{
// This is a FORMAT 2 "REPLACING"
inspect_replacing(backward, identifier_1, n_operations, operations);
inspect_replacing(backward, identifier_1, operations);
}
}
@ -10441,8 +10486,8 @@ parser_intrinsic_subst( cbl_field_t *f,
sv_is_i_o = true;
store_location_stuff("SUBSTITUTE");
unsigned char *control_bytes = (unsigned char *)xmalloc(argc * sizeof(unsigned char));
cbl_refer_t *arg1 = (cbl_refer_t *)xmalloc(argc * sizeof(cbl_refer_t));
cbl_refer_t *arg2 = (cbl_refer_t *)xmalloc(argc * sizeof(cbl_refer_t));
std::vector<cbl_refer_t> arg1(argc);
std::vector<cbl_refer_t> arg2(argc);
for(size_t i=0; i<argc; i++)
{
@ -10458,8 +10503,8 @@ parser_intrinsic_subst( cbl_field_t *f,
tree control = gg_array_of_bytes(argc, control_bytes);
build_array_of_treeplets(1, argc, arg1);
build_array_of_treeplets(2, argc, arg2);
build_array_of_treeplets(1, argc, arg1.data());
build_array_of_treeplets(2, argc, arg2.data());
gg_call(VOID,
"__gg__substitute",
@ -10473,8 +10518,6 @@ parser_intrinsic_subst( cbl_field_t *f,
gg_free(control);
free(arg2);
free(arg1);
free(control_bytes);
}
@ -10625,12 +10668,12 @@ parser_intrinsic_call_1( cbl_field_t *tgt,
}
size_t upper = ref1.field->occurs.bounds.upper
? ref1.field->occurs.bounds.upper : 1;
if( ref1.nsubscript )
if( ref1.nsubscript() )
{
upper = 1;
}
if( is_table(ref1.field) && !ref1.nsubscript )
if( is_table(ref1.field) && !ref1.nsubscript() )
{
static tree depending_on = gg_define_variable(LONG, "..pic1_dep");
depending_on_value(depending_on, ref1.field);
@ -11269,7 +11312,7 @@ parser_bsearch_conditional( cbl_label_t* name )
}
bool
is_ascending_key(cbl_refer_t key)
is_ascending_key(const cbl_refer_t& key)
{
bool retval = true;
@ -11290,7 +11333,7 @@ is_ascending_key(cbl_refer_t key)
{
size_t index_of_field
= family_tree->occurs.keys[i].field_list.fields[j];
cbl_field_t *key_field = cbl_field_of(symbol_at(index_of_field));
const cbl_field_t *key_field = cbl_field_of(symbol_at(index_of_field));
if( strcmp( key_field->name,
key.field->name ) == 0 )
@ -11416,8 +11459,7 @@ void
parser_sort(cbl_refer_t tableref,
bool duplicates,
cbl_alphabet_t *alphabet,
size_t nkeys,
cbl_key_t *keys )
const std::vector<cbl_key_t>& keys )
{
Analyze();
SHOW_PARSE
@ -11439,18 +11481,18 @@ parser_sort(cbl_refer_t tableref,
__func__,
tableref.field->name);
}
size_t total_keys = 0;
for( size_t i=0; i<nkeys; i++ )
{
total_keys += keys[i].nfield;
}
cbl_field_t **flattened_fields = (cbl_field_t **)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t total_keys = std::accumulate( keys.begin(), keys.end(), 0,
[](size_t n, const cbl_key_t& key ) {
return n + key.fields.size();
} );
typedef const cbl_field_t * const_field_t;
const_field_t *flattened_fields = (const_field_t *)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t *flattened_ascending = (size_t *)xmalloc(total_keys * sizeof(size_t));
size_t key_index = 0;
for( size_t i=0; i<nkeys; i++ )
for( size_t i=0; i<keys.size(); i++ )
{
for( size_t j=0; j<keys[i].nfield; j++ )
for( size_t j=0; j<keys[i].fields.size(); j++ )
{
flattened_fields[key_index] = keys[i].fields[j];
flattened_ascending[key_index] = keys[i].ascending ? 1 : 0;
@ -11459,7 +11501,8 @@ parser_sort(cbl_refer_t tableref,
}
// Create the array of cbl_field_t pointers for the keys
tree all_keys = gg_array_of_field_pointers( total_keys, flattened_fields);
tree all_keys = gg_array_of_field_pointers( total_keys,
const_cast<cbl_field_t**>(flattened_fields));
// Create the array of integers that are the flags for ASCENDING:
tree ascending = gg_array_of_size_t( total_keys, flattened_ascending );
@ -11498,8 +11541,7 @@ void
parser_file_sort( cbl_file_t *workfile,
bool duplicates,
cbl_alphabet_t *alphabet,
size_t nkeys,
cbl_key_t *keys,
const std::vector<cbl_key_t>& keys,
size_t ninput,
cbl_file_t **inputs,
size_t noutput,
@ -11576,18 +11618,18 @@ parser_file_sort( cbl_file_t *workfile,
// clone of the code for handling multiple keys, each of which can have
// multiple fields.
size_t total_keys = 0;
for( size_t i=0; i<nkeys; i++ )
{
total_keys += keys[i].nfield;
}
cbl_field_t **flattened_fields = (cbl_field_t **)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t total_keys = std::accumulate( keys.begin(), keys.end(), 0,
[]( size_t n, const cbl_key_t& key ) {
return n + key.fields.size();
} );
typedef const cbl_field_t * const_field_t;
auto flattened_fields = (const_field_t *)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t *flattened_ascending = (size_t *) xmalloc(total_keys * sizeof(size_t));
size_t key_index = 0;
for( size_t i=0; i<nkeys; i++ )
for( size_t i=0; i<keys.size(); i++ )
{
for( size_t j=0; j<keys[i].nfield; j++ )
for( size_t j=0; j<keys[i].fields.size(); j++ )
{
flattened_fields[key_index] = keys[i].fields[j];
flattened_ascending[key_index] = keys[i].ascending ? 1 : 0;
@ -11596,7 +11638,8 @@ parser_file_sort( cbl_file_t *workfile,
}
// Create the array of cbl_field_t pointers for the keys
tree all_keys = gg_array_of_field_pointers( total_keys, flattened_fields);
tree all_keys = gg_array_of_field_pointers( total_keys,
const_cast<cbl_field_t**>(flattened_fields));
// Create the array of integers that are the flags for ASCENDING:
tree ascending = gg_array_of_size_t( total_keys, flattened_ascending );
@ -11898,8 +11941,7 @@ gg_array_of_file_pointers( size_t N,
void
parser_file_merge( cbl_file_t *workfile,
cbl_alphabet_t *alphabet,
size_t nkeys,
cbl_key_t *keys,
const std::vector<cbl_key_t>& keys,
size_t ninputs,
cbl_file_t **inputs,
size_t noutputs,
@ -11922,20 +11964,19 @@ parser_file_merge( cbl_file_t *workfile,
build_int_cst_type(INT, file_sequential_e));
}
size_t total_keys = 0;
for( size_t i=0; i<nkeys; i++ )
{
total_keys += keys[i].nfield;
}
cbl_field_t **flattened_fields
= (cbl_field_t **)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t total_keys = std::accumulate( keys.begin(), keys.end(), 0,
[]( size_t i, const cbl_key_t& key ) {
return i + key.fields.size();
} );
typedef const cbl_field_t * const_field_t;
const_field_t *flattened_fields = (const_field_t *)xmalloc(total_keys * sizeof(cbl_field_t *));
size_t *flattened_ascending
= (size_t *)xmalloc(total_keys * sizeof(size_t));
size_t key_index = 0;
for( size_t i=0; i<nkeys; i++ )
for( size_t i=0; i<keys.size(); i++ )
{
for( size_t j=0; j<keys[i].nfield; j++ )
for( size_t j=0; j<keys[i].fields.size(); j++ )
{
flattened_fields[key_index] = keys[i].fields[j];
flattened_ascending[key_index] = keys[i].ascending ? 1 : 0;
@ -11944,7 +11985,8 @@ parser_file_merge( cbl_file_t *workfile,
}
// Create the array of cbl_field_t pointers for the keys
tree all_keys = gg_array_of_field_pointers(total_keys, flattened_fields);
tree all_keys = gg_array_of_field_pointers(total_keys,
const_cast<cbl_field_t**>(flattened_fields));
// Create the array of integers that are the flags for ASCENDING:
tree ascending = gg_array_of_size_t(total_keys, flattened_ascending);
@ -12011,7 +12053,7 @@ parser_file_merge( cbl_file_t *workfile,
gg_call(VOID,
"__gg__merge_files",
gg_get_address_of(workfile->var_decl_node),
build_int_cst_type(SIZE_T, nkeys),
build_int_cst_type(SIZE_T, keys.size()),
all_keys,
ascending,
build_int_cst_type(SIZE_T, ninputs),
@ -12183,7 +12225,7 @@ parser_unstring(cbl_refer_t src,
gg_append_statement(not_overflow->structs.unstring->over.label);
}
cbl_refer_t *delims = (cbl_refer_t *)xmalloc(ndelimited * sizeof(cbl_refer_t));
std::vector<cbl_refer_t> delims(ndelimited);
char *alls = (char *)xmalloc(ndelimited+1);
for(size_t i=0; i<ndelimited; i++)
@ -12195,7 +12237,7 @@ parser_unstring(cbl_refer_t src,
tree t_alls = build_string_literal(ndelimited+1, alls);
build_array_of_treeplets(1, ndelimited, delims);
build_array_of_treeplets(1, ndelimited, delims.data());
build_array_of_treeplets(2, noutputs, outputs);
build_array_of_treeplets(3, noutputs, delimiters);
build_array_of_treeplets(4, noutputs, counts);
@ -12219,7 +12261,6 @@ parser_unstring(cbl_refer_t src,
NULL_TREE)
);
free(alls);
free(delims);
if( overflow )
{
@ -12255,12 +12296,12 @@ parser_unstring(cbl_refer_t src,
}
void
parser_string( cbl_refer_t tgt,
cbl_refer_t pointer,
size_t nsource,
cbl_string_src_t *sources,
cbl_label_t *overflow,
cbl_label_t *not_overflow )
parser_string(const cbl_refer_t& tgt,
const cbl_refer_t& pointer,
size_t nsource,
cbl_string_src_t *sources,
cbl_label_t *overflow,
cbl_label_t *not_overflow )
{
SHOW_PARSE
{
@ -12286,7 +12327,7 @@ parser_string( cbl_refer_t tgt,
cblc_count += 1 + sources[i].ninput; // 1 for identifier_2 + ninput identifier_1 values;
}
cbl_refer_t *refers = (cbl_refer_t *)xmalloc(cblc_count * sizeof(cbl_refer_t));
std::vector<cbl_refer_t> refers(cblc_count);
size_t index_int = 0;
size_t index_cblc = 0;
@ -12311,7 +12352,7 @@ parser_string( cbl_refer_t tgt,
tree pintegers = build_array_of_size_t( index_int, integers);
build_array_of_treeplets(1, index_cblc, refers);
build_array_of_treeplets(1, index_cblc, refers.data());
tree t_overflow = gg_define_int();
gg_assign(t_overflow, gg_call_expr( INT,
@ -12321,7 +12362,6 @@ parser_string( cbl_refer_t tgt,
gg_free(pintegers);
free(integers);
free(refers);
if( overflow )
{
@ -12813,7 +12853,7 @@ parser_call( cbl_refer_t name,
SHOW_PARSE_TEXT(" (")
for(size_t i=0; i<narg; i++)
{
cbl_field_t *p = args[i].refer.field;
const cbl_field_t *p = args[i].refer.field;
SHOW_PARSE_FIELD( " ", p)
}
SHOW_PARSE_TEXT(" )")
@ -13203,7 +13243,8 @@ typedef struct hier_node
hier_node() :
our_index(0),
common(false),
parent_node(NULL)
parent_node(nullptr),
name(nullptr)
{}
} hier_node;
@ -13247,7 +13288,7 @@ find_uncles(const hier_node *node, std::vector<const hier_node *> &uncles)
}
void
parser_program_hierarchy( const struct cbl_prog_hier_t& hier )
parser_program_hierarchy( const cbl_prog_hier_t& hier )
{
Analyze();
/* This routine gets called near the end of every program-id. It keeps
@ -13265,7 +13306,7 @@ parser_program_hierarchy( const struct cbl_prog_hier_t& hier )
}
else
{
for( size_t i=0; i<hier.nlabel; i++ )
for( size_t i=0; i<hier.labels.size(); i++ )
{
if( i )
{
@ -13320,9 +13361,9 @@ parser_program_hierarchy( const struct cbl_prog_hier_t& hier )
node_map[0] = nodes.back();
// Pass 1: Create a node for every program:
for( size_t i=0; i<hier.nlabel; i++ )
for( size_t i=0; i<hier.labels.size(); i++ )
{
hier_node *existing_node = find_hier_node(node_map, hier.labels[i].ordinal);
const hier_node *existing_node = find_hier_node(node_map, hier.labels[i].ordinal);
gcc_assert( existing_node == NULL );
hier_node *new_node = new hier_node;
@ -13334,7 +13375,7 @@ parser_program_hierarchy( const struct cbl_prog_hier_t& hier )
}
// Pass 2: populate each node with their parent and children:
for( size_t i=0; i<hier.nlabel; i++ )
for( size_t i=0; i<hier.labels.size(); i++ )
{
hier_node *child_node = find_hier_node(node_map, hier.labels[i].ordinal);
gcc_assert(child_node);
@ -13726,7 +13767,7 @@ hijack_for_development(const char *funcname)
}
static void
conditional_abs(tree source, cbl_field_t *field)
conditional_abs(tree source, const cbl_field_t *field)
{
Analyze();
if( !(field->attr & signable_e) )
@ -14071,7 +14112,7 @@ tree float_type_of(int n)
}
static tree
float_type_of(cbl_field_t *field)
float_type_of(const cbl_field_t *field)
{
gcc_assert(field->type == FldFloat);
return float_type_of(field->data.capacity);
@ -15554,7 +15595,7 @@ initial_from_initial(cbl_field_t *field)
digits_from_float128(ach, field, field->data.digits, rdigits, value);
char *digits = ach;
const char *digits = ach;
if( (field->attr & signable_e)
&& (field->attr & separate_e)
&& (field->attr & leading_e ) )
@ -15643,7 +15684,7 @@ initial_from_initial(cbl_field_t *field)
: field->data.capacity * 2 - 1;
digits_from_float128(ach, field, ndigits, rdigits, value);
char *digits = ach;
const char *digits = ach;
for(size_t i=0; i<ndigits; i++)
{
if( !(i & 0x01) )
@ -15711,22 +15752,19 @@ initial_from_initial(cbl_field_t *field)
retval = (char *)xmalloc(field->data.capacity+1);
if( field->data.initial && field->attr & quoted_e )
{
if( field->attr & quoted_e )
// What the programmer says the value is, the value becomes, no
// matter how wrong it might be.
size_t length = std::min( (size_t)field->data.capacity,
strlen(field->data.initial));
for(size_t i=0; i<length; i++)
{
// What the programmer says the value is, the value becomes, no
// matter how wrong it might be.
size_t length = std::min( (size_t)field->data.capacity,
strlen(field->data.initial));
for(size_t i=0; i<length; i++)
{
retval[i] = ascii_to_internal(field->data.initial[i]);
}
if( length < (size_t)field->data.capacity )
{
memset( retval+length,
internal_space,
(size_t)field->data.capacity - length);
}
retval[i] = ascii_to_internal(field->data.initial[i]);
}
if( length < (size_t)field->data.capacity )
{
memset( retval+length,
internal_space,
(size_t)field->data.capacity - length);
}
}
else
@ -16333,7 +16371,7 @@ parser_symbol_add(struct cbl_field_t *new_var )
fprintf(stderr," OCCURS:" HOST_SIZE_T_PRINT_DEC,
(fmt_size_t)new_var->occurs.ntimes());
}
cbl_field_t *parent = parent_of(new_var);
const cbl_field_t *parent = parent_of(new_var);
if( parent )
{
fprintf(stderr,
@ -16347,7 +16385,7 @@ parser_symbol_add(struct cbl_field_t *new_var )
size_t parent_index = new_var->parent;
if( parent_index )
{
symbol_elem_t *e = symbol_at(parent_index);
const symbol_elem_t *e = symbol_at(parent_index);
if( e->type == SymFile )
{
fprintf(stderr,
@ -16747,10 +16785,7 @@ parser_symbol_add(struct cbl_field_t *new_var )
if( *external_record_base )
{
char achDataName[256];
if( *external_record_base )
{
sprintf(achDataName, "__%s_vardata", external_record_base);
}
sprintf(achDataName, "__%s_vardata", external_record_base);
tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity);
new_var->data_decl_node = gg_define_variable(
array_type,

View File

@ -119,26 +119,26 @@ parser_divide(size_t nC, cbl_num_result_t *C,
void *compute_error = NULL); // This has to be cast to a tree pointer to int
void
parser_add( struct cbl_refer_t tgt,
struct cbl_refer_t a, struct cbl_refer_t b,
parser_add( const cbl_refer_t& tgt,
const cbl_refer_t& a, const cbl_refer_t& b,
enum cbl_round_t = truncation_e );
void
parser_subtract( struct cbl_refer_t tgt,
struct cbl_refer_t a, struct cbl_refer_t b,
parser_subtract( const cbl_refer_t& tgt,
const cbl_refer_t& a, const cbl_refer_t& b,
enum cbl_round_t = truncation_e );
void
parser_multiply( struct cbl_refer_t tgt,
struct cbl_refer_t a, struct cbl_refer_t b,
parser_multiply( const cbl_refer_t& tgt,
const cbl_refer_t& a, const cbl_refer_t& b,
enum cbl_round_t = truncation_e );
void
parser_divide( struct cbl_refer_t quotient,
struct cbl_refer_t divisor,
struct cbl_refer_t dividend,
parser_divide( const cbl_refer_t& quotient,
const cbl_refer_t& divisor,
const cbl_refer_t& dividend,
enum cbl_round_t = truncation_e,
struct cbl_refer_t remainder = cbl_refer_t());
const cbl_refer_t& remainder = cbl_refer_t());
// void
// parser_exponentiation( cbl_refer_t cref,
@ -225,7 +225,7 @@ parser_perform_conditional_end( struct cbl_perform_tgt_t *tgt );
* For an in-line loop body, tgt->from.type == LblLoop, and tgt->to is NULL.
*/
void
parser_perform( struct cbl_perform_tgt_t *tgt, struct cbl_refer_t N );
parser_perform( const cbl_perform_tgt_t *tgt, cbl_refer_t N );
/*
* A simple UNTIL loop uses 1 varys element. For VARY loops, the
@ -255,7 +255,7 @@ parser_end_program(const char *name=NULL);
void parser_sleep(cbl_refer_t seconds);
void parser_exit( cbl_refer_t refer, ec_type_t = ec_none_e );
void parser_exit( const cbl_refer_t& refer, ec_type_t = ec_none_e );
void parser_exit_section(void);
void parser_exit_paragraph(void);
void parser_exit_perform( struct cbl_perform_tgt_t *tgt, bool cycle );
@ -297,7 +297,7 @@ void
parser_symbol_add(struct cbl_field_t *field);
void
parser_initialize(struct cbl_refer_t refer, bool like_parser_symbol_add=false);
parser_initialize(const cbl_refer_t& refer, bool like_parser_symbol_add=false);
void
parser_initialize_programs(size_t nprog, struct cbl_refer_t *progs);
@ -315,7 +315,7 @@ void
parser_alter( cbl_perform_tgt_t *tgt );
void
parser_set_conditional88( struct cbl_refer_t tgt, bool which_way );
parser_set_conditional88( const cbl_refer_t& tgt, bool which_way );
void
parser_set_numeric(struct cbl_field_t *tgt, ssize_t value);
@ -406,14 +406,12 @@ void
parser_sort(cbl_refer_t table,
bool duplicates,
cbl_alphabet_t *alphabet,
size_t nkey,
cbl_key_t *keys );
const std::vector<cbl_key_t>& keys );
void
parser_file_sort( cbl_file_t *file,
bool duplicates,
cbl_alphabet_t *alphabet,
size_t nkey,
cbl_key_t *keys,
const std::vector<cbl_key_t>& keys,
size_t ninput,
cbl_file_t **inputs,
size_t noutput,
@ -423,8 +421,7 @@ parser_file_sort( cbl_file_t *file,
void
parser_file_merge( cbl_file_t *file,
cbl_alphabet_t *alphabet,
size_t nkey,
cbl_key_t *keys,
const std::vector<cbl_key_t>& keys,
size_t ninput,
cbl_file_t **inputs,
size_t noutput,
@ -492,12 +489,12 @@ void
parser_string_overflow_end( cbl_label_t *name );
void
parser_string( cbl_refer_t tgt,
cbl_refer_t pointer,
size_t nsource,
cbl_string_src_t *sources,
cbl_label_t *overflow,
cbl_label_t *not_overflow );
parser_string(const cbl_refer_t& tgt,
const cbl_refer_t& pointer,
size_t nsource,
cbl_string_src_t *sources,
cbl_label_t *overflow,
cbl_label_t *not_overflow );
void
parser_unstring( cbl_refer_t src,
@ -552,7 +549,7 @@ void parser_entry_activate( size_t iprog, const cbl_label_t *declarative );
void parser_entry( cbl_field_t *name,
size_t narg = 0, cbl_ffi_arg_t args[] = NULL);
bool is_ascending_key(cbl_refer_t key);
bool is_ascending_key(const cbl_refer_t& key);
void register_main_switch(const char *main_string);

View File

@ -95,8 +95,8 @@ arithmetic_operation(size_t nC, cbl_num_result_t *C,
size_t nA, cbl_refer_t *A,
size_t nB, cbl_refer_t *B,
cbl_arith_format_t format,
cbl_label_t *error,
cbl_label_t *not_error,
const cbl_label_t *error,
const cbl_label_t *not_error,
tree compute_error, // Pointer to int
const char *operation,
cbl_refer_t *remainder = NULL)
@ -137,7 +137,7 @@ arithmetic_operation(size_t nC, cbl_num_result_t *C,
// Allocate nC+1 in case this is a divide with a REMAINDER
cbl_refer_t *results = (cbl_refer_t *)xmalloc((nC+1) * sizeof( cbl_refer_t ));
std::vector<cbl_refer_t> results(nC + 1);
int ncount = 0;
if( nC+1 <= MIN_FIELD_BLOCK_SIZE )
@ -207,7 +207,7 @@ arithmetic_operation(size_t nC, cbl_num_result_t *C,
build_array_of_treeplets(1, nA, A);
build_array_of_treeplets(2, nB, B);
build_array_of_treeplets(3, ncount, results);
build_array_of_treeplets(3, ncount, results.data());
gg_call(VOID,
operation,
@ -253,9 +253,6 @@ arithmetic_operation(size_t nC, cbl_num_result_t *C,
{
SHOW_PARSE_END
}
// We need to release all of the refers we allocated:
free(results);
}
static void
@ -307,7 +304,7 @@ arithmetic_error_handler( cbl_label_t *error,
}
static bool
is_somebody_float(size_t nA, cbl_refer_t *A)
is_somebody_float(size_t nA, const cbl_refer_t *A)
{
bool retval = false;
for(size_t i=0; i<nA; i++)
@ -322,7 +319,7 @@ is_somebody_float(size_t nA, cbl_refer_t *A)
}
static bool
is_somebody_float(size_t nC, cbl_num_result_t *C)
is_somebody_float(size_t nC, const cbl_num_result_t *C)
{
bool retval = false;
for(size_t i=0; i<nC; i++)
@ -337,7 +334,7 @@ is_somebody_float(size_t nC, cbl_num_result_t *C)
}
static bool
all_results_binary(size_t nC, cbl_num_result_t *C)
all_results_binary(size_t nC, const cbl_num_result_t *C)
{
bool retval = true;
@ -581,10 +578,6 @@ fast_multiply(size_t nC, cbl_num_result_t *C,
{
// This is a MULTIPLY Format 2
get_binary_value(valB, NULL, B[0].field, refer_offset(B[0]));
}
if(nB)
{
gg_assign(valA, gg_multiply(valA, valB));
}
@ -993,9 +986,9 @@ parser_add( size_t nC, cbl_num_result_t *C,
}
void
parser_add( cbl_refer_t cref,
cbl_refer_t aref,
cbl_refer_t bref,
parser_add( const cbl_refer_t& cref,
const cbl_refer_t& aref,
const cbl_refer_t& bref,
cbl_round_t rounded)
{
// This is the simple and innocent C = A + B
@ -1215,9 +1208,9 @@ parser_divide( size_t nC, cbl_num_result_t *C, // C = A / B
}
void
parser_multiply(cbl_refer_t cref,
cbl_refer_t aref,
cbl_refer_t bref,
parser_multiply(const cbl_refer_t& cref,
const cbl_refer_t& aref,
const cbl_refer_t& bref,
cbl_round_t rounded )
{
cbl_num_result_t C[1];
@ -1238,11 +1231,11 @@ parser_multiply(cbl_refer_t cref,
}
void
parser_divide( cbl_refer_t cref,
cbl_refer_t aref,
cbl_refer_t bref,
parser_divide( const cbl_refer_t& cref,
const cbl_refer_t& aref,
const cbl_refer_t& bref,
cbl_round_t rounded,
cbl_refer_t remainder_ref )
const cbl_refer_t& remainder_ref )
{
cbl_num_result_t C[1];
C[0].rounded = rounded;
@ -1704,9 +1697,9 @@ parser_subtract(size_t nC, cbl_num_result_t *C, // C = B - A
}
void
parser_subtract(cbl_refer_t cref, // cref = aref - bref
cbl_refer_t aref,
cbl_refer_t bref,
parser_subtract(const cbl_refer_t& cref, // cref = aref - bref
const cbl_refer_t& aref,
const cbl_refer_t& bref,
cbl_round_t rounded )
{
cbl_num_result_t C[1];

View File

@ -515,7 +515,7 @@ get_depending_on_value_from_odo(tree retval, cbl_field_t *odo)
static
void
get_depending_on_value(tree retval, cbl_refer_t &refer)
get_depending_on_value(tree retval, const cbl_refer_t &refer)
{
/* This routine, called only when we know there is an OCCURS DEPENDING ON
clause, returns the current value of the DEPENDING ON variable. When
@ -550,7 +550,7 @@ get_data_offset(cbl_refer_t &refer,
int all_flags = 0;
int all_flag_bit = 1;
if( refer.nsubscript )
if( refer.nsubscript() )
{
REFER("subscript");
// We have at least one subscript:
@ -569,7 +569,7 @@ get_data_offset(cbl_refer_t &refer,
cbl_field_t *parent = refer.field;
// Note the backwards test, because refer->nsubscript is an unsigned value
for(size_t i=refer.nsubscript-1; i<refer.nsubscript; i-- )
for(size_t i=refer.nsubscript()-1; i<refer.nsubscript(); i-- )
{
// We need to search upward for an ancestor with occurs_max:
while(parent)
@ -698,6 +698,8 @@ get_data_offset(cbl_refer_t &refer,
return retval;
}
static tree tree_type_from_field(const cbl_field_t *field);
void
get_binary_value( tree value,
tree rdigits,
@ -1265,8 +1267,8 @@ get_binary_value( tree value,
}
}
tree
tree_type_from_field(cbl_field_t *field)
static tree
tree_type_from_field(const cbl_field_t *field)
{
gcc_assert(field);
return tree_type_from_size(field->data.capacity, field->attr & signable_e);
@ -1559,7 +1561,7 @@ tree_type_from_size(size_t bytes, int signable)
static
bool
refer_has_depends(cbl_refer_t &refer, refer_type_t refer_type)
refer_has_depends(const cbl_refer_t &refer, refer_type_t refer_type)
{
if( suppress_dest_depends )
{
@ -1577,7 +1579,7 @@ refer_has_depends(cbl_refer_t &refer, refer_type_t refer_type)
// Check if there there is an occurs with a depending_on in the hierarchy
bool proceed = false;
cbl_field_t *odo = symbol_find_odo(refer.field);
const cbl_field_t *odo = symbol_find_odo(refer.field);
cbl_field_t *depending_on;
if( odo && odo != refer.field )
{
@ -1603,7 +1605,7 @@ refer_has_depends(cbl_refer_t &refer, refer_type_t refer_type)
{
parent1 = p;
}
cbl_field_t *parent2 = depending_on;
const cbl_field_t *parent2 = depending_on;
while( (p = parent_of(parent2)) )
{
parent2 = p;
@ -1912,18 +1914,14 @@ char *
get_literal_string(cbl_field_t *field)
{
assert(field->type == FldLiteralA);
char *buffer = NULL;
size_t buffer_length = 0;
if( buffer_length < field->data.capacity+1 )
{
buffer_length = field->data.capacity+1;
buffer = (char *)xrealloc(buffer, buffer_length);
}
size_t buffer_length = field->data.capacity+1;
char *buffer = static_cast<char *>(xcalloc(1, buffer_length));
for(size_t i=0; i<field->data.capacity; i++)
{
buffer[i] = ascii_to_internal(field->data.initial[i]);
}
buffer[field->data.capacity] = '\0';
return buffer;
}
@ -1943,7 +1941,7 @@ refer_is_clean(cbl_refer_t &refer)
return !refer.all
&& !refer.addr_of
&& !refer.nsubscript
&& !refer.nsubscript()
&& !refer.refmod.from
&& !refer.refmod.len
&& !refer_has_depends(refer, refer_source)
@ -2141,4 +2139,4 @@ get_time_nanoseconds()
return retval;
#endif
return retval;
}
}

View File

@ -92,7 +92,7 @@ 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,

View File

@ -53,181 +53,162 @@
static inline bool
is_active( const cbl_refer_t& refer ) { return NULL != refer.field; }
template <typename DATA>
struct cbx_inspect_qual_t {
struct cbl_inspect_qual_t {
bool initial;
DATA identifier_4;
cbl_refer_t identifier_4;
cbx_inspect_qual_t() : initial(false), identifier_4(DATA()) {}
cbx_inspect_qual_t( bool initial, const DATA& identifier_4 )
cbl_inspect_qual_t() : initial(false), identifier_4(cbl_refer_t()) {}
cbl_inspect_qual_t( bool initial, const cbl_refer_t& identifier_4 )
: initial(initial), identifier_4(identifier_4)
{
//if( identifier_4.field ) yywarn("%s:qualifying field is '%s'", __func__, identifier_4.field->name);
}
cbx_inspect_qual_t( const cbx_inspect_qual_t& that )
{}
cbl_inspect_qual_t( const cbl_inspect_qual_t& that )
: initial(that.initial)
, identifier_4(that.identifier_4)
{
//if( identifier_4.field ) yywarn("%s:qualifying field is '%s'", __func__, identifier_4.field->name);
}
{}
cbx_inspect_qual_t& operator=( const cbx_inspect_qual_t& that ) {
cbl_inspect_qual_t& operator=( const cbl_inspect_qual_t& that ) {
initial = that.initial;
identifier_4 = that.identifier_4;
//if( identifier_4.field ) yywarn("%s:qualifying field is '%s'", __func__, identifier_4.field->name);
return *this;
}
bool active() const { return is_active(identifier_4); }
void clear() {
initial = false;
identifier_4.clear();
}
};
typedef cbx_inspect_qual_t<cbl_refer_t> cbl_inspect_qual_t;
/*
* Data for INSPECT X TALLYING Y FOR. Captures information for operands of
* CHARACTERS/ALL/LEADING. The CHARACTERS/ALL/LEADING control is kept at the
* next higher level, and may be repeated for each tally.
*
* cbx_inspect_match_t::matching is not used with CHARACTERS
* cbl_inspect_match_t::matching is not used with CHARACTERS
*/
template <typename DATA>
struct cbx_inspect_match_t {
DATA matching; // identifier-3/5 or literal-1/3
cbx_inspect_qual_t<DATA> before, after; // phrase 1
cbx_inspect_match_t(
const DATA& matching = DATA(),
const cbx_inspect_qual_t<DATA>& before = cbx_inspect_qual_t<DATA>(),
const cbx_inspect_qual_t<DATA>& after = cbx_inspect_qual_t<DATA>()
)
: matching(matching)
class cbl_inspect_match_t {
friend void dump_inspect_match( const cbl_inspect_match_t& M );
cbl_refer_t match; // identifier-3/5 or literal-1/3
cbl_refer_t tally; // collected too soon, belongs to next phrase
public:
cbl_inspect_qual_t before, after; // phrase 1
cbl_inspect_match_t() {}
explicit
cbl_inspect_match_t( const cbl_refer_t& matching,
const cbl_inspect_qual_t& before = cbl_inspect_qual_t(),
const cbl_inspect_qual_t& after = cbl_inspect_qual_t() )
: match(matching)
, before(before)
, after(after)
{}
// match all characters
bool match_any() const { return !(before.active() || after.active()); }
};
typedef cbx_inspect_match_t<cbl_refer_t> cbl_inspect_match_t;
void save_premature_tally( const cbl_refer_t& tally ) {
this->tally = tally; // put it here temporarily
}
cbl_refer_t premature_tally() {
if( !tally.field ) { std::swap(match, tally); }
return tally;
}
const cbl_refer_t& matching( const cbl_refer_t& match ) {
return this->match = match;
}
const cbl_refer_t& matching() const { return match; }
bool empty() const {
return !is_active(match) && !before.active() && !after.active();
}
};
/*
* Data for INSPECT X REPLACING. The CHARACTERS/ALL/LEADING/FIRST control is
* kept at the next higher level, and may be repeated.
*/
template <typename DATA>
struct cbx_inspect_replace_t : public cbx_inspect_match_t<DATA> {
DATA replacement;
struct cbl_inspect_replace_t : public cbl_inspect_match_t {
cbl_refer_t replacement;
cbx_inspect_replace_t( const DATA& matching = DATA(),
const DATA& replacement = DATA() )
: cbx_inspect_match_t<DATA>(matching)
, replacement(replacement)
{}
cbx_inspect_replace_t( const DATA& matching,
const DATA& replacement,
const cbx_inspect_qual_t<DATA>& before,
const cbx_inspect_qual_t<DATA>& after )
: cbx_inspect_match_t<DATA>(matching, before, after)
cbl_inspect_replace_t() {}
cbl_inspect_replace_t( const cbl_refer_t& matching,
const cbl_refer_t& replacement,
const cbl_inspect_qual_t& before,
const cbl_inspect_qual_t& after )
: cbl_inspect_match_t(matching, before, after)
, replacement(replacement)
{}
};
typedef cbx_inspect_replace_t<cbl_refer_t> cbl_inspect_replace_t;
// One partial tally or substitution.
template <typename DATA>
struct cbx_inspect_oper_t {
struct cbl_inspect_oper_t {
cbl_inspect_bound_t bound; // CHARACTERS/ALL/LEADING/FIRST
size_t n_identifier_3; // N matches/replaces
// either tallies or replaces is NULL
cbx_inspect_match_t<DATA> *matches;
cbx_inspect_replace_t<DATA> *replaces;
// either tallies or replaces is empty
std::vector<cbl_inspect_match_t> matches;
std::vector<cbl_inspect_replace_t> replaces;
cbx_inspect_oper_t( cbl_inspect_bound_t bound,
std::list<cbx_inspect_match_t<DATA>> matches )
cbl_inspect_oper_t() : bound(bound_characters_e) {}
explicit cbl_inspect_oper_t( const cbl_inspect_match_t& match,
cbl_inspect_bound_t bound = bound_characters_e )
: bound(bound)
, n_identifier_3( matches.size())
, matches(NULL)
, replaces(NULL)
{
this->matches = new cbx_inspect_match_t<DATA>[n_identifier_3];
std::copy( matches.begin(), matches.end(), this->matches );
}
cbx_inspect_oper_t( cbl_inspect_bound_t bound,
std::list<cbx_inspect_replace_t<DATA>> replaces )
{
matches.push_back(match);
}
explicit cbl_inspect_oper_t( const cbl_inspect_replace_t& replace,
cbl_inspect_bound_t bound = bound_characters_e )
: bound(bound)
, n_identifier_3( replaces.size() )
, matches(NULL)
, replaces(NULL)
{
this->replaces = new cbx_inspect_replace_t<DATA>[n_identifier_3];
std::copy( replaces.begin(), replaces.end(), this->replaces );
}
{
replaces.push_back(replace);
}
cbx_inspect_oper_t()
: bound(bound_characters_e)
, n_identifier_3(0)
, matches(NULL)
, replaces(NULL)
{
assert( is_valid() );
}
cbl_inspect_oper_t( cbl_inspect_bound_t bound,
const std::vector<cbl_inspect_match_t>& matches )
: bound(bound)
, matches(matches)
{}
bool is_valid() const {
if( matches && replaces ) return false;
if( matches || replaces ) return n_identifier_3 > 0;
return n_identifier_3 == 0;
cbl_inspect_oper_t( cbl_inspect_bound_t bound,
const std::vector<cbl_inspect_replace_t>& replaces )
: bound(bound)
, replaces(replaces)
{}
// N matches/replaces
size_t n_identifier_3() const {
return std::max( matches.size(), replaces.size() );
}
bool is_valid() const { // only one or the other, never both
bool invalid = !matches.empty() && !replaces.empty();
return ! invalid;
}
};
typedef cbx_inspect_oper_t<cbl_refer_t> cbl_inspect_oper_t;
// One whole tally or substitution. For REPLACING, nbound == 1
template <typename DATA>
struct cbx_inspect_t {
DATA tally; // identifier-2: NULL without a tally
size_t nbound; // FOR and REPLACING start with a cbl_inspect_bound_t
cbx_inspect_oper_t<DATA> *opers;
cbx_inspect_t( const DATA& tally = DATA() )
: tally(tally)
, nbound(0)
, opers(NULL)
// FOR and REPLACING start with a cbl_inspect_bound_t
struct cbl_inspect_t : public std::vector<cbl_inspect_oper_t> {
cbl_refer_t tally; // field is NULL for REPLACING
cbl_inspect_t() {}
cbl_inspect_t( size_t n, const cbl_inspect_oper_t& oper )
: std::vector<cbl_inspect_oper_t>(n, oper)
{}
cbl_inspect_t( const cbl_refer_t& tally,
const std::vector<cbl_inspect_oper_t>& opers )
: std::vector<cbl_inspect_oper_t>(opers)
, tally(tally)
{}
cbx_inspect_t( const DATA& tally, const cbx_inspect_oper_t<DATA>& oper )
: tally(tally)
, nbound(1)
, opers(NULL)
{
this->opers = new cbx_inspect_oper_t<DATA>[1];
this->opers[0] = oper;
}
cbx_inspect_t( const DATA& tally,
const std::list<cbx_inspect_oper_t<DATA>>& opers )
: tally(tally)
, nbound( opers.size() )
, opers(NULL)
{
this->opers = new cbx_inspect_oper_t<DATA>[nbound];
std::copy( opers.begin(), opers.end(), this->opers );
}
size_t nbound() const { return size(); }
};
typedef cbx_inspect_t<cbl_refer_t> cbl_inspect_t;
typedef std::vector<cbl_inspect_t> cbl_inspect_opers_t;
/*
* Runtime
*/
void parser_inspect( cbl_refer_t input, bool backward,
size_t ninspect, cbl_inspect_t *inspects );
void parser_inspect( const cbl_refer_t& input,
bool backward,
cbl_inspect_opers_t& inspects );
void parser_inspect_conv( cbl_refer_t input, bool backward,
cbl_refer_t original,
cbl_refer_t replacement,

View File

@ -123,7 +123,7 @@ continues_at( char *bol, char *eol ) {
// Return pointer to indicator column. Test ch if provided.
// NULL means no indicator column or tested value not present.
static inline char *
indicated( char *bol, char *eol, char ch = '\0' ) {
indicated( char *bol, const char *eol, char ch = '\0' ) {
if( indicator.column == 0 && *bol != '*' ) {
return NULL; // no indicator column in free format, except for comments
}
@ -140,10 +140,10 @@ indicated( char *bol, char *eol, char ch = '\0' ) {
static char *
remove_inline_comment( char *bol, char *eol ) {
static char ends = '\0';
char *nl = std::find(bol, eol, '\n');
if( bol < nl ) {
static char ends = '\0';
std::swap(*nl, ends);
char *comment = strstr(bol, "*>");
if( comment ) {
@ -208,10 +208,10 @@ maybe_add_space(const span_t& pattern, replace_t& recognized) {
}
if( befter[0] == blank || befter[1] == blank ) {
char *s = xasprintf( "%s%.*s%s",
befter[0],
recognized.after.size(), recognized.after.p,
befter[1] );
const char *s = xasprintf( "%s%.*s%s",
befter[0],
recognized.after.size(), recognized.after.p,
befter[1] );
recognized.after = span_t(s, s + strlen(s));
}
}
@ -266,7 +266,9 @@ recognize_replacements( filespan_t mfile, std::list<replace_t>& pending_replacem
span_t found(mfile.eodata, mfile.eodata);
if( regex_search( mfile.ccur(), (const char *)mfile.eodata, cm, re) ) {
if( regex_search( mfile.ccur(),
const_cast<const char *>(mfile.eodata),
cm, re) ) {
gcc_assert(cm[1].matched);
found = span_t( cm[1].first, cm[1].second );
if( yy_flex_debug ) {
@ -301,7 +303,8 @@ recognize_replacements( filespan_t mfile, std::list<replace_t>& pending_replacem
bol = next.found.pend;
if( yy_flex_debug ) {
size_t n = std::count((const char *)mfile.data, recognized.before.p, '\n');
size_t n = std::count(const_cast<const char *>(mfile.data),
recognized.before.p, '\n');
dbgmsg( "%s:%d: line " HOST_SIZE_T_PRINT_UNSIGNED
" @ " HOST_SIZE_T_PRINT_UNSIGNED ": '%s'\n/%.*s/%.*s/",
__func__, __LINE__,
@ -317,10 +320,11 @@ recognize_replacements( filespan_t mfile, std::list<replace_t>& pending_replacem
next.found = span_t(mfile.eodata, mfile.eodata);
regex re(next.directive.before.p, extended_icase);
if( regex_search(bol, (const char *)mfile.eodata, cm, re) ) {
if( regex_search(bol, const_cast<const char *>(mfile.eodata), cm, re) ) {
gcc_assert(cm[1].matched);
next.found = span_t( cm[1].first, cm[1].second );
size_t n = std::count((const char *)mfile.data, next.found.p, '\n');
size_t n = std::count(const_cast<const char *>(mfile.data),
next.found.p, '\n');
if( false )
dbgmsg("%s:%d next '%.*s' will be on line " HOST_SIZE_T_PRINT_UNSIGNED
" (offset " HOST_SIZE_T_PRINT_UNSIGNED ")", __func__, __LINE__,
@ -345,7 +349,7 @@ check_source_format_directive( filespan_t& mfile ) {
// show contents of marked subexpressions within each match
cmatch cm;
if( regex_search(p, (const char *)mfile.eol, cm, re) ) {
if( regex_search(p, const_cast<const char *>(mfile.eol), cm, re) ) {
gcc_assert(cm.size() > 1);
switch( cm[3].length() ) {
case 4:
@ -459,9 +463,9 @@ struct replacing_term_t {
bool matched, done;
span_t leading_trailing, term, stmt;
replacing_term_t(const char input[]) : matched(false), done(false) {
stmt = span_t(input, input);
}
explicit replacing_term_t(const char input[])
: matched(false), done(false), stmt(span_t(input, input))
{}
};
extern YYLTYPE yylloc;
@ -809,7 +813,7 @@ parse_replace_pairs( const char *stmt, const char *estmt, bool is_copy_stmt ) {
}
span_t& before(parsed.replace.before);
span_t& after(parsed.replace.after);
const span_t& after(parsed.replace.after);
const char *befter[2] = { nonword_ch, nonword_ch };
gcc_assert(before.p < before.pend);
@ -877,7 +881,7 @@ struct copy_descr_t {
};
static YYLTYPE
location_in( const filespan_t& mfile, const csub_match cm ) {
location_in( const filespan_t& mfile, const csub_match& cm ) {
YYLTYPE loc {
int(mfile.lineno() + 1), int(mfile.colno() + 1),
int(mfile.lineno() + 1), int(mfile.colno() + 1)
@ -928,7 +932,7 @@ parse_copy_directive( filespan_t& mfile ) {
copy_stmt.p = mfile.eodata;
if( regex_search(mfile.ccur(),
(const char *)mfile.eodata, cm, re) ) {
const_cast<const char *>(mfile.eodata), cm, re) ) {
copy_stmt = span_t( cm[0].first, cm[0].second );
if( yy_flex_debug ) {
size_t nnl = 1 + count_newlines(mfile.data, copy_stmt.p);
@ -981,7 +985,7 @@ parse_copy_directive( filespan_t& mfile ) {
std::pair<std::list<replace_t>, char*>
result = parse_replace_pairs( cm[0].second, mfile.eodata, true );
std::list<replace_t>& replacements(result.first);
const std::list<replace_t>& replacements(result.first);
outcome.parsed = (outcome.nreplace = replacements.size()) > 0;
if( outcome.parsed ) {
replace_directives.push(replacements);
@ -1008,7 +1012,7 @@ parse_copy_directive( filespan_t& mfile ) {
}
static char *
parse_replace_last_off( filespan_t& mfile ) {
parse_replace_last_off( const filespan_t& mfile ) {
static const char pattern[] =
"REPLACE" "[[:space:]]+"
"(LAST[[:space:]]+)?OFF[[:space:]]*[.]"
@ -1018,7 +1022,7 @@ parse_replace_last_off( filespan_t& mfile ) {
// REPLACE [LAST] OFF?
bool found = regex_search(mfile.ccur(),
(const char *)mfile.eodata, cm, re);
const_cast<const char *>(mfile.eodata), cm, re);
gcc_assert(found); // caller ensures
gcc_assert(cm.size() == 2);
@ -1073,7 +1077,7 @@ parse_replace_text( filespan_t& mfile ) {
(fmt_size_t)current_lineno, len, mfile.cur);
}
if( ! regex_search(mfile.ccur(), (const char *)mfile.eodata, cm, re) ) {
if( ! regex_search(mfile.ccur(), mfile.eodata, cm, re) ) {
dbgmsg( "%s:%d: line " HOST_SIZE_T_PRINT_UNSIGNED
": not a REPLACE statement:\n'%.*s'",
__func__, __LINE__, (fmt_size_t)current_lineno,
@ -1109,7 +1113,7 @@ parse_replace_text( filespan_t& mfile ) {
std::pair<std::list<replace_t>, char*>
result = parse_replace_pairs(replace_stmt.p, replace_stmt.pend, false);
std::list<replace_t>& replacements(result.first);
const std::list<replace_t>& replacements(result.first);
replace_directives.push( replacements );
if( yy_flex_debug ) {
@ -1147,7 +1151,7 @@ parse_replace_directive( filespan_t& mfile ) {
next_directive = mfile.eodata;
if( regex_search(mfile.ccur(),
(const char *)mfile.eodata, cm, re) ) {
const_cast<const char *>(mfile.eodata), cm, re) ) {
gcc_assert(cm[1].matched);
next_directive = cm[0].first;
@ -1491,7 +1495,7 @@ cdftext::lex_open( const char filename[] ) {
argv[0] = filter;
auto last_argv = std::transform( options.begin(), options.end(), argv.begin() + 1,
[]( std::string& opt ) {
[]( const std::string& opt ) {
return xstrdup(opt.c_str());
} );
*last_argv = NULL;
@ -1556,9 +1560,9 @@ cdftext::open_input( const char filename[] ) {
int
cdftext::open_output() {
char *name = getenv("GCOBOL_TEMPDIR");
int fd;
if( name && 0 != strcmp(name, "/") ) {
int fd;
char * stem = xasprintf("%sXXXXXX", name);
if( -1 == (fd = mkstemp(stem)) ) {
cbl_err( "could not open temporary file '%s' (%s)",
@ -1685,7 +1689,7 @@ cdftext::free_form_reference_format( int input ) {
size_t lineno;
bytespan_t line;
// construct with length zero
current_line_t( char data[] ) : lineno(0), line(data, data) {}
explicit current_line_t( char data[] ) : lineno(0), line(data, data) {}
} current( mfile.data );
/*
@ -1825,7 +1829,6 @@ cdftext::free_form_reference_format( int input ) {
void
cdftext::process_file( filespan_t mfile, int output, bool second_pass ) {
static size_t nfiles = 0;
std::list<replace_t> replacements;
__gnu_cxx::stdio_filebuf<char> outbuf(fdopen(output, "w"), std::ios::out);
std::ostream out(&outbuf);
@ -1890,34 +1893,12 @@ cdftext::process_file( filespan_t mfile, int output, bool second_pass ) {
continue; // No active REPLACE directive.
}
std::list<span_t> segments = segment_line(mfile); // no replace yields
// // 1 segment
// 1 segment for COPY, 2 for REPLACE
std::list<span_t> segments = segment_line(mfile);
for( const auto& segment : segments ) {
std::copy(segment.p, segment.pend, ofs);
}
if( segments.size() == 2 ) {
struct {
size_t before, after;
int delta() const { return before - after; } } nlines;
nlines.before = std::count(segments.front().p,
segments.front().pend, '\n');
nlines.after = std::count(segments.back().p, segments.back().pend, '\n');
if( nlines.delta() < 0 ) {
yywarn("line %lu: REPLACED %lu lines with %lu lines, "
"line count off by %d",
gb4(mfile.lineno()),
gb4(nlines.before),
gb4(nlines.after),
nlines.delta());
}
int nnl = nlines.delta();
while( nnl-- > 0 ) {
static const char nl[] = "\n";
std::copy(nl, nl + 1, ofs);
}
}
out.flush();
}
// end of file

View File

@ -69,7 +69,9 @@ erase_source( char *src, char *esrc ) {
struct bytespan_t {
char *data, *eodata;
bytespan_t( char *data = NULL, char *eodata = NULL )
bytespan_t() : data( nullptr), eodata(nullptr) {}
bytespan_t( char *data, char *eodata )
: data(data), eodata(eodata)
{
if( eodata < data ) {
@ -124,7 +126,7 @@ struct filespan_t : public bytespan_t {
{}
filespan_t(void *p, size_t len)
: bytespan_t( static_cast<char*>(p), static_cast<char*>(p) + len )
, cur(data), eol(data), quote(NULL), iline(0), line_quote72(0)
, cur(data), eol(data), quote(NULL), iline(0), icol(0), line_quote72(0)
{}
size_t lineno() const { return iline; }
@ -224,6 +226,7 @@ struct span_t {
span_t( const char *data, const char *eodata ) : p(data), pend(eodata) {
verify();
}
// cppcheck-suppress operatorEqRetRefThis
span_t& operator=( const csub_match& cm ) {
p = cm.first;
pend = cm.second;
@ -246,8 +249,8 @@ struct span_t {
struct replace_t {
struct span_t before, after;
replace_t( span_t before = span_t(),
span_t after = span_t() )
replace_t() : before(span_t()), after(span_t()) {}
replace_t( span_t before, span_t after )
: before(before), after(after)
{}
replace_t& reset() {

File diff suppressed because it is too large Load Diff

View File

@ -244,9 +244,9 @@ new_reference_like( const cbl_field_t& skel ) {
return new cbl_refer_t( new_temporary_like(skel) );
}
static void reject_refmod( YYLTYPE loc, cbl_refer_t );
static bool require_pointer( YYLTYPE loc, cbl_refer_t );
static bool require_integer( YYLTYPE loc, cbl_refer_t );
static void reject_refmod( YYLTYPE loc, const cbl_refer_t& );
static bool require_pointer( YYLTYPE loc, const cbl_refer_t& );
static bool require_integer( YYLTYPE loc, const cbl_refer_t& );
struct cbl_field_t * constant_of( size_t isym );
@ -289,7 +289,7 @@ struct evaluate_elem_t {
relop_t oper;
public:
cbl_field_t *subject, *object, *cond;
case_t( cbl_field_t * subject )
explicit case_t( cbl_field_t * subject )
: oper(eq_op)
, subject(subject)
, object(NULL)
@ -328,11 +328,10 @@ struct evaluate_elem_t {
explicit evaluate_elem_t( const char skel[] )
: nother(0)
, label{LblEvaluate}
, result( keep_temporary(FldConditional) )
, pcase( cases.end() )
{
static const cbl_label_t protolabel = { LblEvaluate };
label = protolabel;
label.line = yylineno;
if( -1 == snprintf(label.name, sizeof(label.name),
"%.*s_%d", (int)sizeof(label.name)-6, skel, yylineno) ) {
@ -367,13 +366,14 @@ struct evaluate_elem_t {
static class file_delete_args_t {
cbl_file_t *file;
public:
file_delete_args_t() : file(nullptr) {}
void init( cbl_file_t *file ) {
this->file = file;
}
bool ready() const { return file != NULL; }
bool ready() const { return file != nullptr; }
void call_parser_file_delete( bool sequentially ) {
parser_file_delete(file, sequentially);
file = NULL;
file = nullptr;
}
} file_delete_args;
@ -389,7 +389,7 @@ static struct file_read_args_t {
void
init( struct cbl_file_t *file,
cbl_refer_t record,
const cbl_refer_t& record,
cbl_refer_t *read_into,
int where ) {
this->file = file;
@ -438,7 +438,7 @@ public:
this->file = file;
}
bool ready() const { return file != NULL; }
void call_parser_return_start(cbl_refer_t into = cbl_refer_t() ) {
void call_parser_return_start(const cbl_refer_t& into = cbl_refer_t() ) {
parser_return_start(file, into);
file = NULL;
}
@ -448,17 +448,18 @@ static class file_rewrite_args_t {
cbl_file_t *file;
cbl_field_t *record;
public:
file_rewrite_args_t() : file(nullptr), record(nullptr) {}
void init( cbl_file_t *file, cbl_field_t *record ) {
this->file = file;
this->record = record;
}
bool ready() const { return file != NULL; }
bool ready() const { return file != nullptr; }
void call_parser_file_rewrite( bool sequentially ) {
sequentially = sequentially || file->access == file_access_seq_e;
if( file->access == file_access_rnd_e ) sequentially = false;
parser_file_rewrite(file, record, sequentially);
file = NULL;
record = NULL;
file = nullptr;
record = nullptr;
}
} file_rewrite_args;
@ -487,21 +488,22 @@ static class file_write_args_t {
cbl_refer_t *advance;
public:
file_write_args_t()
: file(NULL)
: file(nullptr)
, data_source(nullptr)
, after(false)
, advance(NULL)
, advance(nullptr)
{}
cbl_file_t * init( cbl_file_t *file,
cbl_field_t *data_source,
bool after,
cbl_refer_t *advance ) {
const cbl_refer_t *advance ) {
this->file = file;
this->data_source = data_source;
this->after = after;
this->advance = new cbl_refer_t(*advance);
return this->file;
}
bool ready() const { return file != NULL; }
bool ready() const { return file != nullptr; }
void call_parser_file_write( bool sequentially ) {
sequentially = sequentially || file->access == file_access_seq_e;
parser_file_write(file, data_source, after, *advance, sequentially);
@ -535,7 +537,7 @@ struct arith_t {
cbl_refer_t remainder;
cbl_label_t *on_error, *not_error;
arith_t( cbl_arith_format_t format )
explicit arith_t( cbl_arith_format_t format )
: format(format), on_error(NULL), not_error(NULL)
{}
arith_t( cbl_arith_format_t format, refer_list_t * refers );
@ -619,7 +621,7 @@ class eval_subject_t {
void new_object_labels();
public:
eval_subject_t();
void append( cbl_refer_t field ) {
void append( const cbl_refer_t& field ) {
columns.push_back(field);
pcol = columns.begin();
}
@ -750,6 +752,7 @@ public:
static void dump_inspect( const cbl_inspect_t& i );
void dump_inspect_match( const cbl_inspect_match_t& M );
struct perform_t {
struct cbl_perform_tgt_t tgt;
@ -789,11 +792,10 @@ struct perform_t {
cbl_refer_t table;
} search;
perform_t( cbl_label_t *from, cbl_label_t *to = NULL )
explicit perform_t( cbl_label_t *from, cbl_label_t *to = NULL )
: tgt( from, to ), before(true)
{
search = {};
}
, search()
{}
~perform_t() { varys.clear(); }
cbl_field_t * until() {
assert(!varys.empty());
@ -892,7 +894,7 @@ static struct cbl_label_t *
paragraph_reference( const char name[], size_t section );
static inline void
list_add( list<cbl_num_result_t>& list, cbl_refer_t refer, int round ) {
list_add( list<cbl_num_result_t>& list, const cbl_refer_t& refer, int round ) {
struct cbl_num_result_t arg = { static_cast<cbl_round_t>(round), refer };
list.push_back(arg);
}
@ -1027,7 +1029,7 @@ class tokenset_t {
const char * name_of( int tok ) const {
tok -= (255 + 3);
gcc_assert(0 <= tok && size_t(tok) < token_names.size());
return token_names[tok];
return tok < 0? "???" : token_names[tok];
}
};
@ -1094,7 +1096,7 @@ redefined_token( const cbl_name_t name ) {
struct file_list_t {
list<cbl_file_t*> files;
file_list_t() {}
file_list_t( cbl_file_t* file ) {
explicit file_list_t( cbl_file_t* file ) {
files.push_back(file);
}
file_list_t( file_list_t& that ) : files(that.files.size()) {
@ -1108,10 +1110,15 @@ struct file_list_t {
struct field_list_t {
list<cbl_field_t*> fields;
field_list_t( cbl_field_t *field ) {
field_list_t() {}
explicit field_list_t( cbl_field_t *field ) {
fields.push_back(field);
}
explicit field_list_t() {}
std::vector<const cbl_field_t*>
as_vector() const {
std::vector<const cbl_field_t*> output( fields.begin(), fields.end() );
return output;
}
};
cbl_field_t **
@ -1138,7 +1145,7 @@ cbl_file_t **
struct refer_list_t {
list<cbl_refer_t> refers;
refer_list_t( cbl_refer_t *refer ) {
explicit refer_list_t( cbl_refer_t *refer ) {
if( refer ) {
refers.push_back(*refer);
delete refer;
@ -1160,13 +1167,20 @@ struct refer_list_t {
refers.clear();
return tgt;
}
std::vector<cbl_refer_t>
vectorize() {
std::vector<cbl_refer_t> tgt(refers.size());
std::copy(refers.begin(), refers.end(), tgt.begin());
refers.clear();
return tgt;
}
};
struct refer_marked_list_t : public refer_list_t {
cbl_refer_t *marker;
refer_marked_list_t() : refer_list_t(NULL), marker(NULL) {}
refer_marked_list_t( cbl_refer_t *marker, refer_list_t *refers )
refer_marked_list_t( cbl_refer_t *marker, const refer_list_t *refers )
: refer_list_t(*refers), marker(marker) {}
refer_marked_list_t( cbl_refer_t *marker, cbl_refer_t *input )
: refer_list_t(input)
@ -1186,7 +1200,7 @@ struct refer_marked_list_t : public refer_list_t {
struct refer_collection_t {
list<refer_marked_list_t> lists;
refer_collection_t( const refer_marked_list_t& marked_list )
explicit refer_collection_t( const refer_marked_list_t& marked_list )
{
lists.push_back( marked_list );
}
@ -1212,48 +1226,13 @@ struct refer_collection_t {
}
};
struct ast_inspect_oper_t {
cbl_inspect_bound_t bound; // CHARACTERS/ALL/LEADING/FIRST
std::list<cbl_inspect_match_t> matches;
std::list<cbl_inspect_replace_t> replaces;
ast_inspect_oper_t( const cbl_inspect_match_t& match,
cbl_inspect_bound_t bound = bound_characters_e )
: bound(bound)
{
matches.push_back(match);
}
ast_inspect_oper_t( const cbl_inspect_replace_t& replace,
cbl_inspect_bound_t bound = bound_characters_e )
: bound(bound)
{
replaces.push_back(replace);
}
};
struct ast_inspect_t : public std::list<cbl_inspect_oper_t> {
cbl_refer_t tally; // field is NULL for REPLACING
const std::list<cbl_inspect_oper_t>& opers() const { return *this; }
};
struct ast_inspect_list_t : public std::list<cbl_inspect_t> {
ast_inspect_list_t( const cbl_inspect_t& insp ) {
push_back(insp);
}
cbl_inspect_t * as_array() {
cbl_inspect_t *output = new cbl_inspect_t[ size() ];
std::copy( begin(), end(), output );
return output;
}
};
void ast_inspect( cbl_refer_t& input, bool backward, ast_inspect_list_t& inspects );
void ast_inspect( YYLTYPE loc, cbl_refer_t& input, bool backward,
cbl_inspect_opers_t& inspects );
template <typename E>
struct elem_list_t {
list<E*> elems;
elem_list_t( E *elem ) {
explicit elem_list_t( E *elem ) {
elems.push_back(elem);
}
void clear() {
@ -1278,7 +1257,7 @@ template <typename L, typename E>
struct unstring_tgt_t {
cbl_refer_t *tgt, *delimiter, *count;
unstring_tgt_t( cbl_refer_t *tgt,
explicit unstring_tgt_t( cbl_refer_t *tgt,
cbl_refer_t *delimiter = NULL,
cbl_refer_t *count = NULL )
: tgt(tgt), delimiter(delimiter), count(count)
@ -1302,7 +1281,7 @@ private:
struct unstring_tgt_list_t {
list<unstring_tgt_t> unstring_tgts;
unstring_tgt_list_t( unstring_tgt_t *unstring_tgt ) {
explicit unstring_tgt_list_t( unstring_tgt_t *unstring_tgt ) {
unstring_tgts.push_back(*unstring_tgt);
delete unstring_tgt;
}
@ -1324,7 +1303,7 @@ struct unstring_tgt_list_t {
struct unstring_into_t : public unstring_tgt_list_t {
cbl_refer_t pointer, tally;
unstring_into_t( unstring_tgt_list_t *tgt_list,
explicit unstring_into_t( unstring_tgt_list_t *tgt_list,
cbl_refer_t *pointer = NULL,
cbl_refer_t *tally = NULL )
: unstring_tgt_list_t(*tgt_list)
@ -1340,7 +1319,7 @@ struct unstring_into_t : public unstring_tgt_list_t {
struct ffi_args_t {
list<cbl_ffi_arg_t> elems;
ffi_args_t( cbl_ffi_arg_t *arg ) {
explicit ffi_args_t( cbl_ffi_arg_t *arg ) {
this->push_back(arg);
}
@ -1416,8 +1395,8 @@ struct file_sort_io_t {
file_list_t file_list;
cbl_perform_tgt_t tgt;
file_sort_io_t( file_list_t& files ) : file_list(files) {}
file_sort_io_t( cbl_perform_tgt_t& tgt ) : tgt(tgt.from(), tgt.to()) {}
explicit file_sort_io_t( file_list_t& files ) : file_list(files) {}
explicit file_sort_io_t( cbl_perform_tgt_t& tgt ) : tgt(tgt.from(), tgt.to()) {}
size_t nfile() const { return file_list.files.size(); }
};
@ -1432,14 +1411,14 @@ struct merge_t {
cbl_perform_tgt_t tgt;
list<cbl_file_t*> outputs;
merge_t( cbl_file_t *input ) : master(input), type(output_unknown_e) {}
explicit merge_t( cbl_file_t *input ) : master(input), type(output_unknown_e) {}
};
static list<merge_t> merges;
static inline merge_t&
merge_alloc( cbl_file_t *file ) {
merges.push_back(file);
merges.push_back(merge_t(file));
return merges.back();
}
@ -1460,7 +1439,7 @@ static list<cbl_refer_t> lhs;
struct vargs_t {
std::list<cbl_refer_t> args;
vargs_t() {}
vargs_t( struct cbl_refer_t *p ) { args.push_back(*p); delete p; }
explicit vargs_t( struct cbl_refer_t *p ) { args.push_back(*p); delete p; }
void push_back( cbl_refer_t *p ) { args.push_back(*p); delete p; }
};
@ -1484,7 +1463,8 @@ class prog_descr_t {
const char *collating_sequence;
struct locale_t {
cbl_name_t name; const char *os_name;
locale_t(const cbl_name_t name = NULL, const char *os_name = NULL)
locale_t() : name(""), os_name(nullptr) {}
locale_t(const cbl_name_t name, const char *os_name)
: name(""), os_name(os_name) {
if( name ) {
bool ok = namcpy(YYLTYPE(), this->name, name);
@ -1495,7 +1475,7 @@ class prog_descr_t {
cbl_call_convention_t call_convention;
cbl_options_t options;
prog_descr_t( size_t isymbol )
explicit prog_descr_t( size_t isymbol )
: program_index(isymbol)
, declaratives_eval(NULL)
, paragraph(NULL)
@ -1607,9 +1587,9 @@ class program_stack_t : protected std::stack<prog_descr_t> {
bool pending_initial() { return pending.initial = true; }
void push( prog_descr_t descr ) {
cbl_call_convention_t current_call_convention = cbl_call_cobol_e;
if( !empty() ) current_call_convention = top().call_convention;
descr.call_convention = current_call_convention;
cbl_call_convention_t call_convention = cbl_call_cobol_e;
if( !empty() ) call_convention = top().call_convention;
descr.call_convention = call_convention;
std::stack<prog_descr_t>& me(*this);
me.push(descr);
}
@ -1645,11 +1625,12 @@ class program_stack_t : protected std::stack<prog_descr_t> {
}
}
// cppcheck-suppress-begin useStlAlgorithm
cbl_label_t *first_declarative() {
auto eval = top().declaratives_eval;
if( eval ) return eval;
// scan stack container for declaratives
for( auto& prog : c ) {
for( const auto& prog : c ) {
if( prog.declaratives_eval ) {
eval = prog.declaratives_eval;
break;
@ -1657,6 +1638,7 @@ class program_stack_t : protected std::stack<prog_descr_t> {
}
return eval;
}
// cppcheck-suppress-end useStlAlgorithm
};
struct rel_part_t {
@ -1664,9 +1646,13 @@ struct rel_part_t {
bool has_relop, invert;
relop_t relop;
rel_part_t( cbl_refer_t *operand = NULL,
relop_t relop = relop_t(-1),
bool invert = false )
rel_part_t()
: operand(nullptr),
has_relop(false),
invert(false),
relop(relop_t(-1))
{}
rel_part_t( cbl_refer_t *operand, relop_t relop, bool invert )
: operand(operand),
has_relop(relop != -1),
invert(invert),
@ -1700,7 +1686,7 @@ struct rel_part_t {
class log_expr_t {
cbl_field_t *orable, *andable;
public:
log_expr_t( cbl_field_t *init ) : orable(NULL), andable(init) {
explicit log_expr_t( cbl_field_t *init ) : orable(NULL), andable(init) {
if( ! is_conditional(init) ) {
dbgmsg("%s:%d: logic error: %s is not a truth value",
__func__, __LINE__, name_of(init));
@ -1859,6 +1845,10 @@ static class current_t {
class declaratives_t : protected declaratives_list_t {
struct file_exception_t {
ec_type_t type; uint32_t file;
file_exception_t() : type(ec_none_e), file(0) {}
file_exception_t(ec_type_t type, uint32_t file)
: type(type), file(file)
{}
bool operator<( const file_exception_t& that ) const {
if( type == that.type ) return file < that.file;
return type < that.type;
@ -1866,9 +1856,11 @@ static class current_t {
};
std::set<file_exception_t> file_exceptions;
public:
declaratives_t() {}
// current compiled data for enabled ECs and Declaratives, used by library.
struct runtime_t {
tree ena, dcl;
runtime_t() : ena(nullptr), dcl(nullptr) {}
} runtime;
bool empty() const {
@ -1888,7 +1880,7 @@ static class current_t {
}
for( auto f = declarative.files;
f && f < declarative.files + declarative.nfile; f++ ) {
file_exception_t ex = { declarative.type, *f };
file_exception_t ex( declarative.type, *f );
auto result = file_exceptions.insert(ex);
if( ! result.second ) {
yyerror("%s defined twice for %s",
@ -1901,6 +1893,7 @@ static class current_t {
return true;
}
// cppcheck-suppress-begin useStlAlgorithm
uint32_t status() const {
uint32_t status_word = 0;
for( auto dcl : *this ) {
@ -1908,6 +1901,7 @@ static class current_t {
}
return status_word;
}
// cppcheck-suppress-end useStlAlgorithm
bool has_format_1() const {
return std::any_of( begin(), end(),
@ -1947,7 +1941,6 @@ static class current_t {
const cbl_field_t * has_typedef( const cbl_field_t *field ) {
auto found = typedefs.find(field);
return found == typedefs.end()? NULL : *found;
return found == typedefs.end()? NULL : *found;
}
void udf_add( size_t isym ) {
@ -2003,12 +1996,12 @@ static class current_t {
std::list<std::string>& debugging_declaratives(bool all) const {
const char *para = programs.top().paragraph->name;
auto declaratives = debugging_clients.find(all? ":all:" : para);
if( declaratives == debugging_clients.end() ) {
auto client = debugging_clients.find(all? ":all:" : para);
if( client == debugging_clients.end() ) {
static std::list<std::string> empty;
return empty;
}
return declaratives->second;
return client->second;
}
bool
@ -2079,7 +2072,7 @@ static class current_t {
const cbl_label_t *L;
if( (L = symbol_program_add(parent, &label)) == NULL ) return false;
programs.push( symbol_index(symbol_elem_of(L)));
programs.push( prog_descr_t(symbol_index(symbol_elem_of(L))) );
programs.apply_pending();
bool fOK = symbol_at(programs.top().program_index) + 1 == symbols_end();
@ -2147,7 +2140,7 @@ static class current_t {
assert(!programs.empty());
procref_t *ref = ambiguous_reference(program_index());
const procref_t *ref = ambiguous_reference(program_index());
std::set<std::string> externals = programs.top().external_targets();
/*
@ -2371,11 +2364,12 @@ void current_enabled_ecs( tree ena ) {
static void
add_debugging_declarative( const cbl_label_t * label ) {
// cppcheck-suppress [unreadVariable] obviously not true
const char *section = current.declarative_section_name();
if( section ) {
debugging_clients[label->name].push_back(section);
}
};
}
cbl_options_t current_options() {
return current.options_paragraph;
@ -2611,7 +2605,7 @@ intrinsic_call_1( cbl_field_t *output, int token,
}
static bool
intrinsic_call_2( cbl_field_t *tgt, int token, cbl_refer_t *r1, cbl_refer_t *r2 ) {
intrinsic_call_2( cbl_field_t *tgt, int token, const cbl_refer_t *r1, cbl_refer_t *r2 ) {
std::vector<cbl_refer_t> args { *r1, r2? *r2 : cbl_refer_t() };
size_t n = intrinsic_invalid_parameter(token, args);
if( n < args.size() ) {
@ -2689,18 +2683,14 @@ table_primary_index( cbl_field_t *table ) {
NULL : cbl_field_of(symbol_at(table->occurs.indexes.fields[0]));
}
static inline const cbl_refer_t // & // Removed the '&' to stop a weird compiler error
static inline const cbl_refer_t // return copy, not element reference
invalid_key( const cbl_refer_t& ref ) {
assert(ref.field);
if( ref.nsubscript == 0 ) return ref;
for( size_t i=0; i < ref.nsubscript; i++ ) {
if( ref.subscripts[i].field->parent != ref.field->parent ) {
return ref.subscripts[i];
}
}
return NULL;
auto p = std::find_if( ref.subscripts.begin(), ref.subscripts.end(),
[parent = ref.field->parent]( const auto &sub ) {
return sub.field->parent == parent;
} );
return p != ref.subscripts.end() ? *p : nullptr;
}
static inline symbol_elem_t *
@ -3186,14 +3176,14 @@ cmd_or_env_special_of( std::string name ) {
}
static inline void
parser_add2( struct cbl_num_result_t& to,
struct cbl_refer_t from ) {
parser_add2( const cbl_num_result_t& to,
const cbl_refer_t& from ) {
parser_add(to.refer, to.refer, from, to.rounded);
}
static inline void
parser_subtract2( struct cbl_num_result_t to,
struct cbl_refer_t from ) {
parser_subtract2( const cbl_num_result_t& to,
const cbl_refer_t& from ) {
parser_subtract(to.refer, to.refer, from, to.rounded);
}
@ -3277,11 +3267,11 @@ ast_set_pointers( const list<cbl_num_result_t>& tgts, cbl_refer_t src ) {
void
stringify( refer_collection_t *inputs,
cbl_refer_t into, cbl_refer_t pointer,
const cbl_refer_t& into, const cbl_refer_t& pointer,
cbl_label_t *on_error = NULL,
cbl_label_t *not_error = NULL);
void unstringify( cbl_refer_t& src, refer_list_t *delimited,
void unstringify( const cbl_refer_t& src, refer_list_t *delimited,
unstring_into_t * into,
cbl_label_t *on_error = NULL,
cbl_label_t *not_error = NULL );
@ -3306,6 +3296,7 @@ implicit_section()
}
static void
// cppcheck-suppress constParameterPointer
ast_enter_exit_section( cbl_label_t * section ) {
auto implicit = section? implicit_paragraph() : NULL;
@ -3385,7 +3376,7 @@ data_division_ready() {
static
bool
anybody_redefines(cbl_field_t *tree)
anybody_redefines( const cbl_field_t *tree )
{
bool retval = false;
while(tree)
@ -3395,7 +3386,8 @@ anybody_redefines(cbl_field_t *tree)
retval = true;
break;
}
tree = parent_of(tree);
// cppcheck-suppress [unreadVariable] obviously not true
tree = parent_of(tree);
}
return retval;
}
@ -3615,14 +3607,14 @@ file_section_parent_set( cbl_field_t *field ) {
field->data.capacity);
field->file = file_section_fd;
auto redefined = symbol_redefines(record_area);
const auto redefined = symbol_redefines(record_area);
field->parent = redefined? record_area->parent : file->default_record;
}
return file_section_fd > 0;
}
void ast_call(const YYLTYPE& loc, cbl_refer_t name,
cbl_refer_t returning,
const cbl_refer_t& returning,
size_t narg, cbl_ffi_arg_t args[],
cbl_label_t *except,
cbl_label_t *not_except,

View File

@ -271,7 +271,7 @@ function_descr_t *function_descrs_end = function_descrs + COUNT_OF(function_desc
class cname_cmp {
const char *cname;
public:
cname_cmp( const char *cname ) : cname(cname) {}
explicit cname_cmp( const char *cname ) : cname(cname) {}
bool operator()( const function_descr_t& descr ) {
return strlen(cname) == strlen(descr.cname) &&
@ -293,8 +293,8 @@ intrinsic_inconsistent_parameter( size_t n, cbl_refer_t *args ) {
class commensurate_type {
cbl_refer_t first;
public:
commensurate_type( const cbl_refer_t& first ) : first(first) {}
bool operator()( cbl_refer_t& arg ) const {
explicit commensurate_type( const cbl_refer_t& first ) : first(first) {}
bool operator()( const cbl_refer_t& arg ) const {
return is_numeric(first.field) == is_numeric(arg.field);
}
};

View File

@ -214,7 +214,11 @@ struct cdf_status_t {
const char *filename;
int token;
bool parsing;
cdf_status_t( int token = 0, bool parsing = true )
cdf_status_t()
: lineno(yylineno), filename(cobol_filename())
, token(0), parsing(true)
{}
cdf_status_t( int token, bool parsing )
: lineno(yylineno), filename(cobol_filename())
, token(token), parsing(parsing)
{}
@ -371,7 +375,7 @@ class enter_leave_t {
enter_leave_t() : entering(NULL), leaving(NULL), filename(NULL) {}
enter_leave_t( parser_enter_file_f *entering, const char *filename )
: entering(entering), leaving(NULL), filename(filename) {}
enter_leave_t(parser_leave_file_f *leaving)
explicit enter_leave_t(parser_leave_file_f *leaving)
: entering(NULL), leaving(leaving), filename(NULL) {}
void notify( unsigned int newlines = 0 ) {
@ -405,7 +409,7 @@ static class input_file_status_t {
trailing_newlines = std::count(yytext, yytext + yyleng, '\n');
if( trailing_newlines && yy_flex_debug )
dbgmsg("adding %u lines after POP", trailing_newlines);
inputs.push( parser_leave_file );
inputs.push( enter_leave_t(parser_leave_file) );
}
void notify() {
while( ! inputs.empty() ) {
@ -429,7 +433,7 @@ update_location() {
auto nline = std::count(yytext, yytext + yyleng, '\n');
if( nline ) {
char *p = static_cast<char*>(memrchr(yytext, '\n', yyleng));
const char *p = static_cast<char*>(memrchr(yytext, '\n', yyleng));
loc.last_column = (yytext + yyleng) - p;
}
@ -666,7 +670,7 @@ bool need_nume_set( bool tf ) {
static int datetime_format_of( const char input[] );
static int symbol_function_token( const char name[] ) {
auto e = symbol_function( 0, name );
const auto e = symbol_function( 0, name );
return e ? symbol_index(e) : 0;
}
@ -754,7 +758,7 @@ typed_name( const char name[] ) {
__attribute__((fallthrough));
case FldLiteralN:
{
auto f = cbl_field_of(e);
const auto f = cbl_field_of(e);
if( type == FldLiteralN ) {
yylval.numstr.radix =
f->has_attr(hex_encoded_e)? hexadecimal_e : decimal_e;

View File

@ -116,10 +116,10 @@ datetime_format_of( const char input[] ) {
for( auto p = patterns; p < eopatterns; p++ ) {
static const int cflags = REG_EXTENDED | REG_ICASE;
static char msg[80];
int erc;
if( 0 != (erc = regcomp(&p->re, p->regex, cflags)) ) {
static char msg[80];
regerror(erc, &p->re, msg, sizeof(msg));
yywarn("%s:%d: %s: %s", __func__, __LINE__, keyword_str(p->token), msg);
}

View File

@ -147,10 +147,10 @@ extern bool cursor_at_sol;
fprintf(stderr, "<%s>", cbl_field_type_str((b).field->type)); \
} \
} \
if( (b).nsubscript) \
if( (b).nsubscript()) \
{ \
fprintf(stderr,"("); \
for(size_t jjj=0; jjj<(b).nsubscript; jjj++) \
for(size_t jjj=0; jjj<(b).nsubscript(); jjj++) \
{ \
if(jjj) \
{ \
@ -337,13 +337,13 @@ extern bool cursor_at_sol;
else \
{ \
gg_fprintf(trace_handle, 1, "%s", gg_string_literal( (b).field->name ? (b).field->name:"")); \
if( b.nsubscript ) \
if( b.nsubscript() ) \
{ \
gg_fprintf(trace_handle, 0, "("); \
for(unsigned int i=0; i<b.nsubscript; i++) \
for(unsigned int i=0; i<b.nsubscript(); i++) \
{ \
gg_fprintf(trace_handle, 1, "%s", gg_string_literal( b.subscripts[i].field->name ? b.subscripts[i].field->name : "" )); \
if( i<b.nsubscript-1 ) \
if( i<b.nsubscript()-1 ) \
{ \
gg_fprintf(trace_handle, 0, " "); \
} \
@ -506,7 +506,7 @@ class ANALYZE
class ANALYZE
{
public:
ANALYZE(const char *)
explicit ANALYZE(const char *)
{
}
~ANALYZE()

View File

@ -136,11 +136,9 @@ static struct symbol_table_t {
static symbol_table_t&
symbol_table_extend() {
static FILE *mapped;
if( symbols.nelem == 0 ) { // first time: create file & set initial capacity
assert(mapped == NULL && symbols.fd == -1);
FILE *mapped;
if( (mapped = tmpfile()) == NULL ) {
cbl_err( "could not create temporary file for symbol table");
}
@ -229,6 +227,12 @@ cbl_span_t::from_field() { assert(from); return from->field; }
cbl_field_t *
cbl_span_t::len_field() { assert(len); return len->field; }
cbl_ffi_arg_t::cbl_ffi_arg_t()
: optional(false)
, crv(by_reference_e)
, attr(none_of_e)
{}
cbl_ffi_arg_t::
cbl_ffi_arg_t( cbl_refer_t* refer, cbl_ffi_arg_attr_t attr )
: optional(false)
@ -927,7 +931,7 @@ end_of_group( size_t igroup ) {
if( e->program != group->program ) return isym;
if( e->type == SymLabel ) return isym; // end of data division
if( e->type == SymField ) {
auto f = cbl_field_of(e);
const auto f = cbl_field_of(e);
if( f->level == LEVEL77 || f->level == 66 ) return isym;
if( f->level == 1 && f->parent != igroup ) {
return isym;
@ -938,7 +942,7 @@ end_of_group( size_t igroup ) {
}
eog_t eog(symbol_at(igroup));
symbol_elem_t *e = std::find_if( symbols_begin(++igroup), symbols_end(), eog );
const symbol_elem_t *e = std::find_if( symbols_begin(++igroup), symbols_end(), eog );
return e - symbols_begin();
}
@ -993,7 +997,7 @@ symbol_find_odo_debug( cbl_field_t * field ) {
// Return OCCURS DEPENDING ON table subordinate to field, if any.
struct cbl_field_t *
symbol_find_odo( cbl_field_t * field ) {
symbol_find_odo( const cbl_field_t * field ) {
size_t bog = field_index(field), eog = end_of_group(bog);
auto e = std::find_if( symbol_at(bog), symbol_at_impl(eog, true), has_odo );
return e == symbol_at_impl(eog, true)? NULL : cbl_field_of(e);
@ -1170,7 +1174,7 @@ static struct symbol_elem_t *
// If an 01 record exists for the FD/SD, use its capacity as the
// default_record capacity.
if( p != symbols_end() ) {
auto record = cbl_field_of(p);
const auto record = cbl_field_of(p);
assert(record->level == 1);
e = calculate_capacity(p);
auto record_size = std::max(record->data.memsize,
@ -1362,7 +1366,7 @@ is_variable_length( const cbl_field_t *field ) {
* occurs-depending table."
*/
cbl_field_t *
rename_not_ok( cbl_field_t *first, cbl_field_t *last) {
rename_not_ok( const cbl_field_t *first, const cbl_field_t *last) {
symbol_elem_t
*beg = symbol_at(field_index(first)),
*end = symbol_at(field_index(last));
@ -1463,7 +1467,7 @@ field_str( const cbl_field_t *field ) {
}
pend += snprintf(pend, string + sizeof(string) - pend,
"%02d %-20s ", field->level, name);
"%02u %-20s ", field->level, name);
char offset[32] = "";
if( field->level > 1 ) {
@ -1574,7 +1578,7 @@ struct capacity_of {
capacity_of operator()( symbol_elem_t& elem ) {
if( elem.type == SymField ) {
cbl_field_t *f = cbl_field_of(&elem);
const cbl_field_t *f = cbl_field_of(&elem);
if( is_elementary(f->type) ) {
capacity += field_size(f);
}
@ -1741,7 +1745,7 @@ symbols_update( size_t first, bool parsed_ok ) {
bool size_invalid = field->data.memsize > 0 && symbol_redefines(field);
if( size_invalid ) { // redefine of record area is ok
auto redefined = symbol_redefines(field);
const auto redefined = symbol_redefines(field);
size_invalid = ! is_record_area(redefined);
}
if( !field->is_valid() || size_invalid )
@ -1824,7 +1828,7 @@ symbols_update( size_t first, bool parsed_ok ) {
}
// Verify REDEFINing field has no ODO components
auto parent = symbol_redefines(field);
const auto parent = symbol_redefines(field);
if( parent && !is_record_area(parent) && is_variable_length(field) ) {
ERROR_FIELD(field, "line %d: REDEFINES field %s cannot be variable length",
field->line, field->name);
@ -2014,15 +2018,15 @@ symbol_in_file( symbol_elem_t *e ) {
}
#endif
static struct cbl_field_t *
symbol_field_parent_set( struct cbl_field_t *field )
static cbl_field_t *
symbol_field_parent_set( cbl_field_t *field )
{
if( field->level == 01 ) return NULL;
if( field->level == 77 ) return NULL;
if( field->level == 78 ) return NULL;
struct symbol_elem_t *e = symbols.elems + symbols.nelem - 1;
struct symbol_elem_t *first = symbols.elems + symbols.first_program;
const struct symbol_elem_t *first = symbols.elems + symbols.first_program;
for( ; field->parent == 0 && e >= first; e-- ) {
if( ! (e->type == SymField && cbl_field_of(e)->level > 0) ) {
@ -2404,7 +2408,7 @@ symbol_file_add( size_t program, cbl_file_t *file ) {
return NULL;
}
struct symbol_elem_t sym = { SymFile, program };
symbol_elem_t sym{ SymFile, program };
sym.elem.file = *file;
e = symbol_add(&sym);
@ -2462,7 +2466,7 @@ symbol_typedef_add( size_t program, struct cbl_field_t *field ) {
auto e = symbols_end() - 1;
assert( symbols_begin() < e );
if( e->type == SymField ) {
auto f = cbl_field_of(e);
const auto f = cbl_field_of(e);
if( f == field ) return e;
}
@ -2500,7 +2504,7 @@ struct symbol_elem_t *
symbol_field_add( size_t program, struct cbl_field_t *field )
{
field->our_index = symbols.nelem;
cbl_field_t *parent = symbol_field_parent_set( field );
const cbl_field_t *parent = symbol_field_parent_set( field );
if( parent && parent->type == FldGroup) {
// Inherit effects of parent's USAGE, as though it appeared 1st in the
// member's definition.
@ -2512,7 +2516,7 @@ symbol_field_add( size_t program, struct cbl_field_t *field )
if( is_numeric(parent->usage) && parent->data.capacity > 0 ) {
field->type = parent->usage;
field->data = parent->data;
field->data = 0.0;
field->data = 0;
field->data.initial = NULL;
}
}
@ -2631,6 +2635,7 @@ symbol_field( size_t program, size_t parent, const char name[] )
return p != end? &*p : NULL;
}
// cppcheck-suppress-begin [CastIntegerToAddressAtReturn] obviously not true
symbol_elem_t *
symbol_register( const char name[] )
{
@ -2646,6 +2651,7 @@ symbol_register( const char name[] )
return p;
}
// cppcheck-suppress-end [CastIntegerToAddressAtReturn]
// Find current 01 record during Level 66 construction.
const symbol_elem_t *
@ -2708,11 +2714,12 @@ symbol_literalA( size_t program, const char name[] )
struct symbol_elem_t *
symbol_file( size_t program, const char name[] ) {
size_t nelem = symbols.nelem;
struct symbol_elem_t key = { SymFile, program }, *e = &key;
symbol_elem_t key{ SymFile, program }, *e = &key;
assert(strlen(name) < sizeof(key.elem.file.name));
strcpy(key.elem.file.name, name);
// cppcheck-suppress-begin [knownConditionTrueFalse]
do {
e = static_cast<struct symbol_elem_t *>(lfind( &key, symbols.elems,
&nelem, sizeof(*e),
@ -2721,6 +2728,7 @@ symbol_file( size_t program, const char name[] ) {
key.program = cbl_label_of(symbol_at(key.program))->parent;
if( key.program == 0 ) break; // no file without a program
} while( !e );
// cppcheck-suppress-end [knownConditionTrueFalse]
if( e ) {
assert(e->type == SymFile);
@ -2914,7 +2922,7 @@ symbol_file_same_record_area( std::list<cbl_file_t*>& files ) {
}
static symbol_elem_t *
next_program( symbol_elem_t *elem ) {
next_program( const symbol_elem_t *elem ) {
size_t start = elem? symbol_index(elem) : 0;
symbol_elem_t * e =
std::find_if( symbols_begin(start), symbols_end(), is_program );
@ -2952,14 +2960,14 @@ is_numeric_constant( const char name[] ) {
// get default record layout for a file
struct cbl_field_t *
symbol_file_record( struct cbl_file_t *file ) {
symbol_file_record( const cbl_file_t *file ) {
return cbl_field_of(symbol_at(file->default_record));
}
class is_section {
cbl_section_type_t section_type;
public:
is_section( cbl_section_type_t sect ) : section_type(sect) {}
explicit is_section( cbl_section_type_t sect ) : section_type(sect) {}
bool operator()( symbol_elem_t& e ) const {
return e.type == SymDataSection && cbl_section_of(&e)->type == section_type;
}
@ -2970,8 +2978,6 @@ static bool fd_record_size_cmp( const symbol_elem_t& a, const symbol_elem_t& b )
return cbl_field_of(&a)->data.capacity < cbl_field_of(&b)->data.capacity;
}
cbl_file_key_t cbl_file_t::no_key;
/*
* Find largest and smallest record defined for a file. The rule is:
* cbl_file_t::varies() returns true if the record size varies,
@ -3604,12 +3610,9 @@ cbl_label_t::explicit_parent() const {
}
cbl_prog_hier_t::cbl_prog_hier_t() {
nlabel = std::count_if( symbols_begin(), symbols_end(), is_program );
assert(nlabel >0);
labels = new cbl_prog_hier_t::program_label_t[nlabel];
std::copy_if( symbols_begin(), symbols_end(),
labels, is_program );
std::back_inserter(labels), is_program );
assert(! labels.empty());
}
/*
@ -3702,7 +3705,8 @@ symbol_label_add( size_t program, cbl_label_t *input )
if( (e = symbol_add(&elem)) == NULL ) {
cbl_errx("%s:%d: could not add '%s'", __func__, __LINE__, label->name);
}
assert(e);
common_callables_update( symbol_index(e) );
// restore munged line number unless symbol_add returned an existing label
@ -3723,7 +3727,7 @@ symbol_label_section_exists( size_t eval_label_index ) {
bool has_section = std::any_of( ++eval, symbols_end(),
[program = eval->program]( const auto& sym ) {
if( program == sym.program && sym.type == SymLabel ) {
auto& L(sym.elem.label);
const auto& L(sym.elem.label);
// true if the symbol is an explicit label.
return L.type == LblSection && L.name[0] != '_';
}
@ -3875,7 +3879,7 @@ expand_picture(const char *picture)
{
assert(strlen(picture) < PICTURE_MAX); // guaranteed by picset() in scanner
size_t retval_length = PICTURE_MAX;
char *retval = (char *)xmalloc(retval_length);
char *retval = static_cast<char *>(xmalloc(retval_length));
size_t index = 0;
int ch;
@ -3904,7 +3908,7 @@ expand_picture(const char *picture)
if( index + repeat >= retval_length )
{
retval_length <<= 1;
retval = (char *)xrealloc(retval, retval_length);
retval = static_cast<char *>(xrealloc(retval, retval_length));
}
while(repeat--)
@ -3917,7 +3921,7 @@ expand_picture(const char *picture)
if( index >= retval_length )
{
retval_length <<= 1;
retval = (char *)xrealloc(retval, retval_length);
retval = static_cast<char *>(xrealloc(retval, retval_length));
}
retval[index++] = ch;
}
@ -3926,7 +3930,7 @@ expand_picture(const char *picture)
if( index >= retval_length )
{
retval_length <<= 1;
retval = (char *)xrealloc(retval, retval_length);
retval = static_cast<char *>(xrealloc(retval, retval_length));
}
retval[index++] = '\0';
@ -3949,7 +3953,6 @@ expand_picture(const char *picture)
{
pcurrency[i] = 'B';
}
dest_length += sign_length;
}
}
@ -4180,7 +4183,7 @@ symbol_program_callables( size_t program ) {
if( e->type != SymLabel ) continue;
if( e->elem.label.type != LblProgram ) continue;
auto prog = cbl_label_of(e);
const auto prog = cbl_label_of(e);
if( program == symbol_index(e) && !prog->recursive ) continue;
if( (self->parent == prog->parent && prog->common) ||
@ -4214,6 +4217,7 @@ symbol_program_local( const char tgt_name[] ) {
*/
std::map<char, const char *> currencies;
// cppcheck-suppress-begin [nullPointerRedundantCheck]
bool
symbol_currency_add( const char symbol[], const char sign[] ) {
// In service of CURRENCY sign PICTURE SYMBOL symbol
@ -4225,6 +4229,7 @@ symbol_currency_add( const char symbol[], const char sign[] ) {
currencies[*symbol] = sign;
return true;
}
// cppcheck-suppress-end [nullPointerRedundantCheck]
const char *
symbol_currency( char sign ) {
@ -4247,24 +4252,19 @@ bool decimal_is_comma() { return decimal_point == ','; }
/*
* A cbl_occurs_key_t is part of a field definition, and comprises
* size_t symbol indexes. A cbl_key_t is a list of field pointers,
* and can be created ad hoc to describe a sort. We can construct a
* and can be created ad hoc to describe a sort. We construct a
* cbl_key_t from cbl_occurs_key_t.
*/
cbl_key_t::
cbl_key_t( const cbl_occurs_key_t& that )
: ascending(that.ascending)
{
if( that.field_list.nfield == 0 ) {
*this = cbl_key_t();
return;
}
nfield = that.field_list.nfield;
fields = static_cast<cbl_field_t**>( xcalloc(nfield,
sizeof(*fields)) );
for( size_t i=0; i < that.field_list.nfield; i++ ) {
fields[i] = cbl_field_of(symbol_at(that.field_list.fields[i]));
}
std::transform( that.field_list.fields,
that.field_list.fields + that.field_list.nfield,
std::back_inserter(fields),
[]( size_t isym ) {
return cbl_field_of(symbol_at(isym));
} );
}
void
@ -4277,7 +4277,7 @@ cbl_occurs_t::key_alloc( bool ascending ) {
}
void
cbl_occurs_t::field_add( cbl_field_list_t& field_list, cbl_field_t *field ) {
cbl_occurs_t::field_add( cbl_field_list_t& field_list, const cbl_field_t *field ) {
cbl_field_list_t list = field_list;
size_t ifield = field_index(field);
auto nbytes = sizeof(list.fields[0]) * (list.nfield + 1);
@ -4295,14 +4295,14 @@ cbl_occurs_t::key_field_add( cbl_field_t *field ) {
}
void
cbl_occurs_t::index_add( cbl_field_t *field ) {
cbl_occurs_t::index_add( const cbl_field_t *field ) {
field_add(indexes, field);
}
class is_field_at {
cbl_field_t *field;
public:
is_field_at( cbl_field_t *field ) : field(field) {}
explicit is_field_at( cbl_field_t *field ) : field(field) {}
bool operator()( size_t isym ) const {
return field == field_at(isym);
}
@ -4470,11 +4470,11 @@ cbl_file_key_t::deforward( size_t ifile ) {
const auto file = cbl_file_of(symbol_at(ifile));
std::transform( fields, fields + nfield, fields,
[ifile, file]( size_t fwd ) {
static std::map<size_t, int> keys;
auto ifield = symbol_forward_to(fwd);
const auto field = cbl_field_of(symbol_at(ifield));
if( is_forward(field) && yydebug ) {
static std::map<size_t, int> keys;
dbgmsg("%s:%d: key %d: #" HOST_SIZE_T_PRINT_UNSIGNED " %s of %s is %s",
"deforward", __LINE__,
keys[ifile]++, (fmt_size_t)ifield, field->name, file->name,
@ -4561,27 +4561,12 @@ cbl_file_t::deforward() {
char *
cbl_file_t::keys_str() const {
std::vector <char *> ks(nkey);
std::transform(keys, keys + nkey, ks.begin(),
[]( const cbl_file_key_t& key ) {
return key.str();
} );
size_t n = 4 * nkey + std::accumulate(ks.begin(), ks.end(), 0,
[]( int n, const char *s ) {
return n + strlen(s);
} );
char *output = static_cast<char*>( xcalloc(1, n) ), *p = output;
const char *sep = "";
*p++ = '[';
for( auto k : ks ) {
p = stpcpy(p, sep);
p = stpcpy(p, k);
sep = ", ";
free(k);
std::string names = "[";
for( cbl_file_key_t *p = keys; p < keys + nkey; p++ ) {
names += p->str();
names += p + 1 < keys + nkey ? "," : "]";
}
*p++ = ']';
return output;
return xasprintf("%s", names.c_str());
}
/*
@ -4643,7 +4628,7 @@ cbl_file_status_cmp( const void *K, const void *E ) {
static long
file_status_status_of( file_status_t status ) {
size_t n = COUNT_OF(file_status_fields);
file_status_field_t *fs, key { status };
const file_status_field_t *fs, key { status };
fs = (file_status_field_t*)lfind( &key, file_status_fields,
&n, sizeof(*fs), cbl_file_status_cmp );
@ -4673,7 +4658,7 @@ ast_file_status_between( file_status_t lower, file_status_t upper ) {
}
bool
is_register_field(cbl_field_t *field)
is_register_field(const cbl_field_t *field)
{
// TRUE when the field is an executable-level global variable of the type we
// are calling a "register", like RETURN-CODE or UPSI or the like:

View File

@ -264,7 +264,18 @@ struct cbl_field_data_t {
explicit etc_t( tree v = build_zero_cst (float128_type_node)) : value(v) {}
} etc;
cbl_field_data_t( uint32_t memsize=0, uint32_t capacity=0 )
cbl_field_data_t()
: memsize(0)
, capacity(0)
, digits(0)
, rdigits(0)
, initial(0)
, picture(0)
, etc_type(value_e)
, etc()
{}
cbl_field_data_t( uint32_t memsize, uint32_t capacity )
: memsize(memsize)
, capacity(capacity)
, digits(0)
@ -327,6 +338,10 @@ struct cbl_field_data_t {
etc_type = value_e;
return etc.value = v;
}
tree& operator=(int i) {
etc_type = value_e;
return etc.value = build_int_cst_type(integer_type_node, i);
}
void set_real_from_capacity( REAL_VALUE_TYPE *r ) const {
real_from_integer (r, VOIDmode, capacity, SIGNED);
@ -412,8 +427,11 @@ struct cbl_occurs_bounds_t {
// variable size table. lower can be zero.
size_t lower, upper;
cbl_occurs_bounds_t(size_t lower=0, size_t upper=0)
cbl_occurs_bounds_t()
: lower(0), upper(0) {}
explicit cbl_occurs_bounds_t(size_t lower, size_t upper=0)
: lower(lower), upper(upper) {}
size_t ntimes() const {
return upper;
}
@ -446,12 +464,12 @@ struct cbl_occurs_t {
void key_alloc( bool ascending );
void key_field_add( cbl_field_t *field );
void index_add( cbl_field_t *field );
void index_add( const cbl_field_t *field );
cbl_occurs_key_t * key_of( cbl_field_t *field );
bool subscript_ok( const cbl_field_t *subscript ) const;
protected:
void field_add( cbl_field_list_t& fields, cbl_field_t *field );
void field_add( cbl_field_list_t& fields, const cbl_field_t *field );
};
/*
@ -655,49 +673,63 @@ struct cbl_refer_t {
cbl_field_t *field;
cbl_label_t *prog_func;
bool all, addr_of;
uint32_t nsubscript;
cbl_refer_t *subscripts; // indices
std::vector<cbl_refer_t> subscripts; // indices
cbl_span_t refmod; // substring bounds
cbl_refer_t()
: loc(), field(NULL), prog_func(NULL)
, all(NULL), addr_of(false)
, nsubscript(0), subscripts(NULL), refmod(NULL)
, refmod(NULL)
{}
// cppcheck-suppress noExplicitConstructor
cbl_refer_t( cbl_field_t *field, bool all = false )
: loc(), field(field), prog_func(NULL)
, all(all), addr_of(false)
, nsubscript(0), subscripts(NULL), refmod(NULL)
, refmod(NULL)
{}
cbl_refer_t( const YYLTYPE& loc, cbl_field_t *field, bool all = false )
: loc(loc), field(field), prog_func(NULL)
, all(all), addr_of(false)
, nsubscript(0), subscripts(NULL), refmod(NULL)
, refmod(NULL)
{}
cbl_refer_t( cbl_field_t *field, cbl_span_t& refmod )
: loc(), field(field), prog_func(NULL)
, all(false), addr_of(false)
, nsubscript(0), subscripts(NULL), refmod(refmod)
, refmod(refmod)
{}
cbl_refer_t( cbl_field_t *field,
size_t nsubscript, cbl_refer_t *subscripts,
const std::vector<cbl_refer_t>& subscripts,
cbl_span_t refmod = cbl_span_t(NULL) )
: loc(), field(field), prog_func(NULL)
, all(false), addr_of(false)
, nsubscript(nsubscript) , subscripts( new cbl_refer_t[nsubscript] )
, subscripts(subscripts)
, refmod(refmod)
{
std::copy(subscripts, subscripts + nsubscript, this->subscripts);
}
{}
explicit cbl_refer_t( cbl_label_t *prog_func, bool addr_of = true )
: loc(), field(NULL), prog_func(prog_func)
, all(false), addr_of(addr_of)
, nsubscript(0), subscripts(NULL), refmod(cbl_span_t(NULL))
, refmod(cbl_span_t(NULL))
{}
cbl_refer_t duplicate() const {
return cbl_refer_t( field, nsubscript, subscripts, refmod );
cbl_refer_t( const cbl_refer_t& that ) = default;
cbl_refer_t& operator=( const cbl_refer_t& that ) {
loc = that.loc;
field = that.field;
prog_func = that.prog_func;
all = that.all;
addr_of = that.addr_of;
subscripts = that.subscripts;
refmod = that.refmod;
return *this;
}
cbl_refer_t duplicate() const {
return cbl_refer_t( field, subscripts, refmod );
}
uint32_t nsubscript() const { return subscripts.size(); }
static cbl_refer_t *empty();
@ -709,8 +741,8 @@ struct cbl_refer_t {
}
bool is_pointer() const { return addr_of || field->type == FldPointer; }
bool is_reference() const { return nsubscript > 0 || refmod.is_active(); }
bool is_table_reference() const { return nsubscript > 0; }
bool is_reference() const { return nsubscript() > 0 || refmod.is_active(); }
bool is_table_reference() const { return nsubscript() > 0; }
bool is_refmod_reference() const { return refmod.is_active(); }
size_t subscripts_set( const std::list<cbl_refer_t>& subs );
@ -775,7 +807,7 @@ struct field_key_t {
}
};
bool valid_move( const struct cbl_field_t *tgt, const struct cbl_field_t *src );
bool valid_move( const cbl_field_t *tgt, const cbl_field_t *src );
#define record_area_name_stem "_ra_"
@ -785,8 +817,7 @@ is_record_area( const cbl_field_t *field ) {
return 0 == memcmp(field->name, stem, sizeof(stem)-1);
}
bool
is_register_field(cbl_field_t *field);
bool is_register_field( const cbl_field_t *field );
static inline bool
is_constant( const cbl_field_t *field ) {
@ -804,17 +835,20 @@ symbol_field_type_update( cbl_field_t *field,
cbl_field_type_t type, bool is_usage );
struct sort_key_t;
struct sort_key_t;
struct cbl_key_t {
bool ascending;
size_t nfield;
cbl_field_t **fields;
std::vector<const cbl_field_t*> fields;
cbl_key_t() : ascending(false), nfield(0), fields(0) {}
cbl_key_t( size_t nfield, cbl_field_t **fields, bool ascending = true )
: ascending(ascending), nfield(nfield), fields(fields) {}
cbl_key_t( const sort_key_t& src );
cbl_key_t() : ascending(true) {}
explicit cbl_key_t( sort_key_t src );
explicit cbl_key_t( const cbl_occurs_key_t& that );
cbl_key_t( size_t nfield, cbl_field_t **fields, bool ascending = true )
: ascending(ascending)
, fields(fields, fields + nfield)
{}
cbl_key_t& operator=( const sort_key_t& that );
};
enum cbl_label_type_t {
@ -911,8 +945,12 @@ struct cbl_substitute_t {
subst_fl_t first_last;
cbl_refer_t orig, replacement;
cbl_substitute_t( bool anycase = false, char first_last = 0,
cbl_refer_t *orig = NULL, cbl_refer_t *replacement = NULL )
cbl_substitute_t()
: anycase(false)
, first_last(subst_all_e)
{}
cbl_substitute_t( bool anycase, char first_last,
cbl_refer_t *orig, cbl_refer_t *replacement )
: anycase(anycase)
, first_last(subst_fl_t(first_last))
, orig( orig? *orig : cbl_refer_t() )
@ -945,7 +983,10 @@ struct cbl_num_result_t {
enum cbl_round_t rounded;
struct cbl_refer_t refer;
static cbl_refer_t refer_of( const cbl_num_result_t& res ) { return res.refer; }
static const cbl_refer_t&
refer_of( const cbl_num_result_t& res ) {
return res.refer;
}
};
void parser_symbol_add( struct cbl_field_t *new_var );
@ -957,8 +998,9 @@ struct cbl_ffi_arg_t {
cbl_ffi_arg_attr_t attr;
cbl_refer_t refer; // refer::field == NULL is OMITTED
cbl_ffi_arg_t( cbl_refer_t* refer = NULL,
cbl_ffi_arg_attr_t attr = none_of_e );
cbl_ffi_arg_t();
cbl_ffi_arg_t( cbl_refer_t* refer,
cbl_ffi_arg_attr_t attr );
cbl_ffi_arg_t( cbl_ffi_crv_t crv,
cbl_refer_t* refer,
cbl_ffi_arg_attr_t attr = none_of_e );
@ -1171,7 +1213,8 @@ class temporaries_t {
struct literal_an {
bool is_quoted;
std::string value;
literal_an( const char value[] = "???", bool is_quoted = false )
literal_an() : is_quoted(false), value("???") {}
literal_an( const char value[], bool is_quoted )
: is_quoted(is_quoted), value(value) {}
literal_an& operator=( const literal_an& that ) {
is_quoted = that.is_quoted;
@ -1513,9 +1556,19 @@ struct cbl_file_key_t {
cbl_name_t name;
size_t leftmost; // START or READ named leftmost field in key
size_t nfield;
size_t *fields;
size_t *fields; // cppcheck-suppress unsafeClassCanLeak
cbl_file_key_t( size_t field = 0, bool unique = true )
cbl_file_key_t()
: unique(true)
, leftmost(0)
, nfield(0)
, fields(nullptr)
{
memset(name, '\0', sizeof(name));
}
// Construct a key of length 1 having a single field.
explicit cbl_file_key_t( size_t field, bool unique = true )
: unique(unique)
, leftmost(0)
, nfield(1)
@ -1529,6 +1582,29 @@ struct cbl_file_key_t {
const std::list<cbl_field_t *>& fields,
bool is_unique );
// The copy constructor and assignment operator exist to quell reports from
// cppcheck. When these objects are copied, the copy still points to the
// original data.
cbl_file_key_t( const cbl_file_key_t& that )
: unique(that.unique)
, leftmost(that.leftmost)
, nfield(that.nfield)
// cppcheck-suppress copyCtorPointerCopying
, fields(that.fields)
{
strcpy(name, that.name);
}
~cbl_file_key_t() {}
cbl_file_key_t& operator=( const cbl_file_key_t& that ) {
unique = that.unique;
leftmost = that.leftmost;
nfield = that.nfield;
// cppcheck-suppress copyCtorPointerCopying
fields = that.fields;
strcpy(name, that.name);
return *this;
}
uint32_t size();
void deforward( size_t ifile );
char * str() const;
@ -1542,12 +1618,12 @@ struct cbl_file_key_t {
struct cbl_file_lock_t {
bool multiple;
enum lock_mode_t { unlocked_e, manual_e, record_e, automatic_e } mode;
cbl_file_lock_t() : multiple(false), mode(unlocked_e) {}
bool mode_set( int token );
bool locked() const { return mode != unlocked_e; }
};
struct cbl_file_t {
static cbl_file_key_t no_key;
enum cbl_file_org_t org;
enum file_entry_type_t entry_type;
uint32_t attr;
@ -1574,15 +1650,32 @@ struct cbl_file_t {
tree var_decl_node; // GENERIC tag for the run-time FIELD structure
cbl_file_t()
: org(file_disorganized_e),
access(file_access_seq_e)
: org(file_disorganized_e)
, entry_type(fd_e)
, attr(0), reserve(0), same_record_as(0)
, padding('\0')
, optional(false)
, varying_size{ false, 0, 0 }
, access(file_access_seq_e)
, filename(0)
, default_record(0)
, nkey(0)
, keys(nullptr)
, password(0), user_status(0), vsam_status(0), record_length(0)
, line(0)
, addresses(nullptr)
, var_decl_node(nullptr)
{
keys = &no_key;
memset(name, '\0', sizeof(name));
}
bool varies() const { return varying_size.min != varying_size.max; }
bool validate() const;
void deforward();
cbl_file_key_t * keys_update( cbl_file_key_t * keys ) {
if( this->keys ) delete[] this->keys;
return this->keys = keys;
}
char * keys_str() const;
int key_one( cbl_field_t *field ) const {
auto ekey = keys + nkey, p = ekey;
@ -1630,7 +1723,8 @@ struct symbol_elem_t {
symbol_elem_u() : field() {}
} elem;
symbol_elem_t( symbol_type_t type = SymField, size_t program = 0 )
symbol_elem_t() : type(SymField), program(0) {}
explicit symbol_elem_t( symbol_type_t type, size_t program = 0 )
: type(type), program(program)
{}
@ -1700,6 +1794,7 @@ static inline symbol_elem_t *
symbol_elem_of( cbl_label_t *label ) {
size_t n = offsetof(struct symbol_elem_t, elem.label);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<struct symbol_elem_t *>((char*)label - n);
}
@ -1707,6 +1802,7 @@ static inline const symbol_elem_t *
symbol_elem_of( const cbl_label_t *label ) {
size_t n = offsetof(symbol_elem_t, elem.label);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<const symbol_elem_t *>((const char*)label - n);
}
@ -1714,6 +1810,7 @@ static inline symbol_elem_t *
symbol_elem_of( cbl_special_name_t *special ) {
size_t n = offsetof(symbol_elem_t, elem.special);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<symbol_elem_t *>((char*)special - n);
}
@ -1721,6 +1818,7 @@ static inline symbol_elem_t *
symbol_elem_of( cbl_alphabet_t *alphabet ) {
size_t n = offsetof(symbol_elem_t, elem.alphabet);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<symbol_elem_t *>((char*)alphabet - n);
}
@ -1728,12 +1826,14 @@ static inline symbol_elem_t *
symbol_elem_of( cbl_file_t *file ) {
size_t n = offsetof(struct symbol_elem_t, elem.file);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<struct symbol_elem_t *>((char*)file - n);
}
static inline const symbol_elem_t *
symbol_elem_of( const cbl_file_t *file ) {
size_t n = offsetof(symbol_elem_t, elem.file);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<const symbol_elem_t *>((const char*)file - n);
}
@ -1741,18 +1841,20 @@ static inline symbol_elem_t *
symbol_elem_of( cbl_field_t *field ) {
size_t n = offsetof(struct symbol_elem_t, elem.field);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<struct symbol_elem_t *>((char*)field - n);
}
static inline const symbol_elem_t *
symbol_elem_of( const cbl_field_t *field ) {
size_t n = offsetof(symbol_elem_t, elem.field);
return
// cppcheck-suppress cstyleCast
reinterpret_cast<const symbol_elem_t *>((const char*)field - n);
}
symbol_elem_t * symbols_begin( size_t first = 0 );
symbol_elem_t * symbols_end(void);
cbl_field_t * symbol_redefines( const struct cbl_field_t *field );
cbl_field_t * symbol_redefines( const cbl_field_t *field );
void build_symbol_map();
bool update_symbol_map( symbol_elem_t *e );
@ -1768,7 +1870,7 @@ symbol_find( size_t program, std::list<const char *> names );
symbol_elem_t * symbol_find_of( size_t program,
std::list<const char *> names, size_t group );
struct cbl_field_t *symbol_find_odo( cbl_field_t * field );
struct cbl_field_t *symbol_find_odo( const cbl_field_t * field );
size_t dimensions( const cbl_field_t *field );
const symbol_elem_t * symbol_field_current_record();
@ -1792,54 +1894,54 @@ bool redefine_field( cbl_field_t *field );
static inline struct cbl_section_t *
cbl_section_of( struct symbol_elem_t *e ) {
assert(e->type == SymDataSection);
assert(e && e->type == SymDataSection);
return &e->elem.section;
}
static inline struct cbl_field_t *
cbl_field_of( struct symbol_elem_t *e ) {
assert(e->type == SymField);
assert(e && e->type == SymField);
return &e->elem.field;
}
static inline const struct cbl_field_t *
cbl_field_of( const struct symbol_elem_t *e ) {
assert(e->type == SymField);
static inline const cbl_field_t *
cbl_field_of( const symbol_elem_t *e ) {
assert(e && e->type == SymField);
return &e->elem.field;
}
static inline struct cbl_label_t *
cbl_label_of( struct symbol_elem_t *e ) {
assert(e->type == SymLabel);
assert(e && e->type == SymLabel);
return &e->elem.label;
}
static inline const struct cbl_label_t *
cbl_label_of( const struct symbol_elem_t *e ) {
assert(e->type == SymLabel);
static inline const cbl_label_t *
cbl_label_of( const symbol_elem_t *e ) {
assert(e && e->type == SymLabel);
return &e->elem.label;
}
static inline struct cbl_special_name_t *
cbl_special_name_of( struct symbol_elem_t *e ) {
assert(e->type == SymSpecial);
assert(e && e->type == SymSpecial);
return &e->elem.special;
}
static inline struct cbl_alphabet_t *
cbl_alphabet_of( struct symbol_elem_t *e ) {
assert(e->type == SymAlphabet);
assert(e && e->type == SymAlphabet);
return &e->elem.alphabet;
}
static inline struct cbl_file_t *
cbl_file_of( struct symbol_elem_t *e ) {
assert(e->type == SymFile);
assert(e && e->type == SymFile);
return &e->elem.file;
}
static inline const struct cbl_file_t *
cbl_file_of( const struct symbol_elem_t *e ) {
assert(e->type == SymFile);
static inline const cbl_file_t *
cbl_file_of( const symbol_elem_t *e ) {
assert(e && e->type == SymFile);
return &e->elem.file;
}
@ -1858,43 +1960,43 @@ is_procedure( const symbol_elem_t& e ) {
}
static inline bool
is_figconst(const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) != 0 );
is_figconst(const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) != 0;
}
static inline bool
is_figconst_low( const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) == low_value_e );
is_figconst_low( const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) == low_value_e;
}
static inline bool
is_figconst_zero( const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) == zero_value_e );
is_figconst_zero( const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) == zero_value_e;
}
static inline bool
is_figconst_space( const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) == space_value_e );
is_figconst_space( const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) == space_value_e;
}
static inline bool
is_figconst_quote( const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) == quote_value_e );
is_figconst_quote( const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) == quote_value_e;
}
static inline bool
is_figconst_high( const struct cbl_field_t *field ) {
return ((field->attr & FIGCONST_MASK) == high_value_e );
is_figconst_high( const cbl_field_t *field ) {
return (field->attr & FIGCONST_MASK) == high_value_e;
}
static inline bool
is_space_value( const struct cbl_field_t *field ) {
return( (strcmp(field->name, "SPACE") == 0)
|| (strcmp(field->name, "SPACES") == 0) );
is_space_value( const cbl_field_t *field ) {
return (strcmp(field->name, "SPACE") == 0)
|| (strcmp(field->name, "SPACES") == 0);
}
static inline bool
is_quoted( const struct cbl_field_t *field ) {
is_quoted( const cbl_field_t *field ) {
return field->has_attr(quoted_e);
}
@ -1922,7 +2024,7 @@ struct cbl_until_addresses_t {
};
size_t symbol_index(); // nth after first program symbol
size_t symbol_index( const struct symbol_elem_t *e );
size_t symbol_index( const symbol_elem_t *e );
struct symbol_elem_t * symbol_at( size_t index );
struct cbl_options_t {
@ -1974,17 +2076,20 @@ symbol_field_forward_add( size_t program, size_t parent,
struct cbl_field_t * symbol_field_forward( size_t index );
struct cbl_prog_hier_t {
size_t nlabel;
struct program_label_t {
size_t ordinal;
cbl_label_t label;
program_label_t() : ordinal(0), label() {}
program_label_t( const symbol_elem_t& e ) {
// because std::copy_if:
// cppcheck-suppress noExplicitConstructor
program_label_t( const symbol_elem_t& e ) {
assert(is_program(e));
ordinal = symbol_index(&e);
label = e.elem.label;
}
} *labels;
};
std::vector<program_label_t> labels;
cbl_prog_hier_t();
};
@ -2038,10 +2143,11 @@ struct cbl_perform_vary_t {
struct cbl_refer_t by; // numeric
struct cbl_field_t *until; // FldConditional
cbl_perform_vary_t( const cbl_refer_t& varying = cbl_refer_t(),
const cbl_refer_t& from = cbl_refer_t(),
const cbl_refer_t& by = cbl_refer_t(),
cbl_field_t *until = NULL )
cbl_perform_vary_t() : until(nullptr) {}
cbl_perform_vary_t( const cbl_refer_t& varying,
const cbl_refer_t& from,
const cbl_refer_t& by,
cbl_field_t *until )
: varying(varying)
, from(from)
, by(by)
@ -2063,12 +2169,12 @@ is_literal( const cbl_field_t *field ) {
}
static inline bool
is_signable( const struct cbl_field_t *field ) {
is_signable( const cbl_field_t *field ) {
return field->attr & signable_e;
}
static inline bool
is_temporary( const struct cbl_field_t *field ) {
is_temporary( const cbl_field_t *field ) {
return field->attr & intermediate_e;
}
@ -2203,7 +2309,7 @@ struct symbol_elem_t * symbol_special( size_t program, const char name[] );
struct symbol_elem_t * symbol_alphabet( size_t program, const char name[] );
struct symbol_elem_t * symbol_file( size_t program, const char name[] );
struct cbl_field_t * symbol_file_record( struct cbl_file_t *file );
struct cbl_field_t * symbol_file_record( const cbl_file_t *file );
cbl_file_t::varying_t symbol_file_record_sizes( struct cbl_file_t *file );
struct cbl_section_t * symbol_section( size_t program,
struct cbl_section_t *section );
@ -2213,7 +2319,7 @@ size_t symbol_label_id( const cbl_label_t *label );
struct cbl_field_t * parent_of( const cbl_field_t *f );
const cbl_field_t * occurs_in( const cbl_field_t *f );
cbl_field_t *rename_not_ok( cbl_field_t *first, cbl_field_t *last);
cbl_field_t *rename_not_ok( const cbl_field_t *first, const cbl_field_t *last);
bool immediately_follows( const cbl_field_t *first );
bool is_variable_length( const cbl_field_t *field );
@ -2226,7 +2332,7 @@ uint64_t numeric_group_attrs( const cbl_field_t *field );
static inline struct cbl_field_t *
field_at( size_t index ) {
struct symbol_elem_t *e = symbol_at(index);
assert(e->type == SymField);
assert(e && e->type == SymField);
return &e->elem.field;
}
@ -2288,8 +2394,9 @@ class procref_base_t {
private:
const char *section_name, *paragraph_name;
public:
procref_base_t( const char *section_name = NULL,
const char *paragraph_name = NULL )
procref_base_t() : section_name(nullptr) , paragraph_name(nullptr) {}
procref_base_t( const char *section_name,
const char *paragraph_name )
: section_name(section_name)
, paragraph_name(paragraph_name)
{}
@ -2356,7 +2463,7 @@ refer_type_str( const cbl_refer_t *r ) {
enum cbl_field_type_t symbol_field_type( size_t program, const char name[] );
struct symbol_elem_t * symbol_parent( const struct symbol_elem_t *e );
struct symbol_elem_t * symbol_parent( const symbol_elem_t *e );
int length_of_picture(const char *picture);
int rdigits_of_picture(const char *picture);

View File

@ -48,7 +48,7 @@ extern int yydebug;
static bool
is_data_field( symbol_elem_t& e ) {
if( e.type != SymField ) return false;
auto f = cbl_field_of(&e);
const auto f = cbl_field_of(&e);
if( f->name[0] == '\0' ) return false;
if( is_filler(f) ) return false;
@ -129,7 +129,7 @@ finalize_symbol_map2() {
for( auto& elem : symbol_map2 ) {
auto& fields( elem.second );
fields.remove_if( []( auto isym ) {
auto f = cbl_field_of(symbol_at(isym));
const auto f = cbl_field_of(symbol_at(isym));
return f->type == FldInvalid;
} );
if( fields.empty() ) empties.insert(elem.first);
@ -341,7 +341,7 @@ class in_scope {
size_t program;
static size_t prog_of( size_t program ) {
auto L = cbl_label_of(symbol_at(program));
const auto L = cbl_label_of(symbol_at(program));
return L->parent;
}
@ -350,7 +350,7 @@ public:
// A symbol is in scope if it's defined by this program or by an ancestor.
bool operator()( const symbol_map_t::value_type& item ) const {
symbol_elem_t *e = symbol_at(item.second.front());
const symbol_elem_t *e = symbol_at(item.second.front());
for( size_t prog = this->program; prog != 0; prog = prog_of(prog) ) {
if( e->program == prog ) return true;
}
@ -430,7 +430,7 @@ symbol_match2( size_t program,
auto plist = symbol_map2.find(key);
if( plist != symbol_map2.end() ) {
for( auto candidate : plist->second ) {
auto e = symbol_at(candidate);
const auto e = symbol_at(candidate);
if( name_has_names( e, names, local ) ) {
fields.push_back( symbol_index(e) );
}

View File

@ -691,6 +691,7 @@ tokens = {
{ "neg", NEG }, // 939
};
// cppcheck-suppress useInitializationList
token_names = {
"IDENTIFICATION", // 0 (258)
"ENVIRONMENT", // 1 (259)

View File

@ -365,51 +365,50 @@ normalize_picture( char picture[] )
regmatch_t pmatch[4];
if( (erc = regcomp(preg, regex, cflags)) != 0 ) {
regerror(erc, preg, regexmsg, sizeof(regexmsg));
dbgmsg( "%s:%d: could not compile regex: %s", __func__, __LINE__, regexmsg );
return picture;
regerror(erc, preg, regexmsg, sizeof(regexmsg));
dbgmsg( "%s:%d: could not compile regex: %s", __func__, __LINE__, regexmsg );
return picture;
}
while( (erc = regexec(preg, picture, COUNT_OF(pmatch), pmatch, 0)) == 0 ) {
assert(pmatch[1].rm_so != -1 && pmatch[1].rm_so < pmatch[1].rm_eo);
size_t len = pmatch[1].rm_eo - pmatch[1].rm_so;
assert(len == 1);
const char *start = picture + pmatch[1].rm_so;
assert(pmatch[1].rm_so != -1 && pmatch[1].rm_so < pmatch[1].rm_eo);
size_t len = pmatch[1].rm_eo - pmatch[1].rm_so;
assert(len == 1);
const char *start = picture + pmatch[1].rm_so;
assert(pmatch[2].rm_so != -2 && pmatch[2].rm_so < pmatch[2].rm_eo);
len = pmatch[2].rm_eo - pmatch[2].rm_so;
assert(len > 0);
assert(pmatch[2].rm_so != -2 && pmatch[2].rm_so < pmatch[2].rm_eo);
len = pmatch[2].rm_eo - pmatch[2].rm_so;
assert(len > 0);
/*
* Overwrite e.g. A(4) with AAAA.
*/
assert(pmatch[2].rm_so == pmatch[1].rm_eo + 1); // character paren number
p = picture + pmatch[2].rm_so;
len = 0;
fmt_size_t lenf = 0;
if( 1 != sscanf(p, "%" GCC_PRISZ "u", &lenf) ) {
dbgmsg("%s:%d: no number found in '%s'", __func__, __LINE__, p);
goto irregular;
}
len = lenf;
if( len == 0 ) {
dbgmsg("%s:%d: ZERO length found in '%s'", __func__, __LINE__, p);
goto irregular;
}
/*
* Overwrite e.g. A(4) with AAAA.
*/
assert(pmatch[2].rm_so == pmatch[1].rm_eo + 1); // character paren number
p = picture + pmatch[2].rm_so;
len = 0;
fmt_size_t lenf = 0;
if( 1 != sscanf(p, "%" GCC_PRISZ "u", &lenf) ) {
dbgmsg("%s:%d: no number found in '%s'", __func__, __LINE__, p);
goto irregular;
}
len = lenf;
if( len == 0 ) {
dbgmsg("%s:%d: ZERO length found in '%s'", __func__, __LINE__, p);
goto irregular;
}
std::vector <char> pic(len + 1, '\0');
memset(pic.data(), *start, len);
const char *finish = picture + pmatch[2].rm_eo,
*eopicture = picture + strlen(picture);
std::vector <char> pic(len + 1, '\0');
memset(pic.data(), *start, len);
const char *finish = picture + pmatch[2].rm_eo,
*eopicture = picture + strlen(picture);
p = xasprintf( "%*s%s%*s",
(int)(start - picture), picture,
pic.data(),
(int)(eopicture - finish), finish );
p = xasprintf( "%*s%s%*s",
(int)(start - picture), picture,
pic.data(),
(int)(eopicture - finish), finish );
free(picture);
picture = p;
continue;
free(picture);
picture = p;
}
assert(erc == REG_NOMATCH);
@ -792,7 +791,7 @@ symbol_field_type_update( cbl_field_t *field,
bool
redefine_field( cbl_field_t *field ) {
cbl_field_t *primary = symbol_redefines(field);
const cbl_field_t *primary = symbol_redefines(field);
bool fOK = true;
if( !primary ) return false;
@ -840,7 +839,7 @@ cbl_field_t::report_invalid_initial_value(const YYLTYPE& loc) const {
// 8 or more, we need do no further testing because we assume
// everything fits.
if( data.capacity < 8 ) {
auto p = strchr(data.initial, symbol_decimal_point());
const auto p = strchr(data.initial, symbol_decimal_point());
if( p && atoll(p+1) != 0 ) {
error_msg(loc, "integer type %s VALUE '%s' "
"requires integer VALUE",
@ -962,8 +961,7 @@ const cbl_field_t *
literal_subscript_oob( const cbl_refer_t& r, size_t& isub /* output */) {
// Verify literal subscripts if dimensions are correct.
size_t ndim(dimensions(r.field));
if( ndim == 0 || ndim != r.nsubscript ) return NULL;
cbl_refer_t *esub = r.subscripts + r.nsubscript;
if( ndim == 0 || ndim != r.nsubscript() ) return NULL;
std::vector<cbl_field_t *> dims( ndim, NULL );
auto pdim = dims.end();
@ -981,22 +979,20 @@ literal_subscript_oob( const cbl_refer_t& r, size_t& isub /* output */) {
* for the corresponding dimension. Return the first subscript not
* meeting those criteria, if any.
*/
auto p = std::find_if( r.subscripts, esub,
[&pdim]( const cbl_refer_t& r ) {
auto psub = std::find_if( r.subscripts.begin(), r.subscripts.end(),
[pdim]( const cbl_refer_t& r ) mutable {
const auto& occurs((*pdim)->occurs);
pdim++;
return ! occurs.subscript_ok(r.field);
} );
isub = p - r.subscripts;
return p == esub? NULL : dims[isub];
isub = psub - r.subscripts.begin();
return psub == r.subscripts.end()? NULL : dims[isub];
}
size_t
cbl_refer_t::subscripts_set( const std::list<cbl_refer_t>& subs ) {
nsubscript = subs.size();
subscripts = new cbl_refer_t[nsubscript];
std::copy( subs.begin(), subs.end(), subscripts );
subscripts.clear();
std::copy( subs.begin(), subs.end(), std::back_inserter(subscripts) );
return dimensions(field);
}
@ -1004,7 +1000,7 @@ const char *
cbl_refer_t::str() const {
static char subscripts[64];
sprintf(subscripts, "(%u of " HOST_SIZE_T_PRINT_UNSIGNED " dimensions)",
nsubscript, (fmt_size_t)dimensions(field));
nsubscript(), (fmt_size_t)dimensions(field));
char *output = xasprintf("%s %s %s",
field? field_str(field) : "(none)",
0 < dimensions(field)? subscripts : "",
@ -1020,18 +1016,18 @@ cbl_refer_t::name() const {
const char *
cbl_refer_t::deref_str() const {
std::vector<char> dimstr(nsubscript * 16, '\0');
std::vector<char> dimstr(nsubscript() * 16, '\0');
dimstr.at(0) = '(';
auto p = dimstr.begin() + 1;
if( !field ) return name();
for( auto sub = subscripts; sub < subscripts + nsubscript; sub++ ) {
auto initial = sub->field->data.initial ? sub->field->data.initial : "?";
for( const auto& sub : subscripts ) {
auto initial = sub.field->data.initial ? sub.field->data.initial : "?";
size_t len = dimstr.end() - p;
p += snprintf( &*p, len, "%s ", initial );
}
if( 0 < nsubscript ) {
if( ! subscripts.empty() ) {
*--p = ')';
}
char *output = xasprintf("%s%s", field->name, dimstr.data());
@ -1383,7 +1379,7 @@ public:
{
assert(isym);
}
procdef_t( const procref_base_t& ref )
explicit procdef_t( const procref_base_t& ref )
: procref_base_t(ref)
, isym(0)
{}
@ -1392,13 +1388,6 @@ public:
return procref_base_t(*this) < procref_base_t(that);
}
bool operator<( const procref_base_t& that ) const {
if( that.has_section() ) {
return procref_base_t(*this) < that;
}
return strcasecmp(paragraph(), that.paragraph()) < 0;
}
cbl_label_t * label_of() const {
return isym == 0? NULL : cbl_label_of(symbol_at(isym));
}
@ -1429,7 +1418,7 @@ static procedures_t::iterator current_procedure = programs.end()->second.end();
class procedure_match {
const procref_base_t& ref;
public:
procedure_match( const procref_base_t& ref ) : ref(ref) {}
explicit procedure_match( const procref_base_t& ref ) : ref(ref) {}
// Match a 2-name reference to section & paragraph, else to one or the other.
bool operator()( procedures_t::const_reference elem ) {
const procdef_t& key = elem.first;
@ -1457,7 +1446,7 @@ locally_unique( size_t program, const procdef_t& key, const procref_t& ref ) {
const char *section_name = ref.has_section()? ref.section() : key.section();
procref_base_t full_ref(section_name, ref.paragraph());
return 1 == procedures.count(full_ref);
return 1 == procedures.count(procdef_t(full_ref));
}
// Add each section and paragraph to the map as it occurs in the Cobol text.
@ -1519,9 +1508,9 @@ ambiguous_reference( size_t program ) {
if( proc.second.end() != ambiguous ) {
if( yydebug ) {
dbgmsg("%s: %s of '%s' has " HOST_SIZE_T_PRINT_UNSIGNED
"potential matches", __func__,
ambiguous->paragraph(), ambiguous->section(),
(fmt_size_t)procedures.count(*ambiguous));
"potential matches", __func__,
ambiguous->paragraph(), ambiguous->section(),
(fmt_size_t)procedures.count(procdef_t(*ambiguous)));
}
return new procref_t(*ambiguous);
}
@ -1548,7 +1537,7 @@ intradeclarative_reference() {
class next_group {
size_t isym;
public:
next_group( symbol_elem_t *group ) : isym(symbol_index(group)) {}
explicit next_group( const symbol_elem_t *group ) : isym(symbol_index(group)) {}
// return true if elem is not a member of the group
bool operator()( const symbol_elem_t& elem ) {
@ -1595,7 +1584,7 @@ public:
static bool
any_redefines( const cbl_field_t& field, const symbol_elem_t *group ) {
for( const cbl_field_t *f = &field; f && f->parent > 0; f = parent_of(f) ) {
symbol_elem_t *e = symbol_at(f->parent);
const symbol_elem_t *e = symbol_at(f->parent);
if( e == group || e->type != SymField ) break;
if( symbol_redefines(f) ) return true;
}
@ -1796,7 +1785,7 @@ class unique_stack : public std::stack<input_file_t>
bool push( const value_type& value ) {
auto ok = std::none_of( c.cbegin(), c.cend(),
[value]( auto& that ) {
[value]( const auto& that ) {
return value == that;
} );
if( ok ) {
@ -1834,7 +1823,7 @@ class unique_stack : public std::stack<input_file_t>
void print() const {
std::string input( top().name );
printf( "%s: ", input.c_str() );
for( auto name : all_names ) {
for( const auto& name : all_names ) {
if( name != input )
printf( "\\\n\t%s ", name.c_str() );
}
@ -1863,7 +1852,7 @@ void cobol_set_pp_option(int opt) {
* to enforce uniqueness, and the scanner to maintain line numbers.
*/
bool cobol_filename( const char *name, ino_t inode ) {
line_map *lines = NULL;
const line_map *lines = NULL;
if( inode == 0 ) {
auto p = old_filenames.find(name);
if( p == old_filenames.end() ) {
@ -1943,11 +1932,9 @@ verify_format( const char gmsgid[] ) {
static regex_t re;
static int cflags = REG_EXTENDED;
static int status = regcomp( &re, pattern, cflags );
static char errbuf[80];
if( status != 0 ) {
static char errbuf[80];
int n = regerror(status, &re, errbuf, sizeof(errbuf));
gcc_assert(size_t(n) < sizeof(errbuf));
fprintf(stderr, "%s:%d: %s", __func__, __LINE__, errbuf);
@ -1988,7 +1975,7 @@ extern YYLTYPE yylloc;
* the global token_location, which is passed to the diagnostic framework. The
* original value is restored when the instantiated variable goes out of scope.
*/
class temp_loc_t : protected YYLTYPE {
class temp_loc_t {
location_t orig;
public:
temp_loc_t() : orig(token_location) {
@ -1996,10 +1983,10 @@ class temp_loc_t : protected YYLTYPE {
gcc_location_set(yylloc); // use lookahead location
}
temp_loc_t( const YYLTYPE& loc) : orig(token_location) {
explicit temp_loc_t( const YYLTYPE& loc) : orig(token_location) {
gcc_location_set(loc);
}
temp_loc_t( const YDFLTYPE& loc) : orig(token_location) {
explicit temp_loc_t( const YDFLTYPE& loc) : orig(token_location) {
YYLTYPE lloc = {
loc.first_line, loc.first_column,
loc.last_line, loc.last_column };
@ -2246,7 +2233,7 @@ os_locale_t os_locale = { "UTF-8", xstrdup("C.UTF-8") };
void
cobol_parse_files (int nfile, const char **files)
{
char * opaque = setlocale(LC_CTYPE, "");
const char * opaque = setlocale(LC_CTYPE, "");
if( ! opaque ) {
yywarn("setlocale: unable to initialize LOCALE");
} else {

View File

@ -50,4 +50,11 @@ const char * cobol_lineno_save();
unsigned long gb4( size_t input );
template <typename P>
static inline const void *
as_voidp( P p ) {
return static_cast<const void *>(p);
}
#endif

View File

@ -570,7 +570,7 @@ class cbl_enabled_exceptions_t : protected std::set<cbl_enabled_exception_t>
: std::set<cbl_enabled_exception_t>(ecs, ecs + nec)
{}
void turn_on_off( bool enabled, bool location, ec_type_t type,
std::set<size_t> files );
const std::set<size_t>& files );
const cbl_enabled_exception_t * match( ec_type_t ec, size_t file = 0 ) const;