📄 io.c
字号:
/****************************************************************/
/* COPYRIGHT NOTICE */
/* ---------------- */
/* All software in this listing remain the strict copyright */
/* of Ilija Kovacevic and cannot be copied or used in any way */
/* except by written permission of Ilija Kovacevic. */
/* */
/* Copyright (c) 1992 Ilija Kovacevic */
/* www.kov.com email ilija@kov.com */
/****************************************************************/
#include "dwgin.h"
static boolean big_file;
static int last_used;
#define OVERLAP 1024
#define MAX_BUFFER 20
#define BUFFER_SIZE (10*1024) /* bug if over 32K */
static struct file_slice
{
unsigned last_used;
long base;
char *buffer;
} buffers[ MAX_BUFFER ];
PUBLIC void read_in_file( void )
{
int index;
long size;
last_used = 0;
__drawing->file_position = 0;
__drawing->file_pointer = buffers[ 0 ].buffer;
for( size = 0,index = 0; size < __drawing->drawing_size ; ++index,size += BUFFER_SIZE )
{
if ( index >= MAX_BUFFER )
{
big_file = true;
return; /* not enough buffers */
}
if ( buffers[ index ].buffer EQ NULL )
{
buffers[ index ].buffer = get_memory( BUFFER_SIZE+OVERLAP );
}
buffers[ index ].last_used = last_used;
++last_used;
buffers[ index ].base = size;
read( __drawing->source_file,buffers[ index ].buffer,( unsigned )( BUFFER_SIZE+OVERLAP ) );
lseek( __drawing->source_file,size+BUFFER_SIZE,SEEK_SET );
}
big_file = false;
}
PUBLIC void file_seek( INT32 position )
{
unsigned index;
unsigned oldest_index;
unsigned oldest_last_used;
if ( big_file )
{
/* see if already in buffers */
for( index = 0; ; ++index )
{
if ( buffers[ index ].base <= position AND position <= (buffers[ index ].base+BUFFER_SIZE) ) break;
if ( index >= MAX_BUFFER OR buffers[ index ].buffer EQ NULL ) /* we do not have in in the buffers */
{
oldest_last_used = buffers[ 1 ].last_used;
oldest_index = 1;
for( index = 2; index < MAX_BUFFER ; ++index )
{
if ( buffers[ index ].buffer EQ NULL ) break; /* no more */
if ( buffers[ index ].last_used < oldest_last_used )
{
oldest_last_used = buffers[ index ].last_used;
oldest_index = index;
}
}
index = oldest_index;
if ( lseek( __drawing->source_file,position,SEEK_SET ) EQ -1 ) read_error( "Seek failure" );
read( __drawing->source_file,buffers[ index ].buffer,( unsigned )( BUFFER_SIZE+OVERLAP ) );
buffers[ index ].base = position;
buffers[ index ].last_used = last_used;
++last_used;
break;
}
}
}
else index = ( int )( position/BUFFER_SIZE );
__drawing->file_pointer = buffers[ index ].buffer + ( unsigned )( position - buffers[ index ].base );
__drawing->file_position = position;
}
#ifdef BIG_ENDIAN
PRIVATE void double_reverse( double *number )
{
double n;
char *s,*d;
d = ( char * )&n;
s = ( char * )number;
s += 7;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d = *s;
memcpy( number,&n,sizeof( double ) );
}
PRIVATE void INT16_reverse( INT16 *number )
{
INT16 n;
char *s,*d;
d = ( char * )&n;
s = ( char * )number;
s += 1;
*d++ = *s--;
*d = *s;
memcpy( number,&n,sizeof( INT16 ) );
}
PRIVATE void INT32_reverse( INT32 *number )
{
INT32 n;
char *s,*d;
d = ( char * )&n;
s = ( char * )number;
s += 3;
*d++ = *s--;
*d++ = *s--;
*d++ = *s--;
*d = *s;
memcpy( number,&n,sizeof( INT32 ) );
}
#endif
PUBLIC void get_UINT8( unsigned char *x )
{
memcpy( x,__drawing->file_pointer,1 );
#ifdef DEBUG
if( debugger ) dprintf( "GC %5lx : ",__drawing->file_position );
#endif
++__drawing->file_pointer;
++__drawing->file_position;
#ifdef DEBUG
if( debugger ) dprintf( "%xH\n",*x );
#endif
}
PUBLIC void get_INT16( INT16 *x )
{
memcpy( x,__drawing->file_pointer,2 );
#ifdef DEBUG
if( debugger ) dprintf( "G16 %5lx : ",__drawing->file_position );
#endif
__drawing->file_pointer += 2;
__drawing->file_position += 2;
#ifdef BIG_ENDIAN
INT16_reverse( x );
#endif
#ifdef DEBUG
if( debugger ) dprintf( "%xH\n",*x );
#endif
}
PUBLIC void get_INT32( INT32 *x )
{
memcpy( x,__drawing->file_pointer,4 );
#ifdef DEBUG
if( debugger ) dprintf( "G32 %5lx : ",__drawing->file_position );
#endif
__drawing->file_pointer += 4;
__drawing->file_position += 4;
#ifdef BIG_ENDIAN
INT32_reverse( x );
#endif
#ifdef DEBUG
if( debugger ) dprintf( "%lxH\n",*x );
#endif
}
PUBLIC void get_double( double *x )
{
memcpy( x,__drawing->file_pointer,8 );
#ifdef DEBUG
if( debugger ) dprintf( "GD %5lx : ",__drawing->file_position );
#endif
__drawing->file_pointer += 8;
__drawing->file_position += 8;
#ifdef BIG_ENDIAN
double_reverse( x );
#endif
#ifdef DEBUG
if( debugger ) dprintf( "%lf\n",*x );
#endif
}
PUBLIC void get_array( void *x, int length )
{
memcpy( x,__drawing->file_pointer,length );
#ifdef DEBUG
if( debugger ) dprintf( "GA %5lx : ",__drawing->file_position );
#endif
__drawing->file_pointer += length;
__drawing->file_position += length;
#ifdef DEBUG
if( debugger ) dprintf( "\n" );
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -