diff options
-rw-r--r-- | wcon.c | 75 | ||||
-rw-r--r-- | wfileIO3.c | 1506 | ||||
-rw-r--r-- | wfileIO3.h | 43 |
3 files changed, 914 insertions, 710 deletions
@@ -35,6 +35,7 @@ } WIN32_FIND_DATA; # endif # endif +# include "wfileIO3.h" #else # define INCL_DOSFILEMGR # include <os2.h> @@ -50,6 +51,9 @@ #ifdef WINDOWS HANDLE std_input_handle,std_output_handle,std_error_handle; int console_window_visible,console_allocated,console_flag=0; +int std_input_from_file=0; +int std_output_to_file=0; +extern void init_std_io_from_or_to_file (void); #endif extern int c_entier (double); @@ -125,6 +129,11 @@ static void make_console_window_visible () void w_print_char (char c) { #ifdef WINDOWS + if (std_output_to_file){ + file_write_char (c,&file_table[1]); + return; + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -135,6 +144,11 @@ void w_print_char (char c) void w_print_text (char *s,unsigned long length) { #ifdef WINDOWS + if (std_output_to_file){ + file_write_characters (s,length,&file_table[1]); + return; + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -170,6 +184,9 @@ int w_get_char (void) char c; #ifdef WINDOWS + if (std_input_from_file) + return file_read_char (&file_table[1]); + if (!console_window_visible) make_console_window_visible(); #endif @@ -195,7 +212,12 @@ int w_get_int (int *i_p) { int c,negative; unsigned int i; - + +#ifdef WINDOWS + if (std_input_from_file) + return file_read_int (&file_table[1],i_p); +#endif + c=w_get_char(); while (c==' ' || c=='\t' || c=='\n') c=w_get_char(); @@ -326,6 +348,11 @@ int w_get_real (double *r_p) { char s[256+1]; int c,dot,digits,result,n; + +#ifdef WINDOWS + if (std_input_from_file) + return file_read_real (&file_table[1],r_p); +#endif n=0; @@ -409,6 +436,13 @@ unsigned long w_get_text (char *string,unsigned long max_length) length=0; #ifdef WINDOWS + if (std_input_from_file){ + unsigned long length; + + length=max_length; + return file_read_characters (&file_table[1],&length,string); + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -459,6 +493,13 @@ void w_print_string (char *s) char *p; #ifdef WINDOWS + if (std_output_to_file){ + for (p=s; *p!=0; ++p) + ; + file_write_characters (p,p-s,&file_table[1]); + return; + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -516,6 +557,11 @@ static void print_integer (int n,OS(HANDLE,int) file_number) void w_print_int (int n) { #ifdef WINDOWS + if (std_output_to_file){ + file_write_int (n,&file_table[1]); + return; + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -562,7 +608,17 @@ static unsigned int dtoi_divmod_1e9 (double d,unsigned int *rem_p) { double a[1]; unsigned int q,r; - +# if 0 + asm ( + "fistpq (%3); " + "movl $1000000000,%%ebx; " + "movl 4(%3),%%edx; " + "movl (%3),%%eax; " + "divl %%ebx; " + : "=&a" (q), "=&d" (r) : "t" (d), "r" (a) + : "%ebx","st" + ); +# else asm ( "fistpq (%3); " "movl $1000000000,%%ebx; " @@ -573,6 +629,7 @@ static unsigned int dtoi_divmod_1e9 (double d,unsigned int *rem_p) : "&=g" (q), "&=d" (r) : "t" (d), "r" (a) : "%eax","%ebx","%ecx","%edx","st" ); +# endif *rem_p=r; return q; @@ -902,6 +959,11 @@ void w_print_real (double r) char s[32],*end_s; #ifdef WINDOWS + if (std_output_to_file){ + file_write_real (r,&file_table[1]); + return; + } + if (!console_window_visible) make_console_window_visible(); #endif @@ -1203,6 +1265,12 @@ int clean_main (void) else std_error_handle=GetStdHandle (STD_ERROR_HANDLE); + std_input_from_file = GetFileType (std_input_handle)==FILE_TYPE_DISK; + std_output_to_file = GetFileType (std_output_handle)==FILE_TYPE_DISK; + + if (std_input_from_file || std_output_to_file) + init_std_io_from_or_to_file(); + console_window_visible=flags & NO_RESULT_MASK ? 0 : 1; if (heap_size_multiple<MINIMUM_HEAP_SIZE_MULTIPLE) @@ -1326,6 +1394,9 @@ int clean_main (void) # endif wait_for_key_press(); + if (std_output_to_file) + flush_file_buffer (&file_table[1]); + if (return_code==0 && execution_aborted) return_code= -1; #endif @@ -12,6 +12,8 @@ # define ULONG unsigned long # define OS(w,o) w +# include "wfileIO3.h" + # ifndef FILE_END # define FILE_END 2 # endif @@ -29,10 +31,11 @@ extern void IO_error (char*); extern void *allocate_memory (int); extern void free_memory (void*); -#define EOF (-1) +extern int std_input_from_file; +extern int std_output_to_file; +extern HANDLE std_input_handle,std_output_handle,std_error_handle; -#define CLEAN_TRUE 1 -#define CLEAN_BOOL int +#define EOF (-1) #define MAX_N_FILES 20 @@ -44,27 +47,6 @@ extern void free_memory (void*); #define F_SEEK_CUR 1 #define F_SEEK_END 2 -struct file { /* 48 bytes */ - unsigned char * file_read_p; /* offset 0 */ - unsigned char * file_write_p; /* offset 4 */ - unsigned char * file_end_buffer_p; /* offset 8 */ - short file_mode; /* offset 12 */ - char file_unique; /* offset 14 */ - char file_error; /* offset 15 */ - - unsigned char * file_buffer_p; - - unsigned long file_offset; - unsigned long file_length; - - char * file_name; - long file_number; - unsigned long file_position; - unsigned long file_position_2; - - HFILE file_refnum; -}; - struct clean_string { long length; char characters[0]; @@ -204,8 +186,10 @@ struct file *open_file (struct clean_string *file_name,unsigned int file_mode) IO_error ("fopen: out of memory"); } - f->file_buffer_p=buffer; - f->file_end_buffer_p=buffer; + f->file_read_buffer_p=buffer; + f->file_write_buffer_p=buffer; + f->file_end_read_buffer_p=buffer; + f->file_end_write_buffer_p=buffer; f->file_read_p=buffer; f->file_write_p=buffer; @@ -276,7 +260,8 @@ struct file *open_file (struct clean_string *file_name,unsigned int file_mode) f->file_length=file_length; f->file_position=-2; f->file_position_2=-1; - f->file_refnum=file_handle; + f->file_read_refnum=file_handle; + f->file_write_refnum=file_handle; if (fn>=number_of_files) number_of_files=fn+1; @@ -286,6 +271,45 @@ struct file *open_file (struct clean_string *file_name,unsigned int file_mode) static int stdio_open=0; +void init_std_io_from_or_to_file (void) +{ + struct file *f; + unsigned char *buffer; + + f=&file_table[1]; + + buffer=allocate_memory (FILE_IO_BUFFER_SIZE<<1); + if (buffer==NULL){ + std_input_from_file=0; + std_output_to_file=0; + return; + } + + f->file_read_buffer_p=buffer; + f->file_end_read_buffer_p=buffer; + f->file_read_p=buffer; + + buffer+=FILE_IO_BUFFER_SIZE; + + f->file_write_buffer_p=buffer; + f->file_end_write_buffer_p=buffer; + f->file_write_p=buffer; + + f->file_mode=(1<<F_READ_TEXT) | (1<<F_WRITE_TEXT); + f->file_unique=1; + f->file_error=0; + + f->file_offset=0; + f->file_length=0; + + f->file_name="stdio"; + f->file_position=-2; + f->file_position_2=-1; + + f->file_read_refnum=std_input_handle; + f->file_write_refnum=std_output_handle; +} + struct file *open_stdio (void) { if (stdio_open) @@ -305,8 +329,8 @@ static int flush_write_buffer (struct file *f) if (f->file_mode & ((1<<F_WRITE_TEXT)|(1<<F_WRITE_DATA)|(1<<F_APPEND_TEXT)|(1<<F_APPEND_DATA))){ unsigned char *buffer; - buffer=f->file_buffer_p; - if (buffer!=f->file_end_buffer_p){ + buffer=f->file_write_buffer_p; + if (buffer!=f->file_end_write_buffer_p){ OS(DWORD,APIRET) error; long count; @@ -316,18 +340,17 @@ static int flush_write_buffer (struct file *f) error=0; else { #ifdef WINDOWS - error=!WriteFile (f->file_refnum,buffer,count,&count,NULL); + error=!WriteFile (f->file_write_refnum,buffer,count,&count,NULL); #else - error=DosWrite (f->file_refnum,buffer,count,&count); + error=DosWrite (f->file_write_refnum,buffer,count,&count); #endif f->file_offset += count; } if (f->file_offset > f->file_length) f->file_length=f->file_offset; - - f->file_end_buffer_p=buffer; - f->file_read_p=buffer; + + f->file_end_write_buffer_p=buffer; if (error!=0 || count!=f->file_write_p-buffer){ f->file_write_p=buffer; @@ -344,10 +367,14 @@ static int flush_write_buffer (struct file *f) CLEAN_BOOL flush_file_buffer (struct file *f) { - if (is_special_file (f)) + if (is_special_file (f)){ + if (f==&file_table[1] && std_output_to_file) + return flush_write_buffer (f); + return 1; - else - return flush_write_buffer (f); + } + + return flush_write_buffer (f); } CLEAN_BOOL close_file (struct file *f) @@ -357,6 +384,21 @@ CLEAN_BOOL close_file (struct file *f) if (!stdio_open) IO_error ("fclose: file not open (stdio)"); stdio_open=0; + + if (std_input_from_file || std_output_to_file){ + int result; + + result=CLEAN_TRUE; + + if (f->file_error) + result=0; + + if (std_output_to_file) + if (! flush_write_buffer (f)) + result=0; + + return result; + } } return CLEAN_TRUE; } else { @@ -374,15 +416,15 @@ CLEAN_BOOL close_file (struct file *f) result=0; #ifdef WINDOWS - if (!CloseHandle (f->file_refnum)) + if (!CloseHandle (f->file_read_refnum)) result=0; #else - if (DosClose (f->file_refnum)!=0) + if (DosClose (f->file_read_refnum)!=0) result=0; #endif free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); f->file_mode=0; @@ -432,12 +474,13 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (f->file_mode!=0){ flush_write_buffer (f); - OS(CloseHandle,DosClose) (f->file_refnum); + OS(CloseHandle,DosClose) (f->file_read_refnum); } else { buffer=allocate_memory (FILE_IO_BUFFER_SIZE); if (buffer==NULL) IO_error ("freopen: out of memory"); - f->file_buffer_p=buffer; + f->file_read_buffer_p=buffer; + f->file_write_buffer_p=buffer; } f->file_mode=0; @@ -447,7 +490,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) file_action_reopen[file_mode],FILE_ATTRIBUTE_NORMAL,NULL); if (file_handle==INVALID_HANDLE_VALUE){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); return 0; } #else @@ -456,7 +499,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (error!=0){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); return 0; } #endif @@ -475,7 +518,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (file_length==-1){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); OS(CloseHandle,DosClose) (file_handle); IO_error ("freopen: can't seek to eof"); } @@ -484,7 +527,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (error!=0){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); OS(CloseHandle,DosClose) (file_handle); IO_error ("freopen: can't seek to eof"); } @@ -498,7 +541,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (file_length==-1){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); OS(CloseHandle,DosClose) (file_handle); IO_error ("freopen: can't get eof"); } @@ -509,7 +552,7 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) if (error!=0){ free_memory (f->file_name); - free_memory (f->file_buffer_p); + free_memory (f->file_read_buffer_p); OS(CloseHandle,DosClose) (file_handle); IO_error ("freopen: can't get eof"); } @@ -519,15 +562,17 @@ CLEAN_BOOL re_open_file (struct file *f,unsigned int file_mode) } } - f->file_refnum=file_handle; + f->file_read_refnum=file_handle; + f->file_write_refnum=file_handle; f->file_mode=1<<file_mode; f->file_length=file_length; f->file_position=-2; f->file_position_2=-1; f->file_error=0; - buffer=f->file_buffer_p; - f->file_end_buffer_p=buffer; + buffer=f->file_read_buffer_p; + f->file_end_read_buffer_p=buffer; + f->file_end_write_buffer_p=buffer; f->file_read_p=buffer; f->file_write_p=buffer; @@ -543,22 +588,21 @@ static void char_to_new_buffer (int c,struct file *f) flush_write_buffer (f); count=FILE_IO_BUFFER_SIZE - (f->file_offset & (FILE_IO_BUFFER_SIZE-1)); - buffer=f->file_buffer_p; + buffer=f->file_write_buffer_p; *buffer=c; f->file_write_p=buffer+1; buffer+=count; - f->file_end_buffer_p=buffer; - f->file_read_p=buffer; + f->file_end_write_buffer_p=buffer; } #if defined (__MWERKS__) || defined (powerc) -#define write_char(c,f) if ((f)->file_write_p<(f)->file_end_buffer_p) \ +#define write_char(c,f) if ((f)->file_write_p<(f)->file_end_write_buffer_p) \ *((f)->file_write_p)++=(c); \ else \ char_to_new_buffer((c),(f)) #else -#define write_char(c,f) ((f)->file_write_p<(f)->file_end_buffer_p ? (*((f)->file_write_p)++=(c)) : char_to_new_buffer((c),(f))) +#define write_char(c,f) ((f)->file_write_p<(f)->file_end_write_buffer_p ? (*((f)->file_write_p)++=(c)) : char_to_new_buffer((c),(f))) #endif static int char_from_new_buffer (struct file *f) @@ -569,12 +613,12 @@ static int char_from_new_buffer (struct file *f) int c; count=FILE_IO_BUFFER_SIZE - (f->file_offset & (FILE_IO_BUFFER_SIZE-1)); - buffer=f->file_buffer_p; + buffer=f->file_read_buffer_p; #ifdef WINDOWS - error=!ReadFile (f->file_refnum,buffer,count,&count,NULL); + error=!ReadFile (f->file_read_refnum,buffer,count,&count,NULL); #else - error=DosRead (f->file_refnum,buffer,count,&count); + error=DosRead (f->file_read_refnum,buffer,count,&count); #endif f->file_offset += count; @@ -583,26 +627,24 @@ static int char_from_new_buffer (struct file *f) f->file_error=-1; if (error!=0 || count==0){ - f->file_end_buffer_p=buffer; + f->file_end_read_buffer_p=buffer; f->file_read_p=buffer; - f->file_write_p=buffer; return EOF; } c=*buffer; f->file_read_p=buffer+1; buffer+=count; - f->file_end_buffer_p=buffer; - f->file_write_p=buffer; + f->file_end_read_buffer_p=buffer; return c; } -#define read_char(f) ((f)->file_read_p<(f)->file_end_buffer_p ? *((f)->file_read_p)++ : char_from_new_buffer(f)) +#define read_char(f) ((f)->file_read_p<(f)->file_end_read_buffer_p ? *((f)->file_read_p)++ : char_from_new_buffer(f)) int file_read_char (struct file *f) { - if (f->file_read_p < f->file_end_buffer_p){ + if (f->file_read_p < f->file_end_read_buffer_p){ unsigned char c; c=*(f->file_read_p)++; @@ -611,35 +653,50 @@ int file_read_char (struct file *f) if (read_char (f)=='\n') c='\n'; else - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } return c; } else { if (is_special_file (f)){ - if (f==file_table){ + if (f==&file_table[1]){ + if (std_input_from_file){ + int c; + + c=char_from_new_buffer (f); + + if (c=='\r'){ + if (read_char (f)=='\n') + c='\n'; + else + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; + } + + return c; + } else + return w_get_char(); + } else if (f==file_table){ IO_error ("freadc: can't read from stderr"); return 0; - } else if (f==&file_table[1]) - return w_get_char(); - else { + } else { IO_error ("freadc: can't open this file"); return 0; } } else { int c; - + if (f->file_mode & ~((1<<F_READ_TEXT) | (1<<F_READ_DATA))) IO_error ("freadc: read from an output file"); - + c=char_from_new_buffer (f); if (c=='\r' && f->file_mode & (1<<F_READ_TEXT)){ if (read_char (f)=='\n') c='\n'; else - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } @@ -653,87 +710,88 @@ int file_read_char (struct file *f) CLEAN_BOOL file_read_int (struct file *f,int *i_p) { if (is_special_file (f)){ - if (f==file_table){ + if (f==&file_table[1]){ + if (!std_input_from_file) + return w_get_int (i_p); + } else if (f==file_table){ IO_error ("freadi: can't read from stderr"); return 0; - } else if (f==&file_table[1]) - return w_get_int (i_p); - else { + } else { IO_error ("freadi: can't open this file"); return 0; } - } else { - *i_p=0; + } + + *i_p=0; + + if (f->file_mode & (1<<F_READ_DATA)){ + int i; - if (f->file_mode & (1<<F_READ_DATA)){ - int i; - - if ((i=read_char (f))==EOF){ - f->file_error=-1; - return 0; - } - ((char*)i_p)[0]=i; - if ((i=read_char (f))==EOF){ - f->file_error=-1; - return 0; - } - ((char*)i_p)[1]=i; - if ((i=read_char (f))==EOF){ - f->file_error=-1; - return 0; - } - ((char*)i_p)[2]=i; - if ((i=read_char (f))==EOF){ - f->file_error=-1; - return 0; + if ((i=read_char (f))==EOF){ + f->file_error=-1; + return 0; + } + ((char*)i_p)[0]=i; + if ((i=read_char (f))==EOF){ + f->file_error=-1; + return 0; + } + ((char*)i_p)[1]=i; + if ((i=read_char (f))==EOF){ + f->file_error=-1; + return 0; + } + ((char*)i_p)[2]=i; + if ((i=read_char (f))==EOF){ + f->file_error=-1; + return 0; + } + ((char*)i_p)[3]=i; + } else if (f->file_mode & (1<<F_READ_TEXT)){ + int c,negative,result; + + result=CLEAN_TRUE; + + while ((c=read_char (f))==' ' || c=='\t' || c=='\n' || c=='\r') + ; + + negative=0; + if (c=='+') + c=read_char (f); + else + if (c=='-'){ + c=read_char (f); + negative=1; } - ((char*)i_p)[3]=i; - } else if (f->file_mode & (1<<F_READ_TEXT)){ - int c,negative,result; - - result=CLEAN_TRUE; + + if (!is_digit (c)){ + result=0; + f->file_error=-1; + } else { + unsigned int i; - while ((c=read_char (f))==' ' || c=='\t' || c=='\n' || c=='\r') - ; + i=c-'0'; - negative=0; - if (c=='+') - c=read_char (f); - else - if (c=='-'){ - c=read_char (f); - negative=1; - } - - if (!is_digit (c)){ - result=0; - f->file_error=-1; - } else { - unsigned int i; - - i=c-'0'; - - while (is_digit (c=read_char (f))){ - i+=i<<2; - i+=i; - i+=c-'0'; - }; + while (is_digit (c=read_char (f))){ + i+=i<<2; + i+=i; + i+=c-'0'; + }; + + if (negative) + i=-i; - if (negative) - i=-i; - - *i_p=i; - } + *i_p=i; + } - if (f->file_read_p > f->file_buffer_p) - --f->file_read_p; + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; - return result; - } else - IO_error ("freadi: read from an output file"); - - return CLEAN_TRUE; - } + return result; + } else + IO_error ("freadi: read from an output file"); + + return CLEAN_TRUE; } extern int convert_string_to_real (char *s,double *r_p); @@ -741,115 +799,116 @@ extern int convert_string_to_real (char *s,double *r_p); CLEAN_BOOL file_read_real (struct file *f,double *r_p) { if (is_special_file (f)){ - if (f==file_table){ + if (f==&file_table[1]){ + if (!std_input_from_file) + return w_get_real (r_p); + } else if (f==file_table){ IO_error ("freadr: can't read from stderr"); return 0; - } else if (f==&file_table[1]) - return w_get_real (r_p); - else { + } else { IO_error ("freadr: can't open this file"); return 0; } - } else { - *r_p=0.0; - - if (f->file_mode & (1<<F_READ_DATA)){ - int n; + } + + *r_p=0.0; + + if (f->file_mode & (1<<F_READ_DATA)){ + int n; - for (n=0; n<8; ++n){ - int i; - - if ((i=read_char (f))==EOF){ - f->file_error=-1; - return 0; - } - ((char*)r_p)[n]=i; - } - } else if (f->file_mode & (1<<F_READ_TEXT)){ - int c,dot,digits,result,n; - char s[256+1]; - - n=0; - - while ((c=read_char (f))==' ' || c=='\t' || c=='\n' || c=='\r') - ; + for (n=0; n<8; ++n){ + int i; - if (c=='+') + if ((i=read_char (f))==EOF){ + f->file_error=-1; + return 0; + } + ((char*)r_p)[n]=i; + } + } else if (f->file_mode & (1<<F_READ_TEXT)){ + int c,dot,digits,result,n; + char s[256+1]; + + n=0; + + while ((c=read_char (f))==' ' || c=='\t' || c=='\n' || c=='\r') + ; + + if (c=='+') + c=read_char (f); + else + if (c=='-'){ + s[n++]=c; c=read_char (f); - else - if (c=='-'){ - s[n++]=c; - c=read_char (f); + } + + dot=0; + digits=0; + + while (is_digit (c) || c=='.'){ + if (c=='.'){ + if (dot){ + dot=2; + break; } - - dot=0; - digits=0; - - while (is_digit (c) || c=='.'){ - if (c=='.'){ - if (dot){ - dot=2; - break; - } - dot=1; - } else - digits=-1; + dot=1; + } else + digits=-1; + if (n<256) + s[n++]=c; + c=read_char (f); + } + + result=0; + if (digits) + if (dot==2 || ! (c=='e' || c=='E')) + result=CLEAN_TRUE; + else { if (n<256) s[n++]=c; c=read_char (f); - } - - result=0; - if (digits) - if (dot==2 || ! (c=='e' || c=='E')) - result=CLEAN_TRUE; - else { - if (n<256) - s[n++]=c; + + if (c=='+') c=read_char (f); - - if (c=='+') + else + if (c=='-'){ + if (n<256) + s[n++]=c; c=read_char (f); - else - if (c=='-'){ - if (n<256) - s[n++]=c; - c=read_char (f); - } - - if (is_digit (c)){ - do { - if (n<256) - s[n++]=c; - c=read_char (f); - } while (is_digit (c)); - - result=CLEAN_TRUE; } + + if (is_digit (c)){ + do { + if (n<256) + s[n++]=c; + c=read_char (f); + } while (is_digit (c)); + + result=CLEAN_TRUE; } + } + + if (n>=256) + result=0; + + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; + + *r_p=0.0; - if (n>=256) - result=0; + if (result){ + s[n]='\0'; + result= convert_string_to_real (s,r_p)==&s[n]; + } - if (f->file_read_p > f->file_buffer_p) - --f->file_read_p; - - *r_p=0.0; - - if (result){ - s[n]='\0'; - result= convert_string_to_real (s,r_p)==&s[n]; - } - - if (!result) - f->file_error=-1; + if (!result) + f->file_error=-1; - return result; - } else - IO_error ("freadr: read from an output file"); - - return CLEAN_TRUE; - } + return result; + } else + IO_error ("freadr: read from an output file"); + + return CLEAN_TRUE; } #define OLD_READ_STRING 0 @@ -866,173 +925,175 @@ unsigned long file_read_characters (struct file *f,unsigned long *length_p,char max_length=*length_p; #endif if (is_special_file (f)){ - if (f==file_table){ - IO_error ("freads: can't read from stderr"); - return 0; - } else if (f==&file_table[1]){ - char *string; - unsigned long length; - - length=0; + if (f==&file_table[1]){ + if (!std_input_from_file){ + char *string; + unsigned long length; + int c; + + length=0; #if OLD_READ_STRING - string=s->characters; + string=s->characters; #else - string=s; + string=s; #endif - while (length!=max_length){ - *string++=w_get_char(); - ++length; - } + while (length!=max_length && (c=w_get_char(),c!=-1)){ + *string++=c; + ++length; + } #if OLD_READ_STRING - s->length=length; + s->length=length; #else - *length_p=length; + *length_p=length; #endif - return length; + return length; + } + } else if (f==file_table){ + IO_error ("freads: can't read from stderr"); + return 0; } else { IO_error ("freads: can't open this file"); return 0; } } else { - unsigned char *string,*end_string,*begin_string; - if (f->file_mode & ~((1<<F_READ_TEXT) | (1<<F_READ_DATA))) IO_error ("freads: read from an output file"); - + } + { + unsigned char *string,*end_string,*begin_string; + #if OLD_READ_STRING - string=s->characters; + string=s->characters; #else - string=s; + string=s; #endif - begin_string=string; - end_string=string+max_length; + begin_string=string; + end_string=string+max_length; - if (f->file_mode & (1<<F_READ_DATA)){ - while (string<end_string){ - if (f->file_read_p < f->file_end_buffer_p){ - unsigned char *read_p; - long n; - - read_p=f->file_read_p; - - n=f->file_end_buffer_p-read_p; - if (n > end_string-string) - n=end_string-string; - - do { - *string++ = *read_p++; - } while (--n); + if (f->file_mode & (1<<F_READ_DATA)){ + while (string<end_string){ + if (f->file_read_p < f->file_end_read_buffer_p){ + unsigned char *read_p; + long n; + + read_p=f->file_read_p; - f->file_read_p=read_p; - } else { - if (end_string-string>=FILE_IO_BUFFER_SIZE && f->file_offset & (FILE_IO_BUFFER_SIZE-1)==0){ - OS(DWORD,APIRET) error; - long count; - unsigned char *buffer; - - count=(end_string-string) & (~(FILE_IO_BUFFER_SIZE-1)); + n=f->file_end_read_buffer_p-read_p; + if (n > end_string-string) + n=end_string-string; + + do { + *string++ = *read_p++; + } while (--n); + + f->file_read_p=read_p; + } else { + if (end_string-string>=FILE_IO_BUFFER_SIZE && (f->file_offset & (FILE_IO_BUFFER_SIZE-1))==0){ + OS(DWORD,APIRET) error; + long count; + unsigned char *buffer; + + count=(end_string-string) & (~(FILE_IO_BUFFER_SIZE-1)); #ifdef WINDOWS - error=!ReadFile (f->file_refnum,string,count,&count,NULL); + error=!ReadFile (f->file_read_refnum,string,count,&count,NULL); #else - error=DosRead (f->file_refnum,string,count,&count); + error=DosRead (f->file_read_refnum,string,count,&count); #endif - f->file_offset += count; - - if (error!=0) - f->file_error=-1; - - buffer=f->file_buffer_p; - f->file_end_buffer_p=buffer; - f->file_read_p=buffer; - f->file_write_p=buffer; - - string+=count; - - if (error!=0 || count==0) + f->file_offset += count; + + if (error!=0) + f->file_error=-1; + + buffer=f->file_read_buffer_p; + f->file_end_read_buffer_p=buffer; + f->file_read_p=buffer; + string+=count; + + if (error!=0 || count==0) #if OLD_READ_STRING - return (s->length=string-begin_string); + return (s->length=string-begin_string); #else - return (*length_p=string-begin_string); + return (*length_p=string-begin_string); #endif - } else { - int c; - - c=char_from_new_buffer (f); - if (c==EOF) - break; - *string++=c; - } - } - } - } else { - while (string<end_string){ - if (f->file_read_p < f->file_end_buffer_p){ - unsigned char *read_p; - long n; - - read_p=f->file_read_p; - - n=f->file_end_buffer_p-read_p; - if (n > end_string-string) - n=end_string-string; - - do { - char c; - - c = *read_p++; - if (c=='\r'){ - if (n>1){ - if (*read_p=='\n'){ - *string++='\n'; - ++read_p; - --n; - } else - *string++ = c; - } else { - int c2; - - f->file_read_p=read_p; - c2=read_char (f); - read_p=f->file_read_p; - - if (c2=='\n') - *string++=c2; - else { - *string++=c; - if (read_p > f->file_buffer_p) - --read_p; - } - break; - } - } else - *string++ = c; - } while (--n); - - f->file_read_p=read_p; } else { int c; c=char_from_new_buffer (f); if (c==EOF) break; + *string++=c; + } + } + } + } else { + while (string<end_string){ + if (f->file_read_p < f->file_end_read_buffer_p){ + unsigned char *read_p; + long n; + read_p=f->file_read_p; + + n=f->file_end_read_buffer_p-read_p; + if (n > end_string-string) + n=end_string-string; + + do { + char c; + + c = *read_p++; if (c=='\r'){ - if (read_char (f)=='\n') - c='\n'; - else - if (f->file_read_p > f->file_buffer_p) - --f->file_read_p; - } - - *string++=c; + if (n>1){ + if (*read_p=='\n'){ + *string++='\n'; + ++read_p; + --n; + } else + *string++ = c; + } else { + int c2; + + f->file_read_p=read_p; + c2=read_char (f); + read_p=f->file_read_p; + + if (c2=='\n') + *string++=c2; + else { + *string++=c; + if (read_p > f->file_read_buffer_p) + --read_p; + } + break; + } + } else + *string++ = c; + } while (--n); + + f->file_read_p=read_p; + } else { + int c; + + c=char_from_new_buffer (f); + if (c==EOF) + break; + + if (c=='\r'){ + if (read_char (f)=='\n') + c='\n'; + else + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; } + + *string++=c; } } + } #if OLD_READ_STRING - return (s->length=string-begin_string); + return (s->length=string-begin_string); #else - return (*length_p=string-begin_string); + return (*length_p=string-begin_string); #endif } } @@ -1040,234 +1101,248 @@ unsigned long file_read_characters (struct file *f,unsigned long *length_p,char unsigned long file_read_line (struct file *f,unsigned long max_length,char *string) { if (is_special_file (f)){ - if (f==file_table){ - IO_error ("freadline: can't read from stderr"); - return 0; - } else if (f==&file_table[1]){ - unsigned long length; + if (f==&file_table[1]){ + if (!std_input_from_file){ + unsigned long length; + int c; - length=0; + length=0; + c=0; - while (length!=max_length){ - int c; + while (length!=max_length && (c=w_get_char(),c!=-1)){ + *string++=c; + ++length; + if (c=='\n') + return length; + } - c=w_get_char(); - *string++=c; - ++length; - if (c=='\n') - return length; + if (c!=-1) + return -1; + + return length; } - - return -1; + } else if (f==file_table){ + IO_error ("freadline: can't read from stderr"); + return 0; } else { IO_error ("freadline: can't open this file"); return 0; } - } else { - unsigned char *end_string,*begin_string; - int c; + } + + { + unsigned char *end_string,*begin_string; + int c; - begin_string=string; - end_string=string+max_length; - - c=0; + begin_string=string; + end_string=string+max_length; + + c=0; - if (f->file_mode & (1<<F_READ_TEXT)){ - while ((unsigned char*)string<end_string){ - if (f->file_read_p < f->file_end_buffer_p){ - unsigned char *read_p; - long n; + if (f->file_mode & (1<<F_READ_TEXT)){ + while ((unsigned char*)string<end_string){ + if (f->file_read_p < f->file_end_read_buffer_p){ + unsigned char *read_p; + long n; + + read_p=f->file_read_p; + + n=f->file_end_read_buffer_p-read_p; + if (n > end_string-(unsigned char*)string) + n=end_string-(unsigned char*)string; + + do { + char ch; - read_p=f->file_read_p; + ch=*read_p++; - n=f->file_end_buffer_p-read_p; - if (n > end_string-(unsigned char*)string) - n=end_string-(unsigned char*)string; - - do { - char ch; - - ch=*read_p++; - - if (ch=='\r'){ - if (n>1 || read_p < f->file_end_buffer_p){ - if (*read_p=='\n'){ - f->file_read_p=++read_p; - *string++='\n'; - return (unsigned char*)string-begin_string; - } else { - *string++=ch; - } + if (ch=='\r'){ + if (n>1 || read_p < f->file_end_read_buffer_p){ + if (*read_p=='\n'){ + f->file_read_p=++read_p; + *string++='\n'; + return (unsigned char*)string-begin_string; } else { - int c; - - f->file_read_p=read_p; - c=char_from_new_buffer(f); - read_p=f->file_read_p; - - if (c=='\n'){ - *string++=c; - return (unsigned char*)string-begin_string; - } else { - *string++=ch; - - if (f->file_read_p > f->file_buffer_p) - --read_p; - } + *string++=ch; } } else { - *string++=ch; - if (ch=='\n'){ - f->file_read_p=read_p; - return (unsigned char*)string-begin_string; + int c; + + f->file_read_p=read_p; + c=char_from_new_buffer(f); + read_p=f->file_read_p; + + if (c=='\n'){ + *string++=c; + return (unsigned char*)string-begin_string; + } else { + *string++=ch; + + if (f->file_read_p > f->file_read_buffer_p) + --read_p; } } - } while (--n); - - c=0; - f->file_read_p=read_p; - } else { - c=char_from_new_buffer(f); - if (c==EOF) - break; - - if (c=='\r'){ - if (read_char (f)=='\n') - c='\n'; - else - if (f->file_read_p > f->file_buffer_p) - --f->file_read_p; + } else { + *string++=ch; + if (ch=='\n'){ + f->file_read_p=read_p; + return (unsigned char*)string-begin_string; + } } - - *string++=c; - if (c=='\n') - return (unsigned char*)string-begin_string; + } while (--n); + + c=0; + f->file_read_p=read_p; + } else { + c=char_from_new_buffer(f); + if (c==EOF) + break; + + if (c=='\r'){ + if (read_char (f)=='\n') + c='\n'; + else + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; } - } - } else if (f->file_mode & (1<<F_READ_DATA)){ - while (string<end_string){ - if (f->file_read_p < f->file_end_buffer_p){ - unsigned char *read_p; - long n; - read_p=f->file_read_p; + *string++=c; + if (c=='\n') + return (unsigned char*)string-begin_string; + } + } + } else if (f->file_mode & (1<<F_READ_DATA)){ + while (string<end_string){ + if (f->file_read_p < f->file_end_read_buffer_p){ + unsigned char *read_p; + long n; + + read_p=f->file_read_p; + + n=f->file_end_read_buffer_p-read_p; + if (n > end_string-(unsigned char*)string) + n=end_string-(unsigned char*)string; + do { + char ch; + + ch=*read_p++; + + *string++=ch; + if (ch=='\xd'){ + if (n>1){ + if (*read_p=='\xa'){ + *string++='\xa'; + ++read_p; + } + f->file_read_p=read_p; + return (unsigned char*)string-begin_string; + } else if (read_p < f->file_end_read_buffer_p){ + f->file_read_p=read_p; + if (*read_p!='\xa'){ + return (unsigned char*)string-begin_string; + } else { + return -1; /* return \xd, read \xa next time */ + } + } else { + int c; - n=f->file_end_buffer_p-read_p; - if (n > end_string-(unsigned char*)string) - n=end_string-(unsigned char*)string; - do { - char ch; + f->file_read_p=read_p; + c=char_from_new_buffer(f); + read_p=f->file_read_p; - ch=*read_p++; + if (c!='\xa'){ + if (read_p > f->file_read_buffer_p) + --read_p; - *string++=ch; - if (ch=='\xd'){ - if (n>1){ - if (*read_p=='\xa'){ - *string++='\xa'; - ++read_p; - } f->file_read_p=read_p; return (unsigned char*)string-begin_string; - } else if (read_p < f->file_end_buffer_p){ - f->file_read_p=read_p; - if (*read_p!='\xa'){ - return (unsigned char*)string-begin_string; - } else { - return -1; /* return \xd, read \xa next time */ - } } else { - int c; - - f->file_read_p=read_p; - c=char_from_new_buffer(f); - read_p=f->file_read_p; - - if (c!='\xa'){ - if (read_p > f->file_buffer_p) + if (string<end_string){ + *string++='\xa'; + f->file_read_p=read_p; + return (unsigned char*)string-begin_string; + } else { + if (read_p > f->file_read_buffer_p) --read_p; f->file_read_p=read_p; - return (unsigned char*)string-begin_string; - } else { - if (string<end_string){ - *string++='\xa'; - f->file_read_p=read_p; - return (unsigned char*)string-begin_string; - } else { - if (read_p > f->file_buffer_p) - --read_p; - - f->file_read_p=read_p; - return -1; /* return \xd, read \xa next time */ - } + return -1; /* return \xd, read \xa next time */ } } - } else if (ch=='\xa'){ - f->file_read_p=read_p; - return (unsigned char*)string-begin_string; } - } while (--n); + } else if (ch=='\xa'){ + f->file_read_p=read_p; + return (unsigned char*)string-begin_string; + } + } while (--n); - c=0; - f->file_read_p=read_p; - } else { - c=char_from_new_buffer(f); - if (c==EOF) - break; + c=0; + f->file_read_p=read_p; + } else { + c=char_from_new_buffer(f); + if (c==EOF) + break; - *string++=c; + *string++=c; - if (c=='\xd'){ - c = read_char (f); - if (string<end_string){ - if (c=='\xa') - *string++=c; - else - if (f->file_read_p > f->file_buffer_p) - --f->file_read_p; - } else { - if (f->file_read_p > f->file_buffer_p) + if (c=='\xd'){ + c = read_char (f); + if (string<end_string){ + if (c=='\xa') + *string++=c; + else + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; - - if (c=='\xa') - return -1; - } + } else { + if (f->file_read_p > f->file_read_buffer_p) + --f->file_read_p; + + if (c=='\xa') + return -1; + } - return (unsigned char*)string-begin_string; - } else if (c=='\xa') - return (unsigned char*)string-begin_string; - } + return (unsigned char*)string-begin_string; + } else if (c=='\xa') + return (unsigned char*)string-begin_string; } - } else - IO_error ("freadline: read from an output file"); + } + } else + IO_error ("freadline: read from an output file"); - if (c!=EOF) - return -1; - - return (unsigned char*)string-begin_string; + if (c!=EOF) + return -1; + + return (unsigned char*)string-begin_string; } } void file_write_char (int c,struct file *f) { - if (f->file_write_p < f->file_end_buffer_p){ + if (f->file_write_p < f->file_end_write_buffer_p){ if (c=='\n' && f->file_mode & ((1<<F_WRITE_TEXT)|(1<<F_APPEND_TEXT))){ *(f->file_write_p)++='\r'; - if (f->file_write_p < f->file_end_buffer_p) + if (f->file_write_p < f->file_end_write_buffer_p) *(f->file_write_p)++=c; else char_to_new_buffer (c,f); } else { *(f->file_write_p)++=c; } - } else { + } else { if (is_special_file (f)){ - if (f==file_table) + if (f==&file_table[1]){ + if (!std_output_to_file) + w_print_char (c); + else { + if (c=='\n'){ + char_to_new_buffer ('\r',f); + write_char (c,f); + } else + char_to_new_buffer (c,f); + } + } else if (f==file_table) ew_print_char (c); - else if (f==&file_table[1]) - w_print_char (c); else IO_error ("fwritec: can't open this file"); } else { @@ -1289,74 +1364,82 @@ extern char *convert_real_to_string (double d,char *s_p); void file_write_int (int i,struct file *f) { if (is_special_file (f)){ - if (f==file_table) + if (f==&file_table[1]){ + if (!std_output_to_file){ + w_print_int (i); + return; + } + } else if (f==file_table){ ew_print_int (i); - else if (f==&file_table[1]) - w_print_int (i); - else + return; + } else IO_error ("fwritei: can't open this file"); } else { if (f->file_mode & ~((1<<F_WRITE_TEXT)|(1<<F_WRITE_DATA)|(1<<F_APPEND_TEXT)|(1<<F_APPEND_DATA))) IO_error ("fwritei: write to an input file"); - - if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ - int v=i; + } - write_char (((char*)&v)[0],f); - write_char (((char*)&v)[1],f); - write_char (((char*)&v)[2],f); - write_char (((char*)&v)[3],f); - } else { - unsigned char string[24],*end_p,*s; - int length; + if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ + int v=i; - end_p=convert_int_to_string (string,i); - length=end_p-string; - - s=string; - do { - write_char (*s++,f); - } while (--length); - } + write_char (((char*)&v)[0],f); + write_char (((char*)&v)[1],f); + write_char (((char*)&v)[2],f); + write_char (((char*)&v)[3],f); + } else { + unsigned char string[24],*end_p,*s; + int length; + + end_p=convert_int_to_string (string,i); + length=end_p-string; + + s=string; + do { + write_char (*s++,f); + } while (--length); } } void file_write_real (double r,struct file *f) { if (is_special_file (f)){ - if (f==file_table) + if (f==&file_table[1]){ + if (!std_output_to_file){ + w_print_real (r); + return; + } + } else if (f==file_table){ ew_print_real (r); - else if (f==&file_table[1]) - w_print_real (r); - else + return; + } else IO_error ("fwriter: can't open this file"); - } else { + } else { if (f->file_mode & ~((1<<F_WRITE_TEXT)|(1<<F_WRITE_DATA)|(1<<F_APPEND_TEXT)|(1<<F_APPEND_DATA))) IO_error ("fwriter: write to an input file"); - - if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ - double v=r; - - write_char (((char*)&v)[0],f); - write_char (((char*)&v)[1],f); - write_char (((char*)&v)[2],f); - write_char (((char*)&v)[3],f); - write_char (((char*)&v)[4],f); - write_char (((char*)&v)[5],f); - write_char (((char*)&v)[6],f); - write_char (((char*)&v)[7],f); - } else { - unsigned char string[32],*end_p,*s; - int length; + } + + if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ + double v=r; + + write_char (((char*)&v)[0],f); + write_char (((char*)&v)[1],f); + write_char (((char*)&v)[2],f); + write_char (((char*)&v)[3],f); + write_char (((char*)&v)[4],f); + write_char (((char*)&v)[5],f); + write_char (((char*)&v)[6],f); + write_char (((char*)&v)[7],f); + } else { + unsigned char string[32],*end_p,*s; + int length; - end_p=convert_real_to_string (r,string); - length=end_p-string; + end_p=convert_real_to_string (r,string); + length=end_p-string; - s=string; - do { - write_char (*s++,f); - } while (--length); - } + s=string; + do { + write_char (*s++,f); + } while (--length); } } @@ -1367,106 +1450,112 @@ void file_write_characters (unsigned char *p,int length,struct file *f) #endif { if (is_special_file (f)){ - if (f==file_table) + if (f==&file_table[1]){ + if (!std_output_to_file){ #if OLD_WRITE_STRING - ew_print_text (s->characters,s->length); + w_print_text (s->characters,s->length); #else - ew_print_text (p,length); + w_print_text (p,length); #endif - else if (f==&file_table[1]) + return; + } + } else if (f==file_table){ #if OLD_WRITE_STRING - w_print_text (s->characters,s->length); + ew_print_text (s->characters,s->length); #else - w_print_text (p,length); + ew_print_text (p,length); #endif - else + return; + } else IO_error ("fwrites: can't open this file"); } else { + if (f->file_mode & ~((1<<F_WRITE_TEXT)|(1<<F_WRITE_DATA)|(1<<F_APPEND_TEXT)|(1<<F_APPEND_DATA))) + IO_error ("fwrites: write to an input file"); + } + + { #if OLD_WRITE_STRING - unsigned char *p,*end_p; + unsigned char *p,*end_p; #else - unsigned char *end_p; + unsigned char *end_p; #endif - if (f->file_mode & ~((1<<F_WRITE_TEXT)|(1<<F_WRITE_DATA)|(1<<F_APPEND_TEXT)|(1<<F_APPEND_DATA))) - IO_error ("fwrites: write to an input file"); - #if OLD_WRITE_STRING - p=s->characters; - end_p=p+s->length; + p=s->characters; + end_p=p+s->length; #else - end_p=p+length; + end_p=p+length; #endif - if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ - while (p<end_p){ - if (f->file_write_p < f->file_end_buffer_p){ - unsigned char *write_p; - long n; - - write_p=f->file_write_p; - - n=f->file_end_buffer_p-write_p; - if (n>end_p-p) - n=end_p-p; - - do { - *write_p++ = *p++; - } while (--n); - - f->file_write_p=write_p; - } else - char_to_new_buffer (*p++,f); - } - } else { - while (p<end_p){ - if (f->file_write_p < f->file_end_buffer_p){ - unsigned char *write_p; - long n; - - write_p=f->file_write_p; - - n=f->file_end_buffer_p-write_p; - if (n>end_p-p) - n=end_p-p; - - do { - char c; - - c = *p++; - if (c=='\n'){ - *write_p++ = '\r'; - if (--n){ - *write_p++ = c; - } else { - f->file_write_p=write_p; - write_char (c,f); - write_p=f->file_write_p; - break; - } - } else - *write_p++ = c; - } while (--n); - - f->file_write_p=write_p; - } else { + if (f->file_mode & ((1<<F_WRITE_DATA)|(1<<F_APPEND_DATA))){ + while (p<end_p){ + if (f->file_write_p < f->file_end_write_buffer_p){ + unsigned char *write_p; + long n; + + write_p=f->file_write_p; + + n=f->file_end_write_buffer_p-write_p; + if (n>end_p-p) + n=end_p-p; + + do { + *write_p++ = *p++; + } while (--n); + + f->file_write_p=write_p; + } else + char_to_new_buffer (*p++,f); + } + } else { + while (p<end_p){ + if (f->file_write_p < f->file_end_write_buffer_p){ + unsigned char *write_p; + long n; + + write_p=f->file_write_p; + + n=f->file_end_write_buffer_p-write_p; + if (n>end_p-p) + n=end_p-p; + + do { char c; - c=*p++; + c = *p++; if (c=='\n'){ - char_to_new_buffer ('\r',f); - write_char (c,f); + *write_p++ = '\r'; + if (--n){ + *write_p++ = c; + } else { + f->file_write_p=write_p; + write_char (c,f); + write_p=f->file_write_p; + break; + } } else - char_to_new_buffer (c,f); - } + *write_p++ = c; + } while (--n); + + f->file_write_p=write_p; + } else { + char c; + + c=*p++; + if (c=='\n'){ + char_to_new_buffer ('\r',f); + write_char (c,f); + } else + char_to_new_buffer (c,f); } } } + } } CLEAN_BOOL file_end (struct file *f) { - if (f->file_read_p < f->file_end_buffer_p) + if (f->file_read_p < f->file_end_read_buffer_p) return 0; if (is_special_file (f)){ @@ -1489,7 +1578,12 @@ CLEAN_BOOL file_end (struct file *f) CLEAN_BOOL file_error (struct file *f) { if (is_special_file (f)){ - if (f==file_table || f==&file_table[1]) + if (f==&file_table[1]){ + if ((std_input_from_file || std_output_to_file) && f->file_error) + return CLEAN_TRUE; + else + return 0; + } else if (f==file_table) return 0; else return CLEAN_TRUE; @@ -1512,9 +1606,9 @@ unsigned long file_position (struct file *f) unsigned long position; if (f->file_mode & ((1<<F_READ_TEXT) | (1<<F_READ_DATA))) - position=f->file_offset - (f->file_end_buffer_p - f->file_read_p); + position=f->file_offset - (f->file_end_read_buffer_p - f->file_read_p); else - position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); return position; } @@ -1536,7 +1630,7 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m unsigned long buffer_size; if (f->file_mode & ((1<<F_READ_TEXT) | (1<<F_READ_DATA))){ - current_position=f->file_offset - (f->file_end_buffer_p - f->file_read_p); + current_position=f->file_offset - (f->file_end_read_buffer_p - f->file_read_p); switch (seek_mode){ case F_SEEK_SET: @@ -1551,9 +1645,9 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m IO_error ("fseek: invalid mode"); } - buffer_size=f->file_end_buffer_p - f->file_buffer_p; + buffer_size=f->file_end_read_buffer_p - f->file_read_buffer_p; if ((unsigned long)(position - (f->file_offset-buffer_size)) < buffer_size){ - f->file_read_p = f->file_buffer_p + (position - (f->file_offset-buffer_size)); + f->file_read_p = f->file_read_buffer_p + (position - (f->file_offset-buffer_size)); return CLEAN_TRUE; } else { @@ -1565,13 +1659,11 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m return 0; } - buffer=f->file_buffer_p; - f->file_end_buffer_p=buffer; + buffer=f->file_read_buffer_p; + f->file_end_read_buffer_p=buffer; f->file_read_p=buffer; - f->file_write_p=buffer; - #ifdef WINDOWS - file_position=SetFilePointer (f->file_refnum,position,NULL,FILE_BEGIN); + file_position=SetFilePointer (f->file_read_refnum,position,NULL,FILE_BEGIN); if (file_position==-1){ f->file_error=-1; @@ -1580,7 +1672,7 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m f->file_offset=file_position; #else - error=DosSetFilePtr (f->file_refnum,position,FILE_BEGIN,&f->file_offset); + error=DosSetFilePtr (f->file_read_refnum,position,FILE_BEGIN,&f->file_offset); if (error!=0){ f->file_error=-1; @@ -1595,7 +1687,7 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m result=CLEAN_TRUE; - current_position=f->file_offset + (f->file_write_p - f->file_buffer_p); + current_position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); if (current_position > f->file_length) f->file_length=current_position; @@ -1626,7 +1718,7 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m return 0; } #ifdef WINDOWS - file_position=SetFilePointer (f->file_refnum,position,NULL,FILE_BEGIN); + file_position=SetFilePointer (f->file_write_refnum,position,NULL,FILE_BEGIN); if (file_position==-1){ f->file_error=-1; @@ -1634,7 +1726,7 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m } else f->file_offset=file_position; #else - error=DosSetFilePtr (f->file_refnum,position,FILE_BEGIN,&f->file_offset); + error=DosSetFilePtr (f->file_write_refnum,position,FILE_BEGIN,&f->file_offset); if (error!=0){ f->file_error=-1; @@ -1646,7 +1738,6 @@ CLEAN_BOOL file_seek (struct file *f,unsigned long position,unsigned long seek_m } } -/* added 13-1-1999 */ static int equal_string (char *s1,char*s2) { char c; @@ -1660,8 +1751,6 @@ static int equal_string (char *s1,char*s2) return 0; } -/* */ - struct file *open_s_file (struct clean_string *file_name,unsigned int file_mode) { int fn; @@ -1729,8 +1818,10 @@ struct file *open_s_file (struct clean_string *file_name,unsigned int file_mode) IO_error ("sfopen: out of memory"); } - f->file_buffer_p=buffer; - f->file_end_buffer_p=buffer; + f->file_read_buffer_p=buffer; + f->file_write_buffer_p=buffer; + f->file_end_read_buffer_p=buffer; + f->file_end_write_buffer_p=buffer; f->file_read_p=buffer; f->file_write_p=buffer; @@ -1758,7 +1849,8 @@ struct file *open_s_file (struct clean_string *file_name,unsigned int file_mode) IO_error ("sfopen: can't get eof"); } - f->file_refnum=file_handle; + f->file_read_refnum=file_handle; + f->file_write_refnum=file_handle; f->file_mode=1<<file_mode; f->file_unique=0; f->file_error=0; @@ -1786,9 +1878,9 @@ static int simple_seek (struct file *f,long position) result=1; - buffer_size=f->file_end_buffer_p - f->file_buffer_p; + buffer_size=f->file_end_read_buffer_p - f->file_read_buffer_p; if ((unsigned long)(position - (f->file_offset-buffer_size)) < buffer_size){ - f->file_read_p = f->file_buffer_p + (position - (f->file_offset-buffer_size)); + f->file_read_p = f->file_read_buffer_p + (position - (f->file_offset-buffer_size)); f->file_position=position; } else { unsigned char *buffer; @@ -1798,13 +1890,12 @@ static int simple_seek (struct file *f,long position) f->file_error=-1; result=0; } else { - buffer=f->file_buffer_p; - f->file_end_buffer_p=buffer; + buffer=f->file_read_buffer_p; + f->file_end_read_buffer_p=buffer; f->file_read_p=buffer; - f->file_write_p=buffer; #ifdef WINDOWS - file_position=SetFilePointer (f->file_refnum,position,NULL,FILE_BEGIN); + file_position=SetFilePointer (f->file_read_refnum,position,NULL,FILE_BEGIN); if (file_position==-1){ f->file_error=-1; @@ -1812,7 +1903,7 @@ static int simple_seek (struct file *f,long position) } else f->file_offset=file_position; #else - error=DosSetFilePtr (f->file_refnum,position,FILE_BEGIN,&f->file_offset); + error=DosSetFilePtr (f->file_read_refnum,position,FILE_BEGIN,&f->file_offset); if (error!=0){ f->file_error=-1; @@ -1852,7 +1943,7 @@ int file_read_s_char (struct file *f,unsigned long *position_p) if (position!=f->file_position_2) position=f->file_position_2; else { - position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); f->file_position_2=position; break; } @@ -1862,7 +1953,7 @@ int file_read_s_char (struct file *f,unsigned long *position_p) } } - if (f->file_read_p < f->file_end_buffer_p){ + if (f->file_read_p < f->file_end_read_buffer_p){ c=*f->file_read_p++; ++position; } else { @@ -1876,7 +1967,7 @@ int file_read_s_char (struct file *f,unsigned long *position_p) c='\n'; ++position; } else - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } @@ -1912,7 +2003,7 @@ CLEAN_BOOL file_read_s_int (struct file *f,int *i_p,unsigned long *position_p) if (position!=f->file_position_2) position=f->file_position_2; else { - position=position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); f->file_position_2=position; break; } @@ -1999,7 +2090,7 @@ CLEAN_BOOL file_read_s_int (struct file *f,int *i_p,unsigned long *position_p) position+=n_characters; - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } @@ -2034,7 +2125,7 @@ CLEAN_BOOL file_read_s_real (struct file *f,double *r_p,unsigned long *position_ if (position!=f->file_position_2) position=f->file_position_2; else { - position=position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); f->file_position_2=position; break; } @@ -2140,7 +2231,7 @@ CLEAN_BOOL file_read_s_real (struct file *f,double *r_p,unsigned long *position_ position+=n_characters; - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; *r_p=0.0; @@ -2190,7 +2281,7 @@ unsigned long file_read_s_string if (position!=f->file_position_2) position=f->file_position_2; else { - position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); f->file_position_2=position; break; } @@ -2216,7 +2307,7 @@ unsigned long file_read_s_string ++position; c='\n'; } else - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } @@ -2264,7 +2355,7 @@ unsigned long file_read_s_line (struct file *f,unsigned long max_length,char *st if (position!=f->file_position_2) position=f->file_position_2; else { - position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); f->file_position_2=position; break; } @@ -2283,7 +2374,7 @@ unsigned long file_read_s_line (struct file *f,unsigned long max_length,char *st ++position; c='\n'; } else - if (f->file_read_p > f->file_buffer_p) + if (f->file_read_p > f->file_read_buffer_p) --f->file_read_p; } @@ -2317,7 +2408,7 @@ CLEAN_BOOL file_s_end (struct file *f,unsigned long position) if (f->file_mode & ~((1<<F_READ_TEXT) | (1<<F_READ_DATA))) IO_error ("sfend: not allowed for output files"); - if (f->file_read_p < f->file_end_buffer_p) + if (f->file_read_p < f->file_end_read_buffer_p) return 0; if (f->file_offset < f->file_length) @@ -2329,7 +2420,7 @@ CLEAN_BOOL file_s_end (struct file *f,unsigned long position) if (f->file_position_2!=-1l) position=f->file_position_2; else { - position=f->file_offset + (f->file_end_buffer_p - f->file_read_p); + position=f->file_offset + (f->file_end_read_buffer_p - f->file_read_p); f->file_position=position; f->file_position_2=position; } @@ -2351,9 +2442,9 @@ unsigned long file_s_position (struct file *f,unsigned long position) } else { if (f->file_unique){ if (f->file_mode & ((1<<F_READ_TEXT) | (1<<F_READ_DATA))) - position=f->file_offset - (f->file_end_buffer_p - f->file_read_p); + position=f->file_offset - (f->file_end_read_buffer_p - f->file_read_p); else - position=f->file_offset + (f->file_write_p - f->file_buffer_p); + position=f->file_offset + (f->file_write_p - f->file_write_buffer_p); return position; } else { @@ -2361,7 +2452,7 @@ unsigned long file_s_position (struct file *f,unsigned long position) if (f->file_position_2!=-1l) return f->file_position_2; else { - position=f->file_offset - (f->file_end_buffer_p - f->file_read_p); + position=f->file_offset - (f->file_end_read_buffer_p - f->file_read_p); f->file_position=position; f->file_position_2=position; @@ -2399,7 +2490,7 @@ CLEAN_BOOL file_s_seek (struct file *f,unsigned long position,unsigned long seek if (f->file_unique) IO_error ("sfseek: can't seek on a unique file"); - current_position=f->file_offset - (f->file_end_buffer_p - f->file_read_p); + current_position=f->file_offset - (f->file_end_read_buffer_p - f->file_read_p); if (*position_p==-1l){ if (f->file_position_2!=-1l) @@ -2423,9 +2514,9 @@ CLEAN_BOOL file_s_seek (struct file *f,unsigned long position,unsigned long seek IO_error ("sfseek: invalid mode"); } - buffer_size=f->file_end_buffer_p - f->file_buffer_p; + buffer_size=f->file_end_read_buffer_p - f->file_read_buffer_p; if ((unsigned long)(position - (f->file_offset-buffer_size)) < buffer_size){ - f->file_read_p = f->file_buffer_p + (position - (f->file_offset-buffer_size)); + f->file_read_p = f->file_read_buffer_p + (position - (f->file_offset-buffer_size)); f->file_position=position; } else { unsigned char *buffer; @@ -2436,13 +2527,12 @@ CLEAN_BOOL file_s_seek (struct file *f,unsigned long position,unsigned long seek result=0; f->file_position=current_position; } else { - buffer=f->file_buffer_p; - f->file_end_buffer_p=buffer; + buffer=f->file_read_buffer_p; + f->file_end_read_buffer_p=buffer; f->file_read_p=buffer; - f->file_write_p=buffer; #ifdef WINDOWS - file_position=SetFilePointer (f->file_refnum,position,NULL,FILE_BEGIN); + file_position=SetFilePointer (f->file_read_refnum,position,NULL,FILE_BEGIN); if (file_position==-1){ f->file_error=-1; @@ -2450,7 +2540,7 @@ CLEAN_BOOL file_s_seek (struct file *f,unsigned long position,unsigned long seek } else f->file_offset=file_position; #else - error=DosSetFilePtr (f->file_refnum,position,FILE_BEGIN,&f->file_offset); + error=DosSetFilePtr (f->file_read_refnum,position,FILE_BEGIN,&f->file_offset); if (error!=0){ f->file_error=-1; diff --git a/wfileIO3.h b/wfileIO3.h new file mode 100644 index 0000000..49816ba --- /dev/null +++ b/wfileIO3.h @@ -0,0 +1,43 @@ + +struct file { /* 48 bytes */ + unsigned char * file_read_p; /* offset 0 */ + unsigned char * file_write_p; /* offset 4 */ + unsigned char * file_end_read_buffer_p; /* offset 8 */ + unsigned char * file_end_write_buffer_p;/* offset 12 */ + short file_mode; /* offset 16 */ + char file_unique; /* offset 18 */ + char file_error; /* offset 19 */ + + unsigned char * file_read_buffer_p; + unsigned char * file_write_buffer_p; + + unsigned long file_offset; + unsigned long file_length; + + char * file_name; + unsigned long file_position; + unsigned long file_position_2; + + HFILE file_read_refnum; + HFILE file_write_refnum; + + long file_fill_offset_56, /* fill to 64 bytes */ + file_fill_offset_60; +}; + +extern struct file file_table[]; + +#define CLEAN_TRUE 1 +#define CLEAN_BOOL int + +extern int file_read_char (struct file *f); +extern CLEAN_BOOL file_read_int (struct file *f,int *i_p); +extern CLEAN_BOOL file_read_real (struct file *f,double *r_p); +extern unsigned long file_read_characters (struct file *f,unsigned long *length_p,char *s); +extern void file_write_char (int c,struct file *f); + +extern void file_write_char (int c,struct file *f); +extern void file_write_characters (unsigned char *p,int length,struct file *f); +extern void file_write_int (int i,struct file *f); +extern void file_write_real (double r,struct file *f); +extern CLEAN_BOOL flush_file_buffer (struct file *f); |