From: Juerg Billeter Date: Wed, 11 Jul 2007 16:19:45 +0000 (+0000) Subject: add substring method to the string type test substring method X-Git-Tag: VALA_0_1_1~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=85a9aab74baad138f7cf7908cdcd1621489ad5dd;p=thirdparty%2Fvala.git add substring method to the string type test substring method 2007-07-11 Juerg Billeter * ccode/valaccodefunctioncall.vala, gobject/valacodegenerator.vala, gobject/valacodegeneratorinvocationexpression.vala, vapi/glib-2.0.vala: add substring method to the string type * tests/test-021.vala, tests/test-021.out: test substring method Fixes bug 443524 svn path=/trunk/; revision=347 --- diff --git a/ChangeLog b/ChangeLog index dd9e99d7e..d5f991fce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-07-11 Jürg Billeter + + * ccode/valaccodefunctioncall.vala, gobject/valacodegenerator.vala, + gobject/valacodegeneratorinvocationexpression.vala, + vapi/glib-2.0.vala: add substring method to the string type + * tests/test-021.vala, tests/test-021.out: test substring method + + Fixes bug 443524 + 2007-07-11 Jürg Billeter * vala/valasemanticanalyzer.vala, gobject/valacodegenerator.vala: diff --git a/ccode/valaccodefunctioncall.vala b/ccode/valaccodefunctioncall.vala index 03c778896..fa6a7d449 100644 --- a/ccode/valaccodefunctioncall.vala +++ b/ccode/valaccodefunctioncall.vala @@ -1,6 +1,6 @@ /* valaccodefunctioncall.vala * - * Copyright (C) 2006 Jürg Billeter + * Copyright (C) 2006-2007 Jürg Billeter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -33,8 +33,7 @@ public class Vala.CCodeFunctionCall : CCodeExpression { private List arguments; - public CCodeFunctionCall (CCodeExpression _call = null) { - call = _call; + public CCodeFunctionCall (construct CCodeExpression call = null) { } /** @@ -45,7 +44,16 @@ public class Vala.CCodeFunctionCall : CCodeExpression { public void add_argument (CCodeExpression! expr) { arguments.append (expr); } - + + /** + * Returns a copy of the list of arguments. + * + * @return list of arguments + */ + public List get_arguments () { + return arguments.copy (); + } + public override void write (CCodeWriter! writer) { call.write (writer); writer.write_string (" ("); diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala index 4191377f2..88cb7ccc4 100644 --- a/gobject/valacodegenerator.vala +++ b/gobject/valacodegenerator.vala @@ -96,6 +96,8 @@ public class Vala.CodeGenerator : CodeVisitor { TypeReference mutex_type; DataType type_module_type; + Method substring_method; + private bool in_plugin = false; private string module_init_param_name; @@ -224,6 +226,7 @@ public class Vala.CodeGenerator : CodeVisitor { string_type = new TypeReference (); string_type.data_type = (DataType) root_symbol.lookup ("string").node; + substring_method = (Method) string_type.data_type.symbol.lookup ("substring").node; var glib_ns = root_symbol.lookup ("GLib"); diff --git a/gobject/valacodegeneratorinvocationexpression.vala b/gobject/valacodegeneratorinvocationexpression.vala index cabe05d59..bbbb3b2f9 100644 --- a/gobject/valacodegeneratorinvocationexpression.vala +++ b/gobject/valacodegeneratorinvocationexpression.vala @@ -242,7 +242,7 @@ public class Vala.CodeGenerator { string_h_needed = true; var clen = get_array_length_cexpression (ma.inner, 1); - var celems = (CCodeExpression)ma.inner.ccodenode; + var celems = (CCodeExpression) ma.inner.ccodenode; var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (ma.inner.static_type.data_type.get_cname ())); var cdelta = new CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, temp_ref, clen)); var ccheck = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, temp_ref, clen); @@ -258,6 +258,34 @@ public class Vala.CodeGenerator { ccomma.append_expression (new CCodeConditionalExpression (ccheck, czero, new CCodeConstant ("NULL"))); ccomma.append_expression (new CCodeAssignment (get_array_length_cexpression (ma.inner, 1), temp_ref)); + expr.ccodenode = ccomma; + } else if (m == substring_method) { + var temp_decl = get_temp_variable_declarator (string_type); + var temp_ref = new CCodeIdentifier (temp_decl.name); + + temp_vars.prepend (temp_decl); + + List args = ccall.get_arguments (); + + var coffsetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_offset_to_pointer")); + // full string + coffsetcall.add_argument (args.nth_data (0)); + // offset + coffsetcall.add_argument (args.nth_data (1)); + + var coffsetcall2 = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_offset_to_pointer")); + coffsetcall2.add_argument (temp_ref); + // len + coffsetcall2.add_argument (args.nth_data (2)); + + var cndupcall = new CCodeFunctionCall (new CCodeIdentifier ("g_strndup")); + cndupcall.add_argument (temp_ref); + cndupcall.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, coffsetcall2, temp_ref)); + + var ccomma = new CCodeCommaExpression (); + ccomma.append_expression (new CCodeAssignment (temp_ref, coffsetcall)); + ccomma.append_expression (cndupcall); + expr.ccodenode = ccomma; } } diff --git a/tests/test-021.out b/tests/test-021.out index 58dfb1b3f..5b9feab5e 100644 --- a/tests/test-021.out +++ b/tests/test-021.out @@ -1 +1 @@ -String + operator: 1 2 3 4 5 6 +String Test: 1 2 3 4 5 6 7 8 diff --git a/tests/test-021.vala b/tests/test-021.vala index 0bb38e353..c2a75beb1 100644 --- a/tests/test-021.vala +++ b/tests/test-021.vala @@ -2,16 +2,18 @@ using GLib; class Maman.Foo { static int main (string[] args) { - stdout.printf ("String + operator: 1"); - + stdout.printf ("String Test: 1"); + stdout.printf (" 2" + " 3"); - + string s = " 4"; s += " 5"; - stdout.printf ("%s", s); - - stdout.printf (" 6\n"); + + string t = " 5 6 7 8".substring (2, 4); + stdout.printf ("%s", t); + + stdout.printf (" 8\n"); return 0; } diff --git a/vapi/glib-2.0.vala b/vapi/glib-2.0.vala index ca8b7bdbb..0948bd8f3 100644 --- a/vapi/glib-2.0.vala +++ b/vapi/glib-2.0.vala @@ -518,6 +518,8 @@ public struct string { [CCode (cname = "g_utf8_skip")] public static char[] skip; + + public string! substring (long offset, long len); } [Import ()]