From f9e8a7ab72406c03e0337f36ec5047fe7eb7782a Mon Sep 17 00:00:00 2001
From: Abhishek Ulayil <62772223+Abhi-1U@users.noreply.github.com>
Date: Fri, 12 Jul 2024 16:40:55 +0200
Subject: [PATCH 1/4] Fixing max print for matrices bug 15027

---
 src/main/printarray.c | 42 +++++++++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/main/printarray.c b/src/main/printarray.c
index b159c50fdab..79be67ac9b0 100644
--- a/src/main/printarray.c
+++ b/src/main/printarray.c
@@ -348,35 +348,55 @@ void printMatrix(SEXP x, int offset, SEXP dim, int quote, int right,
     if(c > 0 && R_print.max / c < r) /* avoid integer overflow */
 	/* using floor(), not ceil(), since 'c' could be huge: */
 	r_pr = R_print.max / c;
+    int c_pr = c;
+    if (c > R_print.max) {
+        c_pr = R_print.max;
+	r_pr = 1;
+    }
     switch (TYPEOF(x)) {
     case LGLSXP:
-	printLogicalMatrix(x, offset, r_pr, r, c, rl, cl, rn, cn, TRUE);
+	printLogicalMatrix(x, offset, r_pr, r, c_pr, rl, cl, rn, cn, TRUE);
 	break;
     case INTSXP:
-	printIntegerMatrix(x, offset, r_pr, r, c, rl, cl, rn, cn, TRUE);
+	printIntegerMatrix(x, offset, r_pr, r, c_pr, rl, cl, rn, cn, TRUE);
 	break;
     case REALSXP:
-	printRealMatrix	  (x, offset, r_pr, r, c, rl, cl, rn, cn, TRUE);
+	printRealMatrix	  (x, offset, r_pr, r, c_pr, rl, cl, rn, cn, TRUE);
 	break;
     case CPLXSXP:
-	printComplexMatrix(x, offset, r_pr, r, c, rl, cl, rn, cn, TRUE);
+	printComplexMatrix(x, offset, r_pr, r, c_pr, rl, cl, rn, cn, TRUE);
 	break;
     case STRSXP:
 	if (quote) quote = '"';
-	printStringMatrix (x, offset, r_pr, r, c, quote, right, rl, cl, rn, cn, TRUE);
+	printStringMatrix (x, offset, r_pr, r, c_pr, quote, right, rl, cl, rn, cn, TRUE);
 	break;
     case RAWSXP:
-	printRawMatrix	  (x, offset, r_pr, r, c, rl, cl, rn, cn, TRUE);
+	printRawMatrix	  (x, offset, r_pr, r, c_pr, rl, cl, rn, cn, TRUE);
 	break;
     default:
 	UNIMPLEMENTED_TYPE("printMatrix", x);
     }
 #ifdef ENABLE_NLS
-    if(r_pr < r) // number of formats must be consistent here
-	Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row ]\n",
-			 " [ reached getOption(\"max.print\") -- omitted %d rows ]\n",
-			 r - r_pr),
-		r - r_pr);
+    if (r ==1 && (c - c_pr) > 0) {
+        Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d columns ]\n",
+	                 " [ reached getOption(\"max.print\") -- omitted %d columns ]\n",
+	                 c - c_pr),
+	        c - c_pr);	
+    }
+    if (r_pr < r) { // number of formats must be consistent here
+        if ((c - c_pr) <= 0) {
+	    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row ]\n",
+		             " [ reached getOption(\"max.print\") -- omitted %d rows ]\n",
+		             r - r_pr),
+	            r - r_pr);	
+	}
+	else {
+	    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row  and %d columns ]\n",
+			     " [ reached getOption(\"max.print\") -- omitted %d rows and %d columns ]\n",
+			     r - r_pr),
+		    r - r_pr,c-c_pr);
+	}
+    }
 #else
     if(r_pr < r)
 	Rprintf(" [ reached getOption(\"max.print\") -- omitted %d rows ]\n",

From 5ebc4a11c0745bfe371cf357d30dbc3531891d96 Mon Sep 17 00:00:00 2001
From: Abhishek Ulayil <62772223+Abhi-1U@users.noreply.github.com>
Date: Fri, 12 Jul 2024 17:22:20 +0200
Subject: [PATCH 2/4] Fixed ngettext options.

---
 src/main/printarray.c | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/main/printarray.c b/src/main/printarray.c
index 79be67ac9b0..ef71dccf949 100644
--- a/src/main/printarray.c
+++ b/src/main/printarray.c
@@ -1,3 +1,4 @@
+
 /*
  *  R : A Computer Language for Statistical Data Analysis
  *  Copyright (C) 1995, 1996	Robert Gentleman and Ross Ihaka
@@ -377,25 +378,33 @@ void printMatrix(SEXP x, int offset, SEXP dim, int quote, int right,
 	UNIMPLEMENTED_TYPE("printMatrix", x);
     }
 #ifdef ENABLE_NLS
-    if (r ==1 && (c - c_pr) > 0) {
-        Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d columns ]\n",
+    if (r == 1 && (c - c_pr) > 0) {
+        Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d column ]\n",
 	                 " [ reached getOption(\"max.print\") -- omitted %d columns ]\n",
 	                 c - c_pr),
-	        c - c_pr);	
+	            c - c_pr);	
     }
     if (r_pr < r) { // number of formats must be consistent here
         if ((c - c_pr) <= 0) {
-	    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row ]\n",
-		             " [ reached getOption(\"max.print\") -- omitted %d rows ]\n",
-		             r - r_pr),
-	            r - r_pr);	
-	}
-	else {
-	    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row  and %d columns ]\n",
-			     " [ reached getOption(\"max.print\") -- omitted %d rows and %d columns ]\n",
-			     r - r_pr),
-		    r - r_pr,c-c_pr);
-	}
+	        Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row ]\n",
+		                     " [ reached getOption(\"max.print\") -- omitted %d rows ]\n",
+		                     r - r_pr),
+	                r - r_pr);
+	    }
+	    else {
+	        if ((c-c_pr) == 1) {	    
+			    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row  and 1 column ]\n",
+			                     " [ reached getOption(\"max.print\") -- omitted %d rows and 1 column ]\n",
+			                     r - r_pr),
+		                r - r_pr);
+		    }
+		    else {
+			    Rprintf(ngettext(" [ reached getOption(\"max.print\") -- omitted %d row  and %d columns ]\n",
+			                     " [ reached getOption(\"max.print\") -- omitted %d rows and %d columns ]\n",
+			                     r - r_pr),
+		                r - r_pr, c-c_pr);
+		    }
+	    }
     }
 #else
     if(r_pr < r)
@@ -524,4 +533,3 @@ void printArray(SEXP x, SEXP dim, int quote, int right, SEXP dimnames)
     UNPROTECT(nprotect);
     vmaxset(vmax);
 }
-

From 1cfdc24618eaf368da664b5c1f2a7d627ae096fb Mon Sep 17 00:00:00 2001
From: Abhi-1U <62772223+Abhi-1U@users.noreply.github.com>
Date: Fri, 12 Jul 2024 17:30:59 +0200
Subject: [PATCH 3/4] Test cases for bug 15027

---
 tests/print-tests.R         | 17 +++++++++++++++++
 tests/print-tests.Rout.save | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/tests/print-tests.R b/tests/print-tests.R
index bcafe7e8976..3afd2d81b86 100644
--- a/tests/print-tests.R
+++ b/tests/print-tests.R
@@ -339,5 +339,22 @@ as.complex(1:10)
 as.raw(1:10)
 options(o)
 
+## max.print and max 
+## bug 15027 https://bugs.r-project.org/show_bug.cgi?id=15027
+## whenever the columns are larger than max.print, no values inside the matrix are displayed
+print(matrix(nrow = 100, ncol = 4), max = 5) ## works
+## fix: ommiting rows **and** columns and warning printed
+## case: omiting rows and columns
+print(matrix(nrow = 10, ncol = 4), max = 3)
+## case: omitting rows
+print(matrix(nrow = 10, ncol = 2), max = 5)
+## case: omitting cols, at least one row prints
+print(matrix(nrow = 1, ncol = 6), max = 5)
+## in R 4.4.0 there should be a warning for ommited rows (NEW BUG)
+print(array(dim = c(2, 4, 1)), max = 3)
+## this does not print anything but it should show 
+## at least one element according to the logic of max.print
+print(array(dim = c(2, 2, 1)), max = 1)
+
 ## Cleanup
 rm(print.foo, obj, a, b, c, d, o)
diff --git a/tests/print-tests.Rout.save b/tests/print-tests.Rout.save
index 34d914e6ca1..f28b3f8c7dd 100644
--- a/tests/print-tests.Rout.save
+++ b/tests/print-tests.Rout.save
@@ -941,6 +941,38 @@ NULL
  [ reached getOption("max.print") -- omitted 5 entries ]
 > options(o)
 > 
+> ## max.print and max 
+> ## bug 15027 https://bugs.r-project.org/show_bug.cgi?id=15027
+> ## whenever the columns are larger than max.print, no values inside the matrix are displayed
+> print(matrix(nrow = 100, ncol = 4), max = 5) ## works
+       [,1] [,2] [,3] [,4]
+  [1,]   NA   NA   NA   NA
+ [ reached getOption("max.print") -- omitted 99 rows ]
+> ## fix: ommiting rows **and** columns and warning printed
+> ## case: omiting rows and columns
+> print(matrix(nrow = 10, ncol = 4), max = 3)
+      [,1] [,2] [,3]
+ [1,]   NA   NA   NA
+ [ reached getOption("max.print") -- omitted 9 rows and 1 column ]
+> ## case: omitting rows
+> print(matrix(nrow = 10, ncol = 2), max = 5)
+      [,1] [,2]
+ [1,]   NA   NA
+ [2,]   NA   NA
+ [ reached getOption("max.print") -- omitted 8 rows ]
+> ## case: omitting cols, at least one row prints
+> print(matrix(nrow = 1, ncol = 6), max = 5)
+     [,1] [,2] [,3] [,4] [,5]
+[1,]   NA   NA   NA   NA   NA
+ [ reached getOption("max.print") -- omitted 1 column ]
+> ## in R 4.4.0 there should be a warning for ommited rows (NEW BUG)
+> print(array(dim = c(2, 4, 1)), max = 3)
+ [ reached getOption("max.print") -- omitted 1 matrix slice(s) ]
+> ## this does not print anything but it should show 
+> ## at least one element according to the logic of max.print
+> print(array(dim = c(2, 2, 1)), max = 1)
+ [ reached getOption("max.print") -- omitted 1 matrix slice(s) ]
+> 
 > ## Cleanup
 > rm(print.foo, obj, a, b, c, d, o)
 > 

From f4de9df39eada48ebfbac72c7ff0fdcbf789546d Mon Sep 17 00:00:00 2001
From: Abhi-1U <62772223+Abhi-1U@users.noreply.github.com>
Date: Fri, 12 Jul 2024 23:57:05 +0200
Subject: [PATCH 4/4] fixed condition when r = 0

---
 src/main/printarray.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/main/printarray.c b/src/main/printarray.c
index ef71dccf949..f51d4c013e8 100644
--- a/src/main/printarray.c
+++ b/src/main/printarray.c
@@ -352,7 +352,9 @@ void printMatrix(SEXP x, int offset, SEXP dim, int quote, int right,
     int c_pr = c;
     if (c > R_print.max) {
         c_pr = R_print.max;
-	r_pr = 1;
+		if (r > 0) {
+	        r_pr = 1;
+		}
     }
     switch (TYPEOF(x)) {
     case LGLSXP: