summaryrefslogtreecommitdiff
path: root/ccode
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2016-11-08 16:37:31 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2016-11-09 15:56:01 +0100
commita88176d2ec960ef1a73f49b7544836588dd87eef (patch)
tree67d6c3a8501ef3ef999806e56cff50c8811019e7 /ccode
parent8629814fad411c2d0bd9f801cda8864f324ab271 (diff)
downloadvala-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.vala15
-rw-r--r--ccode/valaccodefunctiondeclarator.vala15
-rw-r--r--ccode/valaccodemodifiers.vala4
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
}