source: branches/stable/SECEDIT/SEC_bonddef.cxx

Last change on this file was 16766, checked in by westram, 6 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.2 KB
Line 
1// ================================================================= //
2//                                                                   //
3//   File      : SEC_bonddef.cxx                                     //
4//   Purpose   :                                                     //
5//                                                                   //
6//   Coded by Ralf Westram (coder@reallysoft.de) in September 2007   //
7//   Institute of Microbiology (Technical University Munich)         //
8//   http://www.arb-home.de/                                         //
9//                                                                   //
10// ================================================================= //
11
12#include "SEC_bonddef.hxx"
13#include "SEC_defs.hxx"
14
15#include <arbdbt.h>
16
17#include <cctype>
18
19void SEC_bond_def::clear() {
20    int i, j;
21    for (i=0; i<SEC_BOND_BASE_CHARS; i++) {
22        for (j=0; j<SEC_BOND_BASE_CHARS; j++) {
23            bond[i][j] = ' ';
24        }
25    }
26}
27
28int SEC_bond_def::get_index(char base) const {
29    if (base == 0) return -1;
30
31    const char *allowed = SEC_BOND_BASE_CHAR;
32    const char *found = strchr(allowed, toupper(base));
33
34    if (!found) return -1;
35
36    int idx = int(found-allowed);
37    sec_assert(idx>=0 && idx<SEC_BOND_BASE_CHARS);
38    return idx;
39}
40
41GB_ERROR SEC_bond_def::insert(const char *pairs, char pair_char) {
42    GB_ERROR error = NULp;
43
44    if (pair_char==0) pair_char = ' ';
45
46    if (!strchr(SEC_BOND_PAIR_CHAR, pair_char)) {
47        error = GBS_global_string("Illegal pair-character '%c' (allowed: '%s')", pair_char, SEC_BOND_PAIR_CHAR);
48    }
49    else {
50        char c1  = 0;
51        int  idx = 0;
52
53        while (1) {
54            char c2 = pairs[idx++];
55
56            if (!c2) { // end of string
57                if (c1) error = "Odd number of characters in pair definition";
58                break;
59            }
60            if (c2 == ' ') continue; // ignore spaces
61            if (c1==0) { c1 = c2; continue; } // store first char
62
63            int i1 = get_index(c1);
64            int i2 = get_index(c2);
65
66            if (i1==-1 || i2==-1) {
67                char ic = i1==-1 ? c1 : c2;
68                error   = GBS_global_string("Illegal base-character '%c' (allowed: '%s')", ic, SEC_BOND_BASE_CHAR);
69                break;
70            }
71            else {
72                bond[i1][i2] = pair_char;
73                bond[i2][i1] = pair_char;
74            }
75            c1 = 0;
76        }
77    }
78    if (error && pair_char != '@') {
79        insert(pairs, '@'); // means error
80    }
81    return error;
82}
83
84char SEC_bond_def::get_bond(char base1, char base2) const {
85    int i1 = get_index(base1);
86    int i2 = get_index(base2);
87
88    if (i1==-1 || i2==-1) {
89        return ' ';
90    }
91    return bond[i1][i2];
92}
93
94char *SEC_bond_def::get_pair_string(char pair_char) {
95    char *str = ARB_alloc<char>(5*5*3+1);
96    char *ins = str;
97
98    for (int i = 0; i<SEC_BOND_BASE_CHARS; ++i) {
99        for (int j = i; j<SEC_BOND_BASE_CHARS; ++j) {
100            if (bond[i][j] == pair_char) {
101                if (ins>str) *ins++ = ' ';
102                *ins++ = SEC_BOND_BASE_CHAR[i];
103                *ins++ = SEC_BOND_BASE_CHAR[j];
104            }
105        }
106    }
107    *ins = 0;
108
109    return str;
110}
111
112
Note: See TracBrowser for help on using the repository browser.