/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Hunspell, based on MySpell.
 *
 * The Initial Developers of the Original Code are
 * Kevin Hendricks (MySpell) and Németh László (Hunspell).
 * Portions created by the Initial Developers are Copyright (C) 2002-2005
 * the Initial Developers. All Rights Reserved.
 *
 * Contributor(s): David Einstein, Davide Prina, Giuseppe Modugno,
 * Gianluca Turconi, Simon Brouwer, Noll János, Bíró Árpád,
 * Goldman Eleonóra, Sarlós Tamás, Bencsáth Boldizsár, Halácsy Péter,
 * Dvornik László, Gefferth András, Nagy Viktor, Varga Dániel, Chris Halls,
 * Rene Engelhard, Bram Moolenaar, Dafydd Jones, Harri Pitkänen
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
/*
 * Copyright 2002 Kevin B. Hendricks, Stratford, Ontario, Canada
 * And Contributors.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. All modifications to the source code must be clearly marked as
 *    such.  Binary redistributions based on modified source code
 *    must be clearly marked as modified versions in the documentation
 *    and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY KEVIN B. HENDRICKS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * KEVIN B. HENDRICKS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef AFFIX_HXX_
#define AFFIX_HXX_

#include "atypes.hxx"
#include "baseaffix.hxx"
#include "affixmgr.hxx"

/* A Prefix Entry  */

class PfxEntry : public AffEntry {
 private:
  PfxEntry(const PfxEntry&);
  PfxEntry& operator=(const PfxEntry&);

 private:
  AffixMgr* pmyMgr;

  PfxEntry* next;
  PfxEntry* nexteq;
  PfxEntry* nextne;
  PfxEntry* flgnxt;

 public:
  explicit PfxEntry(AffixMgr* pmgr);

  bool allowCross() const { return ((opts & aeXPRODUCT) != 0); }
  struct hentry* checkword(const char* word,
                           int len,
                           char in_compound,
                           const FLAG needflag = FLAG_NULL);

  struct hentry* check_twosfx(const char* word,
                              int len,
                              char in_compound,
                              const FLAG needflag = FLAG_NULL);

  std::string check_morph(const char* word,
                          int len,
                          char in_compound,
                          const FLAG needflag = FLAG_NULL);

  std::string check_twosfx_morph(const char* word,
                                 int len,
                                 char in_compound,
                                 const FLAG needflag = FLAG_NULL);

  FLAG getFlag() { return aflag; }
  const char* getKey() { return appnd.c_str(); }
  std::string add(const char* word, size_t len);

  inline short getKeyLen() { return appnd.size(); }

  inline const char* getMorph() { return morphcode; }

  inline const unsigned short* getCont() { return contclass; }
  inline short getContLen() { return contclasslen; }

  inline PfxEntry* getNext() { return next; }
  inline PfxEntry* getNextNE() { return nextne; }
  inline PfxEntry* getNextEQ() { return nexteq; }
  inline PfxEntry* getFlgNxt() { return flgnxt; }

  inline void setNext(PfxEntry* ptr) { next = ptr; }
  inline void setNextNE(PfxEntry* ptr) { nextne = ptr; }
  inline void setNextEQ(PfxEntry* ptr) { nexteq = ptr; }
  inline void setFlgNxt(PfxEntry* ptr) { flgnxt = ptr; }

  inline char* nextchar(char* p);
  inline int test_condition(const char* st);
};

/* A Suffix Entry */

class SfxEntry : public AffEntry {
 private:
  SfxEntry(const SfxEntry&);
  SfxEntry& operator=(const SfxEntry&);

 private:
  AffixMgr* pmyMgr;
  std::string rappnd;

  SfxEntry* next;
  SfxEntry* nexteq;
  SfxEntry* nextne;
  SfxEntry* flgnxt;

  SfxEntry* l_morph;
  SfxEntry* r_morph;
  SfxEntry* eq_morph;

 public:
  explicit SfxEntry(AffixMgr* pmgr);

  bool allowCross() const { return ((opts & aeXPRODUCT) != 0); }
  struct hentry* checkword(const char* word,
                           int len,
                           int optflags,
                           PfxEntry* ppfx,
                           const FLAG cclass,
                           const FLAG needflag,
                           const FLAG badflag);

  struct hentry* check_twosfx(const char* word,
                              int len,
                              int optflags,
                              PfxEntry* ppfx,
                              const FLAG needflag = FLAG_NULL);

  std::string check_twosfx_morph(const char* word,
                                 int len,
                                 int optflags,
                                 PfxEntry* ppfx,
                                 const FLAG needflag = FLAG_NULL);
  struct hentry* get_next_homonym(struct hentry* he);
  struct hentry* get_next_homonym(struct hentry* word,
                                  int optflags,
                                  PfxEntry* ppfx,
                                  const FLAG cclass,
                                  const FLAG needflag);

  FLAG getFlag() { return aflag; }
  const char* getKey() { return rappnd.c_str(); }
  std::string add(const char* word, size_t len);

  inline const char* getMorph() { return morphcode; }

  inline const unsigned short* getCont() { return contclass; }
  inline short getContLen() { return contclasslen; }
  inline const char* getAffix() { return appnd.c_str(); }

  inline short getKeyLen() { return appnd.size(); }

  inline SfxEntry* getNext() { return next; }
  inline SfxEntry* getNextNE() { return nextne; }
  inline SfxEntry* getNextEQ() { return nexteq; }

  inline SfxEntry* getLM() { return l_morph; }
  inline SfxEntry* getRM() { return r_morph; }
  inline SfxEntry* getEQM() { return eq_morph; }
  inline SfxEntry* getFlgNxt() { return flgnxt; }

  inline void setNext(SfxEntry* ptr) { next = ptr; }
  inline void setNextNE(SfxEntry* ptr) { nextne = ptr; }
  inline void setNextEQ(SfxEntry* ptr) { nexteq = ptr; }
  inline void setFlgNxt(SfxEntry* ptr) { flgnxt = ptr; }
  void initReverseWord();

  inline char* nextchar(char* p);
  inline int test_condition(const char* st, const char* begin);
};

#endif
