- int r_arch,
- void *src, void *dst) {
- gras_dd_cat_scalar_t scal = type->category.scalar_data;
- int cpt;
- const void *r_data;
- void *l_data;
- unsigned long r_size, l_size;
- /* Hexadecimal displayer
- union {
- char c[sizeof(int)];
- int i;
- } tester;
- */
-
- xbt_assert(type->category_code == e_gras_datadesc_type_cat_scalar);
- xbt_assert(r_arch != GRAS_THISARCH);
-
- r_size = type->size[r_arch];
- l_size = type->size[GRAS_THISARCH];
- DEBUG4("r_size=%lu l_size=%lu, src=%p dst=%p",
- r_size,l_size,src,dst);
-
- DEBUG2("remote=%c local=%c", gras_arches[r_arch].endian?'B':'l',
- gras_arches[GRAS_THISARCH].endian?'B':'l');
-
- if(r_size != l_size) {
- for(cpt = 0, r_data = src, l_data = dst;
- cpt < count;
- cpt++,
- r_data = (char *)r_data + r_size,
- l_data = (char *)l_data + l_size) {
-
- /*
- fprintf(stderr,"r_data=");
- for (cpt=0; cpt<r_size; cpt++) {
- tester.i=0;
- tester.c[0]= ((char*)r_data)[cpt];
- fprintf(stderr,"\\%02x", tester.i);
+ int r_arch, void *src, void *dst)
+{
+ gras_dd_cat_scalar_t scal = type->category.scalar_data;
+ int cpt;
+ const void *r_data;
+ void *l_data;
+ unsigned long r_size, l_size;
+ /* Hexadecimal displayer
+ union {
+ char c[sizeof(int)];
+ int i;
+ } tester;
+ */
+
+ xbt_assert(type->category_code == e_gras_datadesc_type_cat_scalar);
+ xbt_assert(r_arch != GRAS_THISARCH);
+
+ r_size = type->size[r_arch];
+ l_size = type->size[GRAS_THISARCH];
+ XBT_DEBUG("r_size=%lu l_size=%lu, src=%p dst=%p", r_size, l_size, src,
+ dst);
+
+ XBT_DEBUG("remote=%c local=%c", gras_arches[r_arch].endian ? 'B' : 'l',
+ gras_arches[GRAS_THISARCH].endian ? 'B' : 'l');
+
+ if (r_size != l_size) {
+ for (cpt = 0, r_data = src, l_data = dst;
+ cpt < count;
+ cpt++,
+ r_data = (char *) r_data + r_size,
+ l_data = (char *) l_data + l_size) {
+
+ /*
+ fprintf(stderr,"r_data=");
+ for (cpt=0; cpt<r_size; cpt++) {
+ tester.i=0;
+ tester.c[0]= ((char*)r_data)[cpt];
+ fprintf(stderr,"\\%02x", tester.i);
+ }
+ fprintf(stderr,"\n");
+ */
+
+ /* Resize that damn integer, pal */
+
+ unsigned char *l_sign, *r_sign;
+ int padding;
+ int sizeChange = l_size - r_size;
+ int lowOrderFirst = !gras_arches[r_arch].endian ||
+ gras_arches[r_arch].endian == gras_arches[GRAS_THISARCH].endian;
+
+ XBT_DEBUG("Resize integer %d from %lu @%p to %lu @%p",
+ cpt, r_size, r_data, l_size, l_data);
+ xbt_assert(r_data != l_data, "Impossible to resize in place");
+
+ if (sizeChange < 0) {
+ XBT_DEBUG("Truncate %d bytes (%s,%s)", -sizeChange,
+ lowOrderFirst ? "lowOrderFirst" : "bigOrderFirst",
+ scal.encoding ==
+ e_gras_dd_scalar_encoding_sint ? "signed" : "unsigned");
+ /* Truncate high-order bytes. */
+ memcpy(l_data,
+ gras_arches[r_arch].endian ? ((char *) r_data - sizeChange)
+ : r_data, l_size);
+
+ if (scal.encoding == e_gras_dd_scalar_encoding_sint) {
+ XBT_DEBUG("This is signed");
+ /* Make sure the high order bit of r_data and l_data are the same */
+ l_sign = gras_arches[GRAS_THISARCH].endian
+ ? ((unsigned char *) l_data + l_size - 1)
+ : (unsigned char *) l_data;
+ r_sign = gras_arches[r_arch].endian
+ ? ((unsigned char *) r_data + r_size - 1)
+ : (unsigned char *) r_data;
+ XBT_DEBUG("This is signed (r_sign=%c l_sign=%c", *r_sign, *l_sign);
+
+ if ((*r_sign > 127) != (*l_sign > 127)) {
+ if (*r_sign > 127)
+ *l_sign += 128;
+ else
+ *l_sign -= 128;
+ }
+ }
+ } else {
+ XBT_DEBUG("Extend %d bytes", sizeChange);
+ if (scal.encoding != e_gras_dd_scalar_encoding_sint) {
+ XBT_DEBUG("This is signed");
+ padding = 0; /* pad unsigned with 0 */
+ } else {
+ /* extend sign */
+ r_sign =
+ gras_arches[r_arch].endian ? ((unsigned char *) r_data +
+ r_size - 1)
+ : (unsigned char *) r_data;
+ padding = (*r_sign > 127) ? 0xff : 0;
+ }
+
+ memset(l_data, padding, l_size);
+ memcpy(!gras_arches[r_arch].endian ? l_data
+ : ((char *) l_data + sizeChange), r_data, r_size);
+
+ /*
+ fprintf(stderr,"r_data=");
+ for (cpt=0; cpt<r_size; cpt++) {
+ tester.i=0;
+ tester.c[0] = ((char*)r_data)[cpt];
+ fprintf(stderr,"\\%02x", tester.i);
+ }
+ fprintf(stderr,"\n");
+
+ fprintf(stderr,"l_data=");
+ for (cpt=0; cpt<l_size; cpt++) {
+ tester.i=0;
+ tester.c[0]= ((char*)l_data)[cpt];
+ fprintf(stderr,"\\%02x", tester.i);
+ } fprintf(stderr,"\n");
+ */