text: /*
   * Copyright 2010, Lloyd Hilaiel.
   * 
   * 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. Neither the name of Lloyd Hilaiel nor the names of its
   *	 contributors may be used to endorse or promote products derived
   *	 from this software without specific prior written permission.
   * 
   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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 __YAJL_LEX_H__
  #define __YAJL_LEX_H__
  
  #include "api/yajl_common.h"
  
  typedef enum {
  	yajl_tok_bool,		 
  	yajl_tok_colon,
  	yajl_tok_comma,	 
  	yajl_tok_eof,
  	yajl_tok_error,
  	yajl_tok_left_brace,	 
  	yajl_tok_left_bracket,
  	yajl_tok_null,		 
  	yajl_tok_right_brace,	 
  	yajl_tok_right_bracket,
  
  	/* we differentiate between integers and doubles to allow the
  	 * parser to interpret the number without re-scanning */
  	yajl_tok_integer, 
  	yajl_tok_double, 
  
  	/* we differentiate between strings which require further processing,
  	 * and strings that do not */
  	yajl_tok_string,
  	yajl_tok_string_with_escapes,
  
  	/* comment tokens are not currently returned to the parser, ever */
  	yajl_tok_comment
  } yajl_tok;
  
  typedef struct yajl_lexer_t * yajl_lexer;
  
  yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc,
  						  unsigned int allowComments,
  						  unsigned int validateUTF8);
  
  void yajl_lex_free(yajl_lexer lexer);
  
  /**
   * run/continue a lex. "offset" is an input/output parameter.
   * It should be initialized to zero for a
   * new chunk of target text, and upon subsetquent calls with the same
   * target text should passed with the value of the previous invocation.
   *
   * the client may be interested in the value of offset when an error is
   * returned from the lexer.  This allows the client to render useful
  n * error messages.
   *
   * When you pass the next chunk of data, context should be reinitialized
   * to zero.
   * 
   * Finally, the output buffer is usually just a pointer into the jsonText,
   * however in cases where the entity being lexed spans multiple chunks,
   * the lexer will buffer the entity and the data returned will be
   * a pointer into that buffer.
   *
   * This behavior is abstracted from client code except for the performance
   * implications which require that the client choose a reasonable chunk
   * size to get adequate performance.
   */
  yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText,
  					  unsigned int jsonTextLen, unsigned int * offset,
  					  const unsigned char ** outBuf, unsigned int * outLen);
  
  /** have a peek at the next token, but don't move the lexer forward */
  yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText,
  					   unsigned int jsonTextLen, unsigned int offset);
  
  
  typedef enum {
  	yajl_lex_e_ok = 0,
  	yajl_lex_string_invalid_utf8,
  	yajl_lex_string_invalid_escaped_char,
  	yajl_lex_string_invalid_json_char,
  	yajl_lex_string_invalid_hex_char,
  	yajl_lex_invalid_char,
  	yajl_lex_invalid_string,
  	yajl_lex_missing_integer_after_decimal,
  	yajl_lex_missing_integer_after_exponent,
  	yajl_lex_missing_integer_after_minus,
  	yajl_lex_unallowed_comment
  } yajl_lex_error;
  
  const char * yajl_lex_error_to_string(yajl_lex_error error);
  
  /** allows access to more specific information about the lexical
   *  error when yajl_lex_lex returns yajl_tok_error. */
  yajl_lex_error yajl_lex_get_error(yajl_lexer lexer);
  
  /** get the current offset into the most recently lexed json string. */
  unsigned int yajl_lex_current_offset(yajl_lexer lexer);
  
  /** get the number of lines lexed by this lexer instance */
  unsigned int yajl_lex_current_line(yajl_lexer lexer);
  
  /** get the number of chars lexed by this lexer instance since the last
   *  \n or \r */
  unsigned int yajl_lex_current_char(yajl_lexer lexer);
  
  #endif
  