//***************************************************************************
// This source code is copyrighted 2002 by Google Inc.  All rights
// reserved.  You are given a limited license to use this source code for
// purposes of participating in the Google programming contest.  If you
// choose to use or distribute the source code for any other purpose, you
// must either (1) first obtain written approval from Google, or (2)
// prominently display the foregoing copyright notice and the following
// warranty and liability disclaimer on each copy used or distributed.
// 
// The source code and repository (the "Software") is provided "AS IS",
// with no warranty, express or implied, including but not limited to the
// implied warranties of merchantability and fitness for a particular
// use.  In no event shall Google Inc. be liable for any damages, direct
// or indirect, even if advised of the possibility of such damages.
//***************************************************************************


#ifndef PARSE_ELT_H
#define PARSE_ELT_H

#include <vector>
#include "goo-repos-reader.h"
#include "goo-handler-parser.h"


// This class provides a namespace to collect together parsing-related 
// functions and variables.

class ParseElt {

 public:
  typedef vector<ParseHandler*>* HandlerVec;

  // Given a ReposReader positioned at the beginning of a document
  // and a vector of parse handlers, parse the document, issuing
  // the appropriate callbacks to the parse handlers for each parse
  // element that is encountered. 
  static void Process_Document(ReposReader* rr, HandlerVec ph);

 private:
  static void Process_Header(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ResponseCode(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_BaseURL(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Anchor(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_LocalName(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_AnchorDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ChangeFontColor(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ChangeFontColorEnd(int pc, ReposReader* rr, 
                                         HandlerVec ph);
  static void Process_ChangeBGColor(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ChangeBGColorEnd(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Image(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ImageHeight(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ImageWidth(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Applet(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_AppletDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_IFrame(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_IFrameDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Frame(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Area(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Meta(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Frameset(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_FramesetDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Body(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_BodyDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ParagraphStart(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ParagraphEnd(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Break(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_HorizontalRule(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ListItem(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_UnorderedList(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_OrderedList(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ListDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Div(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_DivDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Span(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_SpanDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Table(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Caption(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_CaptionDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableHCell(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableDCell(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableCellDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableRow(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TableRowDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Form(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_FormDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Select(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_SelectDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Option(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_OptionDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TextArea(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TextAreaDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Input(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Heading(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_HeadingDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Noframes(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_NoframesDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Object(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_ObjectDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Param(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Embed(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_Head(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_HeadDone(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_SetFace(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_SetSize(int pc, ReposReader* rr, HandlerVec ph);
  static void Process_TermOrPunct(int pc, ReposReader* rr, HandlerVec ph);

  static const int kTextBufSize = 1024;
  typedef void (*ParseEltMethod)(int pc, ReposReader* rr, HandlerVec ph);
  
  static const ParseEltMethod kParseCodeTable[];

  static char cbuf1_[];  
  static char cbuf2_[];
  static int cur_face_;
  static int cur_size_;
  static Document doc_;
};



#endif

