static readstat_error_t dta_end_data(void *writer_ctx) { readstat_writer_t *writer = (readstat_writer_t *)writer_ctx; readstat_error_t retval = READSTAT_OK; retval = dta_emit_value_labels(writer, writer->module_ctx); dta_ctx_free(writer->module_ctx); writer->module_ctx = NULL; return retval; }
static readstat_error_t dta_begin_data(void *writer_ctx) { readstat_writer_t *writer = (readstat_writer_t *)writer_ctx; readstat_error_t error = READSTAT_OK; dta_ctx_t *ctx = dta_ctx_alloc(NULL); dta_header_t header; memset(&header, 0, sizeof(dta_header_t)); header.ds_format = 111; header.byteorder = machine_is_little_endian() ? DTA_LOHI : DTA_HILO; header.filetype = 0x01; header.unused = 0x00; header.nvar = writer->variables_count; header.nobs = writer->row_count; error = readstat_write_bytes(writer, &header, sizeof(dta_header_t)); if (error != READSTAT_OK) goto cleanup; error = dta_ctx_init(ctx, header.nvar, header.nobs, header.byteorder, header.ds_format); if (error != READSTAT_OK) goto cleanup; error = dta_emit_header_data_label(writer); if (error != READSTAT_OK) goto cleanup; error = dta_emit_header_time_stamp(writer); if (error != READSTAT_OK) goto cleanup; error = dta_emit_descriptors(writer, ctx); if (error != READSTAT_OK) goto cleanup; error = dta_emit_variable_labels(writer, ctx); if (error != READSTAT_OK) goto cleanup; error = dta_emit_expansion_fields(writer, ctx); if (error != READSTAT_OK) goto cleanup; cleanup: if (error != READSTAT_OK) { dta_ctx_free(ctx); } else { writer->module_ctx = ctx; } return error; }