NCBI C Toolkit Cross Reference

C/algo/blast/api/blast_message_api.c


  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 

source navigation ]   [ diff markup ]   [ identifier search ]   [ freetext search ]   [ file search ]  

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.