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; }
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; }