/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: parse.h,v 1.7 1999/06/05 23:29:15 greear Exp $
// $Revision: 1.7 $  $Author: greear $ $Date: 1999/06/05 23:29:15 $

//
//ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program 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 General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

#ifndef PARSE_INCLUDE_H
#define PARSE_INCLUDE_H

#include <string2.h>
#include "classes.h"
#include "parse_gen.h"

#define RAW_MAX 20
#define COOKED_MAX 20

String parse_hlp_command(const String& str1);
//int process_input(critter& pc, String& input, short do_sub);


class CmdSpecifier {
private:
   static int _cnt;

protected:
   String word;
   String hlp_key;
   int len;
   CmdId id;
   CmdSpecifier* next;

public:
   CmdSpecifier(const char* w, int l, CmdId cmd_id, const char* help_key)
         : word(w), hlp_key(help_key), len(l), id(cmd_id), next(NULL)
      { _cnt++; word.Tolower(); }
   CmdSpecifier(const char* w, int l) 
         : word(w), len(l), id(ci_UNKNOWN), next(NULL)
      { _cnt++; word.Tolower(); }
   CmdSpecifier() 
         : len(0), id(ci_UNKNOWN), next(NULL)
      { _cnt++; word.Tolower(); }
   ~CmdSpecifier() { _cnt--; }

   // If *this is longer than src, then it will NEVER match.
   // But, if it is equal or lesser, it may match.
   int doesSatisfyMatch(const CmdSpecifier& src) const {
      if (len > src.len) {
         return 0;
      }
      return *this == src;
   }

   String toString() const;

   int operator==(const CmdSpecifier& src) const {
      return (strncasecmp(word, src.word, min(len, src.len)) == 0);
   }
   
   int operator<(const CmdSpecifier& src) {
      return (strncasecmp(word, src.word, max(len, src.len)) < 0);
   }

   int operator>(const CmdSpecifier& src) {
      return (strncasecmp(word, src.word, max(len, src.len)) > 0);
   }

   //unsigned int hash() { return word.hash(); }
   String getHelpKey() const { return hlp_key; }
   CmdId getId() const { return id; }
   CmdSpecifier* getNext() const { return next; }
   String getCmd() const { return word; }
   void setNext(CmdSpecifier* ptr) { next = ptr; }

   static int getInstanceCount() { return _cnt; }
};


   
#define CMD_ARRAY_LEN 26

class CmdCollection {
protected:
   CmdSpecifier* cmd_specifiers[CMD_ARRAY_LEN];

public:
   CmdCollection();

   void addCmdSpecifier(const CmdSpecifier* cs);
   void addCmdSpecifierNoCreate(CmdSpecifier* cs);

   // can return NULL
   const CmdSpecifier* findSpecifierFor(const CmdSpecifier* cs,
                                        int cmd_only);

   int calculateIndex(char val) {
      //convert to upper, subtract A, then hash
      return (abs(toupper(val) - 'A') % CMD_ARRAY_LEN);
   }

};

extern CmdCollection cmds_collection;

#endif