dsh.cwrap
    
    
Stuff for automated wrapping functions written in C.
License:Boost License 1.0.
Authors:Denis Shelomovskij
Source:
cwrap.d
- string wrapFunctions(string s);
 
- Wraps C functions described with IDL.
Original function restrictions:
- It shouldn't store any passed array arguments in global variables.
 
 - An argument shouldn't point to any place in other terminated array argument (like strstr).
 
 - To prevent memory loss it shouldn't allocate any data which should be manually freed by caller if:
 
  - it have a repeat expression and it's true, or
 
  - its success expression is false.
 
Every parameter declaration should starts from a direction: in, ref or out.
If ? follows a direction the parameter is optional (can be null). Every non-optional nullable parameter
is checked for not being null.
Scalar parameters:
If the declaration ends after a direction or ? sign, the parameter is a scalar.
Scalars:  | Description in IDL |  C type |  D param |  D to C param | 
  | in  |  T* |  in T* |  c = d | 
  | in  |  T  |  in T  |  ditto | 
  | in? |  T  |  in T  |  ditto | 
  | ref/out  |  T* |  ref/out T |  c = &d | 
  | ref/out? |  T* |  T* |                                   c = d  | 
Array parameters:
Otherwise it's an array and the rest declaration is array kind declaration. Array kind declaration fully
describes array argument behaviour and is based on array type declaration.
Array type declarations:  | Description in IDL |  Meaning | 
  | [length] |  An array with length defined by the length expression. | 
  | []end |  An array terminated with end element. | 
If length expression is a name of an scalar parameter, the parameter will be removed from D parameters.
Array kind declarations:  | Description in IDL |  Meaning | 
  | array |  Caller allocated array. | 
  | array->array |  Caller allocated array that will be shrinked after C function call. | 
  | array& |  Called function allocated array. | 
Length checking/shrinking operations will not be performed over null arrays (optional arrays can be null).
Caller allocated arrays:  | Description in IDL |  C type |  D param |  D to C param | 
  | in array  |  T*  |  in T[] |  c = d.ptr | 
  | ref/out array  |  T*  |  T[] |  ditto | 
  | in? array  |  T*  |  in T[]  |  ditto | 
  | ref/out? array  |  T*  |  T[]  |  ditto | 
  | ref/out array->array   |  T*  |  ref T[] |  ditto | 
  | ref/out? array->array  |  T*  |  ref T[]  |  ditto | 
Called function allocated arrays:  | Description in IDL |  C type |  D param |  D to C param | 
  | out array&  |  T**  |  out T[] |  c = &d.ptr | 
  | out? array& |  T**  |  out T[] |  ditto | 
String parameters:
Also array in array kind declaration can be prefixed with "". It means that this parameter is a string.
If stringType global state (see below) is set to a particular character type and parameter isn't a pointer to
a desired type (the one which D analog is a desired type) the conversion will be performed.
For null-terminated strings array kind declaration can be omitted so ""[]0 can be reduced to "".
Wrappers generation behaviour depends on the current state which can be configured using global attributes.
State properties:  | Name |  Default value |  Description | 
  | linkage |  C |  Defines original function linkage. | 
  | wrappedFunction |  wrapped_%s |  Defines wrapper name. | 
  | wrappedParameter |  _%s |  Defines wrapped parameters names (those which are different from original parameters). | 
  | tempSize |  10240 |  Defines size of a stack-allocated temp buffer used by a wrapper. | 
  | requiredAlignment |  1 |  Defines required array alignment, i.e. every array passed to original function
will have this alignment. | 
  | desiredAlignment |  64 |  Defines desired array alignment, i.e. if an array is anyway allocated by
wrapper it will have this alignment. | 
  | deallocator |  null |  A function that will free memory allocated by original function. | 
  | reallocate |  false |  Can be true or false. It true, arrays allocated by original function
will be reallocated in GC heap. | 
  | stringType |  native |  Can be native, char, wchar, or dchar. Defines wrapped type
for string parameters. native means no conversion needed. | 
Examples:
  | Original function declaration |  Wrapper declaration | 
  | C Standard Library | 
  __(out) int memcmp(
	__(in[num] ) void*  ptr1,
	__(in[+num]) void*  ptr2,
	__(in      ) size_t num
)
__( success: true );
 
 |  int wrapped_memcmp(
	in void[] _ptr1,
	in void[] _ptr2
);
 
 | 
  __(deallocator: free)
__(out[nmemb*size]) void* calloc(
	__(in) size_t nmemb,
	__(in) size_t size
)
__( success: return !is null );
 
 |  void[] wrapped_calloc(
	in size_t nmemb,
	in size_t size
);
 
 | 
  | WinAPI | 
  __(linkage: Windows)
__(stringType: char)
__(wrappedFunction: winapi_%s)
__(out) BOOL SetCurrentDirectoryW(
	__(in"") LPCWSTR lpPathName
)
__( success: return );
 
 |  BOOL winapi_SetCurrentDirectoryW(
	in char[] _lpPathName
);
 
 | 
  __(linkage: Windows)
__(stringType: char)
__(wrappedFunction: winapi_%s)
__(out) DWORD GetCurrentDirectoryW(
	__(in) DWORD nBufferLength,
	__(out""[nBufferLength]->""[return]) LPWSTR lpBuffer
)
__( repeat: return > nBufferLength )
__( success: return );
 
 |  void winapi_GetCurrentDirectoryW(
	out char[] _lpBuffer
);
 
 |