コード例 #1
0
ファイル: readstat_dta_write.c プロジェクト: evanmiller/haven
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;
}
コード例 #2
0
ファイル: readstat_dta_write.c プロジェクト: scottme/ReadStat
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;
}