📄 block.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"
PUBLIC AcadBlock *AcadBlock__create( void )
{
AcadBlock *me;
me = ( AcadBlock * )get_memory( sizeof( AcadBlock ) );
me->name = NULL;
me->full_name = NULL;
return( me );
}
PUBLIC void AcadBlock__delete( AcadBlock *me )
{
if ( me->name ) free( me->name );
if ( me->full_name ) free( me->full_name );
free( ( char * )me );
}
PUBLIC void AcadBlock__read( AcadBlock *me ,int index )
{
char unknown3[ 7 ];
UINT8 unknown = 0;
char temp_name[ 0x20 ];
me->index = index;
if ( debugger ) dprintf( "\nBLOCK NAME ------------------------------------------------\n" );
get_UINT8( &me->flag );
get_array( &temp_name,sizeof( temp_name ) );
me->name = get_memory( strlen( temp_name )+1 );
strcpy( me->name,temp_name );
get_INT32( &me->reserved );
if ( __drawing->acad11 ) get_array( &unknown3,sizeof( unknown3 ) );
if ( __drawing->header->block_name_size > sizeof( me->flag ) + sizeof( temp_name ) + sizeof( me->reserved ) ) get_UINT8( &unknown );
if ( __drawing->acad11 ) me->offset = (( me->reserved >> 16 )&0xffff) + ( ( INT32 )( unknown3[ 0 ]&0xff ) << 16 );
#ifdef DOS
else me->offset = me->reserved & 0xffffffL;
#else
else me->offset = me->reserved & 0xffffff;
#endif
if ( __drawing->acad11 AND me->flag & 0x4 ) me->external = true;
else me->external = false;
if ( me->flag & 0x80 ) me->deleted = 1;
else me->deleted = 0;
if ( me->flag & 0x40 ) me->referenced = 1;
else me->referenced = 0;
if ( me->flag & 0x20 ) me->resolved = 1;
else me->resolved = 0;
if ( me->flag & 0x10 ) me->dependant = 1;
else me->dependant = 0;
if ( __drawing->acad11 AND me->flag & 0x4 ) me->xref = 1;
else me->xref = 0;
if ( me->flag & 0x2 ) me->attributes = 1;
else me->attributes = 0;
if ( me->flag & 0x1 ) me->anonymous = 1;
else me->anonymous = 0;
if ( me->anonymous )
{
me->full_name = get_memory( strlen( me->name )+1 + 6 ); /* 6 is max length of index */
sprintf( me->full_name,"%s%d",me->name,me->index );
}
else
{
me->full_name = get_memory( strlen( me->name )+1 );
strcpy( me->full_name,me->name );
}
me->entities = NULL;
}
PUBLIC void AcadBlock__dump_to_debug_file( AcadBlock *me )
{
dprintf( "BLOCK NAME\n" );
dprintf( "\tindex %d",me->index );
dprintf( "\tname [%s]",me->name );
dprintf( "\tfull name [%s]",me->full_name );
if ( me->deleted ) dprintf( " deleted" );
if ( me->anonymous ) dprintf( " also known as [%s]",me->full_name );
if ( me->deleted ) dprintf( " deleted" );
if ( me->referenced ) dprintf( " referenced" );
if ( me->resolved ) dprintf( " resolved" );
if ( me->dependant ) dprintf( " dependant" );
if ( me->xref ) dprintf( " xref" );
if ( me->attributes ) dprintf( " attributes" );
if ( me->anonymous ) dprintf( " anonymous" );
dprintf( "\n" );
dprintf( "offset %lx\n",me->offset );
}
boolean AcadBlock__contains_attributes( AcadBlock *me )
{
if ( me->flag & 0x2 ) return( true );
else return( false );
}
PUBLIC void AcadBlock__write( AcadBlock *me )
{
char *temp_name;
put_UINT8( me->flag );
temp_name = get_memory( 0x20 );
strcpy( temp_name,me->name );
put_array( temp_name,0x20 );
free( temp_name );
put_INT32( me->reserved );
}
void set_block_names_offset( INT32 blocks_start,INT32 block_names_start,int current_block )
{
INT32 offset;
INT32 position;
position = block_names_start + 0x21 + current_block * 0x25;
offset = __drawing->file_position - blocks_start;
#ifdef BIG_ENDIAN
INT32_reverse( &offset );
#endif
lseek( __drawing->output_file,position,SEEK_SET );
write( __drawing->output_file,( char * )&offset,sizeof( offset ) );
lseek( __drawing->output_file,__drawing->file_position,SEEK_SET );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -