(root)/
freetype-2.13.2/
builds/
vms/
ftsystem.c
       1  /***************************************************************************/
       2  /*                                                                         */
       3  /*  ftsystem.c                                                             */
       4  /*                                                                         */
       5  /*    VMS-specific FreeType low-level system interface (body).             */
       6  /*                                                                         */
       7  /*  Copyright (C) 1996-2023 by                                             */
       8  /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
       9  /*                                                                         */
      10  /*  This file is part of the FreeType project, and may only be used,       */
      11  /*  modified, and distributed under the terms of the FreeType project      */
      12  /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
      13  /*  this file you indicate that you have read the license and              */
      14  /*  understand and accept it fully.                                        */
      15  /*                                                                         */
      16  /***************************************************************************/
      17  
      18  
      19  #include <ft2build.h>
      20    /* we use our special ftconfig.h file, not the standard one */
      21  #include <ftconfig.h>
      22  #include <freetype/internal/ftdebug.h>
      23  #include <freetype/ftsystem.h>
      24  #include <freetype/fterrors.h>
      25  #include <freetype/fttypes.h>
      26  #include <freetype/internal/ftobjs.h>
      27  
      28    /* memory-mapping includes and definitions */
      29  #ifdef HAVE_UNISTD_H
      30  #include <unistd.h>
      31  #endif
      32  
      33  #include <sys/mman.h>
      34  #ifndef MAP_FILE
      35  #define MAP_FILE  0x00
      36  #endif
      37  
      38  #ifdef MUNMAP_USES_VOIDP
      39  #define MUNMAP_ARG_CAST  void *
      40  #else
      41  #define MUNMAP_ARG_CAST  char *
      42  #endif
      43  
      44  #ifdef NEED_MUNMAP_DECL
      45  
      46  #ifdef __cplusplus
      47    extern "C"
      48  #else
      49    extern
      50  #endif
      51    int
      52    munmap( char*  addr,
      53            int    len );
      54  
      55  #define MUNMAP_ARG_CAST  char *
      56  
      57  #endif /* NEED_DECLARATION_MUNMAP */
      58  
      59  
      60  #include <sys/types.h>
      61  #include <sys/stat.h>
      62  
      63  #ifdef HAVE_FCNTL_H
      64  #include <fcntl.h>
      65  #endif
      66  
      67  #include <stdio.h>
      68  #include <stdlib.h>
      69  #include <string.h>
      70  
      71  
      72    /*************************************************************************/
      73    /*                                                                       */
      74    /*                       MEMORY MANAGEMENT INTERFACE                     */
      75    /*                                                                       */
      76    /*************************************************************************/
      77  
      78  
      79    /*************************************************************************/
      80    /*                                                                       */
      81    /* <Function>                                                            */
      82    /*    ft_alloc                                                           */
      83    /*                                                                       */
      84    /* <Description>                                                         */
      85    /*    The memory allocation function.                                    */
      86    /*                                                                       */
      87    /* <Input>                                                               */
      88    /*    memory :: A pointer to the memory object.                          */
      89    /*                                                                       */
      90    /*    size   :: The requested size in bytes.                             */
      91    /*                                                                       */
      92    /* <Return>                                                              */
      93    /*    The address of newly allocated block.                              */
      94    /*                                                                       */
      95    FT_CALLBACK_DEF( void* )
      96    ft_alloc( FT_Memory  memory,
      97              long       size )
      98    {
      99      FT_UNUSED( memory );
     100  
     101      return malloc( size );
     102    }
     103  
     104  
     105    /*************************************************************************/
     106    /*                                                                       */
     107    /* <Function>                                                            */
     108    /*    ft_realloc                                                         */
     109    /*                                                                       */
     110    /* <Description>                                                         */
     111    /*    The memory reallocation function.                                  */
     112    /*                                                                       */
     113    /* <Input>                                                               */
     114    /*    memory   :: A pointer to the memory object.                        */
     115    /*                                                                       */
     116    /*    cur_size :: The current size of the allocated memory block.        */
     117    /*                                                                       */
     118    /*    new_size :: The newly requested size in bytes.                     */
     119    /*                                                                       */
     120    /*    block    :: The current address of the block in memory.            */
     121    /*                                                                       */
     122    /* <Return>                                                              */
     123    /*    The address of the reallocated memory block.                       */
     124    /*                                                                       */
     125    FT_CALLBACK_DEF( void* )
     126    ft_realloc( FT_Memory  memory,
     127                long       cur_size,
     128                long       new_size,
     129                void*      block )
     130    {
     131      FT_UNUSED( memory );
     132      FT_UNUSED( cur_size );
     133  
     134      return realloc( block, new_size );
     135    }
     136  
     137  
     138    /*************************************************************************/
     139    /*                                                                       */
     140    /* <Function>                                                            */
     141    /*    ft_free                                                            */
     142    /*                                                                       */
     143    /* <Description>                                                         */
     144    /*    The memory release function.                                       */
     145    /*                                                                       */
     146    /* <Input>                                                               */
     147    /*    memory :: A pointer to the memory object.                          */
     148    /*                                                                       */
     149    /*    block  :: The address of block in memory to be freed.              */
     150    /*                                                                       */
     151    FT_CALLBACK_DEF( void )
     152    ft_free( FT_Memory  memory,
     153             void*      block )
     154    {
     155      FT_UNUSED( memory );
     156  
     157      free( block );
     158    }
     159  
     160  
     161    /*************************************************************************/
     162    /*                                                                       */
     163    /*                     RESOURCE MANAGEMENT INTERFACE                     */
     164    /*                                                                       */
     165    /*************************************************************************/
     166  
     167  
     168    /*************************************************************************/
     169    /*                                                                       */
     170    /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
     171    /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
     172    /* messages during execution.                                            */
     173    /*                                                                       */
     174  #undef  FT_COMPONENT
     175  #define FT_COMPONENT  io
     176  
     177    /* We use the macro STREAM_FILE for convenience to extract the       */
     178    /* system-specific stream handle from a given FreeType stream object */
     179  #define STREAM_FILE( stream )  ( (FILE*)stream->descriptor.pointer )
     180  
     181  
     182    /*************************************************************************/
     183    /*                                                                       */
     184    /* <Function>                                                            */
     185    /*    ft_close_stream                                                    */
     186    /*                                                                       */
     187    /* <Description>                                                         */
     188    /*    The function to close a stream.                                    */
     189    /*                                                                       */
     190    /* <Input>                                                               */
     191    /*    stream :: A pointer to the stream object.                          */
     192    /*                                                                       */
     193    FT_CALLBACK_DEF( void )
     194    ft_close_stream( FT_Stream  stream )
     195    {
     196      munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size );
     197  
     198      stream->descriptor.pointer = NULL;
     199      stream->size               = 0;
     200      stream->base               = NULL;
     201    }
     202  
     203  
     204    /* documentation is in ftobjs.h */
     205  
     206    FT_BASE_DEF( FT_Error )
     207    FT_Stream_Open( FT_Stream    stream,
     208                    const char*  filepathname )
     209    {
     210      int          file;
     211      struct stat  stat_buf;
     212  
     213  
     214      if ( !stream )
     215        return FT_THROW( Invalid_Stream_Handle );
     216  
     217      /* open the file */
     218      file = open( filepathname, O_RDONLY );
     219      if ( file < 0 )
     220      {
     221        FT_ERROR(( "FT_Stream_Open:" ));
     222        FT_ERROR(( " could not open `%s'\n", filepathname ));
     223        return FT_THROW( Cannot_Open_Resource );
     224      }
     225  
     226      if ( fstat( file, &stat_buf ) < 0 )
     227      {
     228        FT_ERROR(( "FT_Stream_Open:" ));
     229        FT_ERROR(( " could not `fstat' file `%s'\n", filepathname ));
     230        goto Fail_Map;
     231      }
     232  
     233      stream->size = stat_buf.st_size;
     234      if ( !stream->size )
     235      {
     236        FT_ERROR(( "FT_Stream_Open:" ));
     237        FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
     238        goto Fail_Map;
     239      }
     240  
     241      stream->pos  = 0;
     242      stream->base = (unsigned char *)mmap( NULL,
     243                                            stream->size,
     244                                            PROT_READ,
     245                                            MAP_FILE | MAP_PRIVATE,
     246                                            file,
     247                                            0 );
     248  
     249      if ( stream->base == MAP_FAILED )
     250      {
     251        FT_ERROR(( "FT_Stream_Open:" ));
     252        FT_ERROR(( " could not `mmap' file `%s'\n", filepathname ));
     253        goto Fail_Map;
     254      }
     255  
     256      close( file );
     257  
     258      stream->descriptor.pointer = stream->base;
     259      stream->pathname.pointer   = (char*)filepathname;
     260  
     261      stream->close = ft_close_stream;
     262      stream->read  = NULL;
     263  
     264      FT_TRACE1(( "FT_Stream_Open:" ));
     265      FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
     266                  filepathname, stream->size ));
     267  
     268      return FT_Err_Ok;
     269  
     270    Fail_Map:
     271      close( file );
     272  
     273      stream->base = NULL;
     274      stream->size = 0;
     275      stream->pos  = 0;
     276  
     277      return FT_THROW( Cannot_Open_Stream );
     278    }
     279  
     280  
     281  #ifdef FT_DEBUG_MEMORY
     282  
     283    extern FT_Int
     284    ft_mem_debug_init( FT_Memory  memory );
     285  
     286    extern void
     287    ft_mem_debug_done( FT_Memory  memory );
     288  
     289  #endif
     290  
     291  
     292    /* documentation is in ftobjs.h */
     293  
     294    FT_BASE_DEF( FT_Memory )
     295    FT_New_Memory( void )
     296    {
     297      FT_Memory  memory;
     298  
     299  
     300      memory = (FT_Memory)malloc( sizeof ( *memory ) );
     301      if ( memory )
     302      {
     303        memory->user    = NULL;
     304        memory->alloc   = ft_alloc;
     305        memory->realloc = ft_realloc;
     306        memory->free    = ft_free;
     307  #ifdef FT_DEBUG_MEMORY
     308        ft_mem_debug_init( memory );
     309  #endif
     310      }
     311  
     312      return memory;
     313    }
     314  
     315  
     316    /* documentation is in ftobjs.h */
     317  
     318    FT_BASE_DEF( void )
     319    FT_Done_Memory( FT_Memory  memory )
     320    {
     321  #ifdef FT_DEBUG_MEMORY
     322      ft_mem_debug_done( memory );
     323  #endif
     324      memory->free( memory, memory );
     325    }
     326  
     327  
     328  /* END */