blob: 0d97aeff6e8190c1bb707090508a2aba4898cabf [file]
/*
* Copyright (c) 2021-2026 Symas Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of the Symas Corporation nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <fcntl.h>
#include <unistd.h>
#include <cctype>
#include <cerrno>
#include <cmath>
#include <cfenv>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include "ec.h"
#include "io.h"
#include "common-defs.h"
#include "gcobolio.h"
#include "cobol-endian.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwrite-strings"
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
// There are global variables that need to be initialized at the point where
// the very first PROGRAM-ID is executed. This flag is used to make sure that
// initialization happens just once.
int __gg__globals_are_initialized = 0;
#if COBOL_BIG_ENDIAN
#define endian big_endian_e
#else
#define endian none_e
#endif
unsigned char __gg__data_spaces[1] = {' '};
struct cblc_field_t __ggsr__spaces = {
.data = __gg__data_spaces ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 0 ,
.name = "SPACES" ,
.picture = "" ,
.initial = (char *)space_value_e ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = quoted_e | constant_e | register_e | space_value_e,
.type = FldAlphanumeric ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_low_values[1] = {'\0'};
struct cblc_field_t __ggsr__low_values = {
.data = __gg__data_low_values,
.capacity = 1 ,
.allocated = 1 ,
.offset = 0 ,
.name = "LOW_VALUES" ,
.picture = "" ,
.initial = (char *)low_value_e ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = quoted_e | constant_e | register_e | low_value_e ,
.type = FldAlphanumeric ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_zeros[1] = {'0'};
struct cblc_field_t __ggsr__zeros = {
.data = __gg__data_zeros ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 0 ,
.name = "ZEROS" ,
.picture = "" ,
.initial = (char *)zero_value_e ,
.parent = NULL ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = quoted_e | constant_e | register_e | zero_value_e ,
.type = FldAlphanumeric ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_high_values[1] = {0xFF};
struct cblc_field_t __ggsr__high_values = {
.data = __gg__data_high_values ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 0 ,
.name = "HIGH_VALUES" ,
.picture = "" ,
.initial = (char *)high_value_e ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = quoted_e | constant_e | register_e | high_value_e ,
.type = FldAlphanumeric ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_quotes[1] = {0xFF};
struct cblc_field_t __ggsr__quotes = {
.data = __gg__data_quotes ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 0 ,
.name = "QUOTES" ,
.picture = "" ,
.initial = (char *)quote_value_e ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = quoted_e | constant_e | register_e | quote_value_e ,
.type = FldAlphanumeric ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_nulls[8] = {0,0,0,0,0,0,0,0};
struct cblc_field_t __ggsr__nulls = {
.data = __gg__data_nulls ,
.capacity = 8 ,
.allocated = 8 ,
.offset = 0 ,
.name = "NULLS" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = constant_e | register_e | null_value_e ,
.type = FldPointer ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data__file_status[2] = {0,0};
struct cblc_field_t __ggsr___file_status = {
.data = __gg__data__file_status ,
.capacity = 2 ,
.allocated = 2 ,
.offset = 0 ,
.name = "_FILE_STATUS" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e ,
.type = FldNumericDisplay ,
.level = 0 ,
.digits = 2 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_upsi_0[2] = {0,0};
struct cblc_field_t __ggsr__upsi_0 = {
.data = __gg__data_upsi_0 ,
.capacity = 2 ,
.allocated = 2 ,
.offset = 0 ,
.name = "UPSI-0" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | endian,
.type = FldNumericBin5 ,
.level = 0 ,
.digits = 4 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg___data_dev_stdin[] = "/dev/stdin";
struct cblc_field_t __ggsr___dev_stdin = {
.data = __gg___data_dev_stdin ,
.capacity = sizeof(__gg___data_dev_stdin)-1 ,
.allocated = sizeof(__gg___data_dev_stdin)-1 ,
.offset = 0 ,
.name = "_dev_stdin" ,
.picture = "" ,
.initial = "/dev/stdin" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = constant_e | quoted_e | register_e ,
.type = FldLiteralA ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg___data_dev_stdout[] = "/dev/stdout";
struct cblc_field_t __ggsr___dev_stdout = {
.data = __gg___data_dev_stdout ,
.capacity = sizeof(__gg___data_dev_stdout)-1 ,
.allocated = sizeof(__gg___data_dev_stdout)-1 ,
.offset = 0 ,
.name = "_dev_stdout" ,
.picture = "" ,
.initial = "/dev/stdout" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = constant_e | quoted_e | register_e ,
.type = FldLiteralA ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg___data_dev_stderr[] = "/dev/stderr";
struct cblc_field_t __ggsr___dev_stderr = {
.data = __gg___data_dev_stderr ,
.capacity = sizeof(__gg___data_dev_stderr)-1 ,
.allocated = sizeof(__gg___data_dev_stderr)-1 ,
.offset = 0 ,
.name = "_dev_stderr" ,
.picture = "" ,
.initial = "/dev/stderr" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = constant_e | quoted_e | register_e ,
.type = FldLiteralA ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg___data_dev_null[] = "/dev/null";
struct cblc_field_t __ggsr___dev_null = {
.data = __gg___data_dev_null ,
.capacity = sizeof(__gg___data_dev_null)-1 ,
.allocated = sizeof(__gg___data_dev_null)-1 ,
.offset = 0 ,
.name = "_dev_null" ,
.picture = "" ,
.initial = "/dev/null" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = constant_e | quoted_e | register_e ,
.type = FldLiteralA ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data_argi[] = {0,0,0,0};
struct cblc_field_t __ggsr__argi = {
.data = __gg__data_argi ,
.capacity = 4 ,
.allocated = 4 ,
.offset = 0 ,
.name = "_ARGI" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = global_e | endian,
.type = FldNumericBin5 ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char __gg__data__literally_zero[] = {0,0,0,0};
struct cblc_field_t __ggsr___literally_zero = {
.data = __gg__data__literally_zero ,
.capacity = 4 ,
.allocated = 4 ,
.offset = 0 ,
.name = "_literally_zero" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | endian,
.type = FldNumericBin5 ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
#if COBOL_BIG_ENDIAN
unsigned char __gg__data__literally_one[] = {0,0,0,1};
#else
unsigned char __gg__data__literally_one[] = {1,0,0,0};
#endif
struct cblc_field_t __ggsr__literally_one = {
.data = __gg__data__literally_one ,
.capacity = 4 ,
.allocated = 4 ,
.offset = 0 ,
.name = "_literally_one" ,
.picture = "" ,
.initial = "" ,
.parent = NULL,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | endian,
.type = FldNumericBin5 ,
.level = 0 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
/* The following defines storage for the global DEBUG-ITEM:
01 DEBUG-ITEM.
02 DEBUG-LINE PIC X(6).
02 FILLER PIC X VALUE SPACE.
02 DEBUG-NAME PIC X(30).
02 FILLER PIC X VALUE SPACE.
02 DEBUG-SUB-1 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
02 FILLER PIC X VALUE SPACE.
02 DEBUG-SUB-2 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
02 FILLER PIC X VALUE SPACE.
02 DEBUG-SUB-3 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
02 FILLER PIC X VALUE SPACE.
02 DEBUG-CONTENTS PIC X(76).
*/
unsigned char __gg__data_debug_item[132] =
" "
"+0000 +0000 +0000 "
" "
" ";
struct cblc_field_t __ggsr__debug_item = {
.data = __gg__data_debug_item ,
.capacity = 132 ,
.allocated = 132 ,
.offset = 0 ,
.name = "DEBUG-ITEM" ,
.picture = "" ,
.initial = " "
"+0000 +0000 +0000 "
" "
" " ,
.parent = NULL ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = external_e | register_e ,
.type = FldGroup ,
.level = 01 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_line = __gg__data_debug_item;
struct cblc_field_t __ggsr__debug_line = {
.data = __gg__data_debug_line ,
.capacity = 6 ,
.allocated = 6 ,
.offset = 0 ,
.name = "DEBUG-LINE" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = external_e | register_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_filler_1 = &__gg__data_debug_item[6];
struct cblc_field_t __ggsr__debug_filler_1 = {
.data = __gg__data_debug_item ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 6 ,
.name = "FILLER" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = external_e | register_e | filler_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_name = &__gg__data_debug_item[7];
struct cblc_field_t __ggsr__debug_name = {
.data = __gg__data_debug_name ,
.capacity = 30 ,
.allocated = 30 ,
.offset = 7 ,
.name = "DEBUG-NAME" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = external_e | register_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_filler_2 = &__gg__data_debug_item[37];
struct cblc_field_t __ggsr__debug_filler_2 = {
.data = __gg__data_debug_filler_2 ,
.capacity = 1 ,
.allocated = 1 ,
.offset = 37 ,
.name = "FILLER" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = external_e | register_e | filler_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_sub_1 = &__gg__data_debug_item[38];
struct cblc_field_t __ggsr__debug_sub_1 = {
.data = __gg__data_debug_sub_1 ,
.capacity = 5 ,
.allocated = 5 ,
.offset = 38 ,
.name = "DEBUG-SUB-1" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = signable_e | external_e | register_e | leading_e | separate_e ,
.type = FldNumericDisplay ,
.level = 05 ,
.digits = 4 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_filler_3 = &__gg__data_debug_item[43];
struct cblc_field_t __ggsr__debug_filler_3 = {
.data = __gg__data_debug_filler_3 ,
.capacity = 1,
.allocated = 1,
.offset = 43,
.name = "FILLER" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | filler_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_sub_2 = &__gg__data_debug_item[44];
struct cblc_field_t __ggsr__debug_sub_2 = {
.data = __gg__data_debug_sub_2 ,
.capacity = 5 ,
.allocated = 5 ,
.offset = 44 ,
.name = "DEBUG-SUB-2" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = signable_e | register_e | leading_e | separate_e ,
.type = FldNumericDisplay ,
.level = 05 ,
.digits = 4 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_filler_4 = &__gg__data_debug_item[49];
struct cblc_field_t __ggsr__debug_filler_4 = {
.data = __gg__data_debug_filler_4 ,
.capacity = 1,
.allocated = 1,
.offset = 49,
.name = "FILLER" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | filler_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_sub_3 = &__gg__data_debug_item[50];
struct cblc_field_t __ggsr__debug_sub_3 = {
.data = __gg__data_debug_sub_3 ,
.capacity = 5 ,
.allocated = 5 ,
.offset = 50 ,
.name = "DEBUG-SUB-3" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = signable_e | register_e | leading_e | separate_e ,
.type = FldNumericDisplay ,
.level = 05 ,
.digits = 4 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_filler_5 = &__gg__data_debug_item[55];
struct cblc_field_t __ggsr__debug_filler_5 = {
.data = __gg__data_debug_filler_5 ,
.capacity = 1,
.allocated = 1,
.offset = 55,
.name = "FILLER" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e | filler_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
unsigned char *__gg__data_debug_contents = &__gg__data_debug_item[56];
struct cblc_field_t __ggsr__debug_contents = {
.data = __gg__data_debug_contents ,
.capacity = 76 ,
.allocated = 76 ,
.offset = 56 ,
.name = "DEBUG-CONTENTS" ,
.picture = "" ,
.initial = NULL ,
.parent = &__ggsr__debug_item ,
.occurs_lower = 0 ,
.occurs_upper = 0 ,
.attr = register_e ,
.type = FldAlphanumeric ,
.level = 05 ,
.digits = 0 ,
.rdigits = 0 ,
.encoding = iconv_CP1252_e ,
.alphabet = 0 ,
};
#pragma GCC diagnostic pop