source: tags/arb_5.0/ARBDB/adRevCompl.c

Last change on this file was 6100, checked in by westram, 15 years ago
  • fix warning "format not a string literal and no format arguments"
    • GB_export_error → GB_export_error/GB_export_errorf
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.7 KB
Line 
1/*********************************************************************************
2 *  Coded by Ralf Westram (coder@reallysoft.de) in 2001                          *
3 *  Institute of Microbiology (Technical University Munich)                      *
4 *  http://www.mikro.biologie.tu-muenchen.de/                                    *
5 *********************************************************************************/
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <ctype.h>
10
11#include "arbdb.h"
12#include "arbdbt.h"
13
14/* -------------------------------------------------------------------------------- reverse complement functions */
15
16
17
18char GBT_complementNucleotide(char c, char T_or_U)
19{
20    char n = c;
21
22    switch (c)
23    {
24        case 'A': n = T_or_U; break;                    /* A <-> TU */
25        case 'a': n = tolower(T_or_U); break;
26        case 'U':
27        case 'T': n = 'A'; break;
28        case 'u':
29        case 't': n = 'a'; break;
30
31        case 'C': n = 'G'; break;                       /* C <-> G */
32        case 'c': n = 'g'; break;
33        case 'G': n = 'C'; break;
34        case 'g': n = 'c'; break;
35
36        case 'M': n = 'K'; break;                       /* M=A/C <-> TU/G=K */
37        case 'm': n = 'k'; break;
38        case 'K': n = 'M'; break;
39        case 'k': n = 'm'; break;
40
41        case 'R': n = 'Y'; break;                       /* R=A/G <-> TU/C=Y */
42        case 'r': n = 'y'; break;
43        case 'Y': n = 'R'; break;
44        case 'y': n = 'r'; break;
45
46        case 'V': n = 'B'; break;                       /* V=A/C/G <-> TU/G/C=B */
47        case 'v': n = 'b'; break;
48        case 'B': n = 'V'; break;
49        case 'b': n = 'v'; break;
50
51        case 'H': n = 'D'; break;                       /* H=A/C/TU <-> TU/G/A=D */
52        case 'h': n = 'd'; break;
53        case 'D': n = 'H'; break;
54        case 'd': n = 'h'; break;
55
56        case 'S':                                       /* S=C/G <-> G/C=S */
57        case 's':
58        case 'W':                                       /* W=A/TU <-> TU/A=W */
59        case 'w':
60        case 'N':                                       /* N=A/C/G/TU */
61        case 'n':
62        case '.':
63        case '-': break;
64
65        default: break;
66    }
67
68    return n;
69}
70
71char *GBT_reverseNucSequence(const char *s, int len) {
72    char *n = (char*)malloc(len+1);
73    int p;
74
75    if (!n) {
76        GB_memerr();
77        return 0;
78    }
79
80    len--;
81    for (p=0; len>=0; p++,len--) {
82        n[p] = s[len];
83    }
84    n[p] = 0;
85
86    return n;
87}
88char *GBT_complementNucSequence(const char *s, int len, char T_or_U) {
89    char *n = (char*)malloc(len+1);
90    int p;
91
92    for (p=0; p<len; p++) {
93        n[p] = GBT_complementNucleotide(s[p], T_or_U);
94    }
95    n[p] = 0;
96
97    return n;
98}
99
100GB_ERROR GBT_determine_T_or_U(GB_alignment_type alignment_type, char *T_or_U, const char *supposed_target) {
101    switch (alignment_type)
102    {
103        case GB_AT_RNA: *T_or_U = 'U'; break;
104        case GB_AT_DNA: *T_or_U = 'T'; break;
105        default: {
106            *T_or_U = 0;
107            return GB_export_errorf("%s not available for alignment-type", supposed_target);
108        }
109    }
110    return 0;
111}
112
113/* GB_ERROR GBT_reverseComplementNucSequence(char *seq, long length, GB_alignment_type alignment_type) */
114void GBT_reverseComplementNucSequence(char *seq, long length, char T_or_U)
115{
116    long     i,l;
117    /*     char     T_or_U = 0; */
118    /*     GB_ERROR error  = GBT_determine_T_or_U(alignment_type, &T_or_U, "reverse-complement"); */
119
120    /*     if (!error) { */
121    for (i=0,l=length-1; i <= l; i++,l--) {
122        char c = seq[i];
123
124        seq[i] = GBT_complementNucleotide(seq[l], T_or_U);
125        seq[l] = GBT_complementNucleotide(c, T_or_U);
126    }
127    /*     } */
128
129    /*     return error; */
130}
Note: See TracBrowser for help on using the repository browser.