Skip to content

Commit 974a3fe

Browse files
committed
SAS reader: fix value labels for negative numbers
1 parent fdf4e1e commit 974a3fe

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/sas/readstat_sas7bcat_read.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,12 @@ static readstat_error_t sas7bcat_parse_value_labels(const char *value_start, siz
107107
sas_assign_tag(&value, (val >> 40));
108108
} else {
109109
memcpy(&dval, &val, 8);
110-
dval *= -1.0;
110+
if (dval > 0.0) {
111+
val = ~val;
112+
memcpy(&dval, &val, 8);
113+
} else {
114+
dval *= -1.0;
115+
}
111116
}
112117

113118
value.v.double_value = dval;

src/sas/readstat_sas7bcat_write.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,14 @@ static sas7bcat_block_t *sas7bcat_block_for_label_set(readstat_label_set_t *r_la
7676
memcpy(&lbp1[14], value_label->string_key, string_len);
7777
} else {
7878
uint64_t big_endian_value;
79-
double double_value = -1.0 * value_label->double_key;
80-
memcpy(&big_endian_value, &double_value, sizeof(double));
79+
double double_value = value_label->double_key;
80+
if (double_value >= 0.0) {
81+
double_value *= -1.0;
82+
memcpy(&big_endian_value, &double_value, sizeof(double));
83+
} else {
84+
memcpy(&big_endian_value, &double_value, sizeof(double));
85+
big_endian_value = ~big_endian_value;
86+
}
8187
if (machine_is_little_endian()) {
8288
big_endian_value = byteswap8(big_endian_value);
8389
}

0 commit comments

Comments
 (0)