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 <tlillqv...@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 <t...@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 <t...@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: _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits