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

📄 io.c

📁 AutoCAD DWG-file viewer
💻 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 + -