Back to... Zip-Ada

Source file : win32.ads


--  **************************************************************
--  Parent package for other Win32 interfaces.
--  The packages are organized into one library package with child
--  packages to avoid library level namespace pollution.
--  Some types are moved up here from winnt, winbase, and windefs,
--  to remove circular dependencies between those packages.
--  Also some common types, e.g. CHAR_Array, are put here so they
--  will not be replicated in many other packages.
--  **************************************************************

with Ada.Unchecked_Conversion;
with Interfaces;
with Interfaces.C;
with Interfaces.C.Strings;
with System;

package Win32 is

   pragma Linker_Options ("-lwin32ada");
   pragma Linker_Options ("-luser32");
   pragma Linker_Options ("-lgdi32");
   pragma Linker_Options ("-lcomdlg32");

   --  *****************************************************
   --  Built-in C types, their Win32 names,
   --  pointers to "all" and "constant" values of the types,
   --  and arrays of the types.
   --  *****************************************************

   --  C pointer to "void", a pointer to anything that must
   --  be converted to another pointer to be useful
   type    VOID    is null record;
   subtype PVOID   is System.Address;                      --  winnt.h
   subtype LPVOID  is PVOID;                               --  windef.h
   subtype PCVOID  is PVOID;
   subtype LPCVOID is PCVOID;                              --  windef.h
   type    PVOID_Array is array (Natural range <>) of aliased PVOID;
   --  rpcproxy.h

   --  8 bit signed chars
   subtype CHAR       is Interfaces.C.char;                --  winnt.h
   type    PCHAR      is access all CHAR;                  --  winnt.h
   subtype LPCH       is PCHAR;                            --  winnt.h
   subtype PCH        is PCHAR;                            --  winnt.h
   subtype NPSTR      is PCHAR;                            --  winnt.h
   subtype LPSTR      is PCHAR;                            --  winnt.h
   subtype PSTR       is PCHAR;                            --  winnt.h
   subtype PSZ        is PCHAR;                            --  windef.h
   type    PCCH       is access constant CHAR;             --  winnt.h
   subtype PCCHAR     is PCCH;                             --  rpcproxy.h
   subtype LPCCH      is PCCH;                             --  winnt.h
   subtype LPCSTR     is PCCH;                             --  winnt.h
   subtype PCSTR      is PCCH;                             --  winnt.h
   type    CHAR_Array is array (Natural range <>) of aliased CHAR;
   Nul     : constant CHAR := CHAR'First;
   type    TCHAR      is new CHAR;                         --  tchar.h :409

   function To_PCSTR is new Ada.Unchecked_Conversion (System.Address, PCSTR);

   --  8 bit unsigned chars
   subtype UCHAR       is Interfaces.C.unsigned_char;      --  windef.h
   type    BYTE        is new Interfaces.C.unsigned_char;  --  windef.h
   type    PBYTE       is access all BYTE;                 --  windef.h
   subtype LPBYTE      is PBYTE;                           --  windef.h
   type    PCBYTE      is access constant BYTE;
   type    PCUCHAR     is access constant UCHAR;           --  rpcndr.h
   type    PUCHAR      is access all UCHAR;                --  windef.h
   type    BYTE_Array  is array (Natural range <>) of aliased BYTE;
   type    UCHAR_Array is array (Natural range <>) of aliased UCHAR;

   function To_PUCHAR is new Ada.Unchecked_Conversion (PVOID, PUCHAR);
   function To_PBYTE is new Ada.Unchecked_Conversion (PVOID, PBYTE);

   --  16 bit wide chars
   subtype Wchar_T     is Interfaces.C.wchar_t;            --  ctype.h
   subtype WCHAR       is Wchar_T;                         --  winnt.h
   type    PWCH        is access all WCHAR;                --  winnt.h
   subtype LPWCH       is PWCH;                            --  winnt.h
   subtype PWCHAR      is PWCH;                            --  winnt.h
   subtype NWPSTR      is PWCH;                            --  winnt.h
   subtype LPWSTR      is PWCH;                            --  winnt.h
   subtype PWSTR       is PWCH;                            --  winnt.h
   type    PCWCH       is access constant WCHAR;           --  winnt.h
   subtype LPCWCH      is PCWCH;                           --  winnt.h
   subtype PCWSTR      is PCWCH;                           --  winnt.h
   subtype LPCWSTR     is PCWCH;                           --  winnt.h
   type    WCHAR_Array is array (Natural range <>) of aliased WCHAR;
   Wide_Nul : constant WCHAR := WCHAR'First;

   function To_LPCWSTR is new Ada.Unchecked_Conversion (PCBYTE, LPCWSTR);
   function To_PWSTR is new Ada.Unchecked_Conversion (System.Address, PWSTR);
   function To_PCWSTR is new Ada.Unchecked_Conversion (System.Address, PCWSTR);

   --  16 bit signed integers
   subtype SHORT       is Interfaces.C.short;              --  winnt.h
   type    PSHORT      is access all SHORT;                --  windef.h
   type    PCSHORT     is access constant SHORT;
   type    SHORT_Array is array (Natural range <>) of aliased SHORT;

   --  16 bit unsigned integers
   subtype USHORT     is Interfaces.C.unsigned_short;      --  windef.h
   subtype WORD       is USHORT;                           --  windef.h
   type    PUSHORT    is access all USHORT;                --  windef.h
   type    PWORD      is new PUSHORT;                      --  windef.h
   type    PCWORD     is access constant WORD;
   subtype LPWORD     is PWORD;                            --  windef.h
   type    WORD_Array is array (Natural range <>) of aliased WORD;

   --  "int" types, signed, 32 bits on Intel
   subtype INT       is Interfaces.C.int;                  --  windef.h
   type    BOOL      is new INT;                           --  windef.h
   type    PBOOL     is access all BOOL;                   --  windef.h
   subtype LPBOOL    is PBOOL;                             --  windef.h
   type    PINT      is access all INT;                    --  windef.h
   subtype LPINT     is PINT;                              --  windef.h
   type    PCINT     is access constant INT;
   type    INT_Array is array (Natural range <>) of aliased INT;

   function To_PINT is new Ada.Unchecked_Conversion (System.Address, PINT);
   function To_PBOOL is new Ada.Unchecked_Conversion(PVOID, PBOOL);

   --  "unsigned" or "unsigned int" types, unsigned, 32 bits on Intel
   subtype UINT       is Interfaces.C.unsigned;            --  windef.h
   subtype WPARAM     is UINT;                             --  windef.h
   type    PUINT      is access all UINT;                  --  windef.h
   type    PCUINT     is access constant UINT;
   type    UINT_Array is array (Natural range <>) of aliased UINT;
   subtype Size_T     is Interfaces.C.size_t;

   --  "long" 32 bit signed integers
   subtype LONG       is Interfaces.C.long;                --  winnt.h
   subtype LPARAM     is LONG;                             --  windef.h
   subtype LRESULT    is LONG;                             --  windef.h
   type    PLONG      is access all LONG;
   subtype LPLONG     is PLONG;                            --  windef.h
   type    PCLONG     is access constant LONG;
   type    LONG_Array is array (Natural range <>) of aliased LONG;

   --  "unsigned long" 32 bit unsigned integers
   subtype ULONG       is Interfaces.C.unsigned_long;      --  windef.h
   subtype DWORD       is ULONG;                           --  windef.h
   type    PULONG      is access all ULONG;                --  windef.h
   subtype PDWORD      is PULONG;                          --  windef.h
   subtype LPDWORD     is PDWORD;                          --  windef.h
   type    PCDWORD     is access constant DWORD;
   type    ULONG_Array is array (Natural range <>) of aliased ULONG;
   subtype DWORD_Array is ULONG_Array;

   function To_PULONG is new Ada.Unchecked_Conversion (System.Address, PULONG);
   function To_LPTSTR is new Ada.Unchecked_Conversion (DWORD, PSTR);
   function To_LPWSTR is new Ada.Unchecked_Conversion (DWORD, LPWSTR);

   --  builtin C "float", 32 bits on Intel
   subtype FLOAT  is Interfaces.C.C_float;                 --  windef.h
   type    PFLOAT is access all FLOAT;                     --  windef.h

   --  builtin C "double", also 64 bits on Intel
   subtype DOUBLE  is Interfaces.C.double;
   type    PDOUBLE is access all DOUBLE;

   --  64 bit signed integer
   type LONGLONG is private;
   type PLONGLONG is access all LONGLONG;                  --  winnt.h
   type PCLONGLONG is access constant LONGLONG;

   --  64 bit unsigned integer
   type DWORDLONG is private;
   type PDWORDLONG is access all DWORDLONG;                --  winnt.h
   type PCDWORDLONG is access constant DWORDLONG;

   --  ************************************************************
   --  True and False constants.
   --  Warning : when you get a value back from Windows, comparing
   --  Value /= FALSE is safe, comparing Value = TRUE is not safe,
   --  since Windows sometimes returns any non-zero value for TRUE.
   --  ************************************************************

   FALSE : constant := 0;                                  --  windef.h
   TRUE  : constant := 1;                                  --  windef.h

   --  ********************************************************
   --  so Interfaces.C and Windows strings can be used together
   --  ********************************************************

   function To_Chars_Ptr (STR : PSTR) return Interfaces.C.Strings.chars_ptr;

   function To_Chars_Ptr (STR : PCSTR) return Interfaces.C.Strings.chars_ptr;

   function To_PSTR (CP : Interfaces.C.Strings.chars_ptr) return PSTR;

   function To_PCSTR (CP : Interfaces.C.Strings.chars_ptr) return PCSTR;

   function To_C (S : CHAR_Array) return Interfaces.C.char_array;

   function To_Win (S : Interfaces.C.char_array) return CHAR_Array;

   function To_Win (S : Interfaces.C.wchar_array) return WCHAR_Array;

   --  ********************************************************************
   --  These could be useful with a Standard.String that is NUL-terminated.
   --  They return the address of the first element.
   --  See also the conversion functions in Interfaces.C.
   --  ********************************************************************

   function Addr (S : String) return PSTR;

   function Addr (S : String) return PCSTR;

   function Addr (S : Wide_String) return PWSTR;

   function Addr (S : Wide_String) return PCWSTR;

   function Addr (S : CHAR_Array) return PSTR;

   function Addr (S : CHAR_Array) return PCSTR;

   function Addr (S : WCHAR_Array) return PWSTR;

   function Addr (S : WCHAR_Array) return PCWSTR;

   --  **************************************************************
   --  Special string-catenation functions that will trim a trailing
   --  nul from the left string, if present, and will add a trailing nul
   --  to the result, if not present at the end of the right string.
   --  The easiest way to use this is with a local renaming, e.g.
   --   function "&" (Left, Right : String) return String renames Win32.Cat;
   --  **************************************************************

   function Cat (Left, Right : String) return String;

   function Cat (Left, Right : Wide_String) return Wide_String;

   function Cat (Left, Right : CHAR_Array) return CHAR_Array;

   function Cat (Left, Right : WCHAR_Array) return WCHAR_Array;

   --  ********************************************************
   --  In C, a variable-size array is declared as a[1] or
   --  a[ANYSIZE_ARRAY], where ANYSIZE_ARRAY is defined as 1.
   --  Then it is used as if it were bigger.
   --  In Ada we declare it as array (0..ANYSIZE_ARRAY) and then
   --  use the extensible array package.
   --  In C ANYSIZE_ARRAY is 1 and in Ada it is 0.
   --  ********************************************************

   ANYSIZE_ARRAY : constant := 0;                           --  winnt.h :26

   --  ********************************************************
   --  String vectors.
   --  Use the extensible-arrays package to get one of these that is bigger.
   --  Be sure to put a null pointer as the last array element.
   --  ********************************************************
   type String_Vector is array (0 .. Win32.ANYSIZE_ARRAY) of aliased
     Win32.PSTR;
   type String_Vector_Access is access all String_Vector;


   --  *******************************************
   --  Bit fields inside C structs and Ada records
   --  *******************************************

   type Bits1  is range 0 .. 2**1-1;
   type Bits2  is range 0 .. 2**2-1;
   type Bits3  is range 0 .. 2**3-1;
   type Bits4  is range 0 .. 2**4-1;
   type Bits5  is range 0 .. 2**5-1;
   type Bits6  is range 0 .. 2**6-1;
   type Bits7  is range 0 .. 2**7-1;
   type Bits8  is range 0 .. 2**8-1;
   type Bits9  is range 0 .. 2**9-1;
   type Bits10 is range 0 .. 2**10-1;
   type Bits11 is range 0 .. 2**11-1;
   type Bits12 is range 0 .. 2**12-1;
   type Bits13 is range 0 .. 2**13-1;
   type Bits14 is range 0 .. 2**14-1;
   type Bits15 is range 0 .. 2**15-1;
   type Bits16 is range 0 .. 2**16-1;
   type Bits17 is range 0 .. 2**17-1;
   type Bits18 is range 0 .. 2**18-1;
   type Bits19 is range 0 .. 2**19-1;
   type Bits20 is range 0 .. 2**20-1;
   type Bits21 is range 0 .. 2**21-1;
   type Bits22 is range 0 .. 2**22-1;
   type Bits23 is range 0 .. 2**23-1;
   type Bits24 is range 0 .. 2**24-1;
   type Bits25 is range 0 .. 2**25-1;
   type Bits26 is range 0 .. 2**26-1;
   type Bits27 is range 0 .. 2**27-1;
   type Bits28 is range 0 .. 2**28-1;
   type Bits29 is range 0 .. 2**29-1;
   type Bits30 is range 0 .. 2**30-1;
   type Bits31 is range 0 .. 2**31-1;

   for Bits1'Size use 1;
   for Bits2'Size use 2;
   for Bits3'Size use 3;
   for Bits4'Size use 4;
   for Bits5'Size use 5;
   for Bits6'Size use 6;
   for Bits7'Size use 7;
   for Bits8'Size use 8;
   for Bits9'Size use 9;
   for Bits10'Size use 10;
   for Bits11'Size use 11;
   for Bits12'Size use 12;
   for Bits13'Size use 13;
   for Bits14'Size use 14;
   for Bits15'Size use 15;
   for Bits16'Size use 16;
   for Bits17'Size use 17;
   for Bits18'Size use 18;
   for Bits19'Size use 19;
   for Bits20'Size use 20;
   for Bits21'Size use 21;
   for Bits22'Size use 22;
   for Bits23'Size use 23;
   for Bits24'Size use 24;
   for Bits25'Size use 25;
   for Bits26'Size use 26;
   for Bits27'Size use 27;
   for Bits28'Size use 28;
   for Bits29'Size use 29;
   for Bits30'Size use 30;
   for Bits31'Size use 31;

private

   pragma Inline (To_C);
   pragma Inline (To_Win);
   pragma Inline (To_Chars_Ptr);
   pragma Inline (To_PSTR);
   pragma Inline (To_PCSTR);

   --  Warning : it is endian dependent to assume which word is least
   --  significant
   type LONGLONG is record
      A, B : INT;
   end record;

   type DWORDLONG is record
      A, B : UINT;
   end record;

   ----------------------------------------------------------------------------
   --
   --  THIS FILE AND ANY ASSOCIATED DOCUMENTATION IS PROVIDED "AS IS"
   --  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
   --  INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
   --  MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.  The
   --  user assumes the entire risk as to the accuracy and the use of
   --  this file.  This file may be used only by licensees of
   --  Microsoft Corporation's WIN32 Software Development Kit in
   --  accordance with the terms of the licensee's End-User License
   --  Agreement for Microsoft Software for the WIN32 Development Kit.
   --
   --  Copyright (c) Intermetrics, Inc. 1995
   --  Portions (c) 1985-1994 Microsoft Corporation with permission.
   --  Microsoft is a registered trademark and Windows and Windows NT are
   --  trademarks of Microsoft Corporation.
   --
   ----------------------------------------------------------------------------

end Win32;

Zip-Ada: Ada library for zip archive files (.zip). Ada programming.
Some news about Zip-Ada and other related Ada projects on Gautier's blog.