📄 file.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 + -