File: samview.c

package info (click to toggle)
sra-sdk 3.0.3%2Bdfsg-6~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 165,852 kB
  • sloc: ansic: 374,775; cpp: 232,734; perl: 8,959; java: 6,253; sh: 6,032; python: 3,890; makefile: 1,046; yacc: 703; xml: 310; lex: 235
file content (123 lines) | stat: -rw-r--r-- 3,476 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* ===========================================================================
 *
 *                            PUBLIC DOMAIN NOTICE
 *               National Center for Biotechnology Information
 *
 *  This software/database is a "United States Government Work" under the
 *  terms of the United States Copyright Act.  It was written as part of
 *  the author's official duties as a United States Government employee and
 *  thus cannot be copyrighted.  This software/database is freely available
 *  to the public for use. The National Library of Medicine and the U.S.
 *  Government have not placed any restriction on its use or reproduction.
 *
 *  Although all reasonable efforts have been taken to ensure the accuracy
 *  and reliability of the software and data, the NLM and the U.S.
 *  Government do not and cannot warrant the performance or results that
 *  may be obtained by using this software or data. The NLM and the U.S.
 *  Government disclaim all warranties, express or implied, including
 *  warranties of performance, merchantability or fitness for any particular
 *  purpose.
 *
 *  Please cite the author in any work or product based on this material.
 *
 * ===========================================================================
 *
 * Primarily, this exists to drive our BAM/SAM parsing code
 */

#include <kapp/args.h>
#include <kapp/main.h>
#include <klib/log.h>
#include <kfs/file.h>

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

#include "bam.h"

#include <klib/rc.h>

static void writeHeader(BAM_File const *const bam)
{
    char const *header = NULL;
    size_t hsize = 0;

    BAM_FileGetHeaderText(bam, &header, &hsize);
    fwrite(header, 1, hsize, stdout);
}

static char *buffer;
static size_t buffer_size;

static rc_t writeSAM(BAM_Alignment const *const rec)
{
    if (buffer_size == 0) {
        buffer_size = 64 * 1024;
        buffer = malloc(buffer_size);
        if (buffer == NULL)
            return RC(rcAlign, rcRow, rcWriting, rcMemory, rcExhausted);
    }
    for ( ; ; ) {
        size_t actsize = 0;
        rc_t const rc = BAM_AlignmentFormatSAM(rec, &actsize, buffer_size, buffer);
        if (rc == 0) {
            fwrite(buffer, 1, actsize, stdout);
            return 0;
        }
        if (GetRCObject(rc) == (int)rcData && GetRCState(rc) == (int)rcExcessive) {
            void *tmp = realloc(buffer, buffer_size * 2);
            if (tmp == NULL)
                return RC(rcAlign, rcRow, rcWriting, rcMemory, rcExhausted);
            buffer_size *= 2;
            buffer = tmp;
        }
        else
            return rc;
    }
}

static
void samview(char const path[])
{
    BAM_File const *bam = NULL;
    rc_t rc = BAM_FileMake(&bam, NULL, NULL, path);

    if (rc == 0) {
        BAM_Alignment const *rec = NULL;

        writeHeader(bam);
        while ((rc = BAM_FileRead3(bam, &rec)) == 0) {
            rc_t const rc2 = writeSAM(rec);
            BAM_AlignmentRelease(rec);
            if (rc2)
                break;
        }
        BAM_FileRelease(bam);
        if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
            rc = 0;
    }
    if (rc)
        LOGERR(klogWarn, rc, "Final RC");
}

rc_t CC UsageSummary(char const *name)
{
    return 0;
}

rc_t CC Usage(Args const *args)
{
    return 0;
}

rc_t CC KMain(int argc, char *argv[])
{
    if (argc == 1) {
        samview("/dev/stdin");
        return 0;
    }
    while (--argc) {
        samview(*++argv);
    }
    return 0;
}