Example #1
0
static void DoFastaTrans (
  SeqFeatPtr sfp,
  Pointer userdata
)

{
  ByteStorePtr   bs;
  CSpeedFlagPtr  cfp;
  CharPtr        seq, str;

  if (sfp == NULL) return;
  cfp = (CSpeedFlagPtr) userdata;
  if (cfp == NULL) return;

  if (sfp->data.choice != SEQFEAT_CDREGION) return;
  bs = ProteinFromCdRegion (sfp, FALSE);
  if (bs == NULL) return;

  seq = (CharPtr) BSMerge (bs, NULL);
  BSFree (bs);
  if (seq == NULL) return;

  if (cfp->ofp != NULL) {
    str = SeqLocPrint (sfp->location);
    if (str != NULL) {
      fprintf (cfp->ofp, "> (%s)\n", str);
      MemFree (str);
    }
    fprintf (cfp->ofp, "%s\n", seq);
  }

  MemFree (seq);
}
Example #2
0
NLM_EXTERN Boolean LIBCALL AsnGenericBaseSeqOfFree (ValNodePtr ptr, int whichvalslot)
{
   Boolean         retval = TRUE;
   ValNodePtr      current, nextcur;

   for (current = ptr; current; current = nextcur) {
      nextcur = current->next;
      switch (whichvalslot) {
      case ASNCODE_BYTEVAL_SLOT:
	 BSFree ((ByteStorePtr)current->data.ptrvalue);
	 break;
      case ASNCODE_PTRVAL_SLOT:
	 MemFree (current->data.ptrvalue);
	 current->data.ptrvalue = NULL;
	 break;
      case ASNCODE_REALVAL_SLOT:
      case ASNCODE_INTVAL_SLOT:
      case ASNCODE_BIGINTVAL_SLOT:
      case ASNCODE_BOOLVAL_SLOT:
	 /* No-op */
	 break;
      }
   }

   ValNodeFree (ptr);
   return retval;
}
Example #3
0
static Pointer AsnLexReadStringEx (AsnIoPtr aip, AsnTypePtr atp, Uint1 fix_non_print)
{
	Int2 token;
	ByteStorePtr ssp;
	CharPtr result=NULL;
	Int4 bytes;

	token = AsnLexWordEx (aip, fix_non_print);      /* read the start */
	if (token != START_STRING)
	{
		AsnIoErrorMsg(aip, 43, AsnErrGetTypeName(atp->name), aip->linenumber);
		return NULL;
	}

	ssp = BSNew(0);
	if (ssp == NULL) return result;
	token = AsnLexWordEx (aip, fix_non_print);   /* read the string(s) */
	while (token == IN_STRING)
	{
		bytes = BSWrite(ssp, aip->word, (Int4)aip->wordlen);
		if (bytes != (Int4)(aip->wordlen))
		{
			BSFree(ssp);
			return result;
		}
		token = AsnLexWord(aip);
	}

	if (token == ERROR_TOKEN) return NULL;

	if (token != END_STRING)
	{
		AsnIoErrorMsg(aip, 44, AsnErrGetTypeName(atp->name), aip->linenumber);
		return NULL;
	}
	if (AsnFindBaseIsa(atp) == STRSTORE_TYPE)    /* string store */
		return ssp;

	result = (CharPtr) BSMerge(ssp, NULL);
	BSFree(ssp);

	return result;
}
Example #4
0
/*****************************************************************************
*
*   void AsnKillValue(atp, dvp)
*   	eliminates stored values such as strings
*
*****************************************************************************/
NLM_EXTERN void LIBCALL  AsnKillValue (AsnTypePtr atp, DataValPtr dvp)
{
	Int2 isa;

	isa = AsnFindBaseIsa(atp);
	if (ISA_STRINGTYPE(isa))
		MemFree(dvp->ptrvalue);
	else if ((isa == OCTETS_TYPE) || (isa == STRSTORE_TYPE))
		BSFree((ByteStorePtr) dvp->ptrvalue);
	return;
}
Example #5
0
/*****************************************************************************
*
*   StdAuthListNamesPrint(dvp)
*   	prints just Auth-list.names to a string
*
*****************************************************************************/
NLM_EXTERN CharPtr StdAuthListNamesPrint(DataValPtr dvp)
{
	AuthListPtr alp;
	Boolean 	first = TRUE;
	ValNodePtr   vnp;
	PersonIdPtr  pip;
	AuthorPtr    ap;
	ByteStorePtr bsp;
	CharPtr str;
	Char buf[60];

	if (dvp == NULL) return NULL;
	alp = (AuthListPtr)(dvp->ptrvalue);
	if (alp == NULL) return NULL;

	bsp = BSNew(80);

	for (vnp = alp->names; vnp != NULL; vnp = vnp->next)
	{
		if (! first)     /* separators for names after first one */
		{
			if (vnp->next != NULL)
				BSPutByte(bsp, (Int2)',');
			else
			{
				BSPutByte(bsp, (Int2)' ');
				BSPutByte(bsp, (Int2)'&');
			}
			BSPutByte(bsp, (Int2)' ');
		}

		first = FALSE;
		if (alp->choice == 3 || alp->choice == 2)  /* ml or str */
		{
			BSWrite(bsp, vnp->data.ptrvalue, (Int4)(StringLen((CharPtr)(vnp->data.ptrvalue))));
		}
		else if (alp->choice == 1)   /* std */
		{
			ap = (AuthorPtr) (vnp->data.ptrvalue);
			if (ap != NULL)
			{
				pip = ap->name;
				PersonIdPrint(pip, buf);
				BSWrite(bsp, buf, (Int4)StringLen(buf));
			}
			else
				BSPutByte(bsp, (Int2)'?');
		}
	}

	str = BSMerge(bsp, NULL);
	BSFree(bsp);
	return str;
}
Example #6
0
/*****************************************************************************
*
*   ByteStorePtr AsnLexReadOctets(aip, atp)
*   	expects Octets type next
*   	assumes none of it has already been read
*   	does not advance to next token
*   	atp points to the definition of this OCTET STRING
*
*****************************************************************************/
NLM_EXTERN ByteStorePtr AsnLexReadOctets (AsnIoPtr aip, AsnTypePtr atp)
{
	Int2 token, len;
	ByteStorePtr ssp = NULL;
	Byte tbuf[256]; /* was 101 - changed to handle occasional hand-edited ASN.1? */
	Int4 bytes, left, added;

	token = AsnLexWord(aip);      /* read the start */
	if (token != START_BITHEX)
	{
		AsnIoErrorMsg(aip, 45, AsnErrGetTypeName(atp->name), aip->linenumber);
		return NULL;
	}
	ssp = BSNew(0);
	if (ssp == NULL) return ssp;
	token = AsnLexWord(aip);   /* read the octet(s) */
	left = 0;
	while (token == IN_BITHEX)
	{
		len = (Int2)(aip->wordlen + left);
		MemCopy((tbuf + left), aip->word, (len - left));
		tbuf[len] = '\0';
		added = AsnTypeStringToHex(tbuf, len, tbuf, &left);
		if (added < 0)
		{
			AsnIoErrorMsg(aip, 46, AsnErrGetTypeName(atp->name), aip->linenumber);
			return NULL;
		}
		if (added)
		{
			bytes = BSWrite(ssp, tbuf, added);
			if (bytes != added)
			{
				ssp = BSFree(ssp);
				return ssp;
			}
		}
		if (left)   /* left a char */
		{
			MemCopy(tbuf, ((aip->word)+(aip->wordlen - left)),left);
		}

		token = AsnLexWord(aip);
	}
	
	if (token != OCTETS)
	{
		AsnIoErrorMsg(aip, 47, AsnErrGetTypeName(atp->name), aip->linenumber);
		return NULL;
	}

	return ssp;
}
void XMLParserDispose(XMLParser* parser)
{
    if (parser == NULL) return;
    {
        QBNodePool* pool = QBNodePoolPtr(parser);
        if (parser->node) {
            BSRelease(parser->node);
            parser->node = NULL;
        }
        if (parser->stack) {
            BSRelease(parser->stack);
            parser->stack = NULL;
        }
        if (parser->string) {
            BSFree(parser->string);
            parser->string = NULL;
        }
        BSFree(parser);
        QBNodePoolRecycle(pool);
    }
}
Example #8
0
PostingPtr LIBCALL  FreePost (PostingPtr pst)

{
  if (pst != NULL) {
    if (pst->uids != NULL) {
      BSFree (pst->uids);
    }
    if (pst->buffer != NULL) {
      MemFree (pst->buffer);
    }
    MemFree (pst);
  }
  return NULL;
}
Example #9
0
/*****************************************************************************
*
*   SimpleSeqFree(ssp)
*
*****************************************************************************/
NLM_EXTERN SimpleSeqPtr SimpleSeqFree (SimpleSeqPtr ssp)

{
    Int2 i;

    if (ssp == NULL)
        return NULL;

    for (i = 0; i < ssp->numid; i++)
        MemFree(ssp->id[i]);
    MemFree(ssp->title);
    BSFree(ssp->seq);
    return MemFree(ssp);
}
Example #10
0
/*****************************************************************************
*
*   StdFormatPrint(data, func, templatename, options)
*
*****************************************************************************/
NLM_EXTERN Boolean StdFormatPrint (Pointer data, AsnWriteFunc func, CharPtr templatename, StdPrintOptionsPtr options)
{
	PrintStackPtr psp;
	CharPtr ptr = NULL;
	PrintFormatListPtr pflp;

	if ((data == NULL) || (func == NULL) || (templatename == NULL) || (options == NULL))
		return FALSE;

	pflp = PrintFormatListGet(templatename);

	if (pflp == NULL) return FALSE;

	if (options->fp == NULL)
	{
		options->bstp = BSNew(80);
		options->ptr = NULL;
	}
	psp = PrintStackBuild(data, func, pflp);

/***
	printf("Before sort\n");
	PrintStackDump(psp, stdout, 0);
***/
	PrintStackSort(psp);
/***
	printf("After sort\n");
	PrintStackDump(psp, stdout, 0);
	printf("\n\n");
***/

	PrintStackPrint(psp, options);
	PrintStackFree(psp);

	if (options->fp == NULL)
	{
		if (BSLen(options->bstp))
			options->ptr = BSMerge(options->bstp, NULL);
		BSFree(options->bstp);
	}
	return TRUE;
}
Example #11
0
static BSErr appendChar(XMLParser* parser,unsigned char a)
{
    if (parser->string == NULL) {
        parser->string = (unsigned char*)BSCalloc(QBNodePoolPtr(parser),1000,"appendChar");
        parser->strptr = 0;
    }
    if (parser->string) {
        if (BSSize(parser->string)-1 <= parser->strptr) {
            unsigned char* mem = (unsigned char*)BSCalloc(QBNodePoolPtr(parser),BSSize(parser->string)+1000,"appendChar");
            if (mem) {
                strcpy((char*)mem,(char*)parser->string);
                BSFree(parser->string);
                parser->string = mem;
            } else {
                return BSERR_MEM;
            }
        }
        parser->string[parser->strptr++] = a;
        parser->string[parser->strptr] = 0;
    }
    return BSERR_OK;
}
Example #12
0
static TrajErr TRADESBenchmark(void)
{
	/* protein is 1CDZ, same as beta protein - mixed alpha/beta protein 96 AA */
	static Char sequence[]="ELPDFFQGKHFFLYGEFPGDERRKLIRYVTAFNGELEDYMSDRVQFVITAQEWDPSFEEALMDNPSLAFVRPRWIYSCNEKQKLLPHQLYGVVPQA";
	CharPtr pc;
	FILE *f;
	Char fnamseq[PATH_MAX];
	Char fnam[PATH_MAX];
	Char fnamtrj[PATH_MAX];
        Char fnuturndb[PATH_MAX];
	Int2 err,numAA,cnt;
	Int4 randseed,dbsize;
	pMakeTrjParamBlock mkdata;
	pFoldTrajParamBlock foldtrajprm; 
	CPUTimePtr pTime1,pTime2,pTime3,pTime4;
	BiostrucPtr bspBiostruc;
	PDNMS pdnmsModelstruc;
	PMSD pmsdHead;
	PDNML pdnmlModel;
	PMLD pmldThis;
	BiostrucIdPtr           pbi=NULL;
	BiostrucDescrPtr        pbd=NULL;


	printf("%d is the CODEBASE version here.\n6502:UNIX x86_32, 6503003:UNIX x86_64, 6500:Win32, 6401:UNIX PPC_32\n\n", S4VERSION);
        sprintf(fnuturndb,"UTURNDB"); /* to clean up errant U-Turn files CWVH 2010 */

	if (!OPENMMDBAPI(0,NULL)) {
	    ErrPostEx(SEV_ERROR,2,1,"Unable to open MMDBAPI");
	    return ERR_FAIL;
	}
	printf("One moment, opening rotamer library...\n");
	if (LoadRotLib()!=ERR_SUCCESS) {
		ErrPostEx(SEV_ERROR,1,8,"Cannot open rotamer library (%s%s) - if the file is missing, please re-install the software",CFG_local_datafilepath,NEWSCWRL_FNAM);
		return ERR_FAIL;
	}
	pc=DFPTmpNam(FALSE,FALSE);
	if ((f=FileOpen(pc,"w"))==NULL) {
		CLOSEMMDBAPI();
		FreeRotLib();
		ErrPostEx(SEV_ERROR,errno,1,"Failed to open %s file",pc);
		return ERR_FAIL;
	}
	fprintf(f,"%s\n",sequence);
	/* Make sure disk space was sufficient to write to file */
    if (fflush(f)==EOF) {
        FileClose(f);
		CLOSEMMDBAPI();
		FreeRotLib();
		ErrPostEx(SEV_ERROR,errno,1,"Failed to write to %s file",pc);
		return ERR_FAIL;
	}
	FileClose(f);
	StringCpy(fnamseq,pc);
	sprintf(fnam,"%s%s",CFG_local_datafilepath,BENCH_TRAJ);
	sprintf(fnamtrj,"%s%s%s",CFG_local_datafilepath,BENCH_TRAJ,ASN_EXT);

	mkdata = (pMakeTrjParamBlock)MemNew(sizeof(MakeTrjParamBlock));	
	mkdata->TrajMethod = 2; /* from sequence */
	mkdata->valfnamin = NULL;
	mkdata->pcChain = NULL;
	mkdata->modelnum = 1;
	mkdata->startres = 1;
	mkdata->endres = 0;
	mkdata->peakheight = 100;
	mkdata->noise = 0;
	mkdata->savechi = 0;
	mkdata->sigma_x = 0.0;
	mkdata->sigma_y = 0.0;
	mkdata->temperature = 0;
	mkdata->timestep = 0.0;
	mkdata->seqfnamin = fnamseq;
	mkdata->tgtype = 4;
	mkdata->sstrufname = NULL;
	mkdata->DoRPS = FALSE;
	mkdata->uturn = FALSE;
	mkdata->SStruinput = FALSE;
	mkdata->trjfnamout = fnam;
	mkdata->comprtype = USE_RLE;
	mkdata->constrfnamin = NULL;
	mkdata->units=UNITS_ARBITRARY;
	mkdata->templat=NULL;
	mkdata->zhangwindsize = 0;
	mkdata->alignfile=NULL;
	mkdata->ssmask=NULL;
	mkdata->dumpcsv=0;
	mkdata->benchmark=1;
	mkdata->all_coil = (Boolean)(FALSE);
	mkdata->all_beta = (Boolean)(FALSE);
	/* ensure config file is set right, even if user may have fudged it */
	if (SetConfigFileValues(WALK_PHIPSI,50.0/*errtol*/, 0.25/*abbb*/, 0.50/*absc*/, 0.0/*tunnelprob*/)!=ERR_SUCCESS) {
		CLOSEMMDBAPI();
		FreeRotLib();
		mkdata=MemFree(mkdata);
		FileRemove(pc);
#ifdef OS_UNIX
		ErrPostEx(SEV_ERROR,0,0,"Unable to write config file .foldtrajrc, cannot continue");
#else
		ErrPostEx(SEV_FATAL,0,0,"Unable to write config file foldtraj.ini, cannot continue");
#endif
		return ERR_FAIL;
	}
	printf("Predicting secondary structure and generating trajectory distribution...\n");
	pTime1=CPUTimeMeasure();
	MakeTrj((VoidPtr)mkdata);
        printf("MadeTrj complete, unpacking ASN.1 Trajectory Graph\n");
	pTime2=CPUTimeMeasure();
	mkdata=MemFree(mkdata);
	FileRemove(fnamseq);

	if (UnPackAsnTrajGraph(fnam,&numAA,sequence,NULL,&pbi,&pbd,NULL)==NULL) {
		CLOSEMMDBAPI();
		FreeRotLib();
		FileRemove(fnamtrj);
		ErrPostEx(SEV_ERROR,2,3,"Unable to read trajectory distribution %s, please create a new one",fnam);
		return ERR_FAIL;
	}
	randseed=54374;
	RandomSeed(randseed);
	StringCpy(tmpskelfname,DFPTmpNam(FALSE,FALSE));
	/* make the ASN.1 file for this protein's chemical graph */
	BuildSkelASN(sequence,tmpskelfname);
	InitBSPLog(randseed,sequence,totalstruc);
	TGInit(tmpdbasename,DB_READ,&dbsize);
	printf("Folding protein...\n");
	pTime3=CPUTimeMeasure();
	for (cnt=0;cnt<100;cnt++) {
		bspBiostruc=NULL;
		bspBiostruc=MIMEBiostrucAsnGet(tmpskelfname,"r",NULL);
		if (bspBiostruc==NULL) {
			CLOSEMMDBAPI();
			FreeRotLib();
			FileRemove(fnamtrj);
			BSFree(bspTempLog);
			FileRemove(tmpskelfname);
			TGClose();
			CleanUpDB(tmpdbasename);
                        CleanUpDB(fnuturndb);        
			ErrPostEx(SEV_ERROR,3,1,"Unable to fetch Biostruc");
			return ERR_FAIL;
		}
		if (pbi!=NULL) {
			if (bspBiostruc->id!=NULL)
				AsnGenericChoiceSeqOfFree(bspBiostruc->id,(AsnOptFreeFunc)BiostrucIdFree);
			bspBiostruc->id=pbi;
			pbi=NULL;
		}
		if (pbd!=NULL) {
			if (bspBiostruc->descr!=NULL)
				AsnGenericChoiceSeqOfFree(bspBiostruc->descr,(AsnOptFreeFunc)BiostrucDescrFree);
			bspBiostruc->descr=pbd;
			pbd=NULL;
		}
		/* now the chemical graph is correctly in memory as a modelstruc, with
			co-ordinates (and hence PALDs) assigned only to a-carbons */
		pdnmsModelstruc=MakeAModelstruc(bspBiostruc);
		if (pdnmsModelstruc==NULL) {
			CLOSEMMDBAPI();
			FreeRotLib();
			FileRemove(fnamtrj);
			BSFree(bspTempLog);
			FileRemove(tmpskelfname);
			TGClose();
			CleanUpDB(tmpdbasename);
                        CleanUpDB(fnuturndb);        
			ErrPostEx(SEV_ERROR,4,1,"Unable to convert Biostruc to Modelstruc. Please ensure your protein only contains the 20 standard amino acids.");
			return ERR_FAIL;
		}
		pmsdHead=(PMSD)(pdnmsModelstruc->data.ptrvalue);

		/* remove ppAsnOrder for all models so it will be rebuilt
			in WriteAsnAllModel */
		pdnmlModel=pmsdHead->pdnmlModels;
		while (pdnmlModel) {
			pmldThis=(PMLD)(pdnmlModel->data.ptrvalue);
			if (pmldThis->ppAsnOrder) {
				PTRVectorFree(pmldThis->ppAsnOrder,0);
				pmldThis->ppAsnOrder=NULL;
			}
			pdnmlModel=pdnmlModel->next;
		}
		if (dbsize!=((PMMD)((pmsdHead->pdnmmHead)->data.ptrvalue))->iResCount) {
			CLOSEMMDBAPI();
			FreeRotLib();
			FreeAModelstruc(pdnmsModelstruc);
			BSFree(bspTempLog);
			FileRemove(fnamtrj);
			FileRemove(tmpskelfname);
			TGClose();
			CleanUpDB(tmpdbasename);
                       	CleanUpDB(fnuturndb);        
			ErrPostEx(SEV_ERROR,1,1,"protein length inconsistency error, expect: %d actual: %d, possibly due to corrupt trajectory file; aborting",((PMMD)((pmsdHead->pdnmmHead)->data.ptrvalue))->iResCount,dbsize);
			return ERR_FAIL;
		}
		foldtrajprm=(pFoldTrajParamBlock)MemNew(sizeof(FoldTrajParamBlock));
		foldtrajprm->pmsdRoot=pmsdHead;
		foldtrajprm->Model=1;
		foldtrajprm->err=0;
		foldtrajprm->gen=0;
		foldtrajprm->errorfile=NULL;
		/* do the folding here */
		TRADEProtein((VoidPtr)foldtrajprm,1);
		err=foldtrajprm->err;
		foldtrajprm=MemFree(foldtrajprm);
		FreeAModelstruc(pdnmsModelstruc);
        if (err!=ERR_SUCCESS && err!=ERR_INCOMPLETE) {
			FileRemove(fnamtrj);
			FileRemove(tmpskelfname);
			BSFree(bspTempLog);
			TGClose();
			CleanUpDB(tmpdbasename);
  	                CleanUpDB(fnuturndb);        
			CLOSEMMDBAPI();
			FreeRotLib();
			ErrPostEx(SEV_ERROR,1,1,"Benchtraj returned a folding error %d",err);
			return ERR_FAIL;
		}
	}
	pTime4=CPUTimeMeasure();
	FileRemove(fnamtrj);
	FileRemove(tmpskelfname);
	BSFree(bspTempLog);
	TGClose();
	CleanUpDB(tmpdbasename);        
        CleanUpDB(fnuturndb);
	CLOSEMMDBAPI();
	FreeRotLib();
	printf("Benchmark complete.\n\nSummary\n-------\n          Usr time  Sys time\n          --------  --------\n");
	printf("Maketrj  %9.3f %9.3f\nFoldtraj %9.3f %9.3f\n\n",CPUTimeGetUser(pTime2)-CPUTimeGetUser(pTime1),CPUTimeGetSys(pTime2)-CPUTimeGetSys(pTime1),CPUTimeGetUser(pTime4)-CPUTimeGetUser(pTime3),CPUTimeGetSys(pTime4)-CPUTimeGetSys(pTime3));
        printf("Benchtraj successful\n");
	return ERR_SUCCESS;
}
Example #13
0
NLM_EXTERN Int4 print_protein_for_cds(SeqFeatPtr sfp, CharPtr buf, SeqLocPtr loc, Boolean reverse_minus)
{
	CdRegionPtr crp;
	Int4 frame_offset, start_offset;
	Uint1 f_strand;
	Boolean reverse;
	Int4 cd_len;
	GatherRange gr;
	Int2 p_pos, buf_len;
	Int4 a_left, a_right;
	Int4 aa, val;
	SeqLocPtr slp;
	SeqPortPtr spp;
	ByteStorePtr p_data;
	Int4 end_pos, start_pos = -1;
	Uint1 residue;
	Boolean seal_ends = FALSE;
	Boolean reverse_order;

	if(sfp == NULL || sfp->data.choice != 3)
		return -1;
	if(buf == NULL || loc == NULL)
		return -1;
	crp = sfp->data.value.ptrvalue;
	if(crp == NULL)
		return -1;

	if(buf[0] == '\0')
		seal_ends = TRUE;
	spp = NULL;
	p_data = NULL;
	if(sfp->product !=NULL && !IS_BOGO_Product(sfp->ext))
	{
		spp = SeqPortNewByLoc(sfp->product, Seq_code_ncbieaa);
		if(spp !=NULL)
		{
    			SeqPortSeek(spp, 0, SEEK_SET);
			end_pos = spp->totlen-1;
		}
	}
	if(spp == NULL)
	{
		p_data = ProteinFromCdRegion(sfp, TRUE);
		/* p_data = ProteinFromCdRegion(sfp, FALSE); */
		if(p_data !=NULL)
		{
			BSSeek(p_data, 0, SEEK_SET);
			end_pos = BSLen(p_data)-1;
		}
	}

	if(spp == NULL && p_data == NULL)
		return -1;

	if(crp->frame == 0)
		frame_offset = 0;
	else
		frame_offset = (Int4)crp->frame-1;
	start_offset = frame_offset;

	f_strand = SeqLocStrand(sfp->location);
	reverse = ck_reverse(f_strand, SeqLocStrand(loc));
	/*if reverse == TRUE, the translated protein is written backwards*/
	if(reverse && reverse_minus)
		reverse_order = TRUE;
	else
		reverse_order = FALSE;
	
	slp = NULL;
	cd_len = 0;
	aa = 0;

        buf_len = SeqLocLen(loc);

	if(reverse_order)
	{
		p_pos = buf_len -1;
		if(seal_ends)
		{
			buf[p_pos+1] = '\0';
			seal_ends = FALSE;
		}
	}
	else
		p_pos = 0;

	while((slp = SeqLocFindNext(sfp->location, slp))!=NULL)
	{
	   if(SeqLocOffset(loc, slp, &gr, 0))
	   {
		if(reverse_order)
		{
			if(gr.right < p_pos)
				p_pos = (Int2)(gr.right);
		}
		else
		{
			if(p_pos < gr.left)
				p_pos = (Int2)(gr.left);
		}
		SeqLocOffset(slp, loc, &gr, 0);
		
		a_left = gr.left + cd_len;
		a_right = gr.right + cd_len;
		/* if(reverse_order)
		{
			temp = a_right;
			a_right = -a_left;
			a_left = -temp;
		} */
		for(; a_left<=a_right; ++a_left)
		{
			val = ABS(a_left) - start_offset;
			aa = val/3;
			if(aa < 0 || aa > end_pos)/*stop & partial codon*/
			{
				buf[p_pos] = '^';
			}
			else
			{
				if(val%3==1)/*label aa in the middle of 3-bp codon*/
				{
					if(start_pos == -1)
						start_pos = aa;
					if(spp !=NULL)
					{
						SeqPortSeek(spp, aa, SEEK_SET);
						residue = SeqPortGetResidue(spp); 
					}
					else
					{
						BSSeek(p_data, aa, SEEK_SET);
						residue = (Uint1)BSGetByte(p_data);
					}
					if(IS_ALPHA(residue) || residue == '*' || residue == '-')
					
						buf[p_pos] = residue;
					else
						buf[p_pos] = '?';
				}
				else
					buf[p_pos] = ' ';
			}
			if(reverse_order)
				-- p_pos;
			else {
				++p_pos;
                                if (p_pos > buf_len)
                                   break;
                        }
		}
	     }
	     cd_len += SeqLocLen(slp);
	     /*frame_offset = (cd_len - start_offset)%3;
	     if(frame_offset > 0)
		--frame_offset;*/
		
	}

	if(spp != NULL)
		SeqPortFree(spp);
	if(p_data != NULL)
		BSFree(p_data);

	if(p_pos  == 0)	/*all the residues are introns*/
	{
		if(seal_ends)
		{
			end_pos = buf_len;
			MemSet((Pointer)buf, '~', (size_t)(end_pos) * sizeof(Char));
			buf[end_pos] = '\0';
		}
	}
	else
	{
		if(seal_ends)
		{
			buf[p_pos] = '\0';
		}
		if(start_pos == -1)
			start_pos = aa;
	}

	return start_pos;
}