作成例

本付録では、ProSortが提供するAPIを利用してCプログラムを作成する例を紹介します。

1. SORT演算

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void
print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16バイト・レコード */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'
int
main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (1,8,CH,A)\n";

    /* スクリプトの設定 */
    rc = prosort_setup (script, NULL, 0, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    /* レコートの入力 */
    for (i = 0; i < 100; i++) {

        for (j = 0; j < REC_LEN - 1; j++)
            buf[j] = RAND;
        buf[j] = 0;

        rc = prosort_release_record (ps_ctx, buf, REC_LEN);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
    }
    /* レコートの入力完了 */
    prosort_release_end (ps_ctx);

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

2. COPY演算

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void
print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16バイト・レコート */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'

static int total_record = 0;
static char buf[16];

/* レコート入力コールバック関数 */
int copy_source_func (char **record, int *len)
{
    int j;
    if (total_record >= 100) {
        /* 終了 */
        return 0;
    }
    total_record++;
    for (j = 0; j < 15; j++)
        buf[j] = RAND;
    buf[j] = 0;

    *record = buf;
    *len = REC_LEN;
    return 1;
}

int
main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    int (*source[1])(char **, int *);

    /* 関数の配列をsetupに入力します */
    source[0] = copy_source_func;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (COPY)\n";

    /* スクリプトの設定 */
    rc = prosort_setup (script, source, 1, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

3. MERGE演算

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void
print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16バイト・レコート */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'

static int total_record1 = 0;
static char buf1[16];

/* レコート入力コールバック関数 */
int merge_source_func1 (char **record, int *len)
{
    int j;
    if (total_record1 >= 100) {
        /* 終了 */
        return 0;
    }
    total_record1++;
    for (j = 0; j < 15; j++)
        buf1[j] = RAND;
    buf1[j] = 0;

    *record = buf1;
    *len = REC_LEN;
    return 1;
}

static int total_record2 = 0;
static char buf2[16];

/* レコート入力コールバック関数 */
int merge_source_func2 (char **record, int *len)
{
    int j;
    if (total_record2 >= 100) {
        /* 終了 */
        return 0;
    }
    total_record2++;
    for (j = 0; j < 15; j++)
        buf2[j] = RAND;
    buf2[j] = 0;

    *record = buf2;
    *len = REC_LEN;
    return 1;
}

int
main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    int (*source[2])(char **, int *);

    /* 関数の配列をsetupに入力します */
    source[0] = merge_source_func1;
    source[1] = merge_source_func2;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "MERGE FIELDS = (1,16,CH,A)\n";

    /* スクリプトの設定 */
    rc = prosort_setup (script, source, 2, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

4. OUTFIL演算

include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void
print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16バイト・レコート */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'
int
main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (1,8,CH,A)\n"
                         "OUTFIL FNAMES = (a), OUTREC=(1,8)\n";

    /* スクリプトの設定 */
    rc = prosort_setup (script, NULL, 0, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    /* レコートの入力 */
    for (i = 0; i < 100; i++) {

        for (j = 0; j < REC_LEN - 1; j++)
            buf[j] = RAND;
        buf[j] = 0;

        rc = prosort_release_record (ps_ctx, buf, REC_LEN);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
    }
    /* レコートの入力完了 */
    prosort_release_end (ps_ctx);

    do {
        char outbuf0[REC_LEN];
        char outbuf1[REC_LEN];
        char *outbufs[2];
        unsigned int len[2];

        outbufs[0] = outbuf0;
        outbufs[1] = outbuf1;

        len[0] = REC_LEN;
        len[1] = REC_LEN;
        rc = prosort_return_record (ps_ctx, outbufs, len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len[0] == 0 && len[1] == 0)
            break;
        printf ("%s\n", outbuf0);
        printf ("%s\n", outbuf1);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

5. prosort_run_script

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

int
main(int argc, char argv)
{
    int rc;
    char script =
        "DEFREC FIXED,SIZE=256 "
        "MEMORY 500M "
        "INFILE = (x1,100M, x2, 100M, x3, 100M, x4, 100M) "
        "SORT FIELDS=(1,13,AC,A) "
        "OUTFIL FNAMES = xresult ";

    rc = prosort_run_script (script);*
    if (rc < 0) {
        fprintf(stderr,"Error[%d]:\n", rc);
        fprintf(stderr,"%s\n", ps_err_code_to_cause(rc));
        fprintf(stderr,"%s\n", ps_err_code_to_action(rc));

        exit (rc);
    }

    return 0;
}