donaldp 02/01/12 15:43:32
Modified: proposal/myrmidon/src/main/org/apache/tools/ant/util
FileUtils.java
Log:
Add in tuility nmethod to quote command line args - extracted from Commandline
Revision Changes Path
1.12 +118 -1
jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/util/FileUtils.java
Index: FileUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/util/FileUtils.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- FileUtils.java 30 Dec 2001 10:46:59 -0000 1.11
+++ FileUtils.java 12 Jan 2002 23:43:32 -0000 1.12
@@ -17,6 +17,7 @@
import java.io.IOException;
import java.util.Stack;
import java.util.StringTokenizer;
+import java.util.ArrayList;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.types.FilterSetCollection;
@@ -28,7 +29,7 @@
* @author [EMAIL PROTECTED]
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
- * @version $Revision: 1.11 $
+ * @version $Revision: 1.12 $
*/
public class FileUtils
@@ -244,6 +245,122 @@
path = path.replace( '/', '\\' );
}
return new File( path );
+ }
+
+ /**
+ * Put quotes around the given String if necessary. <p>
+ *
+ * If the argument doesn't include spaces or quotes, return it as is. If
it
+ * contains double quotes, use single quotes - else surround the
argument by
+ * double quotes.</p>
+ *
+ * @param argument Description of Parameter
+ * @return Description of the Returned Value
+ */
+ public static String quoteArgument( String argument )
+ throws TaskException
+ {
+ if( argument.indexOf( "\"" ) > -1 )
+ {
+ if( argument.indexOf( "\'" ) > -1 )
+ {
+ throw new TaskException( "Can\'t handle single and double
quotes in same argument" );
+ }
+ else
+ {
+ return '\'' + argument + '\'';
+ }
+ }
+ else if( argument.indexOf( "\'" ) > -1 || argument.indexOf( " " ) >
-1 )
+ {
+ return '\"' + argument + '\"';
+ }
+ else
+ {
+ return argument;
+ }
+ }
+
+ public static String[] translateCommandline( String to_process )
+ throws TaskException
+ {
+ if( to_process == null || to_process.length() == 0 )
+ {
+ return new String[ 0 ];
+ }
+
+ // parse with a simple finite state machine
+
+ final int normal = 0;
+ final int inQuote = 1;
+ final int inDoubleQuote = 2;
+ int state = normal;
+ StringTokenizer tok = new StringTokenizer( to_process, "\"\' ", true
);
+ ArrayList v = new ArrayList();
+ StringBuffer current = new StringBuffer();
+
+ while( tok.hasMoreTokens() )
+ {
+ String nextTok = tok.nextToken();
+ switch( state )
+ {
+ case inQuote:
+ if( "\'".equals( nextTok ) )
+ {
+ state = normal;
+ }
+ else
+ {
+ current.append( nextTok );
+ }
+ break;
+ case inDoubleQuote:
+ if( "\"".equals( nextTok ) )
+ {
+ state = normal;
+ }
+ else
+ {
+ current.append( nextTok );
+ }
+ break;
+ default:
+ if( "\'".equals( nextTok ) )
+ {
+ state = inQuote;
+ }
+ else if( "\"".equals( nextTok ) )
+ {
+ state = inDoubleQuote;
+ }
+ else if( " ".equals( nextTok ) )
+ {
+ if( current.length() != 0 )
+ {
+ v.add( current.toString() );
+ current.setLength( 0 );
+ }
+ }
+ else
+ {
+ current.append( nextTok );
+ }
+ break;
+ }
+ }
+
+ if( current.length() != 0 )
+ {
+ v.add( current.toString() );
+ }
+
+ if( state == inQuote || state == inDoubleQuote )
+ {
+ throw new TaskException( "unbalanced quotes in " + to_process );
+ }
+
+ final String[] args = new String[ v.size() ];
+ return (String[])v.toArray( args );
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>