home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Snippets / EMBL Search / Sources / xref.c < prev   
Encoding:
C/C++ Source or Header  |  1992-05-04  |  5.6 KB  |  255 lines  |  [TEXT/KAHL]

  1. /*
  2. *********************************************************************
  3. *    
  4. *    XRef.c
  5. *    Handling of cross-references
  6. *
  7. *    Rainer Fuchs
  8. *    EMBL Data Library
  9. *    Postfach 10.2209
  10. *    D-6900 Heidelberg, FRG
  11. *    E-mail: fuchs@embl-heidelberg.de
  12. *
  13. *    Copyright © 1992 EMBL Data Library
  14. *        
  15. **********************************************************************
  16. *    
  17. */ 
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22.  
  23. #include "EMBL-Search.h"
  24. #include "EMBL-Search.rsrc.h"
  25.  
  26. /*
  27. ******************************* Prototypes ***************************
  28. */
  29.  
  30. #include "xref.h"
  31. #include "util.h"
  32. #include "hitstorage.h"
  33. #include "search.h"
  34. #include "sequence.h"
  35.  
  36. static Boolean NewXRefBuf(XRefHdl *new);
  37. static void RemoveXRefsFromMenu(void);
  38.  
  39.  
  40.  
  41. /*
  42. ******************************** Global variables *****************
  43. */
  44.  
  45. extern MenuHandle    gMenu[MENUNR];
  46. extern WDRec        gWindows[MAXWIN];
  47. extern IndexFiles    gFileList;
  48. extern DBInfo        gDBInfo[DB_NUM];
  49.  
  50.  
  51. /**************************************
  52. *    When user selected an item from the XREF menu we do an acc# search for
  53. *    this entry and open a new window.
  54. *    Return value:    TRUE, if successful
  55. *                        FALSE, if an error occurred
  56. */
  57.  
  58. Boolean OpenXRefs(char *name,short dbcode)
  59. {
  60.     char            key[ACCNOLEN+1];
  61.     HitmapHdl    hitmapHdl;
  62.     Boolean        ret;
  63.     ResultHdl    resHdl;
  64.     register short i;
  65.     
  66.     strncpy(key,name,ACCNOLEN);
  67.     key[ACCNOLEN] = EOS;
  68.     
  69.     /* start new hitmap */
  70.     if( !NewHitmap(&hitmapHdl,dbcode) )
  71.         return( ErrorMsg(ERR_MEMORY) );
  72.  
  73.     StartWaitCursor();
  74.     
  75.     /* search for key, populate hitlist with hits */
  76.     ret=FindHits(key,dbcode,hitmapHdl,
  77.                     gDBInfo[dbcode].actrg_recsize,gFileList.acnumTrgFName,
  78.                     gDBInfo[dbcode].actrg_nrec,
  79.                     general_compare,gFileList.acnumHitFName,
  80.                     gDBInfo[dbcode].actrg_recsize-2*sizeof(long));
  81.  
  82.     if(!ret) { /* not found or error */
  83.         DisposHandle((Handle)hitmapHdl);
  84.         return( ErrorMsg(ERR_NOTFOUND) );
  85.     }
  86.     else {    /* found! */
  87.         /* get a new result record and initialise it */
  88.         if( !InitResultRec(&resHdl,dbcode,hitmapHdl,NULL) ) {
  89.             DisposHandle((Handle)hitmapHdl);
  90.             return( ErrorMsg(ERR_MEMORY) );
  91.         }
  92.         else {
  93.             /* fill short description buffer */
  94.             StartWaitCursor();
  95.             ret = FillDEBuffer(resHdl,0,FALSE);
  96.             InitCursor();
  97.             if(ret) {
  98.                 for(i=0;i < (**resHdl).nhits; ++i) {
  99.                     if( (ret=NewSequenceWindow(resHdl,i)) == FALSE )
  100.                         break;
  101.                 }
  102.             }
  103.             DisposeResRec(resHdl);
  104.             InitCursor();
  105.             return(ret);
  106.         }
  107.     }
  108. }
  109.  
  110.  
  111. /**************************************
  112. *    Every DR line passed to this routine is checked for EMBL or SWIS-PROT cros-references.
  113. *    Information from each xref is extracted and stored into an XRefRec.
  114. *    Return value:    TRUE, if successful
  115. *                        FALSE, if an error occurred
  116. */
  117.  
  118. Boolean ParseDRLine(SeqRecHdl seqRecHdl, char *line)
  119. {
  120.     char            *pos1,*pos2,*pos;
  121.     XRefPtr        xrefPtr;
  122.     Boolean        ret;
  123.     SignedByte    oldState;
  124.     Size            newSize;
  125.     char            buf[ACCNOLEN+1];
  126.     short            i,n;
  127.     
  128.     pos1=pos2=NULL;
  129.     
  130.     if( (pos1=strstr(line,"SWISS-PROT")) == NULL &&
  131.          (pos2 = strstr(line,"EMBL")) == NULL )
  132.          return(TRUE);
  133.     else {
  134.         oldState = MyHLock((Handle)seqRecHdl);
  135.         
  136.         /* create a new xref block, if necessary */
  137.         if( (**seqRecHdl).xrefHdl == NULL) {
  138.             if ( !NewXRefBuf(&(**seqRecHdl).xrefHdl) ) {
  139.                 HSetState((Handle)seqRecHdl,oldState);
  140.                 return(ErrorMsg(ERR_MEMORY));
  141.             }
  142.             
  143.             n = 1;
  144.         }
  145.         else {    /* grow xref block */
  146.             newSize = GetHandleSize((Handle)(**seqRecHdl).xrefHdl) + sizeof(XRef);
  147.             SetHandleSize((Handle)(**seqRecHdl).xrefHdl, newSize);
  148.             if(MemError() != noErr)  {
  149.                 HSetState((Handle)seqRecHdl,oldState);
  150.                 return(ErrorMsg(ERR_MEMORY));
  151.             }
  152.             
  153.             n = newSize / sizeof(XRef);
  154.         }
  155.         
  156.         --n;    /* change to C array offset */
  157.         
  158.         HLock((Handle)(**seqRecHdl).xrefHdl);
  159.         xrefPtr = *(**seqRecHdl).xrefHdl;
  160.         
  161.         if (pos1 != NULL) {
  162.             pos = pos1;
  163.             xrefPtr[n].dbcode = DB_SWISS;
  164.         }
  165.         else {
  166.             pos = pos2;
  167.             xrefPtr[n].dbcode = DB_EMBL;
  168.         }
  169.                 
  170.         while(*pos++ != ';') ;    /* skip db name */
  171.         while(isspace(*pos)) ++pos;    /* skip white space */
  172.         for( i=0; *pos != ';' && i < ACCNOLEN; ++pos,++i )
  173.             xrefPtr[n].accno[i] = *pos;
  174.         xrefPtr[n].accno[i] = EOS;
  175.         while(*pos++ != ';') ; /* go to entryname */
  176.         while(isspace(*pos)) ++pos;
  177.         for( i=0; *pos != '.' && i < ENTRYNAMELEN; ++pos,++i)
  178.             xrefPtr[n].ename[i] = *pos;
  179.         xrefPtr[n].ename[i] = EOS;
  180.         
  181.         HUnlock((Handle)(**seqRecHdl).xrefHdl);
  182.         HSetState((Handle)seqRecHdl,oldState);
  183.         
  184.         return(TRUE);
  185.     }
  186. }
  187.  
  188. /**************************************
  189. *    Allocate memory for new xref buffer
  190. *    Return value:    TRUE, if successful
  191. *                        FALSE, if an error occurred
  192. */
  193.  
  194. static Boolean NewXRefBuf(XRefHdl *new)
  195. {
  196.     *new = (XRefHdl)NewHandleClear(sizeof(XRef));
  197.     return( *new != NULL );
  198. }
  199.  
  200.  
  201. /**************************************
  202. *    Add one menu item for each cross-reference to XREF hierarchical menu
  203. */
  204.  
  205. void AddXRefsToMenu(WDPtr wdp)
  206. {
  207.     XRefHdl        xrefHdl;
  208.     SeqRecHdl    seqRecHdl;
  209.     short            nxref;
  210.     short            i;
  211.     char            temp[256];
  212.     SignedByte    oldState;
  213.     
  214.     if(wdp == NULL || ((WindowPeek)wdp)->windowKind != seqW)
  215.         return;
  216.         
  217.     /* remove old xrefs */
  218.     RemoveXRefsFromMenu();
  219.     
  220.     if( (seqRecHdl = (SeqRecHdl)(wdp->userHandle)) == NULL )
  221.         return;
  222.         
  223.     if( (xrefHdl = (**seqRecHdl).xrefHdl) == NULL )
  224.         return;
  225.         
  226.     oldState = MyHLock((Handle)xrefHdl);
  227.     
  228.     nxref = (short)(GetHandleSize((Handle)xrefHdl)/sizeof(XRef));
  229.     for( i = 0; i < nxref; ++i ) {
  230.         strcpy(temp,(*xrefHdl)[i].accno);
  231.         strcat(temp," [");
  232.         strcat(temp,(*xrefHdl)[i].ename);
  233.         strcat(temp,"]");
  234.         CtoPstr(temp);
  235.         AppendMenu(gMenu[XREF],(StringPtr)temp);
  236.         EnableItem(gMenu[XREF],i+2);
  237.     }
  238.     
  239.     HSetState((Handle)xrefHdl,oldState);
  240. }
  241.  
  242. /**************************************
  243. *    Remove all cross-references from XREF menu
  244. */
  245.  
  246. static void RemoveXRefsFromMenu()
  247. {
  248.     short i;
  249.     
  250.     for(i = CountMItems(gMenu[XREF]); i > 2 ; --i)
  251.         DelMenuItem(gMenu[XREF],i);
  252. }
  253.  
  254.  
  255.