diff --git a/src/obidmscolumn.c b/src/obidmscolumn.c index df946fe..1fb5005 100644 --- a/src/obidmscolumn.c +++ b/src/obidmscolumn.c @@ -600,6 +600,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, int column_dir_file_descriptor; size_t header_size; size_t data_size; + size_t i, nb_elements; new_column = NULL; @@ -730,6 +731,43 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, strncpy(header->name, column_name, OBIDMS_MAX_COLNAME); + // Fill the data with NA values + nb_elements = nb_lines*nb_elements_per_line; + switch (type) { + case OBI_VOID: // TODO; + break; + + case OBI_INT: for (i=0;idata)) + i) = OBIInt_NA; + } + break; + + case OBI_FLOAT: for (i=0;idata)) + i) = OBIFloat_NA; + } + break; + + case OBI_BOOL: for (i=0;idata)) + i) = OBIBool_NA; + } + break; + + case OBI_CHAR: for (i=0;idata)) + i) = OBIChar_NA; + } + break; + + case OBI_IDX: for (i=0;idata)) + i) = OBIIdx_NA; + } + break; + } + free(column_file_name); close(column_file_descriptor); diff --git a/src/obitypes.h b/src/obitypes.h index 92cd124..dd09133 100644 --- a/src/obitypes.h +++ b/src/obitypes.h @@ -14,8 +14,9 @@ #define OBIInt_NA (INT32_MIN) -#define OBIFloat_NA (NAN) #define OBIIdx_NA (SIZE_MAX) +#define OBIFloat_NA (float_NA()) +#define OBIChar_NA (0) // TODO not sure about this one as it can be impossible to distinguish from uninitialized values /** @@ -47,6 +48,22 @@ typedef char obichar_t; typedef size_t obiidx_t; +typedef union +{ + double value; + unsigned int word[2]; +} ieee_double; + + +static double float_NA(void) // as defined in R +{ + volatile ieee_double x; + x.word[0] = 0x7ff00000; + x.word[1] = 1954; + return x.value; +} + + /** * @brief returns the memory size in bytes of an OBIType *