mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
remote generator: Make parsing stricter
Anchor matches at the beginning of a line. Specialize some general matches. Add some comments to special cases.
This commit is contained in:
parent
bfb188dd44
commit
8c6df9139b
@ -352,34 +352,49 @@ elsif ($opt_b) {
|
||||
" virDomainSnapshotFree(snapshot);\n" .
|
||||
" if (dom)\n" .
|
||||
" virDomainFree(dom);");
|
||||
} elsif ($args_member =~ m/(\S+)<\S+>;/) {
|
||||
} elsif ($args_member =~ m/^(remote_string|remote_nonnull_string|remote_uuid|opaque) (\S+)<\S+>;/) {
|
||||
if (! @args_list) {
|
||||
push(@args_list, "conn");
|
||||
}
|
||||
|
||||
if ($calls{$_}->{ProcName} eq "SecretSetValue") {
|
||||
push(@args_list, "(const unsigned char *)args->$1.$1_val");
|
||||
push(@args_list, "(const unsigned char *)args->$2.$2_val");
|
||||
} elsif ($calls{$_}->{ProcName} eq "CPUBaseline") {
|
||||
push(@args_list, "(const char **)args->$1.$1_val");
|
||||
push(@args_list, "(const char **)args->$2.$2_val");
|
||||
} else {
|
||||
push(@args_list, "args->$1.$1_val");
|
||||
push(@args_list, "args->$2.$2_val");
|
||||
}
|
||||
|
||||
push(@args_list, "args->$1.$1_len");
|
||||
} elsif ($args_member =~ m/(\S+) (\S+);/) {
|
||||
push(@args_list, "args->$2.$2_len");
|
||||
} elsif ($args_member =~ m/<\S+>;/ or $args_member =~ m/\[\S+\];/) {
|
||||
# just make all other array types fail
|
||||
die "unhandled type for argument value: $args_member";
|
||||
} elsif ($args_member =~ m/^remote_uuid (\S+);/) {
|
||||
if (! @args_list) {
|
||||
push(@args_list, "conn");
|
||||
}
|
||||
|
||||
if ($1 eq "remote_uuid") {
|
||||
push(@args_list, "(unsigned char *) args->$2");
|
||||
} elsif ($1 eq "remote_string") {
|
||||
push(@vars_list, "char *$2");
|
||||
push(@optionals_list, "$2");
|
||||
push(@args_list, "$2");
|
||||
} else {
|
||||
push(@args_list, "args->$2");
|
||||
push(@args_list, "(unsigned char *) args->$1");
|
||||
} elsif ($args_member =~ m/^remote_string (\S+);/) {
|
||||
if (! @args_list) {
|
||||
push(@args_list, "conn");
|
||||
}
|
||||
|
||||
push(@vars_list, "char *$1");
|
||||
push(@optionals_list, "$1");
|
||||
push(@args_list, "$1");
|
||||
} elsif ($args_member =~ m/^remote_nonnull_string (\S+);/) {
|
||||
if (! @args_list) {
|
||||
push(@args_list, "conn");
|
||||
}
|
||||
|
||||
push(@args_list, "args->$1");
|
||||
} elsif ($args_member =~ m/^(unsigned )?(int|hyper) (\S+);/) {
|
||||
if (! @args_list) {
|
||||
push(@args_list, "conn");
|
||||
}
|
||||
|
||||
push(@args_list, "args->$3");
|
||||
} elsif ($args_member =~ m/^(\/)?\*/) {
|
||||
# ignore comments
|
||||
} else {
|
||||
@ -406,17 +421,14 @@ elsif ($opt_b) {
|
||||
if ($calls{$_}->{ret} ne "void") {
|
||||
foreach my $ret_member (@{$calls{$_}->{ret_members}}) {
|
||||
if ($multi_ret) {
|
||||
if ($ret_member =~ m/(char|short|int|hyper) (\S+)\[\S+\];/) {
|
||||
push(@ret_list, "memcpy(ret->$2, tmp.$2, sizeof ret->$2);");
|
||||
} elsif ($ret_member =~ m/char (\S+);/ or
|
||||
$ret_member =~ m/short (\S+);/ or
|
||||
$ret_member =~ m/int (\S+);/ or
|
||||
$ret_member =~ m/hyper (\S+);/) {
|
||||
push(@ret_list, "ret->$1 = tmp.$1;");
|
||||
if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) {
|
||||
push(@ret_list, "memcpy(ret->$3, tmp.$3, sizeof ret->$3);");
|
||||
} elsif ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+);/) {
|
||||
push(@ret_list, "ret->$3 = tmp.$3;");
|
||||
} else {
|
||||
die "unhandled type for multi-return-value: $ret_member";
|
||||
}
|
||||
} elsif ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_string (\S+)<(\S+)>;/) {
|
||||
push(@vars_list, "int len");
|
||||
push(@ret_list, "ret->$1.$1_len = len;");
|
||||
push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);");
|
||||
@ -439,13 +451,13 @@ elsif ($opt_b) {
|
||||
unshift(@args_list, "ret->$1.$1_val");
|
||||
unshift(@args_list, $conn);
|
||||
}
|
||||
} elsif ($ret_member =~ m/remote_nonnull_string (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) {
|
||||
push(@vars_list, "char *$1");
|
||||
push(@ret_list, "ret->$1 = $1;");
|
||||
$single_ret_var = $1;
|
||||
$single_ret_by_ref = 0;
|
||||
$single_ret_check = " == NULL";
|
||||
} elsif ($ret_member =~ m/remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) {
|
||||
my $type_name = name_to_ProcName($1);
|
||||
|
||||
push(@vars_list, "vir${type_name}Ptr $2 = NULL");
|
||||
@ -456,7 +468,7 @@ elsif ($opt_b) {
|
||||
$single_ret_var = $2;
|
||||
$single_ret_by_ref = 0;
|
||||
$single_ret_check = " == NULL";
|
||||
} elsif ($ret_member =~ m/int (\S+)<(\S+)>;/) {
|
||||
} elsif ($ret_member =~ m/^int (\S+)<(\S+)>;/) {
|
||||
push(@vars_list, "int len");
|
||||
push(@ret_list, "ret->$1.$1_len = len;");
|
||||
push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);");
|
||||
@ -471,7 +483,7 @@ elsif ($opt_b) {
|
||||
my $conn = shift(@args_list);
|
||||
unshift(@args_list, "ret->$1.$1_val");
|
||||
unshift(@args_list, $conn);
|
||||
} elsif ($ret_member =~ m/int (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^int (\S+);/) {
|
||||
push(@vars_list, "int $1");
|
||||
push(@ret_list, "ret->$1 = $1;");
|
||||
$single_ret_var = $1;
|
||||
@ -487,7 +499,7 @@ elsif ($opt_b) {
|
||||
$single_ret_check = " < 0";
|
||||
}
|
||||
}
|
||||
} elsif ($ret_member =~ m/hyper (\S+)<(\S+)>;/) {
|
||||
} elsif ($ret_member =~ m/^hyper (\S+)<(\S+)>;/) {
|
||||
push(@vars_list, "int len");
|
||||
push(@ret_list, "ret->$1.$1_len = len;");
|
||||
push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);");
|
||||
@ -510,13 +522,29 @@ elsif ($opt_b) {
|
||||
}
|
||||
|
||||
unshift(@args_list, $conn);
|
||||
} elsif ($ret_member =~ m/hyper (\S+);/) {
|
||||
push(@vars_list, "unsigned long $1");
|
||||
push(@ret_list, "ret->$1 = $1;");
|
||||
$single_ret_var = $1;
|
||||
} elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);/) {
|
||||
my $type_name;
|
||||
my $ret_name = $2;
|
||||
|
||||
$type_name = $1 if ($1);
|
||||
$type_name .= "long";
|
||||
|
||||
if ($type_name eq "long" and
|
||||
$calls{$_}->{ProcName} =~ m/^Get(Lib)?Version$/) {
|
||||
# SPECIAL: virConnectGet(Lib)?Version uses unsigned long
|
||||
# in public API but hyper in XDR protocol
|
||||
$type_name = "unsigned long";
|
||||
}
|
||||
|
||||
push(@vars_list, "$type_name $ret_name");
|
||||
push(@ret_list, "ret->$ret_name = $ret_name;");
|
||||
$single_ret_var = $ret_name;
|
||||
|
||||
if ($calls{$_}->{ProcName} eq "DomainGetMaxMemory" or
|
||||
$calls{$_}->{ProcName} eq "NodeGetFreeMemory") {
|
||||
# SPECIAL: virDomainGetMaxMemory and virNodeGetFreeMemory
|
||||
# return the actual value directly and 0 indicates
|
||||
# an error
|
||||
$single_ret_by_ref = 0;
|
||||
$single_ret_check = " == 0";
|
||||
} else {
|
||||
@ -538,14 +566,16 @@ elsif ($opt_b) {
|
||||
$struct_name =~ s/Get//;
|
||||
|
||||
if ($calls{$_}->{ProcName} eq "DomainGetBlockInfo") {
|
||||
# SPECIAL: virDomainGetBlockInfo has flags parameter after
|
||||
# the struct parameter in its signature
|
||||
my $flags = pop(@args_list);
|
||||
push(@args_list, "&tmp");
|
||||
push(@args_list, $flags);
|
||||
} elsif ($calls{$_}->{ProcName} eq "DomainBlockStats") {
|
||||
$struct_name .= "Struct";
|
||||
push(@args_list, "&tmp");
|
||||
push(@args_list, "sizeof tmp");
|
||||
} elsif ($calls{$_}->{ProcName} eq "DomainInterfaceStats") {
|
||||
} elsif ($calls{$_}->{ProcName} eq "DomainBlockStats" ||
|
||||
$calls{$_}->{ProcName} eq "DomainInterfaceStats") {
|
||||
# SPECIAL: virDomainBlockStats and virDomainInterfaceStats
|
||||
# have a 'Struct' suffix on the actual struct name
|
||||
# and take the struct size as additional argument
|
||||
$struct_name .= "Struct";
|
||||
push(@args_list, "&tmp");
|
||||
push(@args_list, "sizeof tmp");
|
||||
@ -863,21 +893,25 @@ elsif ($opt_k) {
|
||||
} elsif ($args_member =~ m/^remote_nonnull_string (\S+);/) {
|
||||
push(@args_list, "const char *$1");
|
||||
push(@setters_list, "args.$1 = (char *)$1;");
|
||||
} elsif ($args_member =~ m/(\S+)<(\S+)>;/) {
|
||||
} elsif ($args_member =~ m/^(remote_string|opaque) (\S+)<(\S+)>;/) {
|
||||
my $type_name = $1;
|
||||
my $arg_name = $2;
|
||||
my $limit = $3;
|
||||
|
||||
if ($call->{ProcName} eq "SecretSetValue") {
|
||||
push(@args_list, "const unsigned char *$1");
|
||||
push(@args_list, "size_t ${1}len");
|
||||
push(@args_list, "const unsigned char *$arg_name");
|
||||
push(@args_list, "size_t ${arg_name}len");
|
||||
} elsif ($call->{ProcName} eq "DomainPinVcpu") {
|
||||
push(@args_list, "unsigned char *$1");
|
||||
push(@args_list, "int ${1}len");
|
||||
push(@args_list, "unsigned char *$arg_name");
|
||||
push(@args_list, "int ${arg_name}len");
|
||||
} else {
|
||||
push(@args_list, "const char *$1");
|
||||
push(@args_list, "int ${1}len");
|
||||
push(@args_list, "const char *$arg_name");
|
||||
push(@args_list, "int ${arg_name}len");
|
||||
}
|
||||
|
||||
push(@setters_list, "args.$1.${1}_val = (char *)$1;");
|
||||
push(@setters_list, "args.$1.${1}_len = ${1}len;");
|
||||
push(@args_check_list, { name => "\"$1\"", arg => "${1}len", limit => $2 });
|
||||
push(@setters_list, "args.$arg_name.${arg_name}_val = (char *)$arg_name;");
|
||||
push(@setters_list, "args.$arg_name.${arg_name}_len = ${arg_name}len;");
|
||||
push(@args_check_list, { name => "\"$arg_name\"", arg => "${arg_name}len", limit => $limit });
|
||||
} elsif ($args_member =~ m/^(unsigned )?(int|hyper) (\S+);/) {
|
||||
my $type_name;
|
||||
my $arg_name = $3;
|
||||
@ -928,7 +962,8 @@ elsif ($opt_k) {
|
||||
}
|
||||
|
||||
if ($call->{ProcName} eq "NWFilterDefineXML") {
|
||||
# fix public API and XDR protocol mismatch
|
||||
# SPECIAL: virNWFilterDefineXML has a flags parameter in the
|
||||
# public API that is missing in the XDR protocol
|
||||
push(@args_list, "unsigned int flags ATTRIBUTE_UNUSED");
|
||||
}
|
||||
|
||||
@ -966,17 +1001,17 @@ elsif ($opt_k) {
|
||||
|
||||
foreach my $ret_member (@{$call->{ret_members}}) {
|
||||
if ($multi_ret) {
|
||||
if ($ret_member =~ m/(char|short|int|hyper) (\S+)\[\S+\];/) {
|
||||
push(@ret_list, "memcpy(result->$2, ret.$2, sizeof result->$2);");
|
||||
} elsif ($ret_member =~ m/char (\S+);/ or
|
||||
$ret_member =~ m/short (\S+);/ or
|
||||
$ret_member =~ m/int (\S+);/ or
|
||||
$ret_member =~ m/hyper (\S+);/) {
|
||||
push(@ret_list, "result->$1 = ret.$1;");
|
||||
if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) {
|
||||
push(@ret_list, "memcpy(result->$3, ret.$3, sizeof result->$3);");
|
||||
} elsif ($ret_member =~ m/<\S+>;/ or $ret_member =~ m/\[\S+\];/) {
|
||||
# just make all other array types fail
|
||||
die "unhandled type for multi-return-value: $ret_member";
|
||||
} elsif ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+);/) {
|
||||
push(@ret_list, "result->$3 = ret.$3;");
|
||||
} else {
|
||||
die "unhandled type for multi-return-value: $ret_member";
|
||||
}
|
||||
} elsif ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_string (\S+)<(\S+)>;/) {
|
||||
$single_ret_as_list = 1;
|
||||
$single_ret_list_name = $1;
|
||||
$single_ret_list_max_var = "max$1";
|
||||
@ -1000,11 +1035,11 @@ elsif ($opt_k) {
|
||||
push(@ret_list, "rv = ret.$1.$1_len;");
|
||||
$single_ret_var = "int rv = -1";
|
||||
$single_ret_type = "int";
|
||||
} elsif ($ret_member =~ m/remote_nonnull_string (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) {
|
||||
push(@ret_list, "rv = ret.$1;");
|
||||
$single_ret_var = "char *rv = NULL";
|
||||
$single_ret_type = "char *";
|
||||
} elsif ($ret_member =~ m/remote_nonnull_(domain|network|storage_pool|storage_vol|node_device|interface|secret|nwfilter|domain_snapshot) (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|node_device|interface|secret|nwfilter|domain_snapshot) (\S+);/) {
|
||||
my $name = $1;
|
||||
my $arg_name = $2;
|
||||
my $type_name = name_to_ProcName($name);
|
||||
@ -1039,7 +1074,12 @@ elsif ($opt_k) {
|
||||
|
||||
$single_ret_var = "int rv = -1";
|
||||
$single_ret_type = "int";
|
||||
} elsif ($ret_member =~ m/hyper (\S+);/) {
|
||||
} elsif ($ret_member =~ m/^unsigned hyper (\S+);/) {
|
||||
my $arg_name = $1;
|
||||
push(@ret_list, "rv = ret.$arg_name;");
|
||||
$single_ret_var = "unsigned long rv = 0";
|
||||
$single_ret_type = "unsigned long";
|
||||
} elsif ($ret_member =~ m/^hyper (\S+);/) {
|
||||
my $arg_name = $1;
|
||||
|
||||
if ($call->{ProcName} =~ m/Get(Lib)?Version/) {
|
||||
@ -1048,16 +1088,12 @@ elsif ($opt_k) {
|
||||
push(@ret_list, "rv = 0;");
|
||||
$single_ret_var = "int rv = -1";
|
||||
$single_ret_type = "int";
|
||||
} else {
|
||||
} elsif ($call->{ProcName} eq "NodeGetFreeMemory") {
|
||||
push(@ret_list, "rv = ret.$arg_name;");
|
||||
|
||||
if ($call->{ProcName} eq "NodeGetFreeMemory") {
|
||||
$single_ret_var = "unsigned long long rv = 0";
|
||||
$single_ret_type = "unsigned long long";
|
||||
} else {
|
||||
$single_ret_var = "unsigned long rv = 0";
|
||||
$single_ret_type = "unsigned long";
|
||||
}
|
||||
$single_ret_var = "unsigned long long rv = 0";
|
||||
$single_ret_type = "unsigned long long";
|
||||
} else {
|
||||
die "unhandled type for return value: $ret_member";
|
||||
}
|
||||
} else {
|
||||
die "unhandled type for return value: $ret_member";
|
||||
@ -1072,6 +1108,8 @@ elsif ($opt_k) {
|
||||
$struct_name =~ s/Get//;
|
||||
|
||||
if ($call->{ProcName} eq "DomainGetBlockInfo") {
|
||||
# SPECIAL: virDomainGetBlockInfo has flags parameter after
|
||||
# the struct parameter in its signature
|
||||
$last_arg = pop(@args_list);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user