[Libreoffice-commits] .: 2 commits - sal/osl

Tor Lillqvist tml at kemper.freedesktop.org
Sun Nov 20 08:14:10 PST 2011


 sal/osl/android/src/fi/iki/tml/CommandLine.java            |  176 +++++++++++++
 sal/osl/android/src/org/libreoffice/android/Bootstrap.java |   10 
 2 files changed, 179 insertions(+), 7 deletions(-)

New commits:
commit 8ec713573073baa3bb90e6a4051938d700480c03
Author: Tor Lillqvist <tlillqvist at suse.com>
Date:   Sun Nov 20 18:07:32 2011 +0200

    Use proper command line parsing for the lo-main-cmdline extra string

diff --git a/sal/osl/android/src/org/libreoffice/android/Bootstrap.java b/sal/osl/android/src/org/libreoffice/android/Bootstrap.java
index 505b72e..5df072d 100644
--- a/sal/osl/android/src/org/libreoffice/android/Bootstrap.java
+++ b/sal/osl/android/src/org/libreoffice/android/Bootstrap.java
@@ -34,6 +34,8 @@ import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.util.Log;
 
+import fi.iki.tml.CommandLine;
+
 // We override NativeActivity so that we can get at the intent of the
 // activity and its extra parameters, that we use to tell us what
 // actual LibreOffice "program" to run. I.e. something that on desktop
@@ -111,13 +113,7 @@ public class Bootstrap extends NativeActivity
 
         Log.i(TAG, String.format("cmdLine=%s", cmdLine));
 
-        String[] argv = cmdLine.split(" ");
-
-        // As we don't do any shell style quote handling, to enable
-        // having spaces in argv elements, they need to be entered as
-        // '~' characters which we here change into spaces...
-        for (int i = 0; i < argv.length; i++)
-            argv[i] = argv[i].replace('~', ' ');
+        String[] argv = CommandLine.split(cmdLine);
 
         // Load the LO "program" here and look up lo_main
         int loLib = dlopen(mainLibrary);
commit 5d01d4e37c9e0aa5f1139eed3ea159fa5217e031
Author: Tor Lillqvist <tml at iki.fi>
Date:   Sun Nov 20 18:06:37 2011 +0200

    Unix style command line parser

diff --git a/sal/osl/android/src/fi/iki/tml/CommandLine.java b/sal/osl/android/src/fi/iki/tml/CommandLine.java
new file mode 100644
index 0000000..fb5adec
--- /dev/null
+++ b/sal/osl/android/src/fi/iki/tml/CommandLine.java
@@ -0,0 +1,176 @@
+// -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+// Copyright (C) 2011 Tor Lillqvist <tml at iki.fi>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+package fi.iki.tml;
+
+import java.util.*;
+
+public class CommandLine
+    implements Iterable<String>
+{
+    private String commandLine;
+
+    public class Tokenizer
+        implements Iterator<String>
+    {
+        private int index = 0;
+        private String savedNext = null;
+
+        public Tokenizer()
+        {
+        }
+
+        public boolean hasNext()
+        {
+            if (savedNext != null)
+                return true;
+            try {
+                savedNext = next();
+                return true;
+            }
+            catch (NoSuchElementException e) {
+            }
+            return false;
+        }
+
+        public String next()
+        {
+            if (savedNext != null) {
+                String result = savedNext;
+                savedNext = null;
+                return result;
+            }
+
+            StringBuffer sb = new StringBuffer(commandLine.length());
+
+            while (index < commandLine.length() &&
+                   commandLine.charAt(index) == ' ')
+                index++;
+
+            if (index == commandLine.length())
+                throw new NoSuchElementException();
+
+            while (index < commandLine.length() &&
+                   commandLine.charAt(index) != ' ') {
+                char c = commandLine.charAt(index);
+                if (c == '\'') {
+                    index++;
+                    while (index < commandLine.length() &&
+                           commandLine.charAt(index) != '\'') {
+                        sb.append(commandLine.charAt(index));
+                        index++;
+                    }
+                } else if (c == '"') {
+                    index++;
+                    while (index < commandLine.length() &&
+                           commandLine.charAt(index) != '\"') {
+                        if (commandLine.charAt(index) == '\\') {
+                            index++;
+                            if (index < commandLine.length())
+                                sb.append(commandLine.charAt(index));
+                        } else {
+                            sb.append(commandLine.charAt(index));
+                        }
+                        index++;
+                    }
+                } else if (c == '\\') {
+                    index++;
+                    if (index < commandLine.length())
+                        sb.append(commandLine.charAt(index));
+                } else {
+                    sb.append(c);
+                }
+                index++;
+            }
+            return sb.toString();
+        }
+
+        public void remove()
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    public Iterator<String> iterator()
+    {
+        return new Tokenizer();
+    }
+
+    public CommandLine(String commandLine)
+    {
+        this.commandLine = commandLine;
+    }
+
+    public String[] split()
+    {
+        ArrayList<String> argv = new ArrayList<String>(10);
+
+        try {
+            for (String s : this)
+                argv.add(s);
+        }
+        catch (NoSuchElementException e) {
+        }
+
+        return argv.toArray(new String[0]);
+    }
+
+    public static String[] split(String commandLine)
+    {
+        return new CommandLine(commandLine).split();
+    }
+
+    public static void main(String[] args)
+    {
+        class Test
+        {
+            Test(String commandLine)
+            {
+                String[] argv = split(commandLine);
+                System.out.println("Split of " + commandLine + ":");
+                int n = 0;
+                for (String s : argv) {
+                    System.out.println("argv[" + n + "}: length " + s.length() + ": \"" + s + "\"");
+                    n++;
+                }
+            }
+        }
+
+        new Test("");
+        new Test(" ");
+        new Test("  ");
+        new Test("  '' ");
+        new Test("abc def");
+        new Test("abc '' def");
+        new Test("abc \"\" def");
+        new Test(" abc def ");
+        new Test("  abc  def  ");
+        new Test("abc\" \"def");
+        new Test("abc\" \"def \"gh\\i\\\" jkl\"");
+        new Test("abc' def' '\\ghi jkl'");
+    }
+}
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:


More information about the Libreoffice-commits mailing list