diff options
author | Frederik Zipp <fzipp@gmx.de> | 2010-08-01 12:54:37 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-01-11 19:54:08 +0100 |
commit | 58dcad084f427585994ab66904436e1bd0e0b2a1 (patch) | |
tree | 7e065d02ee93732615fbf1272630eb8685e9d50d /codegen | |
parent | 4bdb3e7301c59a32216ff383c23a4bdcf70fa268 (diff) | |
download | vala-58dcad084f427585994ab66904436e1bd0e0b2a1.tar.gz |
codegen: Add foreach support for strings
Fixes https://gitlab.gnome.org/GNOME/vala/issues/108
Diffstat (limited to 'codegen')
-rw-r--r-- | codegen/valaccodecontrolflowmodule.vala | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala index 9ecbced2f..9a68579b3 100644 --- a/codegen/valaccodecontrolflowmodule.vala +++ b/codegen/valaccodecontrolflowmodule.vala @@ -442,6 +442,40 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule { stmt.body.emit (this); ccode.close (); + } else if (stmt.collection.value_type.compatible (string_type)) { + // iterating over a string + + var validate = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_validate")); + validate.add_argument (get_variable_cexpression (get_local_cname (collection_backup))); + validate.add_argument (new CCodeConstant ("-1")); + validate.add_argument (new CCodeConstant ("NULL")); + var cassert = new CCodeFunctionCall (new CCodeIdentifier ("_vala_warn_if_fail")); + cassert.add_argument (validate); + cassert.add_argument (new CCodeConstant ("\"Invalid UTF-8 string\"")); + requires_assert = true; + ccode.add_expression (cassert); + + var iterator_variable = new LocalVariable (collection_type, "%s_iter".printf (stmt.variable_name)); + visit_local_variable (iterator_variable); + var string_iter = get_variable_cname (get_local_cname (iterator_variable)); + + var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_variable_cexpression (string_iter)), new CCodeConstant ("'\\0'")); + var next_char_call = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_next_char")); + next_char_call.add_argument (get_variable_cexpression (string_iter)); + + ccode.open_for (new CCodeAssignment (get_variable_cexpression (string_iter), get_variable_cexpression (collection_backup.name)), + ccond, + new CCodeAssignment (get_variable_cexpression (string_iter), next_char_call)); + + var element_expr = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_get_char")); + element_expr.add_argument (get_variable_cexpression (string_iter)); + + visit_local_variable (stmt.element_variable); + ccode.add_assignment (get_variable_cexpression (get_local_cname (stmt.element_variable)), element_expr); + + stmt.body.emit (this); + + ccode.close (); } else { Report.error (stmt.source_reference, "internal error: unsupported collection type"); stmt.error = true; |