diff options
Diffstat (limited to 'core/bgdrtm/src/copy.c')
-rw-r--r-- | core/bgdrtm/src/copy.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/core/bgdrtm/src/copy.c b/core/bgdrtm/src/copy.c new file mode 100644 index 0000000..ca2c587 --- /dev/null +++ b/core/bgdrtm/src/copy.c @@ -0,0 +1,226 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +/* + * FILE : i_copy.c + * DESCRIPTION : Struct copy functions based on varspace type info + * + * HISTORY: 0.85 - First version + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <math.h> +#include <time.h> + +#include "xstrings.h" +#include "bgdrtm.h" + +static int copytype( void * dst, void * src, DCB_TYPEDEF * var ); + +/* + * FUNCTION : copyvars + * + * Copy data using a varspace's type information. It updates the + * destination pointer while walking the variables. + * + * PARAMS : + * dst Pointer to the destination memory + * src Pointer to the data + * var Pointer to the type array + * nvars Number of variables (length of var array) + * + * RETURN VALUE : + * Number of bytes actually copied + * + */ + +int copyvars( void * dst, void * src, DCB_VAR * var, int nvars ) +{ + int result = 0; + int partial; + + for ( ; nvars > 0; nvars--, var++ ) + { + partial = copytype( dst, src, &var->Type ); + src = (( uint8_t* )src ) + partial; + dst = (( uint8_t* )dst ) + partial; + result += partial; + } + return result; +} + + +/* + * FUNCTION : copytypes + * + * Copy data from memory using type information stored in memory + * + * PARAMS : + * dst Pointer to the destination memory + * src Pointer to the source + * var Pointer to the type array + * nvars Number of variables (length of var array) + * + * RETURN VALUE : + * Number of bytes actually coppied + * + */ + +int copytypes( void * dst, void * src, DCB_TYPEDEF * var, int nvars, int reps ) +{ + int result = 0; + int partial; + DCB_TYPEDEF * _var = var; + int _nvars = nvars ; + + for ( ; reps > 0; reps-- ) + { + var = _var; + nvars = _nvars; + for ( ; nvars > 0; nvars--, var++ ) + { + partial = copytype( dst, src, var ); + result += partial; + src = (( uint8_t* )src ) + partial; + dst = (( uint8_t* )dst ) + partial; + } + } + return result; +} + +/* + * FUNCTION : copytype + * + * Copy one variable using the given type information. + * + * PARAMS : + * dst Pointer to the file object + * src Pointer to the data + * var Pointer to the variable type + * + * RETURN VALUE : + * Number of bytes actually written + * + */ + +static int copytype( void * dst, void * src, DCB_TYPEDEF * var ) +{ + int count = 1; + int result = 0; + int n = 0; + + for ( ;; ) + { + switch ( var->BaseType[n] ) + { + case TYPE_FLOAT: + case TYPE_INT: + case TYPE_DWORD: + case TYPE_POINTER: + memcpy( dst, src, 4 * count ); + return 4 * count; + + case TYPE_WORD: + case TYPE_SHORT: + memcpy( dst, src, 2 * count ); + return 2 * count; + + case TYPE_BYTE: + case TYPE_SBYTE: + case TYPE_CHAR: + memcpy( dst, src, count ); + return count; + + case TYPE_STRING: + while ( count-- ) + { + string_discard( *( int * )dst ); + string_use( *( int * )src ); + *(( int * )dst ) = *(( int * )src ); + dst = (( int * )dst ) + 1; + src = (( int * )src ) + 1; + result += 4; + } + return result; + + case TYPE_ARRAY: + count *= var->Count[n]; + n++; + continue; + + case TYPE_STRUCT: + for ( ; count ; count-- ) + { + int partial = copyvars( dst, src, dcb.varspace_vars[var->Members], dcb.varspace[var->Members].NVars ); + src = (( uint8_t* )src ) + partial; + dst = (( uint8_t* )dst ) + partial; + result += partial; + } + break; + + default: + fprintf( stderr, "ERROR: Runtime error - Could not copy datatype\n" ) ; + exit( 1 ); + break; + } + break; + } + return result; +} + +/** + * POINTER #COPY# (POINTER DEST, POINTER SRC, POINTER VARSPACE, INT VARS) + * + * Copy struct data from src to dst, using the information varspace given + **/ + +int bgd_copy_struct( INSTANCE * my, int * params ) +{ + return ( int ) copytypes(( void * )params[0], ( void * )params[1], ( DCB_TYPEDEF * )params[2], params[3], params[4] ); +} + +int bgd_internal_memcopy( INSTANCE * my, int * params ) +{ + memmove(( void * )params[0], ( void * )params[1], params[2] ) ; + return 1 ; +} + +int bgd_internal_copy_string_array( INSTANCE * my, int * params ) +{ + int n = params[ 2 ]; + while( n-- ) + { + ((int *)( params[ 0 ] )) [ n ] = ((int *)( params[ 1 ] )) [ n ]; + string_use( ((int *)( params[ 0 ] )) [ n ] ); + } + + return 1 ; +} |