⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.inc

📁 著名的游戏开发库Allegro4.2.0 for DELPHI
💻 INC
字号:
{*         ______   ___    ___
 *        /\  _  \ /\_ \  /\_ \
 *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
 *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
 *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
 *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
 *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
 *                                           /\____/
 *                                           \_/__/
 *
 *      File I/O.
 *
 *      By Shawn Hargreaves.
 *
 *      See readme.txt for copyright information.
 *}
{$IFDEF ALLEGRO_INTERFACE}
type
  for_each_ptr = function(const filename: PChar; attrib: sint32; param: Pointer): sint32; cdecl;

var
  fix_filename_case: function(path: PChar): PChar; cdecl;
  fix_filename_slashes: function(path: PChar): PChar; cdecl;
  canonicalize_filename: function(dest: PChar; const filename: PChar; size: sint32): PChar; cdecl;
  make_absolute_filename: function(dest: PChar; const path, filename: PChar; size: sint32): PChar; cdecl;
  make_relative_filename: function(dest: PChar; const path, filename: PChar; size: sint32): PChar; cdecl;
  is_relative_filename: function(const filename: PChar): sint32; cdecl;
  replace_filename: function(dest: PChar; const path, filename: PChar; size: sint32): PChar; cdecl;
  replace_extension: function(dest: PChar; const filename, ext: PChar; size: sint32): PChar; cdecl;
  append_filename: function(dest: PChar; const path, filename: PChar; size: sint32): PChar; cdecl;
  get_filename: function(const path: PChar): PChar; cdecl;
  get_extension: function(const filename: PChar): PChar; cdecl;
  put_backslash: procedure(filename: PChar); cdecl;
  file_exists: function(const filename: PChar; attrib: sint32; aret: p_sint32): sint32; cdecl;
  exists: function(const filename: PChar): sint32; cdecl;
  file_size: function(const filename: PChar): sint32; cdecl;
  file_time: function(const filename: PChar): sint32; cdecl;
  delete_file: function(const filename: PChar): sint32; cdecl;
  for_each_file_ex: function(const name: PChar; in_attrib, out_attrib: sint32;
    callback: for_each_ptr; param: Pointer): sint32; cdecl;
  set_allegro_resource_path: function(priority: sint32; const path: PChar): sint32; cdecl;
  find_allegro_resource: function(dest: PChar; const resource, ext, datafile, objectname,
    envvar, subdir: PChar; size: sint32): sint32; cdecl;

type
  p_al_ffblk = ^al_ffblk;
  al_ffblk = record    // file info block for the al_find*() routines
    attrib  : sint32;  // actual attributes of the file found
    time    : sint32;  // modification time of file
    size    : sint32;  // size of file
    name    : array[0..511] of Char; // name of file
    ff_data : Pointer; // private hook
  end;

var
  al_findfirst: function(const pattern: PChar; info: p_al_ffblk; attrib: sint32): sint32; cdecl;
  al_findnext: function(info: p_al_ffblk): sint32; cdecl;
  al_findclose: procedure(info: p_al_ffblk);

const
  EOF = -1;

  F_READ         = 'r';
  F_WRITE        = 'w';
  F_READ_PACKED  = 'rp';
  F_WRITE_PACKED = 'wp';
  F_WRITE_NOPACK = 'w!';

  F_BUF_SIZE     = 4096;          // 4K buffer for caching data
  F_PACK_MAGIC   = $736C6821;     // magic number for packed files
  F_NOPACK_MAGIC = $736C682E;     // magic number for autodetect
  F_EXE_MAGIC    = $736C682B;     // magic number for appended data

  PACKFILE_FLAG_WRITE     = 1;     // the file is being written
  PACKFILE_FLAG_PACK      = 2;     // data is compressed
  PACKFILE_FLAG_CHUNK     = 4;     // file is a sub-chunk
  PACKFILE_FLAG_EOF       = 8;     // reached the end-of-file
  PACKFILE_FLAG_ERROR     = 16;    // an error has occurred
  PACKFILE_FLAG_OLD_CRYPT = 32;    // backward compatibility mode
  PACKFILE_FLAG_EXEDAT    = 64;    // reading from our executable

  N           = 4096;           // 4k buffers for LZ compression
  F           = 18;             // upper limit for LZ match length
  THRESHOLD   = 2;              // LZ encode string into pos and lengtn
                                // if match size is greater than this

type
  P_LZSS_PACK_DATA = ^LZSS_PACK_DATA; // stuff for doing LZ compression
  LZSS_PACK_DATA = record
    state             : sint32;       // where have we got to in the pack?
    i, c, len, r, s   : sint32;
    last_match_length : sint32;
    code_buf_ptr      : sint32;
    mask              : uint8;
    code_buf          : array[0..16] of sint8;
    match_position    : sint32;
    match_length      : sint32;
    lson              : array[0..N] of sint32; // left children,
    rson              : array[0..N+256] of sint32; // right children,
    dad               : array[0..N] of sint32; // and parents, = binary search trees
    text_buf          : array[0..N+F-2] of uint8; // ring buffer, with F-1 extra bytes
                                                  // for string comparison
  end;

  P_LZSS_UNPACK_DATA = ^LZSS_UNPACK_DATA; // for reading LZ files
  LZSS_UNPACK_DATA = record
    state            : sint32;      // where have we got to?
    i, j, k, r, c    : sint32;
    flags            : sint32;
    text_buf         : array[0..N+F-2] of uint8; // ring buffer, with F-1 extra bytes                                                 // for string comparison
  end;

  P_PACKFILE = ^PACKFILE;

  p_al_normal_packfile_details = ^_al_normal_packfile_details;
  _al_normal_packfile_details = record
    hndl        : sint32;              // DOS file handle
    flags       : sint32;              // PACKFILE_FLAG_* constants
    buf_pos     : p_uint8s;            // position in buffer
    buf_size    : sint32;              // number of bytes in the buffer
    todo        : sint32;              // number of bytes still on the disk
    parent      : P_PACKFILE;          // nested, parent file
    pack_data   : P_LZSS_PACK_DATA;    // for LZSS compression
    unpack_data : P_LZSS_UNPACK_DATA;  // for LZSS decompression
    filename    : PChar;               // name of the file
    passdata    : PChar;               // encryption key data
    passpos     : PChar;               // current key position
    buf         : array[0..F_BUF_SIZE - 1] of Char; // the actual data buffer
  end;

  P_PACKFILE_VTABLE = ^PACKFILE_VTABLE;
  PACKFILE = record                    // our very own FILE structure...
    vtable             : P_PACKFILE_VTABLE;
    userdata           : Pointer;
    is_normal_packfile : sint32;
   { The following is only to be used for the 'normal' PACKFILE vtable,
    * i.e. what is implemented by Allegro itself. If is_normal_packfile is
    * false then the following is not even allocated. This must be the last
    * member in the structure. }
    normal             : _al_normal_packfile_details;
  end;

  PACKFILE_VTABLE = record
    pf_fclose : function(userdata: Pointer): sint32; cdecl;
    pf_getc   : function(userdata: Pointer): sint32; cdecl;
    pf_ungetc : function(userdata: Pointer): sint32; cdecl;
    pf_fread  : function(p: Pointer; n: sint32; userdata: Pointer): sint32; cdecl;
    pf_fputc  : function(c: sint32; userdata: Pointer): sint32; cdecl;
    pf_fwrite : function(const p: Pointer; n: sint32; userdata: Pointer): sint32; cdecl;
    pf_fseek  : function(userdata: Pointer; offset: sint32): sint32; cdecl;
    pf_feof   : function(userdata: Pointer): sint32; cdecl;
    pf_ferror : function(userdata: Pointer): sint32; cdecl;
  end;

var
  packfile_password: procedure(const password: PChar); cdecl;
  pack_fopen: function(const filename, mode: PChar): P_PACKFILE; cdecl;
  pack_fopen_vtable: function(const vtable: P_PACKFILE_VTABLE; userdata: Pointer): P_PACKFILE; cdecl;
  pack_fclose: function(f: P_PACKFILE): sint32; cdecl;
  pack_fseek: function(f: P_PACKFILE; offset: sint32): sint32; cdecl;
  pack_fopen_chunk: function(f: P_PACKFILE; pack: sint32): P_PACKFILE; cdecl;
  pack_fclose_chunk: function(f: P_PACKFILE): P_PACKFILE; cdecl;
  pack_getc: function(f: P_PACKFILE): sint32; cdecl;
  pack_putc: function(c: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_feof: function(f: P_PACKFILE): sint32; cdecl;
  pack_ferror: function(f: P_PACKFILE): sint32; cdecl;
  pack_igetw: function(f: P_PACKFILE): sint32; cdecl;
  pack_igetl: function(f: P_PACKFILE): sint32; cdecl;
  pack_iputw: function(w: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_iputl: function(l: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_mgetw: function(f: P_PACKFILE): sint32; cdecl;
  pack_mgetl: function(f: P_PACKFILE): sint32; cdecl;
  pack_mputw: function(w: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_mputl: function(l: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_fread: function(p: Pointer; n: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_fwrite: function(const p: Pointer; n: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_ungetc: function(c: sint32; f: P_PACKFILE): sint32; cdecl;
  pack_fgets: function(p: PChar; max: sint32; f: P_PACKFILE): PChar; cdecl;
  pack_fputs: function(const p: PChar; f: P_PACKFILE): sint32; cdecl;
  pack_get_userdata: function(f: P_PACKFILE): Pointer; cdecl;
{$ENDIF ALLEGRO_INTERFACE}
{$IFDEF ALLEGRO_IMPLEMENTATION}
{$ENDIF ALLEGRO_IMPLEMENTATION}
{$IFDEF ALLEGRO_LOADVARIABLE}
  fix_filename_case         := LoadDLL('fix_filename_case');
  fix_filename_slashes      := LoadDLL('fix_filename_slashes');
  canonicalize_filename     := LoadDLL('canonicalize_filename');
  make_absolute_filename    := LoadDLL('make_absolute_filename');
  make_relative_filename    := LoadDLL('make_relative_filename');
  is_relative_filename      := LoadDLL('is_relative_filename');
  replace_filename          := LoadDLL('replace_filename');
  replace_extension         := LoadDLL('replace_extension');
  append_filename           := LoadDLL('append_filename');
  get_filename              := LoadDLL('get_filename');
  get_extension             := LoadDLL('get_extension');
  put_backslash             := LoadDLL('put_backslash');
  file_exists               := LoadDLL('file_exists');
  exists                    := LoadDLL('exists');
  file_size                 := LoadDLL('file_size');
  file_time                 := LoadDLL('file_time');
  delete_file               := LoadDLL('delete_file');
  for_each_file_ex          := LoadDLL('for_each_file_ex');
  set_allegro_resource_path := LoadDLL('set_allegro_resource_path');
  find_allegro_resource     := LoadDLL('find_allegro_resource');
  al_findfirst              := LoadDLL('al_findfirst');
  al_findnext               := LoadDLL('al_findnext');
  al_findclose              := LoadDLL('al_findclose');
  packfile_password         := LoadDLL('packfile_password');
  pack_fopen                := LoadDLL('pack_fopen');
  pack_fopen_vtable         := LoadDLL('pack_fopen_vtable');
  pack_fclose               := LoadDLL('pack_fclose');
  pack_fseek                := LoadDLL('pack_fseek');
  pack_fopen_chunk          := LoadDLL('pack_fopen_chunk');
  pack_fclose_chunk         := LoadDLL('pack_fclose_chunk');
  pack_getc                 := LoadDLL('pack_getc');
  pack_putc                 := LoadDLL('pack_putc');
  pack_feof                 := LoadDLL('pack_feof');
  pack_ferror               := LoadDLL('pack_ferror');
  pack_igetw                := LoadDLL('pack_igetw');
  pack_igetl                := LoadDLL('pack_igetl');
  pack_iputw                := LoadDLL('pack_iputw');
  pack_iputl                := LoadDLL('pack_iputl');
  pack_mgetw                := LoadDLL('pack_mgetw');
  pack_mgetl                := LoadDLL('pack_mgetl');
  pack_mputw                := LoadDLL('pack_mputw');
  pack_mputl                := LoadDLL('pack_mputl');
  pack_fread                := LoadDLL('pack_fread');
  pack_fwrite               := LoadDLL('pack_fwrite');
  pack_ungetc               := LoadDLL('pack_ungetc');
  pack_fgets                := LoadDLL('pack_fgets');
  pack_fputs                := LoadDLL('pack_fputs');
  pack_get_userdata         := LoadDLL('pack_get_userdata');
{$ENDIF ALLEGRO_LOADVARIABLE}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -