|
NCBI Home IEB Home C Toolkit docs C++ Toolkit source browser C Toolkit source browser (2) |
NCBI C Toolkit Cross ReferenceC/algo/blast/api/blast_message_api.c |
source navigation diff markup identifier search freetext search file search |
1 /* $Id: blast_message_api.c,v 1.2 2006/04/26 14:11:33 kans Exp $
2 ***************************************************************************
3 * *
4 * COPYRIGHT NOTICE *
5 * *
6 * This software/database is categorized as "United States Government *
7 * Work" under the terms of the United States Copyright Act. It was *
8 * produced as part of the author's official duties as a Government *
9 * employee and thus can not be copyrighted. This software/database is *
10 * freely available to the public for use without a copyright notice. *
11 * Restrictions can not be placed on its present or future use. *
12 * *
13 * Although all reasonable efforts have been taken to ensure the accuracy *
14 * and reliability of the software and data, the National Library of *
15 * Medicine (NLM) and the U.S. Government do not and can not warrant the *
16 * performance or results that may be obtained by using this software, *
17 * data, or derivative works thereof. The NLM and the U.S. Government *
18 * disclaim any and all warranties, expressed or implied, as to the *
19 * performance, merchantability or fitness for any particular purpose or *
20 * use. *
21 * *
22 * In any work or product derived from this material, proper attribution *
23 * of the author(s) as the source of the software or data would be *
24 * appreciated. *
25 * *
26 * Author: Tom Madden *
27 **************************************************************************/
28
29 /** @file blast_message_api.c
30 * Produces messages for the C API, using the internal structure from core.
31 */
32
33 #include <sequtil.h>
34 #include <blfmtutl.h>
35 #include <algo/blast/api/blast_message_api.h>
36 #include <algo/blast/core/blast_message.h>
37
38 /** @addtogroup CToolkitAlgoBlast
39 *
40 * @{
41 */
42
43 SBlastMessage* SBlastMessageFree(SBlastMessage* message)
44 {
45 SBlastMessage* var = message;
46 SBlastMessage* next = NULL;
47
48 while (var)
49 {
50 next = var->next;
51 sfree((var->message));
52 SeqIdSetFree(var->query_id);
53 var = next;
54 }
55
56 return NULL;
57 }
58
59 void SBlastMessageWrite(SBlastMessage** blast_message, ErrSev sev, const char* message, SeqId* seqid, Boolean believe_query)
60 {
61 SBlastMessage* new_message = (SBlastMessage*) calloc(1, sizeof(SBlastMessage));
62 ASSERT(blast_message);
63
64 new_message->sev = sev;
65 new_message->message = strdup(message);
66 if (seqid)
67 {
68 new_message->query_id = SeqIdDup(seqid);
69 new_message->believe_query = believe_query;
70 }
71
72 if (*blast_message)
73 {
74 SBlastMessage* var = *blast_message;
75 while (var->next)
76 var = var->next;
77 var->next = new_message;
78 }
79 else
80 {
81 *blast_message = new_message;
82 }
83
84 return;
85 }
86
87 SBlastMessage* SBlastMessageDup(SBlastMessage* old)
88 {
89 SBlastMessage* retval = NULL;
90
91 while (old)
92 {
93 SBlastMessageWrite(&retval, old->sev, old->message, old->query_id, old->believe_query);
94 old = old->next;
95 }
96 return retval;
97 }
98
99
100 ErrSev s_EBlastSeverity2ErrSev(EBlastSeverity severity)
101 {
102 ErrSev retval = SEV_NONE;
103
104 switch (severity)
105 {
106 case eBlastSevInfo:
107 retval = SEV_INFO;
108 break;
109 case eBlastSevWarning:
110 retval = SEV_WARNING;
111 break;
112 case eBlastSevError:
113 retval = SEV_ERROR;
114 break;
115 case eBlastSevFatal:
116 retval = SEV_FATAL;
117 break;
118 }
119
120 return retval;
121
122 }
123
124 SeqLoc* s_Context2SeqLoc(int context, SeqLoc* query_slp, const BlastQueryInfo* query_info)
125 {
126 SeqLoc* slp = NULL;
127
128 if (context != -1 && query_slp != NULL && query_info != NULL)
129 {
130 int query_num = query_info->contexts[context].query_index;
131 int index = 0;
132 while (query_slp)
133 {
134 if (index == query_num)
135 {
136 slp = query_slp;
137 break;
138 }
139 query_slp = query_slp->next;
140 index++;
141 }
142
143
144 }
145 return slp;
146 }
147
148 /** Compares two SBlastMessage elements and returns TRUE if they are identical.
149 * FALSE is returned if they are not or one or both is NULL.
150 * @param message_1 first object to compare [in]
151 * @param message_2 second object to compare [in]
152 * @return TRUE if identical
153 */
154 Boolean s_SBlastMessageCompare(SBlastMessage* message_1, SBlastMessage* message_2)
155 {
156 if (message_1 == NULL || message_2 == NULL)
157 return FALSE;
158
159 if (message_1->sev != message_2->sev)
160 return FALSE;
161
162 if (message_1->message == NULL || message_2->message == NULL)
163 return FALSE;
164
165 if (StringCmp(message_1->message, message_2->message))
166 return FALSE;
167
168 if ((message_1->query_id == NULL && message_2->query_id) ||
169 (message_1->query_id && message_2->query_id == NULL))
170 return FALSE;
171
172 if (message_1->query_id && message_2->query_id &&
173 SeqIdComp(message_1->query_id, message_2->query_id) != SIC_YES)
174 return FALSE;
175
176 if (message_1->believe_query != message_2->believe_query)
177 return FALSE;
178
179 return TRUE;
180 }
181
182 SBlastMessage* Blast_MessageToSBlastMessage(const Blast_Message* old, SeqLoc* query_slp, const BlastQueryInfo* query_info, Boolean believe_query)
183 {
184 SBlastMessage* retval = NULL;
185 SBlastMessage* last = NULL;
186 SBlastMessage* var = NULL;
187
188 while (old)
189 {
190 SeqId* sip = NULL;
191 SeqLoc* slp = s_Context2SeqLoc(old->context, query_slp, query_info);
192
193 if (slp)
194 sip = SeqLocId(slp);
195
196 SBlastMessageWrite(&retval, s_EBlastSeverity2ErrSev(old->severity), old->message, sip, believe_query);
197 old = old->next;
198 }
199
200 /*
201 This loop removes a redundant message only if it is the next message. It removes the second one so that
202 the head of the list is not changed.
203 */
204 var = retval;
205 while (var)
206 {
207 if (s_SBlastMessageCompare(var, last) == TRUE)
208 {
209 last->next = var->next;
210 var->next = NULL;
211 SBlastMessageFree(var);
212 var = last->next;
213 }
214 else
215 {
216 last = var;
217 var = var->next;
218 }
219 }
220
221 return retval;
222 }
223
224 ErrSev SBlastMessageErrPost(const SBlastMessage* message)
225 {
226 ErrSev max_sev = SEV_NONE;
227 Uint1 err_id = 0;
228
229 while (message)
230 {
231 err_id = BlastSetUserErrorString(NULL, message->query_id, message->believe_query);
232 ErrPostEx(message->sev, 0, 0, message->message);
233 BlastDeleteUserErrorString(err_id);
234 err_id = 0;
235 max_sev = MAX(max_sev, message->sev);
236 message = message->next;
237 }
238 return max_sev;
239 }
240
241
242
243 /* @} */
244
245 |
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more information. |