Esempio n. 1
0
int
main(void) {
    setvbuf(stdin, 0, _IOFBF, 1024*1024);

    long stdin_size = get_file_size(stdin);
    uint8_t *buffer = calloc(stdin_size + LINE_LENGTH, 1);
    assert(buffer);
    lookup_t lookup;
    pthread_mutex_t mutex;
    job_t *job = 0;

    init_lookup(
            (const uint8_t *)"acbdghkmnsrutwvy",
            (const uint8_t *)"TGVHCDMKNSYAAWBR",
            &lookup);

    pthread_mutex_init(&mutex, 0);

    uint8_t *current = buffer;
    uint8_t *end = buffer + stdin_size;
    uint8_t *header_begin = 0;
    uint8_t *header_end = 0;
    uint8_t *body_begin = 0;

    while (fgets_unlocked((char *)current, end - current, stdin)) {
        if (current[0] == '>') {
            if (body_begin != 0) {
                job = do_process_block(
                        header_begin, header_end,
                        body_begin, current,
                        &lookup,
                        &mutex,
                        job);
            }
            size_t len = strlen((const char *)current);
            header_begin = current;
            header_end = current + len;
            current += len;
            body_begin = current;
        } else {
            if (current[LINE_LENGTH] == '\n') {
                current += LINE_LENGTH;
            } else {
                size_t len = strlen((const char *)current);
                if (current[len - 1] == '\n') {
                    --len;
                }
                current += len;
            }
        }
    }

    if (body_begin != 0) {
        job = do_process_block(
                header_begin, header_end,
                body_begin, current,
                &lookup,
                &mutex,
                job);
    }

    while (job) {
        pthread_join(job->thread, 0);

        if (job->free_buffer) {
            free(job->buffer);
        }
        job = job->prev_job;
    }

    free(buffer);

    return 0;
}
int revcomp_main(void) {

    //setvbuf(input_file, 0, _IOFBF, 1024*1024);

    //long stdin_size = get_file_size(input_file);

    long lSize;
    size_t result;
    struct rqst_struct rqst;

    rqst.bytes = MAXSIZE;
    rqst.pid = PROC_ID;
    rqst.id = CHUNK_ID;

    lSize = rqst.bytes;

    fprintf(stdout, "entering revcomp_main \n");

    // copy the file into the buffer:
    uint8_t *buffer =  pnvread(lSize,&rqst);

    //uint8_t *buffer = calloc(stdin_size + LINE_LENGTH, 1);
    assert(buffer);
    lookup_t lookup;
    pthread_mutex_t mutex;
    job_t *job = 0;

    init_lookup(
        (const uint8_t *)"acbdghkmnsrutwvy",
        (const uint8_t *)"TGVHCDMKNSYAAWBR",
        &lookup);

    pthread_mutex_init(&mutex, 0);

    uint8_t *current = buffer;
    uint8_t *end = buffer + lSize;
    uint8_t *header_begin = 0;
    uint8_t *header_end = 0;
    uint8_t *body_begin = 0;


    fprintf(stderr,"Current %s \n",current);


    if (current[0] == '>') {
        if (body_begin != 0) {
            job = do_process_block(
                      header_begin, header_end,
                      body_begin, current,
                      &lookup,
                      &mutex,
                      job);
        }
        size_t len = strlen((const char *)current);
        header_begin = current;
        header_end = current + len;
        current += len;
        body_begin = current;
    } else {
        if (current[LINE_LENGTH] == '\n') {
            current += LINE_LENGTH;
        } else {
            size_t len = strlen((const char *)current);
            if (current[len - 1] == '\n') {
                --len;
            }
            current += len;
        }
    }

    if (body_begin != 0) {
        job = do_process_block(
                  header_begin, header_end,
                  body_begin, current,
                  &lookup,
                  &mutex,
                  job);
    }

    while (job) {
        pthread_join(job->thread, 0);

        if (job->free_buffer) {
            nv_free(job->buffer);
        }
        job = job->prev_job;
    }

    fprintf(stdout, "revcomp main returning \n");

    /*free(buffer);*/

    return 0;
}