Esempio n. 1
0
static void* recursive_data_copy_func(void *dest, void *src, size_t size)
{
    data_t* dest_d = dest;

    memcpy(dest_d, src, size);

    /* copy string if necessary */
    if(data_is_string_type(dest_d)) {
        String s = data_get_string(dest_d);
        String s2 = malloc(sizeof(*s2) * (wcslen(s) + 1));
        wcscpy(s2, s);
        data_set_string(dest_d, s2);
    }
    
    /* do recursive copy */
    if(data_is_cons_type(dest_d)) {
        data_t *d1 = eng_get_new_block();
        data_t *d2 = eng_get_new_block();

        recursive_data_copy_func(d1, data_get_car(src), size);
        data_set_car(dest_d, d1);

        recursive_data_copy_func(d2, data_get_cdr(src), size);
        data_set_cdr(dest_d, d2);
    }

    return dest_d;
}
Esempio n. 2
0
int coro__ut_data_1( co_t *co_p )
{
	static dword i;
	if ( *co_p ) goto **co_p;
	/* begin */
	data_clear_watch( peek__ut_data_1 );
	data_watch( peek__ut_data_1, _ut_data_1_watch );

	data_set_byte( var__ut_byte, 1 );
	data_set_dword( var__ut_array_1, 1 );
	data_set_float( var__ut_float, 0.0 );
	data_reset_all( peek__ut_data_2 );

	/* Main operations */
	for ( i = 0; i < CYCLE_COUNT; i++ ) {
		/* 1 */
		data_set_byte( var__ut_byte, ( byte ) i );

		do {
			/* wait */
			*co_p = &&L__0;

			L__0:
			if (!( data_get_changed( peek__ut_data_1, var__ut_word ))) { /* cond */
		
				return CO_WAIT;
			}
		} while ( 0 );
		/* 3 */
		data_reset( peek__ut_data_1, var__ut_word );
		assert_u32_eq(( word ) i, data_get_word( var__ut_word ));

		data_set_dword( var__ut_array_1, i << 8 );

		do {
			/* wait */
			*co_p = &&L__1;

			L__1:
			if (!( data_get_changed( peek__ut_data_1, var__ut_array_3 ))) { /* cond */
		
				return CO_WAIT;
			}
		} while ( 0 );
		/* 5 */
		data_reset( peek__ut_data_1, var__ut_array_3 );
		assert_u32_eq( data_get_dword( var__ut_array_1 ), data_get_dword( var__ut_array_3 ));

		data_set_dword( var__ut_array_0, data_get_dword( var__ut_array_2 ));
		data_set_dword( var__ut_array_2, 0 );

		data_set_float( var__ut_float, data_get_float( var__ut_float ) + 0.25 );
		data_reset( peek__ut_data_1, var__ut_float );
		do {
			/* wait */
			*co_p = &&L__2;

			L__2:
			if (!( data_get_changed( peek__ut_data_1, var__ut_float ))) { /* cond */
		
				return CO_WAIT;
			}
		} while ( 0 );
	}
	assert_u32_eq( 0x55555555, data_get_dword( var__ut_array_0 ));

	/* Auxiliary operations */
	data_set_all_changed( peek__ut_data_1 );
	assert(( data_get_changed( peek__ut_data_1, var__ut_word )
	&& data_get_changed( peek__ut_data_1, var__ut_array_3 )
	&& data_get_changed( peek__ut_data_1, var__ut_float )
	&& !data_get_changed( peek__ut_data_1, var__ut_array_1 )
	&& !data_get_changed( peek__ut_data_1, var__ut_array_2 ))
	);
	data_reset_all( peek__ut_data_1 );
	assert_not( data_get_changed_any( peek__ut_data_1 ));
	data_set_changed( var__ut_byte );
	assert_not( data_get_changed_any( peek__ut_data_1 ));
	data_set_changed( var__ut_float );
	assert( data_get_changed_any( peek__ut_data_1 ));

	do {
		/* yield */
		*co_p = &&L__3;
	
		return CO_YIELD;

		L__3:;
	} while ( 0 );

	data_clear_watch( peek__ut_data_1 );
	assert_not( data_get_changed_any( peek__ut_data_1 ));
	data_watch_array( peek__ut_data_1, _ut_data_array_watch );
	data_set_changed( var__ut_float );
	data_set_changed( var__ut_word );
	data_set_changed( var__ut_array_0 );
	assert_not( data_get_changed_any( peek__ut_data_1 ));
	data_set_changed( var__ut_array_1 );
	assert( data_get_changed( peek__ut_data_1, var__ut_array_1 ));
	data_set_changed( var__ut_array_2 );
	assert( data_get_changed( peek__ut_data_1, var__ut_array_2 ));
	data_set_changed( var__ut_array_3 );
	assert( data_get_changed( peek__ut_data_1, var__ut_array_3 ));
	data_set_changed( var__ut_byte );
	assert( data_get_changed( peek__ut_data_1, var__ut_byte ));

	do {
		/* yield */
		*co_p = &&L__4;
	
		return CO_YIELD;

		L__4:;
	} while ( 0 );

	assert_u32_eq( var__ut_array, data_atovar( data_vartoa( var__ut_array_0 )));
	assert_str_eq( "_ut_byte", data_vartoa( data_atovar( "_ut_byte" )));

	i = 0x00ABCDEF;
	data_set( var__ut_array_3, &i );
	assert_str_eq( "0x00ABCDEF", data_get_string( __str, var__ut_array_3 ));
	data_set_string( var__ut_float, "8080.02" );
	assert_str_eq( "8080.02", data_get_string( __str, var__ut_float ));

	assert_str_eq( "word", data_get_type( var__ut_word ));
	/* end */
	*co_p = &&L__END__ut_data_1;

	L__END__ut_data_1:
	
	return CO_END;
}