diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2016-11-08 16:37:31 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2016-11-09 15:56:01 +0100 |
commit | a88176d2ec960ef1a73f49b7544836588dd87eef (patch) | |
tree | 67d6c3a8501ef3ef999806e56cff50c8811019e7 /ccode | |
parent | 8629814fad411c2d0bd9f801cda8864f324ab271 (diff) | |
download | vala-a88176d2ec960ef1a73f49b7544836588dd87eef.tar.gz |
Add G_GNUC_PRINTF/SCANF attribute for Printf/ScanfFormat functions
https://bugzilla.gnome.org/show_bug.cgi?id=710862
Diffstat (limited to 'ccode')
-rw-r--r-- | ccode/valaccodefunction.vala | 15 | ||||
-rw-r--r-- | ccode/valaccodefunctiondeclarator.vala | 15 | ||||
-rw-r--r-- | ccode/valaccodemodifiers.vala | 4 |
3 files changed, 31 insertions, 3 deletions
diff --git a/ccode/valaccodefunction.vala b/ccode/valaccodefunction.vala index cd3e385d0..394fdac2b 100644 --- a/ccode/valaccodefunction.vala +++ b/ccode/valaccodefunction.vala @@ -118,8 +118,10 @@ public class Vala.CCodeFunction : CCodeNode { writer.write_string (name); writer.write_string (" ("); + bool has_args = (CCodeModifiers.PRINTF in modifiers || CCodeModifiers.SCANF in modifiers); int i = 0; int format_arg_index = -1; + int args_index = -1; foreach (CCodeParameter param in parameters) { if (i > 0) { writer.write_string (", "); @@ -128,6 +130,11 @@ public class Vala.CCodeFunction : CCodeNode { if (CCodeModifiers.FORMAT_ARG in param.modifiers) { format_arg_index = i; } + if (has_args && param.ellipsis) { + args_index = i; + } else if (has_args && param.type_name == "va_list" && format_arg_index < 0) { + format_arg_index = i - 1; + } i++; } if (i == 0) { @@ -141,7 +148,13 @@ public class Vala.CCodeFunction : CCodeNode { } if (is_declaration) { - if (format_arg_index >= 0) { + if (CCodeModifiers.PRINTF in modifiers) { + format_arg_index = (format_arg_index >= 0 ? format_arg_index + 1 : args_index); + writer.write_string (" G_GNUC_PRINTF(%d,%d)".printf (format_arg_index, args_index + 1)); + } else if (CCodeModifiers.SCANF in modifiers) { + format_arg_index = (format_arg_index >= 0 ? format_arg_index + 1 : args_index); + writer.write_string (" G_GNUC_SCANF(%d,%d)".printf (format_arg_index, args_index + 1)); + } else if (format_arg_index >= 0) { writer.write_string (" G_GNUC_FORMAT(%d)".printf (format_arg_index + 1)); } diff --git a/ccode/valaccodefunctiondeclarator.vala b/ccode/valaccodefunctiondeclarator.vala index 1378662c5..b195f5ae3 100644 --- a/ccode/valaccodefunctiondeclarator.vala +++ b/ccode/valaccodefunctiondeclarator.vala @@ -55,8 +55,10 @@ public class Vala.CCodeFunctionDeclarator : CCodeDeclarator { writer.write_string (name); writer.write_string (") ("); + bool has_args = (CCodeModifiers.PRINTF in modifiers || CCodeModifiers.SCANF in modifiers); int i = 0; int format_arg_index = -1; + int args_index = -1; foreach (CCodeParameter param in parameters) { if (i > 0) { writer.write_string (", "); @@ -65,12 +67,23 @@ public class Vala.CCodeFunctionDeclarator : CCodeDeclarator { if (CCodeModifiers.FORMAT_ARG in param.modifiers) { format_arg_index = i; } + if (has_args && param.ellipsis) { + args_index = i; + } else if (has_args && param.type_name == "va_list" && format_arg_index < 0) { + format_arg_index = i - 1; + } i++; } writer.write_string (")"); - if (format_arg_index >= 0) { + if (CCodeModifiers.PRINTF in modifiers) { + format_arg_index = (format_arg_index >= 0 ? format_arg_index + 1 : args_index); + writer.write_string (" G_GNUC_PRINTF(%d,%d)".printf (format_arg_index, args_index + 1)); + } else if (CCodeModifiers.SCANF in modifiers) { + format_arg_index = (format_arg_index >= 0 ? format_arg_index + 1 : args_index); + writer.write_string (" G_GNUC_SCANF(%d,%d)".printf (format_arg_index, args_index + 1)); + } else if (format_arg_index >= 0) { writer.write_string (" G_GNUC_FORMAT(%d)".printf (format_arg_index + 1)); } } diff --git a/ccode/valaccodemodifiers.vala b/ccode/valaccodemodifiers.vala index 75c5a99d7..257423040 100644 --- a/ccode/valaccodemodifiers.vala +++ b/ccode/valaccodemodifiers.vala @@ -39,5 +39,7 @@ public enum Vala.CCodeModifiers { UNUSED = 1 << 9, CONSTRUCTOR = 1 << 10, DESTRUCTOR = 1 << 11, - FORMAT_ARG = 1 << 12 + FORMAT_ARG = 1 << 12, + PRINTF = 1 << 13, + SCANF = 1 << 14 } |