- __padded2cigar(t[2], t[3]);
- if (end < t[2].l) write_cigar(cigar, n_cigar, m_cigar, (t[2].l-end)<<4|4);
- if (n_cigar > 1 && (cigar[0]&0xf) == 4) cigar[1] -= beg<<4;
- if (n_cigar > 1 && (cigar[n_cigar-1]&0xf) == 4) cigar[n_cigar-2] -= cigar[n_cigar-1]>>4<<4;
- for (i = 0; i < n_cigar; ++i) {
+ if (is_padded) {
+ __padded2cigar(t[2]);
+ if (beg && n_cigar > 1) cigar[1] -= beg<<4; // fix the left-hand CIGAR
+ if (end < t[2].l && n_cigar) cigar[n_cigar-1] -= (t[2].l - end)<<4; // fix the right-hand CIGAR
+ } else {
+ // generate flattened CIGAR string
+ for (i = beg, k = pos - 1; i < end; ++i, ++k)
+ t[2].s[i] = t[2].s[i] != '*'? (t[1].s[k] != '*'? 0 : 1) : (t[1].s[k] != '*'? 2 : 6);
+ // generate the proper CIGAR
+ for (i = beg + 1, k = 1, op = t[2].s[beg]; i < end; ++i) {
+ if (op != t[2].s[i]) {
+ write_cigar(cigar, n_cigar, m_cigar, k<<4|op);
+ op = t[2].s[i]; k = 1;
+ } else ++k;
+ }
+ write_cigar(cigar, n_cigar, m_cigar, k<<4|op);
+ // remove unnecessary "P" and possibly merge adjacent operations
+ for (i = 2; i < n_cigar; ++i) {
+ if ((cigar[i]&0xf) != 1 && (cigar[i-1]&0xf) == 6 && (cigar[i-2]&0xf) != 1) {
+ cigar[i-1] = 0;
+ if ((cigar[i]&0xf) == (cigar[i-2]&0xf)) // merge operations
+ cigar[i] += cigar[i-2], cigar[i-2] = 0;
+ }
+ }
+ for (i = k = 0; i < n_cigar; ++i) // squeeze out dumb operations
+ if (cigar[i]) cigar[k++] = cigar[i];
+ n_cigar = k;
+ }
+ if (end < t[2].l) write_cigar(cigar, n_cigar, m_cigar, (t[2].l - end)<<4|4);
+ // write the SAM line for the read
+ kputc('\t', &t[4]); // QNAME has already been written
+ kputw((af[af_i]&1)? 16 : 0, &t[4]); kputc('\t', &t[4]); // FLAG
+ kputsn(t[0].s, t[0].l, &t[4]); kputc('\t', &t[4]); // RNAME
+ kputw(is_padded? pos : p2u[pos-1]+1, &t[4]); // POS
+ kputs("\t60\t", &t[4]); // MAPQ
+ for (i = 0; i < n_cigar; ++i) { // CIGAR