/* @include ajpat *************************************************************
**
** AJAX PATTERN (ajax pattern and patternlist) functions
**
** These functions allow handling of patternlists.
**
** @author Copyright (C) 2004 Henrikki Almusa, Medicel Oy, Finland
** @version $Revision: 1.12 $
** @modified Aug 10 Beta version
** @modified 2004-2011 Peter Rice
** @modified $Date: 2011/10/18 14:23:40 $ by $Author: rice $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef AJPAT_H
#define AJPAT_H

/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ajdefine.h"
#include "ajstr.h"
#include "ajlist.h"
#include "ajreg.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */




/*
**  Defines for string search algorithms
*/
#define AJALPHA  256                    /* Alphabet                     */
#define AJMOD256 0xff
#define AJALPHA2 128                    /* ASCII printable              */
#define AJWORD   32                     /* Size of a word               */
#define AJBPS    1                      /* Bits per state               */




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */




/* @data AjPPatBYPNode ********************************************************
**
** AJAX data structure for nodes in Baeza-Yates & Perleberg algorithm
**
** @attr next [struct AjSPatBYPNode*] Pointer to next node
** @attr offset [ajint] Offset
** @attr Padding [char[4]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSPatBYPNode
{
    struct AjSPatBYPNode *next;
    ajint offset;
    char  Padding[4];
} AjOPatBYPNode;

#define AjPPatBYPNode AjOPatBYPNode*




/* @data AjPPatComp ***********************************************************
**
** AJAX data structure that holds all needed data for compiling and
** searching. Not including mismatch number.
**
** @alias AjSPatComp
** @alias AjOPatComp
**
** @attr pattern [AjPStr] Prosite pattern string
** @attr type [ajuint] Prosite pattern compile type
** @attr plen [ajuint] Prosite pattern length
** @attr buf [ajint*] Buffer for BMH search (can be -1)
** @attr off [AjOPatBYPNode[AJALPHA]] Offset buffer for B-Y/P search
** @attr sotable [ajuint*] Buffer for SHIFT-OR
** @attr solimit [ajuint] Limit for BMH search
** @attr m [ajuint] Real length of pattern (from embPatGetType)
** @attr regex [AjPStr] PCRE regexp string
** @attr skipm [ajuint**] Skip buffer for Tarhio-Ukkonen
** @attr amino [AjBool] Must match left begin
** @attr carboxyl [AjBool] Must match right
**
** @@
******************************************************************************/

typedef struct AjSPatComp
{
    AjPStr pattern;
    ajuint type;
    ajuint plen;
    ajint* buf;
    AjOPatBYPNode off[AJALPHA];
    ajuint* sotable;
    ajuint solimit;
    ajuint m;
    AjPStr regex;
    ajuint** skipm;
    AjBool amino;
    AjBool carboxyl;
} AjOPatComp;

#define AjPPatComp AjOPatComp*




/* @data AjPPatternSeq ********************************************************
**
** Ajax sequence pattern object.
**
** Holds definition of feature pattern. Regular expression patterns ignore
** mismatch value.
**
** @alias AjSPatternSeq
** @alias AjOPatternSeq
**
** @attr Name [AjPStr] Name.
** @attr Pattern [AjPStr] Pattern in string format.
** @attr Compiled [void*] Compiled version of the pattern.
** @attr Protein [AjBool] True if protein pattern
** @attr Mismatch [ajuint] Mismatch value.
**
** @new ajPatternSeqNew Default constructor
** @delete ajPatternSeqDel Default destructor
** @use ajPatternSeqGetName Returns name.
** @use ajPatternSeqGetPattern Returns pattern in string format.
** @use ajPatternSeqGetCompiled Returns pointer to compiled pattern.
** @use ajPatternSeqGetType Returns type as integer value.
** @use ajPatternSeqGetMismatch Return mismatch value.
** @@
******************************************************************************/

typedef struct AjSPatternSeq
{
    AjPStr Name;
    AjPStr Pattern;
    void* Compiled;
    AjBool Protein;
    ajuint Mismatch;
} AjOPatternSeq;

#define AjPPatternSeq AjOPatternSeq*




/* @data AjPPatternRegex ******************************************************
**
** Ajax regular expression pattern object.
**
** Holds definition of feature pattern. Regular expression patterns ignore
** mismatch value.
**
** @alias AjSPatternRegex
** @alias AjOPatternRegex
**
** @attr Name [AjPStr] Name.
** @attr Pattern [AjPStr] Pattern in string format.
** @attr Compiled [AjPRegexp] Compiled version of the pattern.
** @attr Type [ajuint] Type.
** @attr Padding [char[4]] Padding to alignment boundary
**
** @new ajPatternRegexNew Default constructor
** @delete ajPatternRegexDel Default destructor
** @use ajPatternRegexGetName Returns name.
** @use ajPatternRegexGetPattern Returns pattern in string format.
** @use ajPatternRegexGetCompiled Returns pointer to compiled pattern.
** @use ajPatternRegexGetType Returns type as integer value.
** @@
******************************************************************************/

typedef struct AjSPatternRegex
{
    AjPStr    Name;
    AjPStr    Pattern;
    AjPRegexp Compiled;
    ajuint    Type;
    char      Padding[4];
} AjOPatternRegex;

#define AjPPatternRegex AjOPatternRegex*




/*
** type can be 0: string, 1: prosite (protein) 2: prosite like (nucleotide)
*/
#define AJ_PAT_TYPE_STRING 0
#define AJ_PAT_TYPE_PRO 1
#define AJ_PAT_TYPE_NUCL 2




/* @data AjPPatlistSeq ********************************************************
**
** Ajax Pattern List object.
**
** Holds list of feature patterns and general information of them.
**
** @alias AjSPatlistSeq
** @alias AjOPatlistSeq
**
** @attr Patlist [AjPList] List for patterns.
** @attr Iter [AjIList] List iterator.
** @attr Protein [AjBool] True if protein
** @attr Padding [char[4]] Padding to alignment boundary
**
** @new ajPatlistNew Default constructor.
** @delete ajPatlistDel Default destructor.
** @modify ajPatlistRegexRead Reads the pattern file and fills the list.
** @modify ajPatlistSeqRead Reads the pattern file and fills the list.
** @modify ajPatlistRewind Restarts the iteration loop.
** @modify ajPatlistAdd Adds new pattern into list.
** @use ajPatlistGetNext Gets the next pattern from file and returns true if
**      available and false if not.
** @@
******************************************************************************/

typedef struct AjSPatlistSeq
{
    AjPList Patlist;
    AjIList Iter;
    AjBool Protein;
    char   Padding[4];
} AjOPatlistSeq;

#define AjPPatlistSeq AjOPatlistSeq*




/* @data AjPPatlistRegex ******************************************************
**
** Ajax Pattern List object.
**
** Holds list of feature patterns and general information of them.
**
** @alias AjSPatlistRegex
** @alias AjOPatlistRegex
**
** @attr Patlist [AjPList] List for patterns.
** @attr Iter [AjIList] List iterator.
** @attr Type [ajuint] Type of expression
** @attr Padding [char[4]] Padding to alignment boundary
**
** @new ajPatlistNew Default constructor.
** @delete ajPatlistDel Default destructor.
** @modify ajPatlistRegexRead Reads the pattern file and fills the list.
** @modify ajPatlistSeqRead Reads the pattern file and fills the list.
** @modify ajPatlistRewind Restarts the iteration loop.
** @modify ajPatlistAdd Adds new pattern into list.
** @use ajPatlistGetNext Gets the next pattern from file and returns true if
**      available and false if not.
** @@
******************************************************************************/

typedef struct AjSPatlistRegex
{
    AjPList Patlist;
    AjIList Iter;
    ajuint Type;
    char Padding[4];
} AjOPatlistRegex;

#define AjPPatlistRegex AjOPatlistRegex*




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */




/*
** Prototype definitions
*/

AjPPatternSeq ajPatternSeqNewList(AjPPatlistSeq plist, const AjPStr name,
                                  const AjPStr pat, ajuint mismatch);
void ajPatternSeqDel(AjPPatternSeq* pthys);
const AjPStr ajPatternSeqGetName(const AjPPatternSeq thys);
const AjPStr ajPatternSeqGetPattern(const AjPPatternSeq thys);
AjPPatComp ajPatternSeqGetCompiled(const AjPPatternSeq thys);
AjBool ajPatternSeqGetProtein(const AjPPatternSeq thys);
ajuint ajPatternSeqGetMismatch(const AjPPatternSeq thys);
void ajPatternSeqSetCompiled(AjPPatternSeq thys, void* pat);
void ajPatternSeqDebug(const AjPPatternSeq pat);

AjPPatternRegex ajPatternRegexNewList(AjPPatlistRegex plist,
                                      const AjPStr name,
                                      const AjPStr pat);
void ajPatternRegexDel(AjPPatternRegex* pthys);
const AjPStr ajPatternRegexGetName(const AjPPatternRegex thys);
const AjPStr ajPatternRegexGetPattern(const AjPPatternRegex thys);
AjPRegexp ajPatternRegexGetCompiled(const AjPPatternRegex thys);
ajuint ajPatternRegexGetType(const AjPPatternRegex thys);
void ajPatternRegexSetCompiled(AjPPatternRegex thys, AjPRegexp pat);
void ajPatternRegexDebug(const AjPPatternRegex pat);

/* Patlist handling functions */
AjPPatlistSeq ajPatlistSeqNewType(AjBool Protein);
AjPPatlistRegex ajPatlistRegexNewType(ajuint type);
AjPPatlistRegex ajPatlistRegexNew(void);
AjPPatlistSeq ajPatlistSeqNew(void);
void ajPatlistSeqDel(AjPPatlistSeq* pthys);
void ajPatlistRegexDel(AjPPatlistRegex* pthys);
AjPPatlistRegex ajPatlistRegexRead(const AjPStr patspec,
                                   const AjPStr patname,
                                   const AjPStr fmt,
                                   ajuint type, AjBool upper, AjBool lower);
AjPPatlistSeq ajPatlistSeqRead(const AjPStr patspec,
                               const AjPStr patname,
                               const AjPStr fmt,
                               AjBool protein, ajuint mismatches);
AjBool ajPatlistRegexGetNext(AjPPatlistRegex thys,
                             AjPPatternRegex* pattern);
AjBool ajPatlistSeqGetNext(AjPPatlistSeq thys,
                           AjPPatternSeq* pattern);
void ajPatlistSeqRewind(AjPPatlistSeq thys);
void ajPatlistRegexRewind(AjPPatlistRegex thys);
void ajPatlistSeqRemoveCurrent(AjPPatlistSeq thys);
void ajPatlistRegexRemoveCurrent(AjPPatlistRegex thys);
void ajPatlistAddRegex(AjPPatlistRegex thys, AjPPatternRegex pat);
void ajPatlistAddSeq(AjPPatlistSeq thys, AjPPatternSeq pat);
ajuint ajPatlistSeqGetSize(const AjPPatlistSeq plist);
ajuint ajPatlistRegexGetSize(const AjPPatlistRegex plist);
ajuint ajPatlistRegexDoc(AjPPatlistRegex thys, AjPStr* pdoc);
ajuint ajPatlistSeqDoc(AjPPatlistSeq thys, AjPStr* pdoc);

AjPPatComp      ajPatCompNew(void);
void            ajPatCompDel(AjPPatComp* pthys);
ajuint ajPatternRegexType(const AjPStr type);

/*
** End of prototype definitions
*/




AJ_END_DECLS

#endif /* !AJPAT_H */
