aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorFrederik 'playya' Sdun <Frederik.Sdun@googlemail.com>2010-08-13 20:23:30 +0200
committerFrederik 'playya' Sdun <Frederik.Sdun@googlemail.com>2010-08-13 20:23:30 +0200
commit37f4f7a8207930c3b39e285e2187652f4ed5d03f (patch)
treee7b0409486b8acc049b83db9683241b3e63408ee /tools
parent3e9f68fe222bbf5cac40f20a5c1346ba41ffa2d7 (diff)
downloadcornucopia-37f4f7a8207930c3b39e285e2187652f4ed5d03f.tar.gz
cornucopia-37f4f7a8207930c3b39e285e2187652f4ed5d03f.tar.bz2
cornucopia-37f4f7a8207930c3b39e285e2187652f4ed5d03f.zip
mdbus2: Add minimal parser for seperation of complex arguments
Diffstat (limited to 'tools')
-rw-r--r--tools/mdbus2/src/main.vala33
1 files changed, 29 insertions, 4 deletions
diff --git a/tools/mdbus2/src/main.vala b/tools/mdbus2/src/main.vala
index c8f748c4..8d35e1d6 100644
--- a/tools/mdbus2/src/main.vala
+++ b/tools/mdbus2/src/main.vala
@@ -289,13 +289,12 @@ public class Argument : Object
private bool appendArrayTypeToCall(string arg, DBus.RawMessageIter iter, string typ)
{
//remove []
- var raw_arg = arg.substring( 1, arg.len() - 2 );
var subiter = DBus.RawMessageIter();
#if DEBUG
- debug( @"parsing array '$raw_arg' with subsignature '$typ'" );
+ debug( @"parsing array '$arg' with subsignature '$typ'" );
#endif
assert( iter.open_container( DBus.RawType.ARRAY, typ, subiter ) );
- foreach( var sub_arg in raw_arg.split(",") )
+ foreach( var sub_arg in getSubArgs( arg ) )
{
if(appendTypeToCall( sub_arg, subiter, typ ) == false)
return false;
@@ -306,12 +305,12 @@ public class Argument : Object
}
const char[] start_chars = {'{', '[', '('};
const char[] end_chars = {'}', ']', ')'};
+ const char arg_separator = ',';
private string getSubSignature( string signature )
{
var result = "";
int depth = 0;
- debug(@"parsing signature: $signature");
for(int i = 0; i < signature.len(); i++)
{
char c = (char)signature[i];
@@ -332,6 +331,32 @@ public class Argument : Object
return result;
}
+ string[] getSubArgs(string arg, char separator = arg_separator)
+ {
+ var raw_arg = arg.substring(1, arg.len() - 2);
+ var result = new string[0];
+ var part = "";
+ int depth = 0;
+ for( int i = 0; i < raw_arg.len(); i ++ )
+ {
+ char c = (char)raw_arg[i];
+ if( c in start_chars )
+ depth ++;
+ else if( c in end_chars )
+ depth --;
+ part += c.to_string();
+ if (depth == 0 && c == separator)
+ {
+ debug(@"adding part '$part'");
+ result += part.substring(0, part.len() - 1 );
+ part = "";
+ }
+ }
+ assert(depth == 0);
+ result += part;
+ return result;
+ }
+
public string name;
public string typ;
}