diff options
author | Frederik 'playya' Sdun <Frederik.Sdun@googlemail.com> | 2010-08-13 20:23:30 +0200 |
---|---|---|
committer | Frederik 'playya' Sdun <Frederik.Sdun@googlemail.com> | 2010-08-13 20:23:30 +0200 |
commit | 37f4f7a8207930c3b39e285e2187652f4ed5d03f (patch) | |
tree | e7b0409486b8acc049b83db9683241b3e63408ee /tools | |
parent | 3e9f68fe222bbf5cac40f20a5c1346ba41ffa2d7 (diff) | |
download | cornucopia-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.vala | 33 |
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; } |