This is an automated email from the ASF dual-hosted git repository.

lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d9e6cc  [NETBEANS-3648] Support single quotes in parameter parsing
0d9e6cc is described below

commit 0d9e6cc6dfc456a40a5cd9d335c92f5820d81b3b
Author: Laszlo Kishalmi <laszlo.kisha...@gmail.com>
AuthorDate: Sun Dec 29 09:24:57 2019 -0800

    [NETBEANS-3648] Support single quotes in parameter parsing
---
 .../src/org/openide/util/BaseUtilities.java        | 172 ++++++++-------------
 .../src/org/openide/util/BaseUtilitiesTest.java    |  61 +++++++-
 2 files changed, 121 insertions(+), 112 deletions(-)

diff --git a/platform/openide.util/src/org/openide/util/BaseUtilities.java 
b/platform/openide.util/src/org/openide/util/BaseUtilities.java
index 9dfb1f7..2fda5b5 100644
--- a/platform/openide.util/src/org/openide/util/BaseUtilities.java
+++ b/platform/openide.util/src/org/openide/util/BaseUtilities.java
@@ -1036,12 +1036,11 @@ widthcheck:  {
     * @return an array of parameters
     */
     public static String[] parseParameters(String s) {
-        int NULL = 0x0; // STICK + whitespace or NULL + non_"
-        int INPARAM = 0x1; // NULL + " or STICK + " or INPARAMPENDING + "\ // 
NOI18N
-        int INPARAMPENDING = 0x2; // INPARAM + \
-        int STICK = 0x4; // INPARAM + " or STICK + non_" // NOI18N
-        int STICKPENDING = 0x8; // STICK + \
-        ArrayList<String> params = new ArrayList<String>(5);
+        final int NULL = 0x0;
+        final int IN_PARAM = 0x1;
+        final int IN_DOUBLE_QUOTE = 0x2;
+        final int IN_SINGLE_QUOTE = 0x3;
+        ArrayList<String> params = new ArrayList<>(5);
         char c;
 
         int state = NULL;
@@ -1050,117 +1049,72 @@ widthcheck:  {
 
         for (int i = 0; i < slength; i++) {
             c = s.charAt(i);
-
-            if (Character.isWhitespace(c)) {
-                if (state == NULL) {
-                    if (buff.length() > 0) {
-                        params.add(buff.toString());
-                        buff.setLength(0);
+            switch (state) {
+                case NULL:
+                    switch (c) {
+                        case '\'':
+                            state = IN_SINGLE_QUOTE;
+                            break;
+                        case '"':
+                            state = IN_DOUBLE_QUOTE;
+                            break;
+                        default:
+                            if (!Character.isWhitespace(c)) {
+                                buff.append(c);
+                                state = IN_PARAM;
+                            }
                     }
-                } else if (state == STICK) {
-                    params.add(buff.toString());
-                    buff.setLength(0);
-                    state = NULL;
-                } else if (state == STICKPENDING) {
-                    buff.append('\\');
-                    params.add(buff.toString());
-                    buff.setLength(0);
-                    state = NULL;
-                } else if (state == INPARAMPENDING) {
-                    state = INPARAM;
-                    buff.append('\\');
-                    buff.append(c);
-                } else { // INPARAM
-                    buff.append(c);
-                }
-
-                continue;
-            }
-
-            if (c == '\\') {
-                if (state == NULL) {
-                    ++i;
-
-                    if (i < slength) {
-                        char cc = s.charAt(i);
-
-                        if ((cc == '"') || (cc == '\\')) {
-                            buff.append(cc);
-                        } else if (Character.isWhitespace(cc)) {
-                            buff.append(c);
-                            --i;
-                        } else {
-                            buff.append(c);
-                            buff.append(cc);
-                        }
+                    break;
+                case IN_SINGLE_QUOTE:
+                    if (c != '\'') {
+                        buff.append(c);
                     } else {
-                        buff.append('\\');
-
-                        break;
+                        state = IN_PARAM;
                     }
-
-                    continue;
-                } else if (state == INPARAM) {
-                    state = INPARAMPENDING;
-                } else if (state == INPARAMPENDING) {
-                    buff.append('\\');
-                    state = INPARAM;
-                } else if (state == STICK) {
-                    state = STICKPENDING;
-                } else if (state == STICKPENDING) {
-                    buff.append('\\');
-                    state = STICK;
-                }
-
-                continue;
-            }
-
-            if (c == '"') {
-                if (state == NULL) {
-                    state = INPARAM;
-                } else if (state == INPARAM) {
-                    state = STICK;
-                } else if (state == STICK) {
-                    state = INPARAM;
-                } else if (state == STICKPENDING) {
-                    buff.append('"');
-                    state = STICK;
-                } else { // INPARAMPENDING
-                    buff.append('"');
-                    state = INPARAM;
-                }
-
-                continue;
-            }
-
-            if (state == INPARAMPENDING) {
-                buff.append('\\');
-                state = INPARAM;
-            } else if (state == STICKPENDING) {
-                buff.append('\\');
-                state = STICK;
+                    break;
+                case IN_DOUBLE_QUOTE:
+                    switch (c) {
+                        case '\\':
+                            char peek = (i < slength - 1) ? s.charAt(i+1) : 
Character.MIN_VALUE;
+                            if (peek == '"' || peek =='\\') {
+                                buff.append(peek);
+                                i++;
+                            } else {
+                                buff.append(c);
+                            }
+                            break;
+                        case '"':
+                            state = IN_PARAM;
+                            break;
+                        default:
+                            buff.append(c);
+                    }
+                    break;
+                case IN_PARAM:
+                    switch (c) {
+                        case '\'':
+                            state = IN_SINGLE_QUOTE;
+                            break;
+                        case '"':
+                            state = IN_DOUBLE_QUOTE;
+                            break;
+                        default:
+                          if (Character.isWhitespace(c)) {
+                              params.add(buff.toString());
+                              buff.setLength(0);
+                              state = NULL;
+                          } else {
+                              buff.append(c);
+                          }
+                    }
+                    break;
             }
-
-            buff.append(c);
         }
-
-        // collect
-        if (state == INPARAM) {
+        if (buff.length() > 0) {
             params.add(buff.toString());
-        } else if ((state & (INPARAMPENDING | STICKPENDING)) != 0) {
-            buff.append('\\');
-            params.add(buff.toString());
-        } else { // NULL or STICK
-
-            if (buff.length() != 0) {
-                params.add(buff.toString());
-            }
         }
 
-        String[] ret = new String[params.size()];
-        params.toArray(ret);
-
-        return ret;
+        return params.toArray(new String[params.size()]);
     }
 
     /** Complementary method to parseParameters
diff --git 
a/platform/openide.util/test/unit/src/org/openide/util/BaseUtilitiesTest.java 
b/platform/openide.util/test/unit/src/org/openide/util/BaseUtilitiesTest.java
index a27fdc2..f5116c1 100644
--- 
a/platform/openide.util/test/unit/src/org/openide/util/BaseUtilitiesTest.java
+++ 
b/platform/openide.util/test/unit/src/org/openide/util/BaseUtilitiesTest.java
@@ -22,9 +22,6 @@ package org.openide.util;
 import java.io.File;
 import java.net.URI;
 import java.util.Locale;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 
 /**
@@ -146,4 +143,62 @@ public class BaseUtilitiesTest extends NbTestCase {
         assertEquals(f, BaseUtilities.toFile(u));
     }
 
+    public void testParseParameters1() {
+        String[] args = BaseUtilities.parseParameters("\"c:\\program 
files\\jdk\\bin\\java\" -Dmessage=\"Hello /\\\\/\\\\ there!\" -Xmx128m");
+        assertEquals(3, args.length);
+        assertEquals("c:\\program files\\jdk\\bin\\java", args[0]);
+        assertEquals("-Dmessage=Hello /\\/\\ there!", args[1]);
+        assertEquals("-Xmx128m", args[2]);
+    }
+
+    public void testParseParameters2() {
+        String[] args = BaseUtilities.parseParameters("c:\\program 
files\\jdk\\bin\\java   -Xmx128m");
+        assertEquals(3, args.length);
+        assertEquals("c:\\program", args[0]);
+        assertEquals("files\\jdk\\bin\\java", args[1]);
+        assertEquals("-Xmx128m", args[2]);
+    }
+
+    public void testParseParameters3() {
+        String[] args = BaseUtilities.parseParameters("\"-Xmx128m");
+        assertEquals(1, args.length);
+        assertEquals("-Xmx128m", args[0]);
+    }
+
+    public void testParseParameters4() {
+        String[] args = BaseUtilities.parseParameters("'-Xmx128m");
+        assertEquals(1, args.length);
+        assertEquals("-Xmx128m", args[0]);
+    }
+
+    public void testParseParameters5() {
+        String[] args = BaseUtilities.parseParameters("-Dmessage='Hello 
\"NetBeans\"'");
+        assertEquals(1, args.length);
+        assertEquals("-Dmessage=Hello \"NetBeans\"", args[0]);
+    }
+
+    public void testParseParameters6() {
+        String[] args = BaseUtilities.parseParameters("'c:\\program 
files\\jdk\\bin\\java'\n-Dmessage='Hello /\\/\\ there!' \t -Xmx128m");
+        assertEquals(3, args.length);
+        assertEquals("c:\\program files\\jdk\\bin\\java", args[0]);
+        assertEquals("-Dmessage=Hello /\\/\\ there!", args[1]);
+        assertEquals("-Xmx128m", args[2]);
+    }
+
+    public void testParseParameters7() {
+        String[] args = BaseUtilities.parseParameters("-Dmessage=\"NetBeans\" 
\"\" 'third\narg'");
+        assertEquals(3, args.length);
+        assertEquals("-Dmessage=NetBeans", args[0]);
+        assertEquals("", args[1]);
+        assertEquals("third\narg", args[2]);
+    }
+
+    public void testParseParameters8() {
+        String[] args = BaseUtilities.parseParameters("-Dmessage=\"NetBeans\" 
\"\" \"third\\narg\"");
+        assertEquals(3, args.length);
+        assertEquals("-Dmessage=NetBeans", args[0]);
+        assertEquals("", args[1]);
+        assertEquals("third\\narg", args[2]);
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to