* Bug 16143 fixed: clc(n) cleared n+1 lines instead of n>0 66/21166/10
Chin Luh Tan [Thu, 12 Dec 2019 22:56:48 +0000 (23:56 +0100)]
* Bug 14642 fized: no more "\r" carriage return with printf

  http://bugzilla.scilab.org/16143
  http://bugzilla.scilab.org/14642

  Test 1:
  // Test 1
  mode(0)
  mode(0)
  mode(0)
  clc(1)
should leave
--> // Test 1
--> mode(0)
--> mode(0)
-->

  Test 2:
  // Test 2
  printf("\ntoto, \r titi");
should leave
--> // Test 2
--> printf("\ntoto, \r titi");

 titi

Change-Id: I732698f754c07f94efb5a48c3130f7e53e5e8e71

scilab/CHANGES.md
scilab/modules/console/src/c/clc.c
scilab/modules/console/src/java/org/scilab/modules/console/SciConsole.java
scilab/modules/console/src/java/org/scilab/modules/console/SciOutputView.java
scilab/modules/console/tests/nonreg_tests/bug_14642.tst [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_16143.tst [new file with mode: 0644]

index ac91779..c3d20c4 100644 (file)
@@ -186,6 +186,7 @@ Bug Fixes
 * [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` is 40x slower with 6.0.0 wrt 5.5.2
 * [#14605](http://bugzilla.scilab.org/show_bug.cgi?id=14605): fixed - `bench_run` was too strict about the specification of tests names.
 * [#14606](http://bugzilla.scilab.org/show_bug.cgi?id=14606): Memory used by variables returned by `[names,mem]=who()` was always zero.
+* [#14642](http://bugzilla.scilab.org/show_bug.cgi?id=14642): No more "\r" carriage return with printf.
 * [#14741](http://bugzilla.scilab.org/show_bug.cgi?id=14741): The syntax `[m,e]=log2(x)` was not documented. As public function `frexp()` was in duplicate with `[m,e]=log2(x)`.
 * [#14746](http://bugzilla.scilab.org/show_bug.cgi?id=14746): Tiny numbers were sometimes displayed as 0.
 * [#14791](http://bugzilla.scilab.org/show_bug.cgi?id=14791): `sleep 1` crashed Scilab.
@@ -224,7 +225,7 @@ Bug Fixes
 * [#16012](http://bugzilla.scilab.org/show_bug.cgi?id=16012): `[struct() struct()]` crashed Scilab.
 * [#16013](http://bugzilla.scilab.org/show_bug.cgi?id=16013): Load previously saved environment with "File/Load environment" menu failed.
 * [#16014](http://bugzilla.scilab.org/show_bug.cgi?id=16014): after `x.a=1; x(:)=[]` x.a was an empty list.
-* [#16015](http://bugzilla.scilab.org/show_bug.cgi?id=116015): `intg(a,b,f)` called f(x) with x outside [a,b].
+* [#16015](http://bugzilla.scilab.org/show_bug.cgi?id=16015): `intg(a,b,f)` called f(x) with x outside [a,b].
 * [#16021](http://bugzilla.scilab.org/show_bug.cgi?id=16021): `tand([-90 90])` answered [Nan Nan] instead of [-Inf, Inf]. `cotd([-90 90])` answered [Nan Nan] instead of [0 0]. `1 ./cosd([-90 90])` answered [Inf -Inf] instead of [Inf Inf].
 * [#16026](http://bugzilla.scilab.org/show_bug.cgi?id=16026): For `atanh()`, neither the documentation pages nor the `m2sci` converter were up to date.
 * [#16051](http://bugzilla.scilab.org/show_bug.cgi?id=16051): undefined list elements could be of 2 distinct typeof "void" or "listundefined" according to the way they are created.
@@ -239,6 +240,7 @@ Bug Fixes
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
 * [#16118](http://bugzilla.scilab.org/show_bug.cgi?id=16118): `%s <> (1+%s)` returned %F.
 * [#16139](http://bugzilla.scilab.org/show_bug.cgi?id=16139): `auread()` and `auwrite()` kept the sound file open and locked when returning on errors. They poorly handled the default .au sound file extension.
+* [#16143](http://bugzilla.scilab.org/show_bug.cgi?id=16143): `clc(n)` cleared n+1 lines instead of n>0. Thus, it was not possible to clear only one line. 
 * [#16144](http://bugzilla.scilab.org/show_bug.cgi?id=16144): Addition of sparse matrices gave incorrect results.
 * [#16152](http://bugzilla.scilab.org/show_bug.cgi?id=16152): For sparse or boolean sparse matrix `s`, `s([])` returned `[]` instead of `sparse([])`.
 * [#16158](http://bugzilla.scilab.org/show_bug.cgi?id=16158): When a multicolumn array of rationals was displayed wide column per column, columns #2:$ were replaced with its column #2.
index c1a7b29..e3dad86 100644 (file)
@@ -37,9 +37,20 @@ BOOL clc(int nblines)
         {
 #ifdef  _MSC_VER
             clrscrPart_nw(nblines);
+            if (getPromptMode() != 2) /* Add extra newline for other modes besides mode 2 */
+            {
+                printf("\n");
+            }
             bOK = TRUE;
 #else
-            printf("\033[%dA\033[J", nblines + 2);
+            if (getPromptMode() == 2) /* Check for output mode(2) and move the cursor up for extra 1 line */
+            {
+                printf("\033[%dA\033[J\033[A", nblines + 1);
+            }
+            else
+            {
+                printf("\033[%dA\033[J", nblines + 1);
+            }
             bOK = TRUE;
 #endif
         }
index 01d98f7..ea29635 100644 (file)
@@ -435,6 +435,9 @@ public abstract class SciConsole extends JPanel {
                 // We have to remove the command entered by the user
                 int totalNumberOfLines = nbLines + LINE_NUMBER_IN_PROMPT;
 
+                //  We add a space to add a line to make it consistent clc for all mode
+                config.getOutputView().append(" ");
+
                 Document outputDoc = ((JEditorPane) config.getOutputView()).getDocument();
                 String outputTxt =  outputDoc.getText(0, outputDoc.getLength());
 
@@ -455,6 +458,10 @@ public abstract class SciConsole extends JPanel {
                         }
                     }
                 }
+
+                // Bring the prompt back to the left
+                config.getOutputView().append("\r");
+
             } catch (BadLocationException e) {
                 e.printStackTrace();
             }
index 54630e4..33f1ebe 100644 (file)
@@ -104,8 +104,10 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
             }
         });
 
-        /* A PlainDocument contains only "box" for lines not for all characters (as in a StyledDocument)
-           so there are less boxes to explore in a PlainDocument... */
+        /*
+         * A PlainDocument contains only "box" for lines not for all characters (as in a
+         * StyledDocument) so there are less boxes to explore in a PlainDocument...
+         */
         setDocument(new PlainDocument());
         setMaxSize(10000);
         setBorder(BorderFactory.createEmptyBorder(TOP_BORDER, LEFT_BORDER, BOTTOM_BORDER, RIGHT_BORDER));
@@ -120,6 +122,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
         /**
          * Default caret for output view (to handle paste actions using middle button)
+         *
          * @author Vincent COUVERT
          */
         final class FixedCaret extends ScilabCaret {
@@ -135,6 +138,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
             /**
              * Manages mouse clicks
+             *
              * @param e the event
              * @see javax.swing.text.DefaultCaret#mouseClicked(java.awt.event.MouseEvent)
              */
@@ -150,7 +154,8 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
                             if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                                 try {
                                     String pastedText = (String) trans.getTransferData(DataFlavor.stringFlavor);
-                                    ((JTextPane) getConsole().getConfiguration().getInputCommandView()).replaceSelection(pastedText);
+                                    ((JTextPane) getConsole().getConfiguration().getInputCommandView())
+                                            .replaceSelection(pastedText);
                                 } catch (UnsupportedFlavorException e1) {
                                     e1.printStackTrace();
                                 } catch (IOException e1) {
@@ -198,7 +203,8 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
     /**
      * @param styledDocument
      */
-    public void setStyledDocument(StyledDocument styledDocument) { }
+    public void setStyledDocument(StyledDocument styledDocument) {
+    }
 
     public void resetLastEOL() {
         lastEOL = false;
@@ -206,7 +212,8 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
     /**
      * Display a buffer entry in the console
-     * @param buff the string  to write
+     *
+     * @param buff  the string to write
      * @param style the style to use to format the string
      */
     private void displayLineBuffer(String buff, String style) {
@@ -222,17 +229,23 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
                 e.printStackTrace();
             }
             return;
+        } else if (buff.contains("\r")) {
+            /* If \r is part of the buff then perform CR on to the buff */
+            int n = buff.lastIndexOf("\r");
+            buff = buff.substring(n + 1) + buff.substring(buff.length() - n - 1, n) + "\r";
+
         } else {
             /* Change position for insertion if a previous \r still influence display */
             if ((insertPosition != 0) && (insertPosition < sDocLength)) {
                 sDocLength = insertPosition;
                 try {
                     /* Remove chars to be replaced */
-                    if (insertPosition + buff.length() <= getDocument().getLength()) {
-                        getDocument().remove(insertPosition, buff.length());
-                    } else {
-                        /* Remove end of line */
-                        getDocument().remove(insertPosition, getDocument().getLength() - insertPosition);
+                    if (!buff.equals("\n")) {
+                        if ((insertPosition + buff.length() == getDocument().getLength())) {
+                            getDocument().remove(insertPosition, buff.length());
+                        } else {
+                            getDocument().remove(insertPosition, getDocument().getLength() - insertPosition);
+                        }
                     }
                 } catch (BadLocationException e) {
                     e.printStackTrace();
@@ -259,6 +272,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
             /* Move insertPosition to the end of last inserted data */
             if (insertPosition != 0) {
+
                 insertPosition += str.length();
             }
         } catch (BadLocationException e) {
@@ -267,11 +281,15 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
         int count = getDocument().getDefaultRootElement().getElementCount();
         if (count > 1.5 * maxNumberOfLines) {
-            /* A removal is costly: array copy and with a gap buffer that leads to two array copies (when remove is followed by an insert).
-               So the idea is to minimize the number of removal: a removal only when 0.5*maxNumberOfLines useless lines are entered.
-            */
+            /*
+             * A removal is costly: array copy and with a gap buffer that leads to two array
+             * copies (when remove is followed by an insert). So the idea is to minimize the
+             * number of removal: a removal only when 0.5*maxNumberOfLines useless lines are
+             * entered.
+             */
             try {
-                getDocument().remove(0, getDocument().getDefaultRootElement().getElement(count - maxNumberOfLines - 1).getEndOffset());
+                getDocument().remove(0,
+                        getDocument().getDefaultRootElement().getElement(count - maxNumberOfLines - 1).getEndOffset());
             } catch (BadLocationException e) {
                 e.printStackTrace();
             }
@@ -286,11 +304,10 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
      * Adds text to the output view and change the size of others components if
      * necessary
      *
-     * @param content
-     *            text to add
+     * @param content text to add
      */
     public void append(String content) {
-        //append(content, activeStyle);
+        // append(content, activeStyle);
         displayLineBuffer(content, activeStyle);
     }
 
@@ -298,10 +315,8 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
      * Adds text to the output view and change the size of others components if
      * necessary
      *
-     * @param content
-     *            text to add
-     * @param styleName
-     *            style to set for content
+     * @param content   text to add
+     * @param styleName style to set for content
      */
     public void append(String content, String styleName) {
         if (styleName.equals(lastAppendedStyle) && bufferQueue.size() > 1) {
@@ -375,8 +390,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
     /**
      * Set the style for current text
      *
-     * @param styleName
-     *            the style to set
+     * @param styleName the style to set
      * @see com.artenum.rosetta.interfaces.ui.OutputView#setStyleName(java.lang.String)
      */
     public void setStyleName(String styleName) {
@@ -386,19 +400,17 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
     /**
      * Sets the console object containing this output view
      *
-     * @param c
-     *            the console associated
+     * @param c the console associated
      */
     public void setConsole(SciConsole c) {
         console = c;
 
         // Drag n' Drop handling
-        this.setDropTarget(new DropTarget(this,
-                                          DnDConstants.ACTION_COPY_OR_MOVE, new SciDropTargetListener(console)));
+        this.setDropTarget(new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new SciDropTargetListener(console)));
 
         // Commented because now done by the caret class
-        //FocusMouseListener focusGrabber = new FocusMouseListener(console);
-        //this.addMouseListener(focusGrabber);
+        // FocusMouseListener focusGrabber = new FocusMouseListener(console);
+        // this.addMouseListener(focusGrabber);
     }
 
     /**
@@ -412,6 +424,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
     /**
      * Get the current thread used to display
+     *
      * @return the thread
      */
     public Thread getThread() {
@@ -420,6 +433,7 @@ public class SciOutputView extends JEditorPane implements OutputView, ViewFactor
 
     /**
      * Set the maximum number of lines to keep before deleting the older one
+     *
      * @param number the maximum
      */
     public void setMaxSize(int number) {
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_14642.tst b/scilab/modules/console/tests/nonreg_tests/bug_14642.tst
new file mode 100644 (file)
index 0000000..a0cd32e
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Tan C.L. ByteCode
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 14642 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14642
+//
+// <-- INTERACTIVE TEST -->
+// no more "\r" carriage return with print -> this patch fixes this problem
+// partially. The case where the "\r" located in the same line with the text
+// inside a loop still unhandled for STD console.
+
+
+// Test 1
+clc;
+for i = 1:10, mprintf("%d",i), sleep(100), mprintf("\r"), end;
+// should leave
+// --> for i = 1:10, mprintf("%d",i), sleep(100), mprintf("\r"), end;
+// 10
+// -->
+
+// Test 2
+clc;
+mprintf("tititatatutu,\rtoto");
+// should leave
+// --> mprintf("tititatatutu,\rtoto");
+// tototatatutu,
+
+
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_16143.tst b/scilab/modules/console/tests/nonreg_tests/bug_16143.tst
new file mode 100644 (file)
index 0000000..89177e7
--- /dev/null
@@ -0,0 +1,47 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Tan C.L. ByteCode
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 16143 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16143
+//
+// <-- INTERACTIVE TEST -->
+// clc(n) cleared n+1 lines instead of n>0
+
+// Test 1
+clc;
+mode(0);
+mode(0);
+mode(0);
+clc(1);
+// should leave
+// --> mode(0);
+// --> mode(0);
+// -->
+
+// Test 2
+clc;
+mode(2);
+mode(2);
+mode(2);
+clc(1);
+// should leave
+// --> mode(2);
+//
+// --> mode(2);
+//
+// --> mode(2);
+// -->
+
+// Test 3
+clc;
+for i = 1:10, mprintf("%d\n\n\n",i), sleep(100), clc(1), end;
+// should leave
+// --> for i = 1:10, mprintf("%d\n\n\n",i), sleep(100), clc(1), end;
+// 10
+// -->