示例#1
0
AjPPatternSeq ajPatternSeqNewList (AjPPatlistSeq plist,
				   const AjPStr name, const AjPStr pat,
				   ajuint mismatch)
{
    AjPPatternSeq pthis;

    if (!ajStrGetLen(pat))
	return NULL;

    AJNEW0(pthis);

    if(ajStrGetLen(name))
	ajStrAssignS (&pthis->Name,name);
    else
	ajFmtPrintS(&pthis->Name, "pattern%d",
		    1+ajListGetLength(plist->Patlist));

    ajStrAssignS(&pthis->Pattern,pat);
    pthis->Protein  = plist->Protein;
    pthis->Mismatch = mismatch;

    ajPatlistAddSeq(plist,pthis);

    return pthis;
}
示例#2
0
AjPPatternRegex ajPatternRegexNewList(AjPPatlistRegex plist,
				      const AjPStr name,
				      const AjPStr pat)
{
    AjPPatternRegex pthis;

    if (!ajStrGetLen(pat))
	return NULL;

    AJNEW0(pthis);

    if(ajStrGetLen(name))
	ajStrAssignS (&pthis->Name,name);
    else
	ajFmtPrintS(&pthis->Name, "regex%d",
		    1+ajListGetLength(plist->Patlist));

    ajStrAssignS  (&pthis->Pattern,pat);
    pthis->Type = plist->Type;

    pthis->Compiled = ajRegComp(pthis->Pattern);
    ajPatlistAddRegex (plist,pthis);

    return pthis;
}
示例#3
0
size_t ajWritebinStr(AjPFile file, const AjPStr str, size_t len)
{
    size_t ret;
    ajuint ilen;
    ajuint i;
    ajuint j;
    ajuint k;

    ilen = 1+ajStrGetLen(str);

    if(ilen >= len)
        return fwrite(ajStrGetPtr(str), len, 1, file->fp);

    ret = fwrite(ajStrGetPtr(str), ilen, 1, file->fp);

    j = len - ilen;

    k = 20;

    for(i=0;i<j;i+=20)
    {
        if((j-i) < 20)
            k = j-i;
        fwrite("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", k, 1, file->fp);
    }

    return ret;
}
示例#4
0
文件: ajtime.c 项目: WenchaoLin/JAMg
AjBool ajTimeSetS(AjPTime thys, const AjPStr timestr)
{
    ajint year = 0;
    ajint mon  = 0;
    ajint mday = 0;
    ajint hour = 0;
    ajint min  = 0;
    ajint sec  = 0;

    if(!thys)
        return ajFalse;
    
    if(!ajStrGetLen(timestr))
	return ajFalse;

    if(!ajFmtScanS(timestr, "%4d-%2d-%2d %2d:%2d:%2d",
	       &year, &mon, &mday, &hour, &min, &sec))
	return ajFalse;

    if(year > 1899)
        year = year-1900;

    thys->time.tm_year  = year ;
    thys->time.tm_mon   = mon-1;
    thys->time.tm_mday  = mday ;
    thys->time.tm_hour = hour;
    thys->time.tm_min = min;
    thys->time.tm_sec = sec;
    thys->time.tm_isdst = -1;

    mktime(&thys->time);

    return ajTrue;
}
示例#5
0
文件: ajreg.c 项目: ICO2S/emboss
AjBool ajRegExec(AjPRegexp prog, const AjPStr str)
{
    int startoffset = 0;
    int options     = 0;
    int status      = 0;

    status = pcre_exec(prog->pcre, prog->extra, ajStrGetPtr(str),
                       ajStrGetLen(str), startoffset, options, prog->ovector,
                       3*prog->ovecsize);

    if(status >= 0)
    {
	prog->orig = ajStrGetPtr(str);

	if(status == 0)
	    ajWarn("ajRegExec too many substrings");

	return ajTrue;
    }

    if(status < -1)		    /* -1 is a simple fail to match */
    {				/* others are recursion limits etc. */
	ajDebug("ajRegExec returned unexpected status '%d'\n", status);
	prog->orig = ajStrGetPtr(str);	/* needed for the trace */
	ajRegTrace(prog);
    }

    prog->orig = NULL;

    return ajFalse;
}
示例#6
0
static void infoalign_OutputStr(AjPFile outfile, const AjPStr str, AjBool html,
				 AjBool after, ajuint minlength)
{
    AjPStr marginfmt;

    marginfmt = ajStrNewRes(10);

    /* ajFmtPrintF doesn't seem to deal with formats like "%-*S" correctly */
    ajFmtPrintS(&marginfmt, "%%-%dS", minlength);

    if(html)
	ajFmtPrintF(outfile, "<td>");

    if(html || !after || minlength == NOLIMIT)
	ajFmtPrintF(outfile, "%S", str);
    else
	/*
	**  Format:
	**  If this is the last item, don't put spaces or TABs after it.
	**  Try to fit the name in 'minlength' spaces, else just add a
	**  TAB after it
	*/
	ajFmtPrintF(outfile, ajStrGetPtr(marginfmt), str);

    if(html)
	ajFmtPrintF(outfile, "</td>\n");
    else
	if(after &&  ajStrGetLen(str) >= minlength)
	    ajFmtPrintF(outfile, "\t");

    ajStrDel(&marginfmt);

    return;
}
示例#7
0
文件: embprop.c 项目: WenchaoLin/JAMg
AjBool embPropGetProperties(const EmbPPropAmino prop, AjPStr* Pstr)
{
    ajStrAssignC(Pstr, "");

    if(prop->tiny)
        ajStrAppendC(Pstr, "tiny,");

    if(prop->sm_all)
        ajStrAppendC(Pstr, "small,");

    if(prop->aliphatic)
        ajStrAppendC(Pstr, "aliphatic,");

    if(prop->aromatic)
        ajStrAppendC(Pstr, "aromatic,");

    if(prop->polar)
        ajStrAppendC(Pstr, "polar,");

    if(prop->nonpolar)
        ajStrAppendC(Pstr, "nonpolar,");

    ajStrTrimEndC(Pstr, ",");

    if(!ajStrGetLen(*Pstr))
        return ajFalse;

    return ajTrue;
}
示例#8
0
AjBool ajAssemoutformatFind(const AjPStr format, ajint* iformat)
{
    AjPStr tmpformat = NULL;
    ajuint i = 0;

    /* ajDebug("ajAssemoutformatFind '%S'\n", format); */
    if(!ajStrGetLen(format))
	return ajFalse;

    ajStrAssignS(&tmpformat, format);
    ajStrFmtLower(&tmpformat);

    for(i=0; assemoutFormatDef[i].Name; i++)
    {
	/* ajDebug("test %d '%s' \n", i, assemoutFormatDef[i].Name); */
	if(ajStrMatchCaseC(tmpformat, assemoutFormatDef[i].Name))
	{
	    *iformat = i;
	    ajStrDel(&tmpformat);
	    /* ajDebug("found '%s' at %d\n", assemoutFormatDef[i].Name, i); */
	    return ajTrue;
	}
    }

    ajErr("Unknown output format '%S'", format);

    ajStrDel(&tmpformat);

    *iformat = 0;

    return ajFalse;
}
示例#9
0
static ajint prima_primalign(const AjPStr a, const AjPStr b)
{
    ajint plen;
    ajint qlen;
    ajint limit;
    ajint i;
    ajint n = 0;
    ajint mm = 0;
    ajint j;
    const char *p;
    const char *q;
    ajint alen;
    ajint blen;

    alen = ajStrGetLen(a);
    blen = ajStrGetLen(b);


    if(alen > blen)
    {
        plen = alen;
	qlen = blen;
        p = ajStrGetPtr(a);
        q = ajStrGetPtr(b);
    }
    else
    {
        plen = blen;
        qlen = alen;
        p = ajStrGetPtr(b);
        q = ajStrGetPtr(a);
    }

    limit = plen-qlen+1;

    for(i=0; i<limit; ++i)
    {
        for(j=0; j<qlen; ++j)
	    if(p[j]==q[j])
		++n;

        mm = AJMAX(mm, n);
        ++p;
    }

    return (ajint)(((float)mm/(float)qlen)*100.0);
}
示例#10
0
static void silent_fmt_hits(AjPList hits, AjPFeattable feat,
			    AjBool silent, AjBool rev)
{
    PSilent res;
    AjPFeature sf = NULL;
    AjPStr tmpFeatStr = NULL;

    ajListSort(hits,silent_basecompare);

    while(ajListPop(hits,(void **)&res))
    {
	if (rev)
	    sf = ajFeatNewIIRev(feat,
				res->match, res->match+ajStrGetLen(res->site)-1);
	else
	    sf = ajFeatNewII(feat,
			     res->match, res->match+ajStrGetLen(res->site)-1);

	if (silent)
	{
	    ajFmtPrintS(&tmpFeatStr, "*silent Yes");
	    ajFeatTagAdd (sf, NULL, tmpFeatStr);
	}
	ajFmtPrintS(&tmpFeatStr, "*enzyme %S", res->code);
	ajFeatTagAdd (sf, NULL, tmpFeatStr);
	ajFmtPrintS(&tmpFeatStr, "*rspattern %S", res->site);
	ajFeatTagAdd (sf, NULL, tmpFeatStr);
	ajFmtPrintS(&tmpFeatStr, "*baseposn %d", res->base);
	ajFeatTagAdd (sf, NULL, tmpFeatStr);
	ajFmtPrintS(&tmpFeatStr, "*aa %S.%S", res->seqaa, res->reaa);
	ajFeatTagAdd (sf, NULL, tmpFeatStr);
	ajFmtPrintS(&tmpFeatStr, "*mutation %c->%c", res->obase,res->nbase);
	ajFeatTagAdd (sf, NULL, tmpFeatStr);
	
       ajStrDel(&res->code);
       ajStrDel(&res->site);
       ajStrDel(&res->seqaa);
       ajStrDel(&res->reaa);
       AJFREE(res);
    }

    ajStrDel(&tmpFeatStr);
    return;
}
示例#11
0
static void silent_fmt_sequence(const char* title,
				const AjPStr seq, AjPStr* tailstr, ajint start,
				AjBool num)
{
    const char *p;
    ajint m;
    ajint i;
    ajint tlen;

    ajFmtPrintAppS(tailstr,"%s:\n",title);
    if(num)
    {
    	p = ajStrGetPtr(seq);
    	ajFmtPrintAppS(tailstr,"%-7d",start);
    	tlen = ajStrGetLen(seq);
    	for(i=0; i<tlen ; i++)
    	{
		ajFmtPrintAppS(tailstr,"%c",p[i]);
        	m=i+1;
        	if(m%10==0)
		    ajFmtPrintAppS(tailstr," ");
		if(m%60==0 && m<tlen)
		    ajFmtPrintAppS(tailstr,"\n%-7d",(start+m+1));
    	}
    }
    else
    {
	p = ajStrGetPtr(seq);
        tlen = ajStrGetLen(seq);
        for(i=0; i<tlen ; i++)
        {
                ajFmtPrintAppS(tailstr,"%c",p[i]);
                m=i+1;
                if(m%10==0)
		    ajFmtPrintAppS(tailstr," ");
                if(m%60==0 && m<tlen)
		    ajFmtPrintAppS(tailstr,"\n");
        }
    }

    ajFmtPrintAppS(tailstr,"\n\n");

    return;
}
示例#12
0
static AjBool extractfeat_MatchPatternTags(const AjPFeature feat,
					   const AjPStr tpattern,
					   const AjPStr vpattern)
{
    AjIList titer;                      /* iterator for feat */
    AjPStr tagnam = NULL;        /* tag structure */
    AjPStr tagval = NULL;        /* tag structure */
    AjBool val = ajFalse;               /* returned value */
    AjBool tval;                        /* tags result */
    AjBool vval;                        /* value result */


    /*
    **  if there are no tags to match, but the patterns are
    **  both '*', then allow this as a match
    */
    if(!ajStrCmpC(tpattern, "*") &&
        !ajStrCmpC(vpattern, "*"))
        return ajTrue;

    /* iterate through the tags and test for match to patterns */
    titer = ajFeatTagIter(feat);

    while(ajFeatTagval(titer, &tagnam, &tagval))
    {
        tval = embMiscMatchPatternDelimC(tagnam, tpattern, ",;|");

        /*
        ** If tag has no value then
        **   If vpattern is '*' the value pattern is a match
        ** Else check vpattern
        */
        if(!ajStrGetLen(tagval))
	{
            if(!ajStrCmpC(vpattern, "*"))
            	vval = ajTrue;
            else
		vval = ajFalse;
        }
	else
            vval = embMiscMatchPatternDelimC(tagval, vpattern, ",;|");

        if(tval && vval)
	{
            val = ajTrue;
            break;
        }
    }
    ajListIterDel(&titer);

    ajStrDel(&tagnam);
    ajStrDel(&tagval);

    return val;
}
示例#13
0
const AjPStr ajXmlGetQryS(const AjPXml xml)
{
    ajDebug("ajXmlGetQryS '%S'\n", xml->Qry);

    if(ajStrGetLen(xml->Qry))
        return xml->Qry;

    xmlMakeQry(xml, &xmlTempQry);

    return xmlTempQry;
}
示例#14
0
文件: ajresource.c 项目: ICO2S/emboss
const AjPStr ajResourceGetQryS(const AjPResource resource)
{
    ajDebug("ajResourceGetQryS '%S'\n", resource->Qry);

    if(ajStrGetLen(resource->Qry))
	return resource->Qry;

    resourceMakeQry(resource, &resourceTempQry);

    return resourceTempQry;
}
示例#15
0
文件: ajrefseq.c 项目: ICO2S/emboss
const AjPStr ajRefseqGetQryS(const AjPRefseq refseq)
{
    ajDebug("ajRefseqGetQryS '%S'\n", refseq->Qry);

    if(ajStrGetLen(refseq->Qry))
	return refseq->Qry;

    refseqMakeQry(refseq, &refseqTempQry);

    return refseqTempQry;
}
示例#16
0
static AjBool assemoutWriteList(AjPFile outf, const AjPAssem assem)
{
    if(!outf) return ajFalse;
    if(!assem) return ajFalse;

    if(ajStrGetLen(assem->Db))
        ajFmtPrintF(outf, "%S:%S\n", assem->Db, assem->Id);
    else
        ajFmtPrintF(outf, "%S\n", assem->Id);
    
    return ajTrue;
}
示例#17
0
int main(int argc, char **argv)
{
    /* Variable Declarations */
    AjPFile outf;
    AjPStr code = NULL;
    char    code1;
    ajuint i;
    ajuint iend;

    /* ACD File Processing */
    embInit("infobase", argc, argv);
    code = ajAcdGetString("code");
    outf = ajAcdGetOutfile("outfile");


    /* Application logic */

    ajStrFmtUpper(&code);
    iend = ajStrGetLen(code);
    ajFmtPrintF(outf, "%4s %-10s %-10s %s\n",
                "Code", "Ambiguity", "Complement", "Mnemonic");
    for(i=0;i<iend;i++)
    {
        code1=ajStrGetCharPos(code,i);
        if(ajBaseExistsChar(code1))
        {
            ajFmtPrintF(outf, "%-4c %-10S %-10c %S\n",
                        code1, ajBaseGetCodes(code1),
                        ajBaseAlphacharComp(code1),
                        ajBaseGetMnemonic(code1));
        }
        else
        {
            ajFmtPrintF(outf, "%-4c %-10s %-10c %s\n",
                        code1, ".",
                        '.',
                        "invalid");

        }
        
    }
    
    

    /* Memory management and exit */
    ajStrDel(&code);
    ajFileClose(&outf);

    embExit();

    return 0;
}
示例#18
0
static void eprimer3_write_primer(AjPFile outfile, const char *tag,
                                  const AjPStr pos,
                                  const AjPStr tm, const AjPStr gc,
                                  const AjPStr seq,
                                  AjBool rev, ajint begin)
{
    ajint startint;
    ajint lenint;
    float tmfloat;
    float gcfloat;
    AjPStr start = NULL;
    AjPStr lenstr = NULL;
    ajlong comma;

    if(ajStrGetLen(pos))
    {
        ajStrToFloat(tm, &tmfloat);
        ajStrToFloat(gc, &gcfloat);
        comma = ajStrFindC(pos, ",");
        ajStrAssignS(&start, pos);
        ajStrCutRange(&start, comma, ajStrGetLen(start)-1);
        ajStrToInt(start, &startint);
        startint += begin;
        ajStrAssignS(&lenstr, pos);
        ajStrCutRange(&lenstr, 0, comma);
        ajStrToInt(lenstr, &lenint);
        if(rev)
            startint = startint - lenint + 1;

        ajFmtPrintF(outfile, "     %s  %6d %4d  %2.2f  %2.2f  %S\n\n",
                    tag, startint, lenint, tmfloat, gcfloat, seq);
    }


    ajStrDel(&start);
    ajStrDel(&lenstr);

    return;
}
示例#19
0
static AjBool resourceoutWriteBasic(AjPFile outf, const AjPResource resource)
{
    if(!outf)
        return ajFalse;

    ajFmtPrintF(outf, "%-8s%S\n", "ID", resource->Id);
    ajFmtPrintF(outf, "%-8s%S\n", "Name", resource->Name);
    if(ajStrGetLen(resource->Url))
        ajFmtPrintF(outf, "%-8s%S\n", "URL", resource->Url);

    ajFmtPrintF(outf, "\n");

    return ajTrue;
}
示例#20
0
static AjBool resourceoutWriteList(AjPFile outf, const AjPResource resource)
{
    if(!outf)
        return ajFalse;
    if(!resource)
        return ajFalse;

    if(ajStrGetLen(resource->Db))
        ajFmtPrintF(outf, "%S:%S\n", resource->Db, resource->Id);
    else
        ajFmtPrintF(outf, "%S\n", resource->Id);

    return ajTrue;
}
示例#21
0
int main(int argc, char **argv)
{
    /* Variable Declarations */
    AjPSeqset seqset = NULL;
    AjPAlign  align  = NULL;
    AjPStr    name     = NULL;
    AjPStr    comment  = NULL;
    AjBool    append   = ajFalse;

    AjPStr    header   = NULL;


    /* ACD File Processing */
    embInit("aligncopy", argc, argv);
    seqset      = ajAcdGetSeqset("sequences");
    align       = ajAcdGetAlign("outfile");
    name       = ajAcdGetString("name");
    comment    = ajAcdGetString("comment");
    append     = ajAcdGetBoolean("append");


    /* Application logic */
    ajAlignDefine(align, seqset);

    if(ajStrGetLen(name))
        ajFmtPrintS(&header, "Alignment: %S\n\n", name);
    ajStrAppendS(&header, comment);
    if(append)
      ajAlignSetHeaderApp(align, header);
    else
      ajAlignSetHeader(align, header);

    ajAlignWrite(align);
    ajAlignClose(align);


    /* Memory management and exit */
    ajSeqsetDel(&seqset);
    ajAlignDel(&align);

    ajStrDel(&name);
    ajStrDel(&comment);
    ajStrDel(&header);

    embExit();

    return 0;
}
示例#22
0
static ajuint patternRegexFormat(const AjPStr fmt)
{
    ajuint i = 0;

    if(!ajStrGetLen(fmt))
       return 0;

    while (patRegInformat[i].Name) {
	if(ajStrMatchCaseC(fmt, patRegInformat[i].Name))
	    return i;
	i++;
    }

    ajErr("Unrecognized regular expression file format '%S'",fmt);

    return 0;
}
示例#23
0
static void eprimer3_send_string(FILE * stream, const char * tag,
                                 const AjPStr value)
{
    AjPStr str;

    str = ajStrNew();

    if(ajStrGetLen(value))
    {
        ajFmtPrintS(&str, "%s=%S\n", tag, value);
        eprimer3_write(str, stream);
    }

    ajStrDel(&str);

    return;
}
示例#24
0
static AjBool assemoutWriteNextList(AjPOutfile outfile, const AjPAssem assem)
{
    AjPFile outf = ajOutfileGetFile(outfile);

    if(!outf) return ajFalse;
    if(!assem) return ajFalse;

    if(!assem->Hasdata)
        return ajTrue;

    if(ajStrGetLen(assem->Db))
        ajFmtPrintF(outf, "%S:%S\n", assem->Db, assem->Id);
    else
        ajFmtPrintF(outf, "%S\n", assem->Id);
    
    return ajTrue;
}
示例#25
0
static AjBool remap_Ambiguous(const AjPStr str)
{
    ajuint ipos;
    char chr;
    
    for (ipos=0; ipos<ajStrGetLen(str); ipos++) 
    {
    	chr = ajStrGetCharPos(str, ipos);
    	if (tolower((int)chr) != 'a' &&
    	    tolower((int)chr) != 'c' &&
    	    tolower((int)chr) != 'g' &&
    	    tolower((int)chr) != 't'
    	    )
            return ajTrue;
    }

    return ajFalse;
}
示例#26
0
static AjBool extractfeat_MatchPatternDescribe(const AjPFeature feat, 
					       const AjPStr describe,
					       AjPStr *strout)
{
    AjIList titer;                      /* iterator for feat */
    AjPStr tagnam = NULL;        /* tag structure */
    AjPStr tagval = NULL;        /* tag structure */
    AjBool val = ajFalse;               /* returned value */


    /* iterate through the tags and test for match to patterns */
    titer = ajFeatTagIter(feat);

    while(ajFeatTagval(titer, &tagnam, &tagval))
    {
        if(embMiscMatchPatternDelimC(tagnam, describe, ",;|"))
	{
            /* There's a match, so write to strout in a pretty format */
            if(!val)
            	ajStrAssignC(strout, "(");
            else
            	ajStrAppendC(strout, ", ");
            val = ajTrue;
            ajStrAppendS(strout, tagnam);

            if(ajStrGetLen(tagval))
	    {
            	ajStrAppendC(strout, "=\"");
            	ajStrAppendS(strout, tagval);
            	ajStrAppendC(strout, "\"");
            }
        }	
    }
    ajListIterDel(&titer);

    if(val)
        ajStrAppendC(strout, ") ");


    ajStrDel(&tagnam);
    ajStrDel(&tagval);

    return val;
}
示例#27
0
static ajuint patternSeqFormat(const AjPStr fmt)
{
    ajuint i = 0;

    if(!ajStrGetLen(fmt))
       return 0;

    while (patSeqInformat[i].Name)
    {
	if(ajStrMatchCaseC(fmt, patSeqInformat[i].Name))
	    return i;

	i++;
    }

    ajErr("Unrecognized pattern file format '%S'",fmt);

    return 0;
}
示例#28
0
AjBool ensGvdatabaseadaptorFailedvariationsconstraint(
    EnsPGvdatabaseadaptor gvdba,
    const AjPStr tablename,
    AjPStr *Pconstraint)
{
    char *txttablename = NULL;

    if (!gvdba)
        return ajFalse;

    if (!Pconstraint)
        return ajFalse;

    if (!*Pconstraint)
        *Pconstraint = ajStrNew();

    if (gvdba->Failedvariations)
    {
        if ((tablename != NULL) && (ajStrGetLen(tablename)))
        {
            ensDatabaseadaptorEscapeC(
                ensGvdatabaseadaptorGetDatabaseadaptor(gvdba),
                &txttablename,
                tablename);

            ajStrAssignC(Pconstraint, txttablename);

            ajCharDel(&txttablename);
        }
        else
            ajStrAssignC(Pconstraint, "failed_variation");

        ajStrAppendC(Pconstraint, ".variation_id IS NULL");
    }
    else
        ajStrAssignC(Pconstraint, "1");

    return ajTrue;
}
示例#29
0
文件: ajresource.c 项目: ICO2S/emboss
static void resourceMakeQry(const AjPResource thys, AjPStr* qry)
{
    ajDebug("resourceMakeQry (Id <%S> Formatstr <%S> Db <%S> "
	    "Filename <%S>)\n",
	    thys->Id, thys->Formatstr, thys->Db,
	    thys->Filename);

    /* ajResourceTrace(thys); */

    if(ajStrGetLen(thys->Db))
	ajFmtPrintS(qry, "%S-id:%S", thys->Db, thys->Id);
    else
    {
	ajFmtPrintS(qry, "%S::%S:%S", thys->Formatstr,
                    thys->Filename,thys->Id);
    }

    ajDebug("      result: <%S>\n",
	    *qry);

    return;
}
示例#30
0
static void dbiblast_dbname(AjPStr* dbname,
			    const AjPStr oname, const char *suff)
{
    AjPStr suffix = NULL;

    ajFmtPrintS(&suffix, ".%s", suff);

    ajStrAssignS(dbname, oname);

    if(ajStrGetCharFirst(oname)=='@')
	ajStrCutStart(dbname, 1);

    if(!ajStrSuffixS(*dbname, suffix))
    {
	ajStrDel(&suffix);
	return;
    }

    ajStrCutEnd(dbname, ajStrGetLen(suffix));

    ajStrDel(&suffix);

    return;
}