use strict;
use Parse::Pidl::Typelist qw(hasType getType);
use Parse::Pidl::Util qw(has_property ParseExpr);
-use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel);
+use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
# list of known types
my %typefamily;
return 0 unless ($nl->{TYPE} eq "DATA");
return 0 unless (hasType($nl->{DATA_TYPE}));
- return Parse::Pidl::Typelist::is_scalar($nl->{DATA_TYPE});
+ my $t = getType($nl->{DATA_TYPE});
+
+ # Only uint8 and string have fast array functions at the moment
+ return ($t->{NAME} eq "uint8") or ($t->{NAME} eq "string");
}
sub get_pointer_to($)
pidl "}";
}
- if ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $l)) {
+ if ($deferred and ContainsDeferred($e, $l)) {
pidl "for ($counter = 0; $counter < $length; $counter++) {";
indent;
ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 0, 1);
$var_name = append_prefix($e, $var_name);
- return unless $primitives or ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $e->{LEVELS}[0]));
+ return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
start_flags($e);
}
}
- if ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $l)) {
+ if ($deferred and ContainsDeferred($e, $l)) {
pidl "for ($counter = 0; $counter < $length; $counter++) {";
indent;
ParseElementPullLevel($e,GetNextLevel($e,$l), $ndr, $var_name, $env, 0, 1);
$var_name = append_prefix($e, $var_name);
- return unless $primitives or ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $e->{LEVELS}[0]));
+ return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
start_flags($e);
return ndr_pull_bytes(ndr, data, n);
}
-/*
- pull an array of uint16
-*/
-NTSTATUS ndr_pull_array_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *data, uint32_t n)
-{
- uint32_t i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- pull a const array of uint32_t
-*/
-NTSTATUS ndr_pull_array_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *data, uint32_t n)
-{
- uint32_t i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- pull a const array of hyper
-*/
-NTSTATUS ndr_pull_array_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *data, uint32_t n)
-{
- uint32_t i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- pull a const array of WERROR
-*/
-NTSTATUS ndr_pull_array_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *data, uint32_t n)
-{
- uint32_t i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &data[i]));
- }
- return NT_STATUS_OK;
-}
-
/*
push a int8_t
*/
return ndr_push_bytes(ndr, data, n);
}
-/*
- push an array of uint16
-*/
-NTSTATUS ndr_push_array_uint16(struct ndr_push *ndr, int ndr_flags, const uint16_t *data, uint32_t n)
-{
- int i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- push an array of uint32_t
-*/
-NTSTATUS ndr_push_array_uint32(struct ndr_push *ndr, int ndr_flags, const uint32_t *data, uint32_t n)
-{
- int i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- push an array of hyper
-*/
-NTSTATUS ndr_push_array_hyper(struct ndr_push *ndr, int ndr_flags, const uint64_t *data, uint32_t n)
-{
- int i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, data[i]));
- }
- return NT_STATUS_OK;
-}
-
-/*
- push an array of hyper
-*/
-NTSTATUS ndr_push_array_WERROR(struct ndr_push *ndr, int ndr_flags, const WERROR *data, uint32_t n)
-{
- int i;
- if (!(ndr_flags & NDR_SCALARS)) {
- return NT_STATUS_OK;
- }
- for (i=0;i<n;i++) {
- NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, data[i]));
- }
- return NT_STATUS_OK;
-}
-
/*
save the current position
*/
ndr->print(ndr, "UNKNOWN LEVEL %u", level);
}
-void ndr_print_array_WERROR(struct ndr_print *ndr, const char *name,
- const WERROR *data, uint32_t count)
-{
- int i;
-
- ndr->print(ndr, "%s: ARRAY(%d)", name, count);
- ndr->depth++;
- for (i=0;i<count;i++) {
- char *idx=NULL;
- asprintf(&idx, "[%d]", i);
- if (idx) {
- ndr_print_WERROR(ndr, idx, data[i]);
- free(idx);
- }
- }
- ndr->depth--;
-}
-
-void ndr_print_array_hyper(struct ndr_print *ndr, const char *name,
- const uint64_t *data, uint32_t count)
-{
- int i;
-
- ndr->print(ndr, "%s: ARRAY(%d)", name, count);
- ndr->depth++;
- for (i=0;i<count;i++) {
- char *idx=NULL;
- asprintf(&idx, "[%d]", i);
- if (idx) {
- ndr_print_hyper(ndr, idx, data[i]);
- free(idx);
- }
- }
- ndr->depth--;
-}
-
-void ndr_print_array_uint32(struct ndr_print *ndr, const char *name,
- const uint32_t *data, uint32_t count)
-{
- int i;
-
- ndr->print(ndr, "%s: ARRAY(%d)", name, count);
- ndr->depth++;
- for (i=0;i<count;i++) {
- char *idx=NULL;
- asprintf(&idx, "[%d]", i);
- if (idx) {
- ndr_print_uint32(ndr, idx, data[i]);
- free(idx);
- }
- }
- ndr->depth--;
-}
-
-void ndr_print_array_uint16(struct ndr_print *ndr, const char *name,
- const uint16_t *data, uint32_t count)
-{
- int i;
-
- ndr->print(ndr, "%s: ARRAY(%d)", name, count);
- ndr->depth++;
- for (i=0;i<count;i++) {
- char *idx=NULL;
- asprintf(&idx, "[%d]", i);
- if (idx) {
- ndr_print_uint16(ndr, idx, data[i]);
- free(idx);
- }
- }
- ndr->depth--;
-}
-
void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
const uint8_t *data, uint32_t count)
{