From 34a735a17886e781108b60d0a0b970310d418257 Mon Sep 17 00:00:00 2001
From: "James K. Lowden" <jklowden@symas.com>
Date: Sun, 2 Feb 2025 12:02:41 -0500
Subject: [PATCH] fix "make install", honor NOT DEFINED, and doc markup fixes

---
 gcc/cobol/Make-lang.in |  38 +++++----
 gcc/cobol/cdf.y        |   6 +-
 gcc/cobol/gcobol.1     | 190 +++++++++++++++++++++++++++--------------
 3 files changed, 150 insertions(+), 84 deletions(-)

diff --git a/gcc/cobol/Make-lang.in b/gcc/cobol/Make-lang.in
index 034a3f9efeef..e5de58441260 100644
--- a/gcc/cobol/Make-lang.in
+++ b/gcc/cobol/Make-lang.in
@@ -56,21 +56,21 @@ LIB_SOURCE ?= $(srcdir)/../libgcobol
 #
 
 CPPFLAGS =					\
- -std=c++17 					\
+ -std=c++17					\
  $(MAX_ERRORS)					\
  -Iinclude					\
  -I$(BINCLUDE)					\
- -I$(LIB_INCLUDE)					\
+ -I$(LIB_INCLUDE)				\
  -Wno-cpp					\
  -Wno-missing-field-initializers		\
- -DEXEC_LIB=\"$(DESTDIR)$(libdir)\"
+ -DEXEC_LIB=\"$(PREFIX)/$(libdir)\"		\
  $(END)
 
-YACC = bison
+BISON = bison
 YFLAGS = -Werror -Wmidrule-values -Wno-yacc \
 	--debug --verbose
 
-LEX = flex
+FLEX = flex
 LFLAGS = -d -Ca
 
 #
@@ -166,12 +166,12 @@ gcobol$(exeext): \
 # parse.c in the list for scan.o because that's the one make(1) knows about.
 
 cobol/parse.c: cobol/parse.y
-	$(YACC) -o $@ $(YFLAGS)				\
+	$(BISON) -o $@ $(YFLAGS)				\
 		--defines=cobol/parse.h			\
 		--report-file=cobol/parser.out $<
 
 cobol/cdf.c: cobol/cdf.y
-	$(YACC) -o $@ $(YFLAGS)						\
+	$(BISON) -o $@ $(YFLAGS)						\
 		--defines=cobol/cdf.h --report-file=cobol/cdf.out $<
 
 # See "Trailing context is getting confused with trailing optional patterns"
@@ -179,9 +179,9 @@ cobol/cdf.c: cobol/cdf.y
 FLEX_WARNING = warning, dangerous trailing context
 
 cobol/scan.c: cobol/scan.l
-	$(LEX) -o$@ $(LFLAGS) $< >$@~ 2>&1
+	$(FLEX) -o$@ $(LFLAGS) $< >$@~ 2>&1
 	awk  '! /$(FLEX_WARNING)/ {print > "/dev/stderr"; nerr++}	\
-	     END {print "$(LEX):", NR, "messages" > "/dev/stderr";	\
+	     END {print "$(FLEX):", NR, "messages" > "/dev/stderr";	\
 		  exit nerr}' $@~
 	@rm $@~
 
@@ -264,10 +264,13 @@ cobol.start.encap: gcobol$(exeext)
 cobol.rest.encap:
 
 cobol.install-common: installdirs
-	$(INSTALL_PROGRAM) gcobol$(exeext) $(DESTDIR)$(bindir)/$(gcobol_INSTALL_NAME)$(exeext)
-	$(INSTALL) -m 755 $(srcdir)/cobol/gcobc $(DESTDIR)$(bindir)/
-	mkdir -p $(DESTDIR)$(bindir)/udf/
-	$(INSTALL_DATA) $(srcdir)/cobol/udf/*  $(DESTDIR)$(datadir)/cobol/udf
+	$(INSTALL_PROGRAM) gcobol$(exeext) cobol1$(exeext) \
+			   $(DESTDIR)$(bindir)/
+	$(INSTALL) -m 755 $(srcdir)/cobol/gcobc \
+		 	   $(DESTDIR)$(bindir)/
+	mkdir -p $(DESTDIR)$(datadir)/gcobol/udf
+	$(INSTALL_DATA) $(srcdir)/cobol/udf/*  \
+			$(DESTDIR)$(datadir)/gcobol/udf/
 
 cobol.install-man: installdirs
 	$(INSTALL_DATA) $(srcdir)/cobol/gcobol.1 $(DESTDIR)$(man1dir)/
@@ -290,9 +293,12 @@ cobol.pdf:
 cobol.html:
 
 cobol.uninstall:
-	-rm -f gcobol$(exeext) cobol1$(exeext)
-	-rm -f $(cobol_OBJS)
-
+	rm -rf 	$(DESTDIR)$(bindir)/$(gcobol_INSTALL_NAME)$(exeext)	\
+	 	$(DESTDIR)$(bindir)/$(cobol1_INSTALL_NAME)$(exeext)	\
+		$(DESTDIR)$(bindir)/gcobc				\
+		$(DESTDIR)$(datadir)/gcobol/udf/			\
+		$(DESTDIR)$(man1dir)/gcobol.1				\
+		$(DESTDIR)$(man3dir)/gcobol.3
 cobol.man:
 
 cobol.mostlyclean:
diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y
index e296f79d2e60..08b53412b26f 100644
--- a/gcc/cobol/cdf.y
+++ b/gcc/cobol/cdf.y
@@ -526,10 +526,12 @@ cdf_eval_obj:	cdf_cond_expr
         ;
 
 cdf_cond_expr:	BOOL
-	|	NAME DEFINED
+	|	NAME DEFINED[maybe]
 		{
 		  auto p = dictionary.find($1);
-		  if( p == dictionary.end() ) {
+		  bool found = p != dictionary.end();
+		  if( !$maybe ) found = ! found;
+		  if( ! found ) {
 		    $$ = !$2;
 		    dbgmsg("CDF: %s not found in dictionary (result %s)",
 			   $1, $$? "true" : "false");
diff --git a/gcc/cobol/gcobol.1 b/gcc/cobol/gcobol.1
index 71f334ece6fa..583d24935d71 100644
--- a/gcc/cobol/gcobol.1
+++ b/gcc/cobol/gcobol.1
@@ -1,7 +1,7 @@
 .ds lang COBOL
 .ds gcobol GCC\ \*[lang]\ Front-end
 .ds isostd ISO/IEC 1989:2023
-.Dd \& December 2022
+.Dd \& February 2025
 .Dt GCOBOL 1\& "GCC \*[lang] Compiler"
 .Os Linux
 .Sh NAME
@@ -283,7 +283,7 @@ may be
 .Bl -tag -compact
 .It ibm
 to indicate IBM COBOL 6.3 syntax, specifically
-.D1 STOP <number> .
+.D1 STOP <number>.
 .It gnu
 to indicate GnuCOBOL syntax
 .It mf
@@ -371,19 +371,19 @@ option shows the shift and reduce actions taken by the parser.
 .El
 .
 .Sh COMPILATION SCENARIOS
-.Ss gcobol Pa xyz.cob
-.Ss gcobol -main Pa xyz.cob
-.Ss gcobol -main= Ns Pa xyz.cob Pa xyz.cob
+.D1 gcobol Ar xyz.cob
+.D1 gcobol -main Ar xyz.cob
+.D1 gcobol -main= Ns Ar xyz.cob Ar xyz.cob
 These are equivalent.  The
-.Pa xyz.cob
+.Ar xyz.cob
 code is compiled and a 
 .Fn main
 function is
 inserted that calls the first PROGRAM-ID in the
-.Pa xyz.cob
+.Ar xyz.cob
 source file.
-
-.Ss gcobol -nomain Pa xyz.cob Pa elsewhere.o
+.Pp
+.D1 gcobol -nomain Ar xyz.cob Ar elsewhere.o
 The
 .Fl nomain
 option prevents a 
@@ -392,50 +392,49 @@ function from being generated by the gcobol compiler.
 A 
 .Fn main
 entry point must be present in the
-.Pa elsewhere.o
+.Ar elsewhere.o
 module; without it the
 linker will report a
 .Dq "missing main"
 error.
-
-.Ss gcobol Pa aaa.cob Pa bbb.cob Pa ccc.cob
-.Ss gcobol -main Pa aaa.cob Pa bbb.cob Pa ccc.cob
+.Pp
+.D1 gcobol Ar aaa.cob Ar bbb.cob Ar ccc.cob
+.D1 gcobol -main Ar aaa.cob Ar bbb.cob Ar ccc.cob
 The two commands are equivalent. The three source code modules are compiled and
 linked together along with a generated
 .Fn main
 function that calls the first
 PROGRAM-ID in the
-.Pa aaa.cob
+.Ar aaa.cob
 module.
-
-.Ss gcobol Pa aaa.cob Pa bbb.cob Fl main Pa ccc.cob
-.Ss gcobol -main Ns = Ns Pa ccc.cob Pa aaa.cob Pa bbb.cob Pa ccc.cob
+.Pp
+.D1 gcobol Ar aaa.cob Ar bbb.cob Fl main Ar ccc.cob
+.D1 gcobol -main Ns = Ns Ar ccc.cob Ar aaa.cob Ar bbb.cob Ar ccc.cob
 These two commands have the same result: An
-.Pa a.out
+.Ar a.out
 executable is created that
 starts executing at the first PROGRAM-ID in
-.Pa ccc.cob .
-
-.Ss gcobol -main Ns = Ns Pa bbb.cob:b-entry Pa aaa.cob Pa bbb.cob Pa ccc.cob
+.Ar ccc.cob .
+.Pp
+.D1 gcobol -main Ns = Ns Ar bbb.cob:b-entry Ar aaa.cob Ar bbb.cob Ar ccc.cob
 An
-.Pa a.out
+.Ar a.out
 executable is created that starts executing at the PROGRAM-ID
 .Ar "b-entry" .
-
-.Ss gcobol -c Pa aaa.cob
-.Ss gcobol -c -main Pa bbb.cob
-.Ss gcobol -c Pa ccc.cob
-.Ss gcobol Pa aaa.o Pa bbb.o Pa ccc.o
+.Pp
+.D1 gcobol -c Ar aaa.cob
+.D1 gcobol -c -main Ar bbb.cob
+.D1 gcobol -c Ar ccc.cob
+.D1 gcobol Ar aaa.o Ar bbb.o Ar ccc.o
 The first three commands each create a .o file. The
-.Pa bbb.o
+.Ar bbb.o
 file will contain a
 .Fn main
 entry point that calls the first PROGRAM-ID in
-.Pa bbb .
-The fourth links the
-three .o files into an
-.Pa a.out.  
-
+.Ar bbb .
+The fourth links the three .o files into an
+.Ar a.out .  
+.
 .Sh EBCDIC
 The
 .Fl finternal-ebcdic
@@ -584,13 +583,22 @@ The following are implemented:
 .Pp
 .Bl -tag -offset 5n -compact
 .It EC-FUNCTION-ARGUMENT
+for the following functions: 
 .Bl -item  -compact
-.It ACOS.It ANNUITY
-.It ASIN
-.It LOG
-.It LOG10
-.It PRESENT-VALUE
-.It SQRT
+.It
+ACOS
+.It
+ANNUITY
+.It
+ASIN
+.It
+LOG
+.It
+LOG10
+.It
+PRESENT-VALUE
+.It
+SQRT
 .El
 .It EC-SORT-MERGE-FILE-OPEN
 .It EC-BOUND-SUBSCRIPT
@@ -895,31 +903,49 @@ has no effect; the two are interchangeable.
 ..
 .
 .Ss Compiler-Directing Facility (CDF)
-The CDF is partially implemented, and should be used with caution
-because no comprehensive test suite has been identified.  The status
-of CDF directives and statements is shown below.
+The CDF should be used with caution because no comprehensive test
+suite has been identified.
 .
 .Ss Conditional Compilation
 .Bl -tag -width >>DEFINE
-.It >> Ns Sy DEFINE Ar name Li = Ar expression
+.It >> Ns Sy DEFINE Ar name Sy AS Bro Ar expression Li | Sy PARAMETER Brc Op Sy OVERRIDE
 Define
 .Ar name
-to have the value
-.Ar expression
-for the purposes of conditional compilation.
+as a compilation variable to have the value
+.Ar expression .
+If
+.Ar name
+was previously defined, 
+.Sy OVERRIDE
+is required, else the directive is invalid. 
 .Sy AS PARAMETER
-is unimplemented.
-.It >> Ns Sy IF Ar expression Li ... >> Ns Sy END-IF
+is accepted, but has no effect in
+.Nm .
+.
+.It >> Ns Sy DEFINE Ar name AS Sy OFF
+releases the definition
+.Ar name ,
+making it subsequently invalid for use.
+.\" ISO requires AS; cdf.y does not. 
+.
+.It >> Ns Sy IF Ar cce Ar text Oo >> Ns Sy ELSE Ar alt-text Oc Li >> Ns Sy END-IF 
 evaluates
-.Ar expression
+.Ar cce ,
+a
+.Em "constant conditional expression\/" ,
 for conditional compilation.
 If a name,
-.Ar expression
+.Ar cce
 may be defined with the
 .Fl D
-command-line parameter.
+command-line parameter.  If true, the \*[lang] text
+.Ar text
+is compiled.  If false,
+.Ar else-text ,
+if present, is compiled. 
 .Bo Sy IS Bo Sy NOT Bc Bc Sy DEFINED
 is supported. Boolean literals are not supported.
+.
 .It >> Ns Sy EVALUATE
 Not implemented.
 .El
@@ -1121,27 +1147,59 @@ was invoked.
 .Nm
 implements all intrinsic functions defined by \*[isostd], plus a few
 others. They are listed alphabetically below.
-.Pp
-ABS ACOS ANNUITY ASIN ATAN BASECONVERT BIT_OF BIT_TO_CHAR
-BOOLEAN_OF_INTEGER BYTE_LENGTH CHAR CHAR_NATIONAL COMBINED_DATETIME
-CONCAT CONVERT COS CURRENT_DATE DATE_OF_INTEGER DATE_TO_YYYYMMDD
-DAY_OF_INTEGER DAY_TO_YYYYDDD DISPLAY_OF E EXCEPTION_FILE
+.Bl -item -compact
+.It
+ABS ACOS ANNUITY ASIN ATAN
+.It
+BASECONVERT BIT_OF BIT_TO_CHAR BOOLEAN_OF_INTEGER BYTE_LENGTH
+.It
+CHAR CHAR_NATIONAL COMBINED_DATETIME CONCAT CONVERT COS CURRENT_DATE
+.It
+DATE_OF_INTEGER DATE_TO_YYYYMMDD DAY_OF_INTEGER DAY_TO_YYYYDDD DISPLAY_OF
+.It
+E EXCEPTION_FILE
 EXCEPTION_FILE_N EXCEPTION_LOCATION EXCEPTION_LOCATION_N
-EXCEPTION_STATEMENT EXCEPTION_STATUS EXP EXP10 FACTORIAL FIND_STRING
+EXCEPTION_STATEMENT EXCEPTION_STATUS EXP EXP10
+.It
+FACTORIAL FIND_STRING
 FORMATTED_CURRENT_DATE FORMATTED_DATE FORMATTED_DATETIME
-FORMATTED_TIME FRACTION_PART HEX_OF HEX_TO_CHAR HIGHEST_ALGEBRAIC
+FORMATTED_TIME FRACTION_PART
+.It
+HEX_OF HEX_TO_CHAR HIGHEST_ALGEBRAIC
+.It
 INTEGER INTEGER_OF_BOOLEAN INTEGER_OF_DATE INTEGER_OF_DAY
-INTEGER_OF_FORMATTED_DATE INTEGER_PART LENGTH LOCALE_COMPARE
+INTEGER_OF_FORMATTED_DATE INTEGER_PART
+.It
+LENGTH LOCALE_COMPARE
 LOCALE_DATE LOCALE_TIME LOCALE_TIME_FROM_SECONDS LOG LOG10 LOWER_CASE
-LOWEST_ALGEBRAIC MAX MEAN MEDIAN MIDRANGE MIN MOD MODULE_NAME
-NATIONAL_OF NUMVAL NUMVAL_C NUMVAL_F ORD ORD_MAX ORD_MIN PI
-PRESENT_VALUE RANDOM RANGE REM REVERSE SECONDS_FROM_FORMATTED_TIME
+LOWEST_ALGEBRAIC
+.It
+MAX MEAN MEDIAN MIDRANGE MIN MOD MODULE_NAME
+.It
+NATIONAL_OF NUMVAL NUMVAL_C NUMVAL_F ORD
+.It
+ORD_MAX ORD_MIN
+.It
+PI PRESENT_VALUE
+.It
+RANDOM RANGE REM REVERSE
+.It
+SECONDS_FROM_FORMATTED_TIME
 SECONDS_PAST_MIDNIGHT SIGN SIN SMALLEST_ALGEBRAIC SQRT
-STANDARD_COMPARE STANDARD_DEVIATION SUBSTITUTE SUM TAN
-TEST_DATE_YYYYMMDD TEST_DAY_YYYYDDD TEST_FORMATTED_DATETIME
-TEST_NUMVAL TEST_NUMVAL_C TEST_NUMVAL_F TRIM ULENGTH UPOS UPPER_CASE
-USUBSTR USUPPLEMENTARY UUID4 UVALID UWIDTH VARIANCE WHEN_COMPILED
+STANDARD_COMPARE STANDARD_DEVIATION SUBSTITUTE SUM
+.It
+TAN TEST_DATE_YYYYMMDD TEST_DAY_YYYYDDD TEST_FORMATTED_DATETIME
+TEST_NUMVAL TEST_NUMVAL_C TEST_NUMVAL_F TRIM
+.It
+ULENGTH UPOS UPPER_CASE
+USUBSTR USUPPLEMENTARY UUID4 UVALID UWIDTH
+.It
+VARIANCE
+.It
+WHEN_COMPILED
+.It
 YEAR_TO_YYYY
+.Bl
 .
 .Ss Binary floating point DISPLAY
 How the DISPLAY presents binary floating point numbers depends on the value.
-- 
GitLab