From f9db35ea440d212cb2150cd734b736399166a6d7 Mon Sep 17 00:00:00 2001 From: engboris Date: Thu, 25 Apr 2024 19:15:43 +0200 Subject: [PATCH 01/12] Add >>IMP INCLUDE directive --- NEWS | 3 ++ cobc/ChangeLog | 12 ++++++ cobc/cobc.h | 3 +- cobc/codegen.c | 21 +++++++-- cobc/pplex.l | 16 +++++++ cobc/ppparse.y | 28 ++++++++++++ cobc/scanner.l | 26 +++++++++++ doc/gnucobol.texi | 2 + tests/testsuite.src/syn_misc.at | 64 ++++++++++++++++++++++++++++ tests/testsuite.src/used_binaries.at | 16 ++++++- 10 files changed, 185 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 8f0d220fb..df2e10705 100644 --- a/NEWS +++ b/NEWS @@ -54,6 +54,9 @@ NEWS - user visible changes -*- outline -*- 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. + The directive >>IMP INCLUDE "file.h", >>IMP INCLUDE "", + >>IMP INCLUDE or >>IMP INCLUDE file.h can be used as an alternative + to this compiler option. ** output of unlimited errors may be requested by -fmax-errors=0, to stop compiliation at first error use -Wfatal-errors diff --git a/cobc/ChangeLog b/cobc/ChangeLog index fea626e9a..ed6d26fbb 100644 --- a/cobc/ChangeLog +++ b/cobc/ChangeLog @@ -147,6 +147,12 @@ compiler aborts on broken expressions, bugs #933, #938 and #966 * typeck.c: minor refactoring within functions +2024-04-25 Boris Eng + + * cobc.h, pplex.l, ppparse.y: new >>IMP INCLUDE directive to include + multiple header files in the C generated code. Has the same behavior as the + --include compiler option. + 2024-04-24 Fabrice Le Fessant * replace.c: optimize speed and memory usage. For speed, we add two @@ -157,6 +163,12 @@ replace stream) and we use a circular buffer for the temporary queue of tokens instead of a list. +2024-04-25 Boris Eng + + * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: + new >>IMP INCLUDE directive to include one or multiple header files in + the generated C code (same behavior as the --include compiler option) + 2024-03-17 Fabrice Le Fessant Emilien Lemaire diff --git a/cobc/cobc.h b/cobc/cobc.h index 2c1bcf2ca..b90036d85 100644 --- a/cobc/cobc.h +++ b/cobc/cobc.h @@ -276,7 +276,7 @@ enum cb_sub_check { struct cb_text_list { struct cb_text_list *next; /* next pointer */ struct cb_text_list *last; - const char *text; + char *text; }; /* Structure for extended filenames */ @@ -480,6 +480,7 @@ 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_include_file_list_directive; extern struct cb_text_list *cb_intrinsic_list; extern struct cb_text_list *cb_extension_list; extern struct cb_text_list *cb_static_call_list; diff --git a/cobc/codegen.c b/cobc/codegen.c index c46d67f24..7221b4cd9 100644 --- a/cobc/codegen.c +++ b/cobc/codegen.c @@ -1833,16 +1833,29 @@ output_gnucobol_defines (const char *formatted_date) 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] == '<'){ + struct cb_text_list *l; + struct cb_text_list *last = NULL; + for (l = cb_include_file_list; l; l = l->next) { + if (l->text[0] == '<') { output_line ("#include %s", l->text); } else { output_line ("#include \"%s\"", l->text); } } - } + for (l = cb_include_file_list_directive; l; l = l->next) { + if (last != NULL) { + cobc_free (last->text); + cobc_free (last); + } + last = l; + if (l->text[0] == '<') { + output_line ("#include %s", l->text); + } else { + output_line ("#include \"%s\"", l->text); + } + } + } } /* CALL cache */ diff --git a/cobc/pplex.l b/cobc/pplex.l index 303f34ec3..f5e521869 100644 --- a/cobc/pplex.l +++ b/cobc/pplex.l @@ -201,6 +201,7 @@ ALNUM_LITERAL_A "\'"([^''\n]|("\'"[0-9][0-9, ]+"\'"))*"\'" ALNUM_LITERAL {ALNUM_LITERAL_Q}|{ALNUM_LITERAL_A} SET_PAREN_LIT \([^()\n]*\) DEFNUM_LITERAL [+-]?[0-9]*[\.]*[0-9]+ +RAW_SEQ [^ \n]+ AREA_A [ ]?# MAYBE_AREA_A [ ]?#? @@ -224,6 +225,7 @@ MAYBE_AREA_A [ ]?#? %x ALNUM_LITERAL_STATE %x CONTROL_STATEMENT_STATE %x DISPLAY_DIRECTIVE_STATE +%x IMP_DIRECTIVE_STATE %% @@ -357,6 +359,11 @@ MAYBE_AREA_A [ ]?#? return CALL_DIRECTIVE; } +^{MAYBE_AREA_A}[ ]*">>"[ ]?"IMP" { + BEGIN IMP_DIRECTIVE_STATE; + return IMP_DIRECTIVE; +} + ^{MAYBE_AREA_A}[ ]*">>"[ ]*\n { /* empty 2002+ style directive */ cb_plex_warning (COBC_WARN_FILLER, newline_count, @@ -721,6 +728,7 @@ ELSE_DIRECTIVE_STATE, ENDIF_DIRECTIVE_STATE, ALNUM_LITERAL_STATE, CONTROL_STATEMENT_STATE, +IMP_DIRECTIVE_STATE, COBOL_WORDS_DIRECTIVE_STATE>{ \n { BEGIN INITIAL; @@ -990,6 +998,14 @@ ENDIF_DIRECTIVE_STATE>{ } } +{ + "INCLUDE" { return INCLUDE; } /* GnuCOBOL 3.3 extension */ + {RAW_SEQ} { + pplval.s = cobc_plex_strdup (yytext); + return TOKEN; + } +} + { "IS" { return IS; } "NOT" { return NOT; } diff --git a/cobc/ppparse.y b/cobc/ppparse.y index 76b3c9a58..267044679 100644 --- a/cobc/ppparse.y +++ b/cobc/ppparse.y @@ -741,6 +741,9 @@ ppparse_clear_vars (const struct cb_define_struct *p) %token WITH %token LOCATION +%token IMP_DIRECTIVE +%token INCLUDE + %token TERMINATOR "end of line" %token TOKEN "Word or Literal" @@ -768,6 +771,7 @@ ppparse_clear_vars (const struct cb_define_struct *p) %type alnum_equality_list %type ec_list %type unquoted_literal +%type imp_include_sources %type _copy_replacing %type replacing_list @@ -838,6 +842,7 @@ directive: | TURN_DIRECTIVE turn_directive | LISTING_DIRECTIVE listing_directive | LEAP_SECOND_DIRECTIVE leap_second_directive +| IMP_DIRECTIVE imp_directive | IF_DIRECTIVE { current_cmd = PLEX_ACT_IF; @@ -1368,6 +1373,29 @@ leap_second_directive: | OFF ; +imp_directive: + /* GnuCOBOL 3.3 extension */ + INCLUDE imp_include_sources + { + struct cb_text_list *p = $2; + while (p != NULL) { + fprintf (ppout, "#INCLUDE %s\n", p->text); + p = p->next; + } + } +; + +imp_include_sources: + TOKEN + { + $$ = ppp_list_add (NULL, fix_filename ($1)); + } +| imp_include_sources TOKEN + { + $$ = ppp_list_add ($1, fix_filename ($2)); + } +; + turn_directive: ec_list CHECKING on_or_off { diff --git a/cobc/scanner.l b/cobc/scanner.l index 878e660e9..504687fbf 100644 --- a/cobc/scanner.l +++ b/cobc/scanner.l @@ -172,6 +172,8 @@ static size_t pic2_size; static unsigned int inside_bracket = 0; static char err_msg[COB_MINI_BUFF]; +struct cb_text_list *cb_include_file_list_directive = NULL; + /* Function declarations */ static void read_literal (const char, const enum cb_literal_type); static int scan_x (const char *, const char *); @@ -189,6 +191,7 @@ static void copy_two_words_in_quotes (char ** const, char ** const); static void add_synonym (const int, const int); static void make_synonym (void); static void clear_constants (void); +static struct cb_text_list *scan_list_add (struct cb_text_list *, const char *); %} @@ -320,6 +323,13 @@ AREA_A "#AREA_A"\n cobc_areacheck = 0; } +<*>^[ ]?"#INCLUDE".*/\n { + cb_include_file_list_directive = scan_list_add ( + cb_include_file_list_directive, + yytext + 9 + ); +} + <*>^{AREA_A}[ ]*/"." { count_lines (yytext + 9); /* skip "\n#area_a\n" */ if (cobc_in_procedure && cobc_areacheck) { @@ -2580,6 +2590,22 @@ clear_constants (void) top_78_ptr = NULL; } +static struct cb_text_list * +scan_list_add (struct cb_text_list *list, const char *text) +{ + struct cb_text_list *p; + + p = cobc_malloc (sizeof (struct cb_text_list)); + p->text = cobc_strdup (text); + if (!list) { + p->last = p; + return p; + } + list->last->next = p; + list->last = p; + return list; +} + /* Global functions */ void diff --git a/doc/gnucobol.texi b/doc/gnucobol.texi index b65511412..cff8b6dd8 100644 --- a/doc/gnucobol.texi +++ b/doc/gnucobol.texi @@ -386,6 +386,8 @@ Add a @code{#include} @file{file.h} at the beginning of the generated C source file. The file name is put into quotes, unless it starts by @code{<}. Quoted files should be absolute paths, since C files are compiled in temporary directories. +The directive @code{>>IMP INCLUDE "FILE.h"} or @code{>>IMP INCLUDE } +can be used as an alternative to this compiler option. The option also implies @option{-fno-gen-c-decl-static-call}. This option can be used to check function prototypes when static calls are used. When this option is used, the source file is diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index 06e8f75c0..e4050a90f 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8414,3 +8414,67 @@ prog.cob:18: error: ANY LENGTH items may only be BY REFERENCE formal parameters AT_CLEANUP + +AT_SETUP([IMP INCLUDE directive]) +AT_KEYWORDS([IMP INCLUDE]) + +AT_DATA([prog.cob], [ + >>IMP INCLUDE "file.h" + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + PROCEDURE DIVISION. + GOBACK. +]) + +AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [0], [], []) + +AT_DATA([prog.cob], [ +>>IMP INCLUDE "file.h" +identification division. +program-id. prog. +procedure division. + goback. +]) + +AT_CHECK([$COMPILE_ONLY -fformat=free prog.cob], [0], [], []) + +AT_DATA([prog.cob], [ + >>IMP INCLUDE + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + PROCEDURE DIVISION. + GOBACK. +]) + +AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [0], [], []) + +AT_DATA([prog.cob], [ + >>IMP INCLUDE + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + PROCEDURE DIVISION. + GOBACK. +]) + +AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [1], [], +[prog.cob:2: error: syntax error, unexpected end of line, expecting Word or Literal +prog.cob:2: error: PROGRAM-ID header missing +]) + +AT_CLEANUP + + +AT_SETUP([IMP INCLUDE directive multiple files]) +AT_KEYWORDS([IMP INCLUDE]) + +AT_DATA([prog.cob], [ +>>IMP INCLUDE "file1.h" file2.h "" +identification division. +program-id. prog. +procedure division. + goback. +]) + +AT_CHECK([$COMPILE_ONLY -fformat=free prog.cob], [0], [], []) + +AT_CLEANUP diff --git a/tests/testsuite.src/used_binaries.at b/tests/testsuite.src/used_binaries.at index 405c48d0f..0359e7caf 100644 --- a/tests/testsuite.src/used_binaries.at +++ b/tests/testsuite.src/used_binaries.at @@ -1074,7 +1074,7 @@ AT_CLEANUP AT_SETUP([check include header file]) -#AT_KEYWORDS([cobc copy]) +#AT_KEYWORDS([cobc copy include imp]) AT_DATA([filec.h], [ /* COB_EXT_IMPORT will be defined by libcob.h up-front */ @@ -1150,6 +1150,20 @@ AT_CHECK([$COMPILE_MODULE -Wno-unfinished --copy "f.copy" -fstatic-call prog2.co AT_CHECK([$COMPILE_MODULE -Wno-unfinished --copy "f.copy" -fstatic-call -L. -lfilec prog2.cob -o prog2c], [0], ignore, ignore)] ) +AT_DATA([prog3.cob], [ + >> IMP INCLUDE "file.h" + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 long USAGE BINARY-C-LONG. + PROCEDURE DIVISION. + CALL "f" USING "Hello" BY VALUE long RETURNING NOTHING. +]) + +# static build with correct function signature +# AT_CHECK([$COBC -m -I . -fstatic-call prog3.cob], [0], [], []) + AT_CLEANUP From e66f0fa0dcf7feb8b64f9f0ce18c65ee9ff7ddd4 Mon Sep 17 00:00:00 2001 From: engboris Date: Mon, 29 Jul 2024 17:14:34 +0200 Subject: [PATCH 02/12] Remove useless tests and change error message --- cobc/ChangeLog | 12 +++--------- cobc/cobc.h | 4 ++-- cobc/pplex.l | 2 +- cobc/ppparse.y | 6 +++++- cobc/scanner.l | 4 ++-- tests/testsuite.src/syn_misc.at | 34 ++++++++++++--------------------- 6 files changed, 25 insertions(+), 37 deletions(-) diff --git a/cobc/ChangeLog b/cobc/ChangeLog index ed6d26fbb..de0a1448f 100644 --- a/cobc/ChangeLog +++ b/cobc/ChangeLog @@ -149,9 +149,9 @@ 2024-04-25 Boris Eng - * cobc.h, pplex.l, ppparse.y: new >>IMP INCLUDE directive to include - multiple header files in the C generated code. Has the same behavior as the - --include compiler option. + * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: + new >>IMP INCLUDE directive to include one or multiple header files in + the generated C code (same behavior as the --include compiler option) 2024-04-24 Fabrice Le Fessant @@ -163,12 +163,6 @@ replace stream) and we use a circular buffer for the temporary queue of tokens instead of a list. -2024-04-25 Boris Eng - - * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: - new >>IMP INCLUDE directive to include one or multiple header files in - the generated C code (same behavior as the --include compiler option) - 2024-03-17 Fabrice Le Fessant Emilien Lemaire diff --git a/cobc/cobc.h b/cobc/cobc.h index b90036d85..838dfaed0 100644 --- a/cobc/cobc.h +++ b/cobc/cobc.h @@ -478,9 +478,9 @@ extern int cb_depend_keep_missing; extern int cb_flag_copybook_deps; 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_file_list; /* global */ +extern struct cb_text_list *cb_include_file_list_directive; /* temporary */ extern struct cb_text_list *cb_include_list; -extern struct cb_text_list *cb_include_file_list_directive; extern struct cb_text_list *cb_intrinsic_list; extern struct cb_text_list *cb_extension_list; extern struct cb_text_list *cb_static_call_list; diff --git a/cobc/pplex.l b/cobc/pplex.l index f5e521869..5a0ffe871 100644 --- a/cobc/pplex.l +++ b/cobc/pplex.l @@ -201,7 +201,7 @@ ALNUM_LITERAL_A "\'"([^''\n]|("\'"[0-9][0-9, ]+"\'"))*"\'" ALNUM_LITERAL {ALNUM_LITERAL_Q}|{ALNUM_LITERAL_A} SET_PAREN_LIT \([^()\n]*\) DEFNUM_LITERAL [+-]?[0-9]*[\.]*[0-9]+ -RAW_SEQ [^ \n]+ +RAW_SEQ [^ \n]+ AREA_A [ ]?# MAYBE_AREA_A [ ]?#? diff --git a/cobc/ppparse.y b/cobc/ppparse.y index 267044679..fe6e2553e 100644 --- a/cobc/ppparse.y +++ b/cobc/ppparse.y @@ -1375,7 +1375,11 @@ leap_second_directive: imp_directive: /* GnuCOBOL 3.3 extension */ - INCLUDE imp_include_sources + INCLUDE + { + ppparse_error (_("Missing argument for IMP INCLUDE directive")); + } +| INCLUDE imp_include_sources { struct cb_text_list *p = $2; while (p != NULL) { diff --git a/cobc/scanner.l b/cobc/scanner.l index 504687fbf..f47e1f218 100644 --- a/cobc/scanner.l +++ b/cobc/scanner.l @@ -2595,8 +2595,8 @@ scan_list_add (struct cb_text_list *list, const char *text) { struct cb_text_list *p; - p = cobc_malloc (sizeof (struct cb_text_list)); - p->text = cobc_strdup (text); + p = cobc_parse_malloc (sizeof (struct cb_text_list)); + p->text = cobc_parse_strdup (text); if (!list) { p->last = p; return p; diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index e4050a90f..ebf32a979 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8426,17 +8426,7 @@ AT_DATA([prog.cob], [ GOBACK. ]) -AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [0], [], []) - -AT_DATA([prog.cob], [ ->>IMP INCLUDE "file.h" -identification division. -program-id. prog. -procedure division. - goback. -]) - -AT_CHECK([$COMPILE_ONLY -fformat=free prog.cob], [0], [], []) +AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], []) AT_DATA([prog.cob], [ >>IMP INCLUDE @@ -8446,9 +8436,9 @@ AT_DATA([prog.cob], [ GOBACK. ]) -AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [0], [], []) +AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], []) -AT_DATA([prog.cob], [ +AT_DATA([prog2.cob], [ >>IMP INCLUDE IDENTIFICATION DIVISION. PROGRAM-ID. prog. @@ -8456,9 +8446,9 @@ AT_DATA([prog.cob], [ GOBACK. ]) -AT_CHECK([$COMPILE_ONLY -fformat=fixed prog.cob], [1], [], -[prog.cob:2: error: syntax error, unexpected end of line, expecting Word or Literal -prog.cob:2: error: PROGRAM-ID header missing +AT_CHECK([$COMPILE_ONLY prog2.cob], [1], [], +[prog2.cob:2: error: syntax error, unexpected end of line, expecting Word or Literal +prog2.cob:2: error: PROGRAM-ID header missing ]) AT_CLEANUP @@ -8468,13 +8458,13 @@ AT_SETUP([IMP INCLUDE directive multiple files]) AT_KEYWORDS([IMP INCLUDE]) AT_DATA([prog.cob], [ ->>IMP INCLUDE "file1.h" file2.h "" -identification division. -program-id. prog. -procedure division. - goback. + >>IMP INCLUDE "file1.h" file2.h "" + IDENTIFICATION DIVISION. + PROGRAM-ID. PROG. + PROCEDURE DIVISION. + GOBACK. ]) -AT_CHECK([$COMPILE_ONLY -fformat=free prog.cob], [0], [], []) +AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], []) AT_CLEANUP From bd3ce931e68770424089d838956e847048047014 Mon Sep 17 00:00:00 2001 From: engboris Date: Thu, 25 Apr 2024 19:15:43 +0200 Subject: [PATCH 03/12] Add >>IMP INCLUDE directive --- cobc/ChangeLog | 6 ++++++ cobc/cobc.h | 1 + 2 files changed, 7 insertions(+) diff --git a/cobc/ChangeLog b/cobc/ChangeLog index de0a1448f..de631ec5d 100644 --- a/cobc/ChangeLog +++ b/cobc/ChangeLog @@ -163,6 +163,12 @@ replace stream) and we use a circular buffer for the temporary queue of tokens instead of a list. +2024-04-25 Boris Eng + + * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: + new >>IMP INCLUDE directive to include one or multiple header files in + the generated C code (same behavior as the --include compiler option) + 2024-03-17 Fabrice Le Fessant Emilien Lemaire diff --git a/cobc/cobc.h b/cobc/cobc.h index 838dfaed0..32426dfb6 100644 --- a/cobc/cobc.h +++ b/cobc/cobc.h @@ -481,6 +481,7 @@ extern struct cb_text_list *cb_copy_list; extern struct cb_text_list *cb_include_file_list; /* global */ extern struct cb_text_list *cb_include_file_list_directive; /* temporary */ extern struct cb_text_list *cb_include_list; +extern struct cb_text_list *cb_include_file_list_directive; extern struct cb_text_list *cb_intrinsic_list; extern struct cb_text_list *cb_extension_list; extern struct cb_text_list *cb_static_call_list; From e38538c9c74e12e65aee0b3dca0dab626eb2d3dc Mon Sep 17 00:00:00 2001 From: Simon Sobisch Date: Thu, 25 Jul 2024 13:27:28 +0000 Subject: [PATCH 04/12] testing IMP INCLUDE directive --- tests/testsuite.src/used_binaries.at | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/testsuite.src/used_binaries.at b/tests/testsuite.src/used_binaries.at index 0359e7caf..f263bb8a9 100644 --- a/tests/testsuite.src/used_binaries.at +++ b/tests/testsuite.src/used_binaries.at @@ -1074,7 +1074,7 @@ AT_CLEANUP AT_SETUP([check include header file]) -#AT_KEYWORDS([cobc copy include imp]) +AT_KEYWORDS([cobc copy directive imp]) AT_DATA([filec.h], [ /* COB_EXT_IMPORT will be defined by libcob.h up-front */ @@ -1150,8 +1150,9 @@ AT_CHECK([$COMPILE_MODULE -Wno-unfinished --copy "f.copy" -fstatic-call prog2.co AT_CHECK([$COMPILE_MODULE -Wno-unfinished --copy "f.copy" -fstatic-call -L. -lfilec prog2.cob -o prog2c], [0], ignore, ignore)] ) +# additional check via directive AT_DATA([prog3.cob], [ - >> IMP INCLUDE "file.h" + >> IMP INCLUDE "filec.h" IDENTIFICATION DIVISION. PROGRAM-ID. prog. DATA DIVISION. @@ -1161,6 +1162,12 @@ AT_DATA([prog3.cob], [ CALL "f" USING "Hello" BY VALUE long RETURNING NOTHING. ]) +# static build with correct function signature +AT_CHECK([$COMPILE_MODULE -I . -fstatic-call prog3.cob], [0], [], [], [ + # Previous test "failed" --> retry with import library + AT_CHECK([$COMPILE_MODULE -I . -fstatic-call -L. -lfilec prog3.cob], [0], ignore, ignore)] +) + # static build with correct function signature # AT_CHECK([$COBC -m -I . -fstatic-call prog3.cob], [0], [], []) From e82ae8f21c03f330e869e2852063e4e0dbf3871a Mon Sep 17 00:00:00 2001 From: engboris Date: Mon, 29 Jul 2024 17:31:02 +0200 Subject: [PATCH 05/12] Fix indent --- cobc/ppparse.y | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cobc/ppparse.y b/cobc/ppparse.y index fe6e2553e..131007741 100644 --- a/cobc/ppparse.y +++ b/cobc/ppparse.y @@ -1376,9 +1376,9 @@ leap_second_directive: imp_directive: /* GnuCOBOL 3.3 extension */ INCLUDE - { - ppparse_error (_("Missing argument for IMP INCLUDE directive")); - } + { + ppparse_error (_("Missing argument for IMP INCLUDE directive")); + } | INCLUDE imp_include_sources { struct cb_text_list *p = $2; From 277aa5fa4ac06492cc5e69fbd5b1ca63ffde5100 Mon Sep 17 00:00:00 2001 From: engboris Date: Mon, 29 Jul 2024 17:33:30 +0200 Subject: [PATCH 06/12] Fix error message of test syn_misc.at --- tests/testsuite.src/syn_misc.at | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index ebf32a979..7458e5011 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8447,8 +8447,7 @@ AT_DATA([prog2.cob], [ ]) AT_CHECK([$COMPILE_ONLY prog2.cob], [1], [], -[prog2.cob:2: error: syntax error, unexpected end of line, expecting Word or Literal -prog2.cob:2: error: PROGRAM-ID header missing +[prog2.cob:2: error: prog2.cob:2: error: PROGRAM-ID header missing ]) AT_CLEANUP From 3430d1c2e6d947e6915a912eba58b1b75c7be19b Mon Sep 17 00:00:00 2001 From: engboris Date: Mon, 29 Jul 2024 17:35:12 +0200 Subject: [PATCH 07/12] Fix indent --- cobc/ppparse.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cobc/ppparse.y b/cobc/ppparse.y index 131007741..fd157e7db 100644 --- a/cobc/ppparse.y +++ b/cobc/ppparse.y @@ -1375,7 +1375,7 @@ leap_second_directive: imp_directive: /* GnuCOBOL 3.3 extension */ - INCLUDE + INCLUDE { ppparse_error (_("Missing argument for IMP INCLUDE directive")); } From c77058ea1feeade4f28b453b1667b38a22ba5da7 Mon Sep 17 00:00:00 2001 From: engboris Date: Mon, 29 Jul 2024 17:59:40 +0200 Subject: [PATCH 08/12] Fix tests (error message for syn_misc.at) --- tests/testsuite.src/syn_misc.at | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index 7458e5011..e1e80dc71 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8447,7 +8447,7 @@ AT_DATA([prog2.cob], [ ]) AT_CHECK([$COMPILE_ONLY prog2.cob], [1], [], -[prog2.cob:2: error: prog2.cob:2: error: PROGRAM-ID header missing +[prog2.cob:2: error: Missing argument for IMP INCLUDE directive ]) AT_CLEANUP From 781f586b7d70c276ede52c3a4a6878141610919a Mon Sep 17 00:00:00 2001 From: engboris Date: Tue, 8 Oct 2024 18:00:34 +0200 Subject: [PATCH 09/12] Several fixes --- NEWS | 10 +++++++--- cobc/cobc.h | 2 +- cobc/codegen.c | 6 ------ cobc/ppparse.y | 3 ++- cobc/scanner.l | 34 ++++++++++++++++----------------- tests/testsuite.src/syn_misc.at | 8 ++++++-- 6 files changed, 33 insertions(+), 30 deletions(-) diff --git a/NEWS b/NEWS index df2e10705..4be136e31 100644 --- a/NEWS +++ b/NEWS @@ -6,9 +6,13 @@ NEWS - user visible changes -*- outline -*- * New GnuCOBOL features -** cobc now checks for binary and multi-byte encoded files and early exit - parsing those; the error output for format errors (for example invalid - indicator column) is now limitted to 5 per source file +** the leading space for all internal directives is removed in the lexer. + Source previously processed may need to be ajusted to be processed by + GnuCOBOL 3.3. + +** cobc now checks for binary files and early exit parsing those; + the error output for format errors (for example invalid indicator column) + is now limitted to 5 per source file ** support the COLLATING SEQUENCE clause on indexed files (currently only with the BDB backend) diff --git a/cobc/cobc.h b/cobc/cobc.h index 32426dfb6..c9c5559b9 100644 --- a/cobc/cobc.h +++ b/cobc/cobc.h @@ -481,7 +481,7 @@ extern struct cb_text_list *cb_copy_list; extern struct cb_text_list *cb_include_file_list; /* global */ extern struct cb_text_list *cb_include_file_list_directive; /* temporary */ extern struct cb_text_list *cb_include_list; -extern struct cb_text_list *cb_include_file_list_directive; +extern struct cb_text_list *cb_include_file_list_directive; extern struct cb_text_list *cb_intrinsic_list; extern struct cb_text_list *cb_extension_list; extern struct cb_text_list *cb_static_call_list; diff --git a/cobc/codegen.c b/cobc/codegen.c index 7221b4cd9..7e5625a10 100644 --- a/cobc/codegen.c +++ b/cobc/codegen.c @@ -1834,7 +1834,6 @@ output_gnucobol_defines (const char *formatted_date) { struct cb_text_list *l; - struct cb_text_list *last = NULL; for (l = cb_include_file_list; l; l = l->next) { if (l->text[0] == '<') { output_line ("#include %s", l->text); @@ -1844,11 +1843,6 @@ output_gnucobol_defines (const char *formatted_date) } for (l = cb_include_file_list_directive; l; l = l->next) { - if (last != NULL) { - cobc_free (last->text); - cobc_free (last); - } - last = l; if (l->text[0] == '<') { output_line ("#include %s", l->text); } else { diff --git a/cobc/ppparse.y b/cobc/ppparse.y index fd157e7db..7779186ed 100644 --- a/cobc/ppparse.y +++ b/cobc/ppparse.y @@ -1377,7 +1377,8 @@ imp_directive: /* GnuCOBOL 3.3 extension */ INCLUDE { - ppparse_error (_("Missing argument for IMP INCLUDE directive")); + cb_error (_("invalid %s directive"), "IMP INCLUDE"); + yyerrok; } | INCLUDE imp_include_sources { diff --git a/cobc/scanner.l b/cobc/scanner.l index f47e1f218..f92c4bbc3 100644 --- a/cobc/scanner.l +++ b/cobc/scanner.l @@ -220,7 +220,7 @@ AREA_A "#AREA_A"\n cobc_in_area_a = 0; %} -<*>^[ ]?"#CALLFH".*\n { +<*>^"#CALLFH".*\n { if (current_program) { const char *p1; char *p2; @@ -243,11 +243,11 @@ AREA_A "#AREA_A"\n } -<*>^[ ]?"#DEFLIT".*\n { +<*>^"#DEFLIT".*\n { scan_define_options (yytext); } -<*>^[ ]?"#ADDRSV".*\n { +<*>^"#ADDRSV".*\n { char *word; copy_word_in_quotes (&word); @@ -255,25 +255,25 @@ AREA_A "#AREA_A"\n cobc_free (word); } -<*>^[ ]?"#ADDSYN-STD".*\n { +<*>^"#ADDSYN-STD".*\n { add_synonym (1, 0); } -<*>^[ ]?"#ADDSYN".*\n { +<*>^"#ADDSYN".*\n { add_synonym (0, 0); } -<*>^[ ]?"#MAKESYN".*\n { +<*>^"#MAKESYN".*\n { make_synonym (); } -<*>^[ ]?"#OVERRIDE-STD".*\n { +<*>^"#OVERRIDE-STD".*\n { add_synonym (1, 1); } -<*>^[ ]?"#OVERRIDE".*\n { +<*>^"#OVERRIDE".*\n { add_synonym (0, 1); } -<*>^[ ]?"#REMOVE-STD".*\n { +<*>^"#REMOVE-STD".*\n { char *word; copy_word_in_quotes (&word); @@ -286,7 +286,7 @@ AREA_A "#AREA_A"\n cobc_free (word); } -<*>^[ ]?"#REMOVE".*\n { +<*>^"#REMOVE".*\n { char *word; copy_word_in_quotes (&word); @@ -294,19 +294,19 @@ AREA_A "#AREA_A"\n cobc_free (word); } -<*>^[ ]?"#REFMOD_ZERO "[0-9]\n { +<*>^"#REFMOD_ZERO "[0-9]\n { cb_ref_mod_zero_length = (yytext[13] - '0'); } -<*>^[ ]?"#ODOSLIDE "[0-1]\n { +<*>^"#ODOSLIDE "[0-1]\n { cb_odoslide = (yytext[10] - '0'); } -<*>^[ ]?"#ASSIGN "[0-9]\n { +<*>^"#ASSIGN "[0-9]\n { cb_assign_type_default = (enum cb_assign_type)(yytext[8] - '0'); } -<*>^[ ]?"#TURN".*\n { +<*>^"#TURN".*\n { struct cb_turn_list *l; for (l = cb_turn_list; l && l->line != -1; l = l->next); @@ -315,15 +315,15 @@ AREA_A "#AREA_A"\n } } -<*>^[ ]?"#AREACHECK"\n { +<*>^"#AREACHECK"\n { cobc_areacheck = 1; } -<*>^[ ]?"#NOAREACHECK"\n { +<*>^"#NOAREACHECK"\n { cobc_areacheck = 0; } -<*>^[ ]?"#INCLUDE".*/\n { +<*>^"#INCLUDE".*/\n { cb_include_file_list_directive = scan_list_add ( cb_include_file_list_directive, yytext + 9 diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index e1e80dc71..466a241d8 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8447,7 +8447,7 @@ AT_DATA([prog2.cob], [ ]) AT_CHECK([$COMPILE_ONLY prog2.cob], [1], [], -[prog2.cob:2: error: Missing argument for IMP INCLUDE directive +[prog2.cob:2: error: invalid IMP INCLUDE directive ]) AT_CLEANUP @@ -8464,6 +8464,10 @@ AT_DATA([prog.cob], [ GOBACK. ]) -AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], []) +AT_CHECK([$COMPILE --save-temps -E -o prog.i prog.cob], [0], [], []) +AT_CHECK([$GREP "#INCLUDE file1.h" prog.i], [0], ignore, []) +AT_CHECK([$GREP "#INCLUDE file2.h" prog.i], [0], ignore, []) +AT_CHECK([$GREP "#INCLUDE " prog.i], [0], ignore, []) +AT_CHECK([$GREP "#INCLUDE " prog.i], [0], ignore, []) AT_CLEANUP From 3efed41d50fa75f2e6b8024e44cc44f43ad7c906 Mon Sep 17 00:00:00 2001 From: engboris Date: Tue, 17 Dec 2024 18:17:56 +0100 Subject: [PATCH 10/12] Update Changelogs, minor fix and add tests --- NEWS | 10 +++------- cobc/ChangeLog | 9 ++++++--- cobc/cobc.h | 1 - cobc/codegen.c | 28 ++++++++++++++-------------- tests/testsuite.src/syn_misc.at | 12 ++++++++++++ 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/NEWS b/NEWS index 4be136e31..df2e10705 100644 --- a/NEWS +++ b/NEWS @@ -6,13 +6,9 @@ NEWS - user visible changes -*- outline -*- * New GnuCOBOL features -** the leading space for all internal directives is removed in the lexer. - Source previously processed may need to be ajusted to be processed by - GnuCOBOL 3.3. - -** cobc now checks for binary files and early exit parsing those; - the error output for format errors (for example invalid indicator column) - is now limitted to 5 per source file +** cobc now checks for binary and multi-byte encoded files and early exit + parsing those; the error output for format errors (for example invalid + indicator column) is now limitted to 5 per source file ** support the COLLATING SEQUENCE clause on indexed files (currently only with the BDB backend) diff --git a/cobc/ChangeLog b/cobc/ChangeLog index de631ec5d..d0399c9ce 100644 --- a/cobc/ChangeLog +++ b/cobc/ChangeLog @@ -149,9 +149,12 @@ 2024-04-25 Boris Eng - * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: - new >>IMP INCLUDE directive to include one or multiple header files in - the generated C code (same behavior as the --include compiler option) + FR #176: "Implementation of GC directive to include .h (c/c++) files" + * pplex.l, ppparse.y, cobc.h, codegen.c: new >>IMP INCLUDE directive to + include one or multiple header files in the generated C code (same behavior + as the --include but with one directive per file) + * scanner.l: the leading space for all internal directives is removed in the + lexer. Source previously preprocessed may need to be adjusted 2024-04-24 Fabrice Le Fessant diff --git a/cobc/cobc.h b/cobc/cobc.h index c9c5559b9..838dfaed0 100644 --- a/cobc/cobc.h +++ b/cobc/cobc.h @@ -481,7 +481,6 @@ extern struct cb_text_list *cb_copy_list; extern struct cb_text_list *cb_include_file_list; /* global */ extern struct cb_text_list *cb_include_file_list_directive; /* temporary */ extern struct cb_text_list *cb_include_list; -extern struct cb_text_list *cb_include_file_list_directive; extern struct cb_text_list *cb_intrinsic_list; extern struct cb_text_list *cb_extension_list; extern struct cb_text_list *cb_static_call_list; diff --git a/cobc/codegen.c b/cobc/codegen.c index 7e5625a10..ad47f1b0c 100644 --- a/cobc/codegen.c +++ b/cobc/codegen.c @@ -1832,24 +1832,24 @@ 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; - for (l = cb_include_file_list; l; l = l->next) { - if (l->text[0] == '<') { - output_line ("#include %s", l->text); - } else { - output_line ("#include \"%s\"", l->text); - } + struct cb_text_list *l; + for (l = cb_include_file_list; l; l = l->next) { + if (l->text[0] == '<') { + output_line ("#include %s", l->text); + } else { + output_line ("#include \"%s\"", l->text); } + } - for (l = cb_include_file_list_directive; l; l = l->next) { - if (l->text[0] == '<') { - output_line ("#include %s", l->text); - } else { - output_line ("#include \"%s\"", l->text); - } + for (l = cb_include_file_list_directive; l; l = l->next) { + if (l->text[0] == '<') { + output_line ("#include %s", l->text); + } else { + output_line ("#include \"%s\"", l->text); } } + + cb_include_file_list_directive = NULL; } /* CALL cache */ diff --git a/tests/testsuite.src/syn_misc.at b/tests/testsuite.src/syn_misc.at index 466a241d8..14481c890 100644 --- a/tests/testsuite.src/syn_misc.at +++ b/tests/testsuite.src/syn_misc.at @@ -8464,10 +8464,22 @@ AT_DATA([prog.cob], [ GOBACK. ]) +AT_DATA([prog2.cob], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + PROCEDURE DIVISION. + GOBACK. +]) + AT_CHECK([$COMPILE --save-temps -E -o prog.i prog.cob], [0], [], []) +AT_CHECK([$COMPILE -C prog.cob prog2.cob], [0], [], []) AT_CHECK([$GREP "#INCLUDE file1.h" prog.i], [0], ignore, []) AT_CHECK([$GREP "#INCLUDE file2.h" prog.i], [0], ignore, []) AT_CHECK([$GREP "#INCLUDE " prog.i], [0], ignore, []) AT_CHECK([$GREP "#INCLUDE " prog.i], [0], ignore, []) +AT_CHECK([$GREP "#INCLUDE file1.h" prog.c], [1], ignore, []) +AT_CHECK([$GREP "#INCLUDE file2.h" prog.c], [1], ignore, []) +AT_CHECK([$GREP "#INCLUDE " prog.c], [1], ignore, []) +AT_CHECK([$GREP "#INCLUDE " prog.c], [1], ignore, []) AT_CLEANUP From 09ad27d28294cf1d57597c5b7cd07608ea68d067 Mon Sep 17 00:00:00 2001 From: engboris Date: Tue, 17 Dec 2024 19:23:11 +0100 Subject: [PATCH 11/12] Fix --- cobc/ChangeLog | 13 ++++--------- tests/testsuite.src/used_binaries.at | 3 --- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/cobc/ChangeLog b/cobc/ChangeLog index d0399c9ce..cdb977426 100644 --- a/cobc/ChangeLog +++ b/cobc/ChangeLog @@ -150,9 +150,10 @@ 2024-04-25 Boris Eng FR #176: "Implementation of GC directive to include .h (c/c++) files" - * pplex.l, ppparse.y, cobc.h, codegen.c: new >>IMP INCLUDE directive to - include one or multiple header files in the generated C code (same behavior - as the --include but with one directive per file) + * pplex.l, ppparse.y, cobc.h, codegen.c (output_gnucobol_defines): + new >>IMP INCLUDE directive to include one or multiple header files in the + generated C code (same behavior as the --include but with one directive per + file) * scanner.l: the leading space for all internal directives is removed in the lexer. Source previously preprocessed may need to be adjusted @@ -166,12 +167,6 @@ replace stream) and we use a circular buffer for the temporary queue of tokens instead of a list. -2024-04-25 Boris Eng - - * pplex.l, ppparse.y, scanner.l, cobc.h, codegen.c: - new >>IMP INCLUDE directive to include one or multiple header files in - the generated C code (same behavior as the --include compiler option) - 2024-03-17 Fabrice Le Fessant Emilien Lemaire diff --git a/tests/testsuite.src/used_binaries.at b/tests/testsuite.src/used_binaries.at index f263bb8a9..0dd9d415c 100644 --- a/tests/testsuite.src/used_binaries.at +++ b/tests/testsuite.src/used_binaries.at @@ -1168,9 +1168,6 @@ AT_CHECK([$COMPILE_MODULE -I . -fstatic-call prog3.cob], [0], [], [], [ AT_CHECK([$COMPILE_MODULE -I . -fstatic-call -L. -lfilec prog3.cob], [0], ignore, ignore)] ) -# static build with correct function signature -# AT_CHECK([$COBC -m -I . -fstatic-call prog3.cob], [0], [], []) - AT_CLEANUP From 6e1f6a4ed4635ded2701771f1f5b0b1d5c175419 Mon Sep 17 00:00:00 2001 From: engboris Date: Fri, 20 Dec 2024 10:57:49 +0100 Subject: [PATCH 12/12] Fix for ISO C90 mixed declarations --- cobc/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cobc/codegen.c b/cobc/codegen.c index ad47f1b0c..b76407760 100644 --- a/cobc/codegen.c +++ b/cobc/codegen.c @@ -1801,6 +1801,7 @@ static void output_gnucobol_defines (const char *formatted_date) { int i; + struct cb_text_list *l; if (!strrchr (cb_source_file, '\\') && !strrchr (cb_source_file, '"')) { @@ -1832,7 +1833,6 @@ 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; for (l = cb_include_file_list; l; l = l->next) { if (l->text[0] == '<') { output_line ("#include %s", l->text);