Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New option --copy COPYBOOK, to include a COPYBOOK #114

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ NEWS - user visible changes -*- outline -*-

* Changes to the COBOL compiler (cobc) options:

** New option --copy COPYBOOK to load copybooks before parsing files. This
option can typically be used to perform replacements without modifying
the source code, or to add prototypes for external calls.

** New option --include FILE.h to add a #include in the generated C file.
This option can typically be used to force the C compiler to check static
calls to externals. The files are put into quotes, unless they start by
'<'. Quoted files are expected to have absolute paths, as the C compiler
is called in a temp directory instead of the project directory.

** output of unlimited errors may be requested by -fmax-errors=0,
to stop compiliation at first error use -Wfatal-errors
** default value for -fmax-errors was changed from 128 to 20
Expand Down
14 changes: 14 additions & 0 deletions cobc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@

2023-10-12 Fabrice Le Fessant <[email protected]>

* cobc.c, codegen.c: new option --include FILE, to #include
GitMensch marked this conversation as resolved.
Show resolved Hide resolved
additional files in the C generated code. Such files can be
used to statically check the number of arguments in static
calls, for example. The files are put into quotes, unless
they start by '<'. Since C files are compiled in a temp dir,
quoted files should be absolute paths. Implementing FR #176

2023-10-11 Fabrice Le Fessant <[email protected]>

* cobc.c, pplex.l: new option --copy COPYBOOK, to include a COPYBOOK
before reading the source file

2023-11-29 Fabrice Le Fessant <[email protected]>

* cobc.c (cobc_clean_up): when save-temps specifies a directory,
Expand Down
54 changes: 48 additions & 6 deletions cobc/cobc.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,9 @@ enum compile_level {
#define CB_FLAG_GETOPT_NO_DUMP 13
#define CB_FLAG_GETOPT_EBCDIC_TABLE 14
#define CB_FLAG_GETOPT_DEFAULT_COLSEQ 15
#define CB_FLAG_MEMORY_CHECK 16
#define CB_FLAG_GETOPT_MEMORY_CHECK 16
#define CB_FLAG_GETOPT_COPY_FILE 17
#define CB_FLAG_GETOPT_INCLUDE_FILE 18


/* Info display limits */
Expand Down Expand Up @@ -171,8 +173,8 @@ enum compile_level {
#define GC_C_VERSION _("unknown")
#endif

#define CB_TEXT_LIST_ADD(y,z) y = cb_text_list_add (y, z)
#define CB_TEXT_LIST_CHK(y,z) y = cb_text_list_chk (y, z)
#define CB_TEXT_LIST_ADD(list,z) list = cb_text_list_add (list, z)
#define CB_TEXT_LIST_CHK(list,z) list = cb_text_list_chk (list, z)

#ifdef _MSC_VER
#define CB_COPT_0 " /Od"
Expand Down Expand Up @@ -232,6 +234,8 @@ const char *cb_cobc_build_stamp = NULL;
const char *demangle_name = NULL;
const char *cb_storage_file_name = NULL;
const char *cb_call_extfh = NULL;
struct cb_text_list *cb_copy_list = NULL;
struct cb_text_list *cb_include_file_list = NULL;
struct cb_text_list *cb_include_list = NULL;
struct cb_text_list *cb_depend_list = NULL;
struct cb_text_list *cb_intrinsic_list = NULL;
Expand Down Expand Up @@ -595,6 +599,8 @@ static const struct option long_options[] = {
{"save-temps", CB_OP_ARG, NULL, '_'},
{"std", CB_RQ_ARG, NULL, '$'},
{"conf", CB_RQ_ARG, NULL, '&'},
{"copy", CB_RQ_ARG, NULL, CB_FLAG_GETOPT_COPY_FILE},
{"include", CB_RQ_ARG, NULL, CB_FLAG_GETOPT_INCLUDE_FILE},
{"debug", CB_NO_ARG, NULL, 'd'},
{"ext", CB_RQ_ARG, NULL, 'e'}, /* note: kept *undocumented* until GC4, will be changed to '.' */
{"free", CB_NO_ARG, NULL, 'F'}, /* note: not assigned directly as this is only valid for */
Expand Down Expand Up @@ -3282,12 +3288,12 @@ process_command_line (const int argc, char **argv)
cobc_wants_debug = 1;
break;

case 8:
case CB_FLAG_GETOPT_DUMP: /* 8 */
/* -fdump=<scope> : Add sections for dump code generation */
cobc_def_dump_opts (cob_optarg, 1);
break;

case 13:
case CB_FLAG_GETOPT_NO_DUMP: /* 13 */
/* -fno-dump=<scope> : Suppress sections in dump code generation */
if (cob_optarg) {
cobc_def_dump_opts (cob_optarg, 0);
Expand Down Expand Up @@ -3892,7 +3898,7 @@ process_command_line (const int argc, char **argv)
}
break;

case CB_FLAG_MEMORY_CHECK: /* 16 */
case CB_FLAG_GETOPT_MEMORY_CHECK: /* 16 */
/* -fmemory-check=<scope> : */
if (!cob_optarg) {
cb_flag_memory_check = CB_MEMCHK_ALL;
Expand All @@ -3901,6 +3907,26 @@ process_command_line (const int argc, char **argv)
}
break;

case CB_FLAG_GETOPT_COPY_FILE: /* 17 */
/* --copy=<file> : COPY file at beginning */
GitMensch marked this conversation as resolved.
Show resolved Hide resolved
if (strlen (cob_optarg) > (COB_MINI_MAX)) {
cobc_err_exit (COBC_INV_PAR, "--copy");
}
CB_TEXT_LIST_ADD (cb_copy_list,
cobc_strdup (cob_optarg));
break;

case CB_FLAG_GETOPT_INCLUDE_FILE: /* 18 */
/* -include=<file.h> : add #include "file.h" to
generated C file */
if (strlen (cob_optarg) > (COB_MINI_MAX)) {
cobc_err_exit (COBC_INV_PAR, "--include");
}
CB_TEXT_LIST_ADD (cb_include_file_list,
cobc_strdup (cob_optarg));
cb_flag_c_decl_for_static_call = 0;
break;

case 'A':
/* -A <xx> : Add options to C compile phase */
COBC_ADD_STR (cobc_cflags, " ", cob_optarg, NULL);
Expand Down Expand Up @@ -9266,6 +9292,22 @@ main (int argc, char **argv)
finish_setup_compiler_env ();
finish_setup_internal_env ();

{
struct cb_text_list *l;
for (l = cb_copy_list; l; l=l->next){
const char *filename;
int has_ext;
char name[COB_MINI_BUFF];
int len = strlen (l->text);
memcpy (name, l->text, len+1);
has_ext = (strchr (name, '.') != NULL);
filename = cb_copy_find_file (name, has_ext);
if (!filename){
cobc_err_exit (_("fatal error: could not find --copy argument %s"), name);
}
}
}

/* Reset source format in case text column has been configured manually. */
cobc_set_source_format (cobc_get_source_format ());

Expand Down
3 changes: 3 additions & 0 deletions cobc/cobc.h
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,8 @@ extern FILE *cb_listing_file;
extern FILE *cb_src_list_file;
extern FILE *cb_depend_file;
extern struct cb_text_list *cb_depend_list;
extern struct cb_text_list *cb_copy_list;
extern struct cb_text_list *cb_include_file_list;
extern struct cb_text_list *cb_include_list;
extern struct cb_text_list *cb_intrinsic_list;
extern struct cb_text_list *cb_extension_list;
Expand Down Expand Up @@ -652,6 +654,7 @@ extern void cb_plex_error (const size_t,
const char *, ...) COB_A_FORMAT23;
extern unsigned int cb_plex_verify (const size_t, const enum cb_support,
const char *);
extern const char *cb_copy_find_file (char *name, int has_ext);
extern void configuration_warning (const char *, const int,
const char *, ...) COB_A_FORMAT34;
extern void configuration_error (const char *, const int,
Expand Down
11 changes: 11 additions & 0 deletions cobc/codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -1829,6 +1829,17 @@ output_gnucobol_defines (const char *formatted_date)
current_compile_tm.tm_sec;
output_line ("#define COB_MODULE_TIME\t\t%d", i);

{
struct cb_text_list *l = cb_include_file_list ;
for (;l;l=l->next){
if (l->text[0] == '<'){
output_line ("#include %s", l->text);
} else {
output_line ("#include \"%s\"", l->text);
}
}
}

}

/* CALL cache */
Expand Down
2 changes: 1 addition & 1 deletion cobc/flag.def
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ CB_FLAG (cb_flag_stack_check, 1, "stack-check",
_(" -fstack-check PERFORM stack checking\n"
" * turned on by --debug/-g"))

CB_FLAG_OP (1, "memory-check", CB_FLAG_MEMORY_CHECK,
CB_FLAG_OP (1, "memory-check", CB_FLAG_GETOPT_MEMORY_CHECK,
_(" -fmemory-check=<scope> checks for invalid writes to internal storage,\n"
" <scope> may be one of: all, pointer, using, none\n"
" * default: none, set to all by --debug"))
Expand Down
4 changes: 4 additions & 0 deletions cobc/help.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,11 @@ cobc_print_usage_common_options (void)
puts (_(" -X, --Xref specify cross reference in listing"));
#endif
puts (_(" -I <directory> add <directory> to copy/include search path"));
puts (_(" --copy <copybook> include <copybook> at beginning of file,\n"
" as would COPY copybook."));
puts (_(" -L <directory> add <directory> to library search path"));
puts (_(" --include <file.h> add a #include \"file.h\" at the beginning of the C\n"
" generated file (implies -fno-gen-c-decl-static-call)"));
puts (_(" -l <lib> link the library <lib>"));
puts (_(" -K <entry> generate CALL to <entry> as static"));
puts (_(" -D <define> define <define> for COBOL compilation"));
Expand Down
59 changes: 45 additions & 14 deletions cobc/pplex.l
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,21 @@ static int ppwrap (void) {
return 1;
}

static void insert_copy_arg (void);

#define PPLEX_BUFF_LEN 512
#define YY_INPUT(buf,result,max_size) result = ppinput (buf, max_size);
#define ECHO fputs (yytext, yyout)

/* The first --copy COPYBOOK is inserted using this macro. The next
ones will be inserted in <<EOF>>, when we come back to the toplevel
source file. */
#define YY_USER_INIT \
if (!plexbuff1) { \
plexbuff1 = cobc_malloc ((size_t)COB_SMALL_BUFF); \
} \
if (!plexbuff2) { \
plexbuff2 = cobc_malloc ((size_t)COB_SMALL_BUFF); \
} \
requires_listing_line = 1; \
comment_allowed = 1;
comment_allowed = 1; \
copy_list_pointer = cb_copy_list; \
insert_copy_arg ();


#include "config.h"

Expand Down Expand Up @@ -179,6 +181,20 @@ static void output_pending_newlines (FILE *);
static struct cb_text_list *pp_text_list_add (struct cb_text_list *,
const char *, const size_t);

static struct cb_text_list *copy_list_pointer = NULL;

static void insert_copy_arg (void)
{
if (copy_list_pointer != NULL){
int ret = ppcopy (copy_list_pointer->text, NULL, NULL);
if ( ret < 0 ){ /* This should never happen, as we already test it before */
cobc_err_msg (_("fatal error: %s"), "could not find --copy argument");
cobc_abort_terminate (0);
}
copy_list_pointer = copy_list_pointer->next;
}
}

%}

WORD [_0-9A-Z\x80-\xFF-]+
Expand Down Expand Up @@ -1205,6 +1221,13 @@ ENDIF_DIRECTIVE_STATE>{
copy_stack = current_copy_info->next;
cobc_free (current_copy_info->dname);
cobc_free (current_copy_info);

/* Check whether we are back at the toplevel source file. In this case,
check if there is a pending copy argument (--copy COPYBOOK) waiting
to be inserted. */
if (copy_stack->next == NULL){
insert_copy_arg();
}
}

%%
Expand Down Expand Up @@ -1480,6 +1503,10 @@ ppcopy_try_open (const char *dir, const char *name, int has_ext)
const char *extension = "";
struct stat st;

if (!plexbuff2) {
plexbuff2 = cobc_malloc ((size_t)COB_SMALL_BUFF);
}

for (;;) {
if (dir) {
snprintf (plexbuff2, (size_t)COB_SMALL_MAX, "%s%c%s%s",
Expand Down Expand Up @@ -1520,8 +1547,8 @@ ppcopy_try_open (const char *dir, const char *name, int has_ext)
each with all known copybook extensions:
1 - as is
2 - all known copybook directories */
static const char *
ppcopy_find_file (char *name, int has_ext)
const char *
cb_copy_find_file (char *name, int has_ext)
{
const char *filename;
{
Expand Down Expand Up @@ -1597,6 +1624,10 @@ ppcopy (const char *name, const char *lib, struct cb_replace_list *replace_list)
cb_current_file->copy_line = cb_source_line;
}

if (!plexbuff1) {
plexbuff1 = cobc_malloc ((size_t)COB_SMALL_BUFF);
}

/* TODO: open with path relative to the current file's path,
if any (applies both to with and without "lib") */

Expand All @@ -1620,10 +1651,10 @@ ppcopy (const char *name, const char *lib, struct cb_replace_list *replace_list)
snprintf (plexbuff1, (size_t)COB_SMALL_MAX, "%s%c%s",
lib_env, SLASH_CHAR, name);
plexbuff1[COB_SMALL_MAX] = 0;
filename = ppcopy_find_file (plexbuff1, has_ext);
filename = cb_copy_find_file (plexbuff1, has_ext);
} else {
strcpy (plexbuff1, name);
filename = ppcopy_find_file (plexbuff1, has_ext);
filename = cb_copy_find_file (plexbuff1, has_ext);
}
}
}
Expand All @@ -1634,13 +1665,13 @@ ppcopy (const char *name, const char *lib, struct cb_replace_list *replace_list)
snprintf (plexbuff1, (size_t)COB_SMALL_MAX, "%s%c%s",
lib, SLASH_CHAR, name);
plexbuff1[COB_SMALL_MAX] = 0;
filename = ppcopy_find_file (plexbuff1, has_ext);
filename = cb_copy_find_file (plexbuff1, has_ext);
}

/* try without library name, if not resolved by env */
if (!filename && !lib_env) {
strcpy (plexbuff1, name);
filename = ppcopy_find_file (plexbuff1, has_ext);
filename = cb_copy_find_file (plexbuff1, has_ext);
if (filename) {
cb_plex_warning (COBC_WARN_FILLER, 0,
_("copybook not found in library '%s', library-name ignored"),
Expand All @@ -1656,7 +1687,7 @@ ppcopy (const char *name, const char *lib, struct cb_replace_list *replace_list)
}
} else {
strcpy (plexbuff1, name);
filename = ppcopy_find_file (plexbuff1, has_ext);
filename = cb_copy_find_file (plexbuff1, has_ext);
}

/* expected case: filename found */
Expand Down
19 changes: 18 additions & 1 deletion cobc/replace.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,17 @@ STRING_OF_LIST(token)
/* string_of_text_list (...) */
STRING_OF_LIST(text)

static void dump_replacement(struct cb_replacement_state* repls)
{
fprintf(stderr, "dump_replacement('%s'):\n", repls->name);
struct cb_replace_list *list = repls->replace_list ;
for (;list;list = list->next){
fprintf(stderr, " replace: %s\n", string_of_text_list (list->src->text_list));
fprintf(stderr, " by: %s\n", string_of_text_list (list->new_text));
}
fprintf(stderr, "=================================================================\n");
}

#endif /* DEBUG_REPLACE */

/* global state */
Expand Down Expand Up @@ -759,7 +770,6 @@ cb_free_replace (void)
reset_replacements (copy_repls);
reset_replacements (replace_repls);
#endif

cobc_free (copy_repls);
copy_repls = NULL;

Expand All @@ -772,6 +782,10 @@ cb_free_replace (void)
struct cb_replace_list *
cb_get_copy_replacing_list (void)
{
#ifdef DEBUG_REPLACE_TRACE
fprintf (stderr, "cb_get_copy_replacing_list()\n");
#endif

if (copy_repls == NULL) {
#ifdef DEBUG_REPLACE_TRACE
int i;
Expand Down Expand Up @@ -845,4 +859,7 @@ cb_set_replace_list (struct cb_replace_list *list, const int is_pushpop)
if (cb_src_list_file) {
cb_set_print_replace_list (list);
}
#ifdef DEBUG_REPLACE_TRACE
dump_replacement(replace_repls);
#endif
}
Loading
Loading