NCBI C Toolkit Cross Reference

C/demo/asn2asn.c


  1 /*****************************************************************************
  2 *
  3 *   asn2asn.c
  4 *       This is a framework for reading an ASN.1 Seq-entry or Bioseq-set,
  5 *       doing some processing on it, and outputting it again. seqport.h
  6 *       is included since it covers most necessary utilities that you might
  7 *       need. You may need to add others for specialized reports and so on.
  8 *
  9 *       The check for aipout == NULL is to show how to change the code if
 10 *         no output is desired. Change the default in myargs from "stdout" to
 11 *         NULL to make output command line optional.
 12 *
 13 *       This program can be used "as is" to convert between binary and text
 14 *        ASN.1 through the object loaders.
 15 *
 16 *****************************************************************************/
 17 #include <seqport.h>
 18 
 19 #define NUMARG 7
 20 Args myargs[NUMARG] = {
 21         {"Filename for asn.1 input","stdin",NULL,NULL,FALSE,'i',ARG_FILE_IN,0.0,0,NULL},
 22         {"Input is a Seq-entry","F", NULL ,NULL ,TRUE,'e',ARG_BOOLEAN,0.0,0,NULL},
 23         {"Input asnfile in binary mode","F",NULL,NULL,TRUE,'b',ARG_BOOLEAN,0.0,0,NULL},
 24         {"Filename for asn.1 output","stdout", NULL,NULL,TRUE,'o',ARG_FILE_OUT,0.0,0,NULL},
 25         {"Output asnfile in binary mode?","F", NULL ,NULL ,TRUE,'s',ARG_BOOLEAN,0.0,0,NULL},
 26     {"Log errors to file named:",NULL,NULL,NULL,TRUE,'l',ARG_FILE_OUT, 0.0,0,NULL},
 27         {"Output asnfile in XML?","F", NULL ,NULL ,TRUE,'x',ARG_BOOLEAN,0.0,0,NULL}};
 28 
 29 
 30 /*****************************************************************************
 31 *
 32 *   Put any internal prototypes here
 33 *   NB: the function must match the prototype exactly, including "static" or
 34 *       not.
 35 *
 36 *****************************************************************************/
 37 static void SeqEntryProcess PROTO((SeqEntryPtr sep));  /* dummy function */
 38 
 39 
 40 /*****************************************************************************
 41 *
 42 *   Main program loop to read, process, write SeqEntrys
 43 *
 44 *****************************************************************************/
 45 Int2 Main(void)
 46 {
 47         AsnIoPtr aipout=NULL, aipin;
 48         SeqEntryPtr sep;
 49         AsnTypePtr atp, atp2;
 50         AsnModulePtr amp;
 51         DataVal dv;
 52         CharPtr ftype;
 53 
 54                                         /* check command line arguments */
 55 
 56         if ( ! GetArgs("asn2asn",NUMARG, myargs))
 57                 return 1;
 58 
 59                                         /* load the sequence alphabets  */
 60                                         /* (and sequence parse trees)   */
 61         if (! SeqEntryLoad())
 62                 ErrShow();
 63                                     /* get pointer to all loaded ASN.1 modules */
 64         amp = AsnAllModPtr();
 65         if (amp == NULL)
 66         {
 67                 ErrShow();
 68                 return 1;
 69         }
 70 
 71         atp = AsnFind("Bioseq-set");    /* get the initial type pointers */
 72         if (atp == NULL)
 73         {
 74                 ErrShow();
 75                 return 1;
 76         }
 77         atp2 = AsnFind("Bioseq-set.seq-set.E");
 78         if (atp2 == NULL)
 79         {
 80                 ErrShow();
 81                 return 1;
 82         }
 83 
 84                                         /* open the ASN.1 input file in the right mode */
 85 
 86         if ((aipin = AsnIoOpen (myargs[0].strvalue, myargs[2].intvalue?"rb":"r"))
 87           == NULL)
 88         {
 89                 ErrPostEx(SEV_ERROR,0,0, "Can't open %s", myargs[0].strvalue);
 90                 ErrShow();
 91                 return 1;
 92         }
 93 
 94                                         /* open the ASN.1 output file in the right mode */
 95 
 96         if (myargs[3].strvalue != NULL)   /* output desired? */
 97         {
 98                 ftype = "w";
 99                 if (myargs[4].intvalue)
100                         ftype = "wb";
101                 if (myargs[6].intvalue)
102                         ftype = "wx";
103 
104                 if ((aipout = AsnIoOpen (myargs[3].strvalue, ftype)) == NULL)
105                 {
106                         ErrPostEx(SEV_ERROR,0,0, "Can't open %s", myargs[3].strvalue);
107                         ErrShow();
108                         return 1;
109                 }
110         }
111 
112                                 /* log errors instead of die */
113     if (myargs[5].strvalue != NULL)
114     {
115         if (! ErrSetLog (myargs[5].strvalue))
116                 {
117             ErrShow();
118                         return 1;
119                 }
120         else
121             ErrSetOpts (ERR_CONTINUE, ERR_LOG_ON);
122     }
123 
124         if ( myargs[1].intvalue)   /* read one Seq-entry */
125         {
126                 sep = SeqEntryAsnRead(aipin, NULL);
127                 SeqEntryProcess(sep);     /* do any processing */
128                 if (aipout != NULL)
129                         SeqEntryAsnWrite(sep, aipout, NULL);  
130                 SeqEntryFree(sep);
131         }
132         else                      /* read Seq-entry's from a Bioseq-set */
133         {
134                 while ((atp = AsnReadId(aipin, amp, atp)) != NULL)
135                 {
136                         if (atp == atp2)    /* top level Seq-entry */
137                         {
138                                 sep = SeqEntryAsnRead(aipin, atp);
139                                 SeqEntryProcess(sep);     /* do any processing */
140                                 if (aipout != NULL)
141                                         SeqEntryAsnWrite(sep, aipout, atp);  
142                                 SeqEntryFree(sep);
143                         }
144                         else
145                         {
146                                 if (aipout == NULL)    /* don't need to read the data */
147                                         AsnReadVal(aipin, atp, NULL);
148                                 else
149                                 {
150                                         AsnReadVal(aipin, atp, &dv); /* read it */
151                                         AsnWrite(aipout, atp, &dv);      /* write it */
152                                         AsnKillValue(atp, &dv);      /* free it */
153                                 }
154                         }
155                 }
156         }
157 
158         AsnIoClose(aipin);
159         AsnIoClose(aipout);
160 
161         return(0);
162 }
163 
164 
165 /*****************************************************************************
166 *
167 *   void SeqEntryProcess (sep)
168 *      just a dummy routine that does nothing
169 *
170 *****************************************************************************/
171 static void SeqEntryProcess (SeqEntryPtr sep)
172 {
173         if (sep == NULL)
174                 return;
175         return;
176 }
177 
178 

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.