NCBI C Toolkit Cross Reference

C/demo/asn2xml.c


  1 /*****************************************************************************
  2 *
  3 * $Id: asn2xml.c,v 1.2 2001/08/10 18:56:42 kans Exp $
  4 *
  5 *   asn2xml.c
  6 *
  7 *      This program is based on asn2asn.c but modified specifically to
  8 *   efficiently convert asn.1 Seq-entry or Bioseq-set into XML. The
  9 *   only real difference with asn2asn -x is that a special step puts
 10 *   the Seq-inst through the object loaders to convert 2 bit and 4 bit
 11 *   encodings to text formats (1 base per letter) that XML fans prefer.
 12 *
 13 *   The defaults are set so that you can pipe the binary asn.1 Bioseq-set
 14 *   in the GenBank release or update.
 15 *
 16 *   cat update.ent | asn2xml | myxmlreader
 17 *
 18 * Author: Jim Ostell <ostell@ncbi.nlm.nih.gov>
 19 *
 20 *****************************************************************************/
 21 #include <seqport.h>
 22 #include <objsub.h>
 23 
 24 #define NUMARG 6
 25 Args myargs[NUMARG] = {
 26         {"Filename for asn.1 input","stdin",NULL,NULL,FALSE,'i',ARG_FILE_IN,0.0,0,NULL},
 27         {"Input is a Seq-entry","F", NULL ,NULL ,TRUE,'e',ARG_BOOLEAN,0.0,0,NULL},
 28         {"Input is a Seq-submit","F", NULL ,NULL ,TRUE,'s',ARG_BOOLEAN,0.0,0,NULL},
 29         {"Input asnfile in binary mode","T",NULL,NULL,TRUE,'b',ARG_BOOLEAN,0.0,0,NULL},
 30         {"Filename for XML output","stdout", NULL,NULL,TRUE,'o',ARG_FILE_OUT,0.0,0,NULL},
 31     {"Log errors to file named:",NULL,NULL,NULL,TRUE,'l',ARG_FILE_OUT, 0.0,0,NULL}};
 32 
 33 /*****************************************************************************
 34 *
 35 *   Main program loop to read, process, write SeqEntrys
 36 *
 37 *****************************************************************************/
 38 Int2 Main(void)
 39 {
 40         AsnIoPtr aipout=NULL, aipin;
 41         AsnTypePtr atp, atp_inst;
 42         AsnModulePtr amp;
 43         DataVal dv;
 44         CharPtr ftype;
 45         BioseqPtr bsp;
 46 
 47                                         /* check command line arguments */
 48 
 49         if ( ! GetArgs("asn2xml 1.0",NUMARG, myargs))
 50                 return 1;
 51 
 52                                         /* load the sequence alphabets  */
 53                                         /* (and sequence parse trees)   */
 54         if (! SeqEntryLoad())
 55                 ErrShow();
 56         if (! SubmitAsnLoad())
 57                 ErrShow();
 58         if (! SeqCodeSetLoad())
 59                 ErrShow();
 60                                     /* get pointer to all loaded ASN.1 modules */
 61         amp = AsnAllModPtr();
 62         if (amp == NULL)
 63         {
 64                 ErrShow();
 65                 return 1;
 66         }
 67 
 68         if (myargs[1].intvalue)
 69                 atp = AsnFind("Seq-entry");
 70         else if (myargs[2].intvalue)
 71                 atp = AsnFind("Seq-submit");
 72         else
 73                 atp = AsnFind("Bioseq-set");    /* get the initial type pointers */
 74         if (atp == NULL)
 75         {
 76                 ErrShow();
 77                 return 1;
 78         }
 79 
 80         atp_inst = AsnFind("Bioseq.inst");
 81         if (atp_inst == NULL)
 82         {
 83                 ErrShow();
 84                 return 1;
 85         }
 86 
 87                                         /* open the ASN.1 input file in the right mode */
 88 
 89         if ((aipin = AsnIoOpen (myargs[0].strvalue, myargs[3].intvalue?"rb":"r"))
 90           == NULL)
 91         {
 92                 ErrPostEx(SEV_ERROR,0,0, "Can't open %s", myargs[0].strvalue);
 93                 ErrShow();
 94                 return 1;
 95         }
 96 
 97                                         /* open the ASN.1 output file in the right mode */
 98 
 99         if (myargs[4].strvalue != NULL)   /* output desired? */
100         {
101                 ftype = "wx";
102 
103                 if ((aipout = AsnIoOpen (myargs[4].strvalue, ftype)) == NULL)
104                 {
105                         ErrPostEx(SEV_ERROR,0,0, "Can't open %s", myargs[4].strvalue);
106                         ErrShow();
107                         return 1;
108                 }
109         }
110 
111                                 /* log errors instead of die */
112         if (myargs[5].strvalue != NULL)
113         {
114                 if (! ErrSetLog (myargs[5].strvalue))
115                 {
116                         ErrShow();
117                         return 1;
118                 }
119                 else
120                         ErrSetOpts (ERR_CONTINUE, ERR_LOG_ON);
121         }
122 
123         while ((atp = AsnReadId(aipin, amp, atp)) != NULL)
124         {
125                 if (atp == atp_inst)    /* need object loader convert */
126                 {
127                         bsp = BioseqNew();  /* need newly initialized bsp */
128                         BioseqInstAsnRead(bsp, aipin, atp);
129                         BioseqInstAsnWrite(bsp, aipout, atp);
130                         bsp = BioseqFree(bsp);
131                 }
132                 else
133                 {
134                         AsnReadVal(aipin, atp, &dv); /* read it */
135                         AsnWrite(aipout, atp, &dv);      /* write it */
136                         AsnKillValue(atp, &dv);      /* free it */
137                 }
138         }
139 
140         AsnIoClose(aipin);
141         AsnIoClose(aipout);
142 
143         return(0);
144 }
145 
146 
147 

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.