📄 ftrfork.c
字号:
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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -