Delete all Trailing spaces in code.
[reactos.git] / reactos / dll / 3rdparty / freetype / src / base / ftrfork.c
index a4f726d..2a9f8e7 100644 (file)
-/***************************************************************************/
-/*                                                                         */
-/*  ftrfork.c                                                              */
-/*                                                                         */
-/*    Embedded resource forks accessor (body).                             */
-/*                                                                         */
-/*  Copyright 2004, 2005, 2006 by                                          */
-/*  Masatake YAMATO and Redhat K.K.                                        */
-/*                                                                         */
-/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
-/*  derived from ftobjs.c.                                                 */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/* Development of the code in this file is support of                      */
-/* Information-technology Promotion Agency, Japan.                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_RFORK_H
-
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_raccess
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****               Resource fork directory access                    ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_BASE_DEF( FT_Error )
-  FT_Raccess_Get_HeaderInfo( FT_Library  library,
-                             FT_Stream   stream,
-                             FT_Long     rfork_offset,
-                             FT_Long    *map_offset,
-                             FT_Long    *rdata_pos )
-  {
-    FT_Error       error;
-    unsigned char  head[16], head2[16];
-    FT_Long        map_pos, rdata_len;
-    int            allzeros, allmatch, i;
-    FT_Long        type_list;
-
-    FT_UNUSED( library );
-
-
-    error = FT_Stream_Seek( stream, rfork_offset );
-    if ( error )
-      return error;
-
-    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
-    if ( error )
-      return error;
-
-    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
-                                  ( head[1] << 16 ) |
-                                  ( head[2] <<  8 ) |
-                                    head[3]         );
-    map_pos    = rfork_offset + ( ( head[4] << 24 ) |
-                                  ( head[5] << 16 ) |
-                                  ( head[6] <<  8 ) |
-                                    head[7]         );
-    rdata_len = ( head[ 8] << 24 ) |
-                ( head[ 9] << 16 ) |
-                ( head[10] <<  8 ) |
-                  head[11];
-
-    /* map_len = head[12] .. head[15] */
-
-    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
-      return FT_Err_Unknown_File_Format;
-
-    error = FT_Stream_Seek( stream, map_pos );
-    if ( error )
-      return error;
-
-    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */
-
-    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
-    if ( error )
-      return error;
-
-    allzeros = 1;
-    allmatch = 1;
-    for ( i = 0; i < 16; ++i )
-    {
-      if ( head2[i] != 0 )
-        allzeros = 0;
-      if ( head2[i] != head[i] )
-        allmatch = 0;
-    }
-    if ( !allzeros && !allmatch )
-      return FT_Err_Unknown_File_Format;
-
-    /* If we have reached this point then it is probably a mac resource */
-    /* file.  Now, does it contain any interesting resources?           */
-    /* Skip handle to next resource map, the file resource number, and  */
-    /* attributes.                                                      */
-    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
-                          + 2      /* skip file resource number */
-                          + 2 );   /* skip attributes */
-
-    if ( FT_READ_USHORT( type_list ) )
-      return error;
-    if ( type_list == -1 )
-      return FT_Err_Unknown_File_Format;
-
-    error = FT_Stream_Seek( stream, map_pos + type_list );
-    if ( error )
-      return error;
-
-    *map_offset = map_pos + type_list;
-    return FT_Err_Ok;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Raccess_Get_DataOffsets( FT_Library  library,
-                              FT_Stream   stream,
-                              FT_Long     map_offset,
-                              FT_Long     rdata_pos,
-                              FT_Long     tag,
-                              FT_Long   **offsets,
-                              FT_Long    *count )
-  {
-    FT_Error   error;
-    int        i, j, cnt, subcnt;
-    FT_Long    tag_internal, rpos;
-    FT_Memory  memory = library->memory;
-    FT_Long    temp;
-    FT_Long    *offsets_internal;
-
-
-    error = FT_Stream_Seek( stream, map_offset );
-    if ( error )
-      return error;
-
-    if ( FT_READ_USHORT( cnt ) )
-      return error;
-    cnt++;
-
-    for ( i = 0; i < cnt; ++i )
-    {
-      if ( FT_READ_LONG( tag_internal ) ||
-           FT_READ_USHORT( subcnt )     ||
-           FT_READ_USHORT( rpos )       )
-        return error;
-
-      FT_TRACE2(( "Resource tags: %c%c%c%c\n",
-                  (char)( 0xff & ( tag_internal >> 24 ) ),
-                  (char)( 0xff & ( tag_internal >> 16 ) ),
-                  (char)( 0xff & ( tag_internal >>  8 ) ),
-                  (char)( 0xff & ( tag_internal >>  0 ) ) ));
-
-      if ( tag_internal == tag )
-      {
-        *count = subcnt + 1;
-        rpos  += map_offset;
-
-        error = FT_Stream_Seek( stream, rpos );
-        if ( error )
-          return error;
-
-        if ( FT_NEW_ARRAY( offsets_internal, *count ) )
-          return error;
-
-        for ( j = 0; j < *count; ++j )
-        {
-          (void)FT_STREAM_SKIP( 2 ); /* resource id */
-          (void)FT_STREAM_SKIP( 2 ); /* rsource name */
-
-          if ( FT_READ_LONG( temp ) )
-          {
-            FT_FREE( offsets_internal );
-            return error;
-          }
-
-          offsets_internal[j] = rdata_pos + ( temp & 0xFFFFFFL );
-
-          (void)FT_STREAM_SKIP( 4 ); /* mbz */
-        }
-
-        *offsets = offsets_internal;
-
-        return FT_Err_Ok;
-      }
-    }
-
-    return FT_Err_Cannot_Open_Resource;
-  }
-
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                     Guessing functions                          ****/
-  /****                                                                 ****/
-  /****            When you add a new guessing function,                ****/
-  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef FT_Error
-  (*raccess_guess_func)( FT_Library  library,
-                         FT_Stream   stream,
-                         char *      base_file_name,
-                         char      **result_file_name,
-                         FT_Long    *result_offset );
-
-
-  static FT_Error
-  raccess_guess_apple_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_apple_single( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_darwin_ufs_export( FT_Library  library,
-                                   FT_Stream   stream,
-                                   char *      base_file_name,
-                                   char      **result_file_name,
-                                   FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_darwin_hfsplus( FT_Library  library,
-                                FT_Stream   stream,
-                                char *      base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_vfat( FT_Library  library,
-                      FT_Stream   stream,
-                      char *      base_file_name,
-                      char      **result_file_name,
-                      FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_cap( FT_Library  library,
-                           FT_Stream   stream,
-                           char *      base_file_name,
-                           char      **result_file_name,
-                           FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_netatalk( FT_Library  library,
-                                FT_Stream   stream,
-                                char *      base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset );
-
-
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                       Helper functions                          ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-
-  static FT_Error
-  raccess_guess_apple_generic( FT_Library  library,
-                               FT_Stream   stream,
-                               char *      base_file_name,
-                               FT_Int32    magic,
-                               FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_double_from_file_name( FT_Library  library,
-                                             char *      file_name,
-                                             FT_Long    *result_offset );
-
-  static char *
-  raccess_make_file_name( FT_Memory    memory,
-                          const char  *original_name,
-                          const char  *insertion );
-
-
-  FT_BASE_DEF( void )
-  FT_Raccess_Guess( FT_Library  library,
-                    FT_Stream   stream,
-                    char*       base_name,
-                    char      **new_names,
-                    FT_Long    *offsets,
-                    FT_Error   *errors )
-  {
-    FT_Long  i;
-
-
-    raccess_guess_func  funcs[FT_RACCESS_N_RULES] =
-    {
-      raccess_guess_apple_double,
-      raccess_guess_apple_single,
-      raccess_guess_darwin_ufs_export,
-      raccess_guess_darwin_hfsplus,
-      raccess_guess_vfat,
-      raccess_guess_linux_cap,
-      raccess_guess_linux_double,
-      raccess_guess_linux_netatalk,
-    };
-
-    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
-    {
-      new_names[i] = NULL;
-      errors[i] = FT_Stream_Seek( stream, 0 );
-      if ( errors[i] )
-        continue ;
-
-      errors[i] = (funcs[i])( library, stream, base_name,
-                              &(new_names[i]), &(offsets[i]) );
-    }
-
-    return;
-  }
-
-
-  static FT_Error
-  raccess_guess_apple_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    FT_Int32  magic = ( 0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x07 );
-
-
-    *result_file_name = NULL;
-    return raccess_guess_apple_generic( library, stream, base_file_name,
-                                        magic, result_offset );
-  }
-
-
-  static FT_Error
-  raccess_guess_apple_single( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    FT_Int32  magic = (0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x00);
-
-
-    *result_file_name = NULL;
-    return raccess_guess_apple_generic( library, stream, base_file_name,
-                                        magic, result_offset );
-  }
-
-
-  static FT_Error
-  raccess_guess_darwin_ufs_export( FT_Library  library,
-                                   FT_Stream   stream,
-                                   char *      base_file_name,
-                                   char      **result_file_name,
-                                   FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory  = library->memory;
-    newpath = raccess_make_file_name( memory, base_file_name, "._" );
-    if ( !newpath )
-      return FT_Err_Out_Of_Memory;
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_darwin_hfsplus( FT_Library  library,
-                                FT_Stream   stream,
-                                char *      base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset )
-  {
-    /*
-      Only meaningful on systems with hfs+ drivers (or Macs).
-     */
-    FT_Error   error;
-    char*      newpath;
-    FT_Memory  memory;
-    FT_Long    base_file_len = ft_strlen( base_file_name );
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    if ( base_file_len > FT_INT_MAX )
-      return FT_Err_Array_Too_Large;
-
-    if ( FT_ALLOC( newpath, base_file_len + 6 ) )
-      return error;
-
-    FT_MEM_COPY( newpath, base_file_name, base_file_len );
-    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_vfat( FT_Library  library,
-                      FT_Stream   stream,
-                      char *      base_file_name,
-                      char      **result_file_name,
-                      FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name,
-                                      "resource.frk/" );
-    if ( !newpath )
-      return FT_Err_Out_Of_Memory;
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_cap( FT_Library  library,
-                           FT_Stream   stream,
-                           char *      base_file_name,
-                           char      **result_file_name,
-                           FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
-    if ( !newpath )
-      return FT_Err_Out_Of_Memory;
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char *      base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name, "%" );
-    if ( !newpath )
-      return FT_Err_Out_Of_Memory;
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_netatalk( FT_Library  library,
-                                FT_Stream   stream,
-                                char *      base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name,
-                                      ".AppleDouble/" );
-    if ( !newpath )
-      return FT_Err_Out_Of_Memory;
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_apple_generic( FT_Library  library,
-                               FT_Stream   stream,
-                               char *      base_file_name,
-                               FT_Int32    magic,
-                               FT_Long    *result_offset )
-  {
-    FT_Int32   magic_from_stream;
-    FT_Error   error;
-    FT_Int32   version_number = 0;
-    FT_UShort  n_of_entries;
-
-    int        i;
-    FT_UInt32  entry_id, entry_offset, entry_length = 0;
-
-    const FT_UInt32  resource_fork_entry_id = 0x2;
-
-    FT_UNUSED( library );
-    FT_UNUSED( base_file_name );
-    FT_UNUSED( version_number );
-    FT_UNUSED( entry_length   );
-
-
-    if ( FT_READ_LONG( magic_from_stream ) )
-      return error;
-    if ( magic_from_stream != magic )
-      return FT_Err_Unknown_File_Format;
-
-    if ( FT_READ_LONG( version_number ) )
-      return error;
-
-    /* filler */
-    error = FT_Stream_Skip( stream, 16 );
-    if ( error )
-      return error;
-
-    if ( FT_READ_USHORT( n_of_entries ) )
-      return error;
-    if ( n_of_entries == 0 )
-      return FT_Err_Unknown_File_Format;
-
-    for ( i = 0; i < n_of_entries; i++ )
-    {
-      if ( FT_READ_LONG( entry_id ) )
-        return error;
-      if ( entry_id == resource_fork_entry_id )
-      {
-        if ( FT_READ_LONG( entry_offset ) ||
-             FT_READ_LONG( entry_length ) )
-          continue;
-        *result_offset = entry_offset;
-
-        return FT_Err_Ok;
-      }
-      else
-        FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */
-      }
-
-    return FT_Err_Unknown_File_Format;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_double_from_file_name( FT_Library  library,
-                                             char *      file_name,
-                                             FT_Long    *result_offset )
-  {
-    FT_Open_Args  args2;
-    FT_Stream     stream2;
-    char *        nouse = NULL;
-    FT_Error      error;
-
-
-    args2.flags    = FT_OPEN_PATHNAME;
-    args2.pathname = file_name;
-    error = FT_Stream_New( library, &args2, &stream2 );
-    if ( error )
-      return error;
-
-    error = raccess_guess_apple_double( library, stream2, file_name,
-                                        &nouse, result_offset );
-
-    FT_Stream_Free( stream2, 0 );
-
-    return error;
-  }
-
-
-  static char*
-  raccess_make_file_name( FT_Memory    memory,
-                          const char  *original_name,
-                          const char  *insertion )
-  {
-    char*        new_name;
-    char*        tmp;
-    const char*  slash;
-    unsigned     new_length;
-    FT_Error     error = FT_Err_Ok;
-
-    FT_UNUSED( error );
-
-
-    new_length = ft_strlen( original_name ) + ft_strlen( insertion );
-    if ( FT_ALLOC( new_name, new_length + 1 ) )
-      return NULL;
-
-    tmp = ft_strrchr( original_name, '/' );
-    if ( tmp )
-    {
-      ft_strncpy( new_name, original_name, tmp - original_name + 1 );
-      new_name[tmp - original_name + 1] = '\0';
-      slash = tmp + 1;
-    }
-    else
-    {
-      slash       = original_name;
-      new_name[0] = '\0';
-    }
-
-    ft_strcat( new_name, insertion );
-    ft_strcat( new_name, slash );
-
-    return new_name;
-  }
-
-
-#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
-
-
-  /*************************************************************************/
-  /*                  Dummy function; just sets errors                     */
-  /*************************************************************************/
-
-  FT_BASE_DEF( void )
-  FT_Raccess_Guess( FT_Library  library,
-                    FT_Stream   stream,
-                    char*       base_name,
-                    char      **new_names,
-                    FT_Long    *offsets,
-                    FT_Error   *errors )
-  {
-    int  i;
-
-    FT_UNUSED( library );
-    FT_UNUSED( stream );
-    FT_UNUSED( base_name );
-
-
-    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
-    {
-      new_names[i] = NULL;
-      offsets[i]   = 0;
-      errors[i]    = FT_Err_Unimplemented_Feature;
-    }
-  }
-
-
-#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
-
-
-/* END */
+/***************************************************************************/\r
+/*                                                                         */\r
+/*  ftrfork.c                                                              */\r
+/*                                                                         */\r
+/*    Embedded resource forks accessor (body).                             */\r
+/*                                                                         */\r
+/*  Copyright 2004, 2005, 2006 by                                          */\r
+/*  Masatake YAMATO and Redhat K.K.                                        */\r
+/*                                                                         */\r
+/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */\r
+/*  derived from ftobjs.c.                                                 */\r
+/*                                                                         */\r
+/*  This file is part of the FreeType project, and may only be used,       */\r
+/*  modified, and distributed under the terms of the FreeType project      */\r
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\r
+/*  this file you indicate that you have read the license and              */\r
+/*  understand and accept it fully.                                        */\r
+/*                                                                         */\r
+/***************************************************************************/\r
+\r
+/***************************************************************************/\r
+/* Development of the code in this file is support of                      */\r
+/* Information-technology Promotion Agency, Japan.                         */\r
+/***************************************************************************/\r
+\r
+\r
+#include <ft2build.h>\r
+#include FT_INTERNAL_DEBUG_H\r
+#include FT_INTERNAL_STREAM_H\r
+#include FT_INTERNAL_RFORK_H\r
+\r
+\r
+#undef  FT_COMPONENT\r
+#define FT_COMPONENT  trace_raccess\r
+\r
+\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /****                                                                 ****/\r
+  /****                                                                 ****/\r
+  /****               Resource fork directory access                    ****/\r
+  /****                                                                 ****/\r
+  /****                                                                 ****/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+\r
+  FT_BASE_DEF( FT_Error )\r
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,\r
+                             FT_Stream   stream,\r
+                             FT_Long     rfork_offset,\r
+                             FT_Long    *map_offset,\r
+                             FT_Long    *rdata_pos )\r
+  {\r
+    FT_Error       error;\r
+    unsigned char  head[16], head2[16];\r
+    FT_Long        map_pos, rdata_len;\r
+    int            allzeros, allmatch, i;\r
+    FT_Long        type_list;\r
+\r
+    FT_UNUSED( library );\r
+\r
+\r
+    error = FT_Stream_Seek( stream, rfork_offset );\r
+    if ( error )\r
+      return error;\r
+\r
+    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );\r
+    if ( error )\r
+      return error;\r
+\r
+    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |\r
+                                  ( head[1] << 16 ) |\r
+                                  ( head[2] <<  8 ) |\r
+                                    head[3]         );\r
+    map_pos    = rfork_offset + ( ( head[4] << 24 ) |\r
+                                  ( head[5] << 16 ) |\r
+                                  ( head[6] <<  8 ) |\r
+                                    head[7]         );\r
+    rdata_len = ( head[ 8] << 24 ) |\r
+                ( head[ 9] << 16 ) |\r
+                ( head[10] <<  8 ) |\r
+                  head[11];\r
+\r
+    /* map_len = head[12] .. head[15] */\r
+\r
+    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )\r
+      return FT_Err_Unknown_File_Format;\r
+\r
+    error = FT_Stream_Seek( stream, map_pos );\r
+    if ( error )\r
+      return error;\r
+\r
+    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */\r
+\r
+    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );\r
+    if ( error )\r
+      return error;\r
+\r
+    allzeros = 1;\r
+    allmatch = 1;\r
+    for ( i = 0; i < 16; ++i )\r
+    {\r
+      if ( head2[i] != 0 )\r
+        allzeros = 0;\r
+      if ( head2[i] != head[i] )\r
+        allmatch = 0;\r
+    }\r
+    if ( !allzeros && !allmatch )\r
+      return FT_Err_Unknown_File_Format;\r
+\r
+    /* If we have reached this point then it is probably a mac resource */\r
+    /* file.  Now, does it contain any interesting resources?           */\r
+    /* Skip handle to next resource map, the file resource number, and  */\r
+    /* attributes.                                                      */\r
+    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */\r
+                          + 2      /* skip file resource number */\r
+                          + 2 );   /* skip attributes */\r
+\r
+    if ( FT_READ_USHORT( type_list ) )\r
+      return error;\r
+    if ( type_list == -1 )\r
+      return FT_Err_Unknown_File_Format;\r
+\r
+    error = FT_Stream_Seek( stream, map_pos + type_list );\r
+    if ( error )\r
+      return error;\r
+\r
+    *map_offset = map_pos + type_list;\r
+    return FT_Err_Ok;\r
+  }\r
+\r
+\r
+  FT_BASE_DEF( FT_Error )\r
+  FT_Raccess_Get_DataOffsets( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              FT_Long     map_offset,\r
+                              FT_Long     rdata_pos,\r
+                              FT_Long     tag,\r
+                              FT_Long   **offsets,\r
+                              FT_Long    *count )\r
+  {\r
+    FT_Error   error;\r
+    int        i, j, cnt, subcnt;\r
+    FT_Long    tag_internal, rpos;\r
+    FT_Memory  memory = library->memory;\r
+    FT_Long    temp;\r
+    FT_Long    *offsets_internal;\r
+\r
+\r
+    error = FT_Stream_Seek( stream, map_offset );\r
+    if ( error )\r
+      return error;\r
+\r
+    if ( FT_READ_USHORT( cnt ) )\r
+      return error;\r
+    cnt++;\r
+\r
+    for ( i = 0; i < cnt; ++i )\r
+    {\r
+      if ( FT_READ_LONG( tag_internal ) ||\r
+           FT_READ_USHORT( subcnt )     ||\r
+           FT_READ_USHORT( rpos )       )\r
+        return error;\r
+\r
+      FT_TRACE2(( "Resource tags: %c%c%c%c\n",\r
+                  (char)( 0xff & ( tag_internal >> 24 ) ),\r
+                  (char)( 0xff & ( tag_internal >> 16 ) ),\r
+                  (char)( 0xff & ( tag_internal >>  8 ) ),\r
+                  (char)( 0xff & ( tag_internal >>  0 ) ) ));\r
+\r
+      if ( tag_internal == tag )\r
+      {\r
+        *count = subcnt + 1;\r
+        rpos  += map_offset;\r
+\r
+        error = FT_Stream_Seek( stream, rpos );\r
+        if ( error )\r
+          return error;\r
+\r
+        if ( FT_NEW_ARRAY( offsets_internal, *count ) )\r
+          return error;\r
+\r
+        for ( j = 0; j < *count; ++j )\r
+        {\r
+          (void)FT_STREAM_SKIP( 2 ); /* resource id */\r
+          (void)FT_STREAM_SKIP( 2 ); /* rsource name */\r
+\r
+          if ( FT_READ_LONG( temp ) )\r
+          {\r
+            FT_FREE( offsets_internal );\r
+            return error;\r
+          }\r
+\r
+          offsets_internal[j] = rdata_pos + ( temp & 0xFFFFFFL );\r
+\r
+          (void)FT_STREAM_SKIP( 4 ); /* mbz */\r
+        }\r
+\r
+        *offsets = offsets_internal;\r
+\r
+        return FT_Err_Ok;\r
+      }\r
+    }\r
+\r
+    return FT_Err_Cannot_Open_Resource;\r
+  }\r
+\r
+\r
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\r
+\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /****                                                                 ****/\r
+  /****                                                                 ****/\r
+  /****                     Guessing functions                          ****/\r
+  /****                                                                 ****/\r
+  /****            When you add a new guessing function,                ****/\r
+  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/\r
+  /****                                                                 ****/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+  /*************************************************************************/\r
+\r
+  typedef FT_Error\r
+  (*raccess_guess_func)( FT_Library  library,\r
+                         FT_Stream   stream,\r
+                         char *      base_file_name,\r
+                         char      **result_file_name,\r
+                         FT_Long    *result_offset );\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_double( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_single( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_darwin_ufs_export( FT_Library  library,\r
+                                   FT_Stream   stream,\r
+                                   char *      base_file_name,\r
+                                   char      **result_file_name,\r
+                                   FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_darwin_hfsplus( FT_Library  library,\r
+                                FT_Stream   stream,\r
+                                char *      base_file_name,\r
+                                char      **result_file_name,\r
+                                FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_vfat( FT_Library  library,\r
+                      FT_Stream   stream,\r
+                      char *      base_file_name,\r
+                      char      **result_file_name,\r
+                      FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_cap( FT_Library  library,\r
+                           FT_Stream   stream,\r
+                           char *      base_file_name,\r
+                           char      **result_file_name,\r
+                           FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_double( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_netatalk( FT_Library  library,\r
+                                FT_Stream   stream,\r
+                                char *      base_file_name,\r
+                                char      **result_file_name,\r
+                                FT_Long    *result_offset );\r
+\r
+\r
+  /*************************************************************************/\r
+  /****                                                                 ****/\r
+  /****                       Helper functions                          ****/\r
+  /****                                                                 ****/\r
+  /*************************************************************************/\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_generic( FT_Library  library,\r
+                               FT_Stream   stream,\r
+                               char *      base_file_name,\r
+                               FT_Int32    magic,\r
+                               FT_Long    *result_offset );\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_double_from_file_name( FT_Library  library,\r
+                                             char *      file_name,\r
+                                             FT_Long    *result_offset );\r
+\r
+  static char *\r
+  raccess_make_file_name( FT_Memory    memory,\r
+                          const char  *original_name,\r
+                          const char  *insertion );\r
+\r
+\r
+  FT_BASE_DEF( void )\r
+  FT_Raccess_Guess( FT_Library  library,\r
+                    FT_Stream   stream,\r
+                    char*       base_name,\r
+                    char      **new_names,\r
+                    FT_Long    *offsets,\r
+                    FT_Error   *errors )\r
+  {\r
+    FT_Long  i;\r
+\r
+\r
+    raccess_guess_func  funcs[FT_RACCESS_N_RULES] =\r
+    {\r
+      raccess_guess_apple_double,\r
+      raccess_guess_apple_single,\r
+      raccess_guess_darwin_ufs_export,\r
+      raccess_guess_darwin_hfsplus,\r
+      raccess_guess_vfat,\r
+      raccess_guess_linux_cap,\r
+      raccess_guess_linux_double,\r
+      raccess_guess_linux_netatalk,\r
+    };\r
+\r
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\r
+    {\r
+      new_names[i] = NULL;\r
+      errors[i] = FT_Stream_Seek( stream, 0 );\r
+      if ( errors[i] )\r
+        continue ;\r
+\r
+      errors[i] = (funcs[i])( library, stream, base_name,\r
+                              &(new_names[i]), &(offsets[i]) );\r
+    }\r
+\r
+    return;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_double( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset )\r
+  {\r
+    FT_Int32  magic = ( 0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x07 );\r
+\r
+\r
+    *result_file_name = NULL;\r
+    return raccess_guess_apple_generic( library, stream, base_file_name,\r
+                                        magic, result_offset );\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_single( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset )\r
+  {\r
+    FT_Int32  magic = (0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x00);\r
+\r
+\r
+    *result_file_name = NULL;\r
+    return raccess_guess_apple_generic( library, stream, base_file_name,\r
+                                        magic, result_offset );\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_darwin_ufs_export( FT_Library  library,\r
+                                   FT_Stream   stream,\r
+                                   char *      base_file_name,\r
+                                   char      **result_file_name,\r
+                                   FT_Long    *result_offset )\r
+  {\r
+    char*      newpath;\r
+    FT_Error   error;\r
+    FT_Memory  memory;\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory  = library->memory;\r
+    newpath = raccess_make_file_name( memory, base_file_name, "._" );\r
+    if ( !newpath )\r
+      return FT_Err_Out_Of_Memory;\r
+\r
+    error = raccess_guess_linux_double_from_file_name( library, newpath,\r
+                                                       result_offset );\r
+    if ( !error )\r
+      *result_file_name = newpath;\r
+    else\r
+      FT_FREE( newpath );\r
+\r
+    return error;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_darwin_hfsplus( FT_Library  library,\r
+                                FT_Stream   stream,\r
+                                char *      base_file_name,\r
+                                char      **result_file_name,\r
+                                FT_Long    *result_offset )\r
+  {\r
+    /*\r
+      Only meaningful on systems with hfs+ drivers (or Macs).\r
+     */\r
+    FT_Error   error;\r
+    char*      newpath;\r
+    FT_Memory  memory;\r
+    FT_Long    base_file_len = ft_strlen( base_file_name );\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory = library->memory;\r
+\r
+    if ( base_file_len > FT_INT_MAX )\r
+      return FT_Err_Array_Too_Large;\r
+\r
+    if ( FT_ALLOC( newpath, base_file_len + 6 ) )\r
+      return error;\r
+\r
+    FT_MEM_COPY( newpath, base_file_name, base_file_len );\r
+    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );\r
+\r
+    *result_file_name = newpath;\r
+    *result_offset    = 0;\r
+\r
+    return FT_Err_Ok;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_vfat( FT_Library  library,\r
+                      FT_Stream   stream,\r
+                      char *      base_file_name,\r
+                      char      **result_file_name,\r
+                      FT_Long    *result_offset )\r
+  {\r
+    char*      newpath;\r
+    FT_Memory  memory;\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory = library->memory;\r
+\r
+    newpath = raccess_make_file_name( memory, base_file_name,\r
+                                      "resource.frk/" );\r
+    if ( !newpath )\r
+      return FT_Err_Out_Of_Memory;\r
+\r
+    *result_file_name = newpath;\r
+    *result_offset    = 0;\r
+\r
+    return FT_Err_Ok;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_cap( FT_Library  library,\r
+                           FT_Stream   stream,\r
+                           char *      base_file_name,\r
+                           char      **result_file_name,\r
+                           FT_Long    *result_offset )\r
+  {\r
+    char*      newpath;\r
+    FT_Memory  memory;\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory = library->memory;\r
+\r
+    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );\r
+    if ( !newpath )\r
+      return FT_Err_Out_Of_Memory;\r
+\r
+    *result_file_name = newpath;\r
+    *result_offset    = 0;\r
+\r
+    return FT_Err_Ok;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_double( FT_Library  library,\r
+                              FT_Stream   stream,\r
+                              char *      base_file_name,\r
+                              char      **result_file_name,\r
+                              FT_Long    *result_offset )\r
+  {\r
+    char*      newpath;\r
+    FT_Error   error;\r
+    FT_Memory  memory;\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory = library->memory;\r
+\r
+    newpath = raccess_make_file_name( memory, base_file_name, "%" );\r
+    if ( !newpath )\r
+      return FT_Err_Out_Of_Memory;\r
+\r
+    error = raccess_guess_linux_double_from_file_name( library, newpath,\r
+                                                       result_offset );\r
+    if ( !error )\r
+      *result_file_name = newpath;\r
+    else\r
+      FT_FREE( newpath );\r
+\r
+    return error;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_netatalk( FT_Library  library,\r
+                                FT_Stream   stream,\r
+                                char *      base_file_name,\r
+                                char      **result_file_name,\r
+                                FT_Long    *result_offset )\r
+  {\r
+    char*      newpath;\r
+    FT_Error   error;\r
+    FT_Memory  memory;\r
+\r
+    FT_UNUSED( stream );\r
+\r
+\r
+    memory = library->memory;\r
+\r
+    newpath = raccess_make_file_name( memory, base_file_name,\r
+                                      ".AppleDouble/" );\r
+    if ( !newpath )\r
+      return FT_Err_Out_Of_Memory;\r
+\r
+    error = raccess_guess_linux_double_from_file_name( library, newpath,\r
+                                                       result_offset );\r
+    if ( !error )\r
+      *result_file_name = newpath;\r
+    else\r
+      FT_FREE( newpath );\r
+\r
+    return error;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_apple_generic( FT_Library  library,\r
+                               FT_Stream   stream,\r
+                               char *      base_file_name,\r
+                               FT_Int32    magic,\r
+                               FT_Long    *result_offset )\r
+  {\r
+    FT_Int32   magic_from_stream;\r
+    FT_Error   error;\r
+    FT_Int32   version_number = 0;\r
+    FT_UShort  n_of_entries;\r
+\r
+    int        i;\r
+    FT_UInt32  entry_id, entry_offset, entry_length = 0;\r
+\r
+    const FT_UInt32  resource_fork_entry_id = 0x2;\r
+\r
+    FT_UNUSED( library );\r
+    FT_UNUSED( base_file_name );\r
+    FT_UNUSED( version_number );\r
+    FT_UNUSED( entry_length   );\r
+\r
+\r
+    if ( FT_READ_LONG( magic_from_stream ) )\r
+      return error;\r
+    if ( magic_from_stream != magic )\r
+      return FT_Err_Unknown_File_Format;\r
+\r
+    if ( FT_READ_LONG( version_number ) )\r
+      return error;\r
+\r
+    /* filler */\r
+    error = FT_Stream_Skip( stream, 16 );\r
+    if ( error )\r
+      return error;\r
+\r
+    if ( FT_READ_USHORT( n_of_entries ) )\r
+      return error;\r
+    if ( n_of_entries == 0 )\r
+      return FT_Err_Unknown_File_Format;\r
+\r
+    for ( i = 0; i < n_of_entries; i++ )\r
+    {\r
+      if ( FT_READ_LONG( entry_id ) )\r
+        return error;\r
+      if ( entry_id == resource_fork_entry_id )\r
+      {\r
+        if ( FT_READ_LONG( entry_offset ) ||\r
+             FT_READ_LONG( entry_length ) )\r
+          continue;\r
+        *result_offset = entry_offset;\r
+\r
+        return FT_Err_Ok;\r
+      }\r
+      else\r
+        FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */\r
+      }\r
+\r
+    return FT_Err_Unknown_File_Format;\r
+  }\r
+\r
+\r
+  static FT_Error\r
+  raccess_guess_linux_double_from_file_name( FT_Library  library,\r
+                                             char *      file_name,\r
+                                             FT_Long    *result_offset )\r
+  {\r
+    FT_Open_Args  args2;\r
+    FT_Stream     stream2;\r
+    char *        nouse = NULL;\r
+    FT_Error      error;\r
+\r
+\r
+    args2.flags    = FT_OPEN_PATHNAME;\r
+    args2.pathname = file_name;\r
+    error = FT_Stream_New( library, &args2, &stream2 );\r
+    if ( error )\r
+      return error;\r
+\r
+    error = raccess_guess_apple_double( library, stream2, file_name,\r
+                                        &nouse, result_offset );\r
+\r
+    FT_Stream_Free( stream2, 0 );\r
+\r
+    return error;\r
+  }\r
+\r
+\r
+  static char*\r
+  raccess_make_file_name( FT_Memory    memory,\r
+                          const char  *original_name,\r
+                          const char  *insertion )\r
+  {\r
+    char*        new_name;\r
+    char*        tmp;\r
+    const char*  slash;\r
+    unsigned     new_length;\r
+    FT_Error     error = FT_Err_Ok;\r
+\r
+    FT_UNUSED( error );\r
+\r
+\r
+    new_length = ft_strlen( original_name ) + ft_strlen( insertion );\r
+    if ( FT_ALLOC( new_name, new_length + 1 ) )\r
+      return NULL;\r
+\r
+    tmp = ft_strrchr( original_name, '/' );\r
+    if ( tmp )\r
+    {\r
+      ft_strncpy( new_name, original_name, tmp - original_name + 1 );\r
+      new_name[tmp - original_name + 1] = '\0';\r
+      slash = tmp + 1;\r
+    }\r
+    else\r
+    {\r
+      slash       = original_name;\r
+      new_name[0] = '\0';\r
+    }\r
+\r
+    ft_strcat( new_name, insertion );\r
+    ft_strcat( new_name, slash );\r
+\r
+    return new_name;\r
+  }\r
+\r
+\r
+#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\r
+\r
+\r
+  /*************************************************************************/\r
+  /*                  Dummy function; just sets errors                     */\r
+  /*************************************************************************/\r
+\r
+  FT_BASE_DEF( void )\r
+  FT_Raccess_Guess( FT_Library  library,\r
+                    FT_Stream   stream,\r
+                    char*       base_name,\r
+                    char      **new_names,\r
+                    FT_Long    *offsets,\r
+                    FT_Error   *errors )\r
+  {\r
+    int  i;\r
+\r
+    FT_UNUSED( library );\r
+    FT_UNUSED( stream );\r
+    FT_UNUSED( base_name );\r
+\r
+\r
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\r
+    {\r
+      new_names[i] = NULL;\r
+      offsets[i]   = 0;\r
+      errors[i]    = FT_Err_Unimplemented_Feature;\r
+    }\r
+  }\r
+\r
+\r
+#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\r
+\r
+\r
+/* END */\r