Changeset 2606

Show
Ignore:
Timestamp:
01/15/08 22:30:51 (1 year ago)
Author:
maxr
Message:

ada: fix unix (mmap) version of source buffer

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/tendra/mk/def/def.linux.mk

    r2605 r2606  
    101101 
    102102# Which of Gela.Source_Buffers.* Ada will use:  
    103 # ADA_INPUT_BUFFER?= Unix 
    104 ADA_INPUT_BUFFER?= Portable 
     103# ADA_INPUT_BUFFER?= Portable 
     104ADA_INPUT_BUFFER?= Unix 
  • trunk/tendra/src/producers/ada/libgela/gela-source_buffers-unix.adb

    r2604 r2606  
    55 
    66   function open 
    7       (path  : C.char_array; 
    8       flags : C.int) 
    9       return HANDLE; 
     7     (path  : C.char_array; 
     8      flags : C.int) 
     9     return HANDLE; 
    1010   pragma Import (C, open, "open"); 
    1111 
    1212   function close 
    13       (fd : HANDLE) 
    14       return C.int; 
     13     (fd : HANDLE) 
     14     return C.int; 
    1515   pragma Import (C, close, "close"); 
    1616 
    1717   O_RDONLY    : constant := 0; 
    1818   OPEN_FAILED : constant := -1; 
     19   SEEK_END    : constant := 2; 
    1920 
    20    type Stat_Struct is record 
    21       st_dev     : C.unsigned_long; 
    22       st_ino     : C.unsigned_long; 
    23       st_mode    : C.unsigned; 
    24       st_nlink   : C.unsigned; 
    25       st_uid     : C.unsigned; 
    26       st_gid     : C.unsigned; 
    27       st_rdev    : C.unsigned_long; 
    28       st_size    : C.long; 
    29       st_blksize : C.unsigned_long; 
    30       st_blocks  : C.unsigned_long; 
    31       st_atime   : C.long; 
    32       st_mtime   : C.long; 
    33       st_ctime   : C.long; 
    34    end record; 
    35    pragma Convention (C, Stat_Struct); 
     21   --type off_t is range -2 ** 63 .. 2 ** 63 - 1; 
     22   type off_t is range -2 ** 31 .. 2 ** 31 - 1; 
    3623 
    37    type Stat_Struct_Access is access all Stat_Struct; 
    38    pragma Convention (C, Stat_Struct_Access); 
    39  
    40    function fstat 
    41       (filedes : HANDLE; 
    42        buf     : Stat_Struct_Access) 
    43       return C.int; 
    44    pragma Import (C, fstat, "fstat"); 
     24   function lseek 
     25     (filedes : HANDLE; 
     26      Offset  : off_t; 
     27      whence  : C.int) 
     28     return off_t; 
     29   pragma Import (C, lseek, "lseek"); 
    4530 
    4631   function mmap 
    47       (start  : System.Address; 
    48       length : C.size_t; 
    49       prot   : C.int; 
    50       flags  : C.int; 
    51       fd     : HANDLE; 
    52       offset : C.ptrdiff_t) 
    53       return System.Address; 
     32     (start  : System.Address; 
     33      length : C.size_t; 
     34      prot   : C.int; 
     35      flags  : C.int; 
     36      fd     : HANDLE; 
     37      offset : C.ptrdiff_t) 
     38     return System.Address; 
    5439   pragma Import (C, mmap, "mmap"); 
    5540 
     
    5843 
    5944   function munmap 
    60       (start  : System.Address; 
    61       length : C.size_t) 
    62       return C.int; 
     45     (start  : System.Address; 
     46      length : C.size_t) 
     47     return C.int; 
    6348   pragma Import (C, munmap, "munmap"); 
    6449 
     
    7964        Storage_Elements.To_Address (-1); 
    8065 
    81       Stat : aliased Stat_Struct; 
    82       Size : unsigned_long := 0; 
     66      Size : off_t; 
    8367   begin 
    8468      This.Internal_File := open (To_C (Name), O_RDONLY); 
     
    8872      end if; 
    8973 
    90       if fstat (This.Internal_File, Stat'Unchecked_Access) /= 0 then 
    91          Close (This); 
    92          raise Use_Error; 
    93       end if; 
     74      Size := lseek (This.Internal_File, 0, SEEK_END); 
    9475 
    95       Size := unsigned_long (Stat.st_size); 
    96  
    97       if Size > unsigned_long (Offset'Last) then 
     76      if Size = -1 or Size > off_t (Offset'Last) then 
    9877         Close (This); 
    9978         raise Use_Error;