$PBExportHeader$nvo_sizeof.sru
$PBExportComments$Non visual user O B J E C T that implements the SizeOf function present on other languages (C, Delphi, VB)
forward
global type nvo_sizeof from nonvisual O B J E C T
end type
end forward
global type nvo_sizeof from nonvisual O B J E C T autoinstantiate
end type
type variables
Private:
CONSTANT integer SIZE_BOOLEAN = 1 // Boolean
CONSTANT integer SIZE_CHAR = 1 // Char
CONSTANT integer SIZE_INT = 2 // Signed integer
CONSTANT integer SIZE_UINT = 2 // Unsigned integer
CONSTANT integer SIZE_LONG = 4 // Signed Long
CONSTANT integer SIZE_ULONG = 4 // Unsigned Long
CONSTANT integer SIZE_STRING = 4 // Assume as string pointer
// Supported DataTypes
integer INTEGER
uint UINT
long LONG
ulong ULONG
char CHAR
string STRING
boolean BOOLEAN
end variables
forward prototypes
public function long sizeof (long data)
public function long sizeof (ulong data)
public function long sizeof (integer data)
public function long sizeof (uint data)
public function long sizeof (character data)
public function long sizeof (string data)
public function long sizeof (any data[])
public function long sizeof (boolean data)
public function long sizeof (power O B J E C T data)
private function long sizeof (variabledefinition vardef[])
end prototypes
public function long sizeof (long data);Return(SIZE_LONG)
end function
public function long sizeof (ulong data);Return(SIZE_ULONG)
end function
public function long sizeof (integer data);Return(SIZE_INT)
end function
public function long sizeof (uint data);Return(SIZE_UINT)
end function
public function long sizeof (character data);Return(SIZE_CHAR)
end function
public function long sizeof (string data);Return(SIZE_STRING)
end function
public function long sizeof (any data[]);// Gives the dimension of an array
//
// Arguments: Data[] => Array to know the dimension
//
// Returns: Size of the array
//
// Notes:
// 1) Supports mixed type arrays (and variable sized strings within the array)
// 2) DOESN'T support multi-dimension arrays;
long ll_Index, ll_Count, ll_Size = 0
ll_Count = UpperBound(Data)
For ll_Index = 1 To ll_Count
Choose Case ClassName(Data[ll_Index])
Case "long"
ll_Size += SizeOf(LONG)
Case "unsignedlong","ulong"
ll_Size += SizeOf(ULONG)
Case "int","integer"
ll_Size += SizeOf(INTEGER)
Case "uint","unsignedinteger","unsignedint"
ll_Size += SizeOf(UINT)
Case "char", "character"
ll_Size += SizeOf(CHAR)
Case "string"
ll_Size += SizeOf(CHAR) * SizeOf(String(Data[ll_Index]))
Case "boolean"
ll_Size += SizeOf(BOOLEAN)
End Choose
Next
Return(ll_Size)
end function
public function long sizeof (boolean data);Return(SIZE_BOOLEAN)
end function
public function long sizeof (power O B J E C T data);// This function calculates the size of a structure
//
// The structure can contain simple datatypes (long, integer, boolean), arrays or
// other structures within it
//
// Arguments: Data => Structure to know the size of..
//
// Returns: Size of the structure or -1 if error
//
// Notes:
//
// 1) Cannot calculate the size of a structure with strings (variable size), for fixed
// sized strings use a char array;
// 2) CAN calculate the size of multi-dimension arrays within the structures
ClassDefinition ClassDef
VariableDefinition VarDef[]
ClassDef = Data.ClassDefinition
if Not ClassDef.IsStructure then return - 1
VarDef = ClassDef.VariableList
Return(SizeOf(VarDef))
end function
private function long sizeof (variabledefinition vardef[]);// Internal calculations for structure sizes
long ll_Index, ll_Count, ll_Size, ll_Array = 0
ClassDefinition TypeInfo
VariableDefinition VarList[]
VariableCardinalityDefinition VarCarDef
ArrayBounds ArrBounds[]
ll_Count = Upperbound(VarDef)
For ll_Index = 2 To ll_Count //ll_Index=1 itself
VarCarDef = VarDef[ll_Index].Cardinality
if VarCarDef.Cardinality=BoundedArray! then
ArrBounds = VarCarDef.ArrayDefinition
If Upperbound(ArrBounds) = 1 Then
ll_Array = ArrBounds[1].UpperBound
elseif Upperbound(ArrBounds) >=2 then //two dim array
ll_Array =(ArrBounds[2].UpperBOund)*(ArrBounds[1].UpperBOund)
End If
Else //ScalarType! or UnboundedArray!
ll_Array = 1
End If
Choose Case lower(VarDef[ll_Index].TypeInfo.DataTypeOf)
Case "long"
ll_Size += SizeOf(LONG) * ll_Array
Case "ulong","unsignedlong"
ll_Size += SizeOf(ULONG) * ll_Array
Case "int","integer"
ll_Size += SizeOf(INTEGER) * ll_Array
Case "uint","unsignedint","unsignedinteger"
ll_Size += SizeOf(UINT) * ll_Array
Case "char","character"
ll_Size += SizeOf(CHAR) * ll_Array
Case "string"
ll_Size += SizeOf(STRING) * ll_Array
Case "structure"
TypeInfo = VarDef[ll_Index].TypeInfo
VarList = TypeInfo.VariableList
ll_Size += SizeOf(VarList)
Case Else
//if just store pointer in pb?? ll_Size+=(4*ll_Array)
MessageBox("SizeOf error","Type is not supported, possibly variable sized or O B J E C T type!",StopSign!,Ok!)
Return(-1)
End Choose
Next
Return(ll_Size)
end function
on nvo_sizeof.create
call super::create
TriggerEvent( this, "constructor" )
end on
on nvo_sizeof.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on