📄 files.c
字号:
| |
| Open the file and save the handle |
| |
+-------------------------------------------------------------------------+*/
rc = fopen(File_info.filename,"rb");
If rc IsNull
Then
linker_error(255,"Trouble opening \"%s\" for input.\n",
File_info.filename);
EndIf
File.file_handle = rc;
return;
EndCode
#undef File
#undef File_info
/*+-------------------------------------------------------------------------+
| |
| file_open_for_write |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
void file_open_for_write(file_info_ptr file_info)
BeginDeclarations
#define File outfile
#define File_info (*file_info)
FILE *rc;
EndDeclarations
BeginCode
/*+-------------------------------------------------------------------------+
| |
| Initialize the data structure |
| |
+-------------------------------------------------------------------------+*/
File.current_byte = File.buffer;
File.bytes_left_in_buffer =
File.IO_limit = File.buffer_size;
File.start_of_buffer_position =
File.next_buffer_position = 0L;
File.bytes_in_buffer =
File.byte_position = 0;
File.file_info = file_info;
/*+-------------------------------------------------------------------------+
| |
| Open the file and save the handle |
| |
+-------------------------------------------------------------------------+*/
rc = fopen(File_info.filename,"wb");
If rc IsNull
Then
linker_error(255,"Trouble opening \"%s\" for output.\n",
File_info.filename);
EndIf
File.file_handle = rc;
return;
EndCode
#undef File
#undef File_info
/*+-------------------------------------------------------------------------+
| |
| file_position |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
void file_position(bit_32 position)
BeginDeclarations
#define File infile
EndDeclarations
BeginCode
If (position NotLessThan File.start_of_buffer_position) AndIf
(position LessThan File.next_buffer_position)
Then
File.byte_position = Bit_16(position-File.start_of_buffer_position);
File.current_byte = Addr(File.buffer[File.byte_position]);
File.bytes_left_in_buffer = File.bytes_in_buffer - File.byte_position;
Else
If fseek(File.file_handle,position,SEEK_SET) IsNotZero
Then
linker_error(255,"Trouble positioning file \"%s\" to byte %lu.\n",
(*File.file_info).filename, position);
EndIf
File.start_of_buffer_position =
File.next_buffer_position = position;
File.byte_position =
File.bytes_in_buffer =
File.bytes_left_in_buffer = 0;
File.current_byte = File.buffer;
EndIf;
return;
EndCode
#undef File
/*+-------------------------------------------------------------------------+
| |
| file_read |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
void file_read(byte_ptr into, bit_32 length)
BeginDeclarations
#define File infile
int_32 size;
EndDeclarations
BeginCode
While length Exceeds 0
BeginWhile
If length Exceeds File.bytes_left_in_buffer
Then
If File.bytes_left_in_buffer Exceeds 0
Then
far_move(into, File.current_byte, File.bytes_left_in_buffer);
length -= File.bytes_left_in_buffer;
into += File.bytes_left_in_buffer;
EndIf;
If (size = fread(File.buffer,1,File.IO_limit, File.file_handle)) LessThanOrEqualTo 0
Then
linker_error(255,"Trouble reading file \"%s\" at byte %lu.\n",
(*File.file_info).filename, File.next_buffer_position);
EndIf
File.bytes_in_buffer =
File.bytes_left_in_buffer = size ;
File.current_byte = File.buffer;
File.byte_position = 0;
File.start_of_buffer_position = File.next_buffer_position;
File.next_buffer_position = File.start_of_buffer_position +
File.bytes_in_buffer;
Else
far_move(into, File.current_byte, length);
into += length;
File.current_byte += length;
File.bytes_left_in_buffer -= length;
File.byte_position += length;
length = 0;
EndIf;
EndWhile;
return;
EndCode
#undef File
/*+-------------------------------------------------------------------------+
| |
| file_write |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
void file_write(byte_ptr from, bit_32 length)
BeginDeclarations
#define File outfile
EndDeclarations
BeginCode
While length Exceeds 0L
BeginWhile
If length Exceeds Bit_32(File.bytes_left_in_buffer)
Then
far_move(File.current_byte, from, File.bytes_left_in_buffer);
length -= Bit_32(File.bytes_left_in_buffer);
from += File.bytes_left_in_buffer;
File.bytes_in_buffer += File.bytes_left_in_buffer;
If fwrite(File.buffer,1,File.bytes_in_buffer,File.file_handle) IsNot
File.bytes_in_buffer
Then
linker_error(255,"Trouble writing file \"%s\" at byte %lu.\n",
(*File.file_info).filename, File.next_buffer_position);
EndIf
File.current_byte = File.buffer;
File.bytes_left_in_buffer = File.buffer_size;
File.bytes_in_buffer =
File.byte_position = 0;
File.start_of_buffer_position = File.next_buffer_position;
File.next_buffer_position = File.start_of_buffer_position +
File.bytes_left_in_buffer;
Else
far_move(File.current_byte, from, Bit_16(length));
from += Bit_16(length);
File.current_byte += Bit_16(length);
File.bytes_left_in_buffer -= Bit_16(length);
File.byte_position += Bit_16(length);
File.bytes_in_buffer += Bit_16(length);
length = 0;
EndIf;
EndWhile;
return;
EndCode
#undef File
/*+-------------------------------------------------------------------------+
| |
| process_filename |
| |
+-------------------------------------------------------------------------+*/
string_ptr process_filename(string_ptr fn)
BeginDeclarations
bit_16 left;
bit_16 right;
EndDeclarations
BeginCode
lowercase_string(fn);
/*+-------------------------------------------------------------------------+
| |
| Check for AUX:, CON: & PRN: |
| |
+-------------------------------------------------------------------------+*/
If compare_string(substr(fn,0,4), device_AUX) IsZero
Then
copy_string(fn, device_AUX);
return(fn);
EndIf;
If compare_string(substr(fn,0,4), device_CON) IsZero
Then
copy_string(fn, device_CON);
return(fn);
EndIf;
If compare_string(substr(fn,0,4), device_PRN) IsZero
Then
copy_string(fn, device_PRN);
return(fn);
EndIf;
/*+-------------------------------------------------------------------------+
| |
| Add drive designator if missing. |
| |
+-------------------------------------------------------------------------+*/
If compare_string(substr(fn,1,1), colon_string) IsNotZero
Then
paste_string(fn, 0, default_drive_string);
EndIf;
/*+-------------------------------------------------------------------------+
| |
| Substitute current directory if not based from root. |
| |
+-------------------------------------------------------------------------+*/
If compare_string(substr(fn,2,1), backslash_string) IsNotZero
Then
default_directory(fn, default_directory_string);
paste_string(fn, 2, default_directory_string);
EndIf;
/*+-------------------------------------------------------------------------+
| |
| Scan out all \. and \.. from filename. |
| |
+-------------------------------------------------------------------------+*/
left = index_string(fn, -1, backslash_string);
right = index_string(fn, left+1, backslash_string);
While right IsNot 0xffff
BeginWhile
If compare_string(substr(fn,left,4), backslash_dot_dot_string) IsZero
Then
cut_string(fn, left, 3);
right = left;
left = reverse_index_string(fn, right-1, backslash_string);
If left Is 0xffff
Then
return(null_string);
EndIf;
cut_string(fn, left, right-left);
right = index_string(fn, left+1, backslash_string);
ContinueLoop;
Else
If compare_string(substr(fn,left,3), backslash_dot_string) IsZero
Then
cut_string(fn, left, 2);
right = index_string(fn, left+1, backslash_string);
ContinueLoop;
EndIf;
EndIf;
left = right;
right = index_string(fn, left+1, backslash_string);
EndWhile;
return(fn);
EndCode
/*+-------------------------------------------------------------------------+
| |
| start_file_search |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
bit_16 start_file_search(string_ptr fn, bit_16 attr)
BeginDeclarations
bit_16 rc;
EndDeclarations
BeginCode
/*+-------------------------------------------------------------------------+
| |
| Remember the current file path |
| |
+-------------------------------------------------------------------------+*/
copy_string(current_path, fn);
trunc_string(current_path,
reverse_index_string(current_path, 0xFFFF, backslash_string)+1);
rc = _dos_findfirst(String(fn),attr, &DTA);
If rc IsNotZero
Then
copy_string(current_filename, null_string);
Else
far_to_lower(DTA.name, 12);
copy_string(current_filename, current_path);
concat_string(current_filename, string(DTA.name));
EndIf;
return(rc);
EndCode
/*+-------------------------------------------------------------------------+
| |
| continue_file_search |
| |
| O/S dependent |
| |
+-------------------------------------------------------------------------+*/
bit_16 continue_file_search()
BeginDeclarations
bit_16 rc;
EndDeclarations
BeginCode
rc = _dos_findnext(&DTA);
If rc IsNotZero
Then
copy_string(current_filename, null_string);
Else
far_to_lower(DTA.name, 12);
copy_string(current_filename, current_path);
concat_string(current_filename, string(DTA.name));
EndIf;
return(rc);
EndCode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -