diff --git a/pjlib/include/pj/scanner.h b/pjlib/include/pj/scanner.h
index 5b04c68..5a82ff9 100644
--- a/pjlib/include/pj/scanner.h
+++ b/pjlib/include/pj/scanner.h
@@ -1,454 +1,454 @@
-/* $Header: /pjproject-0.3/pjlib/include/pj/scanner.h 10    10/14/05 12:26a Bennylp $ */
-
-#ifndef __PJ_PARSER_H__
-#define __PJ_PARSER_H__
-
-/**
- * @file scanner.h
- * @brief Text Scanning.
- */
-
-#include <pj/types.h>
-
-PJ_BEGIN_DECL
-
-/**
- * @defgroup PJ_SCAN Text Scanning
- * @ingroup PJ_MISC
- * @brief
- * Text scanning utility.
- */
-
-/**
- * @defgroup PJ_CHARSPEC Character Filter Specification
- * @ingroup PJ_SCAN
- * @brief
- * The type pj_char_spec is a specification of character set used in
- * scanner. Application can define multiple character specs, such as to
- * scan alpha numerics, numbers, tokens, etc.
- * @{
- */
-
-/**
- * This describes the type of individual character specification in
- * #pj_char_spec.
- */
-typedef pj_uint8_t pj_char_spec_element_t;
-
-/**
- * The character specification is implemented as array of boolean flags. Each
- * flag indicates the membership of the character in the spec. If the flag
- * at one position is non-zero, then the character at that position belongs
- * to the specification, and vice versa.
- */
-typedef pj_char_spec_element_t pj_char_spec[256];
-// Note: it's got to be 256 (not 128) to cater for extended character in input.
-
-/**
- * Initialize character spec.
- * @param cs the scanner character specification.
- */
-PJ_DECL(void) pj_cs_init( pj_char_spec cs);
-
-/**
- * Set the membership of the specified character to TRUE.
- * @param cs the scanner character specification.
- * @param c the character.
- */
-PJ_DECL(void) pj_cs_set( pj_char_spec cs, int c);
-
-/**
- * Add the characters in the specified range '[cstart, cend)' to the 
- * specification (the last character itself ('cend') is not added).
- * @param cs the scanner character specification.
- * @param cstart the first character in the range.
- * @param cend the next character after the last character in the range.
- */
-PJ_DECL(void) pj_cs_add_range( pj_char_spec cs, int cstart, int cend);
-
-/**
- * Add alphabetic characters to the specification.
- * @param cs the scanner character specification.
- */
-PJ_DECL(void) pj_cs_add_alpha( pj_char_spec cs);
-
-/**
- * Add numeric characters to the specification.
- * @param cs the scanner character specification.
- */
-PJ_DECL(void) pj_cs_add_num( pj_char_spec cs);
-
-/**
- * Add the characters in the string to the specification.
- * @param cs the scanner character specification.
- * @param str the string.
- */
-PJ_DECL(void) pj_cs_add_str( pj_char_spec cs, const char *str);
-
-/**
- * Delete characters in the specified range from the specification.
- * @param cs the scanner character specification.
- * @param cstart the first character in the range.
- * @param cend the next character after the last character in the range.
- */
-PJ_DECL(void) pj_cs_del_range( pj_char_spec cs, int cstart, int cend);
-
-/**
- * Delete characters in the specified string from the specification.
- * @param cs the scanner character specification.
- * @param str the string.
- */
-PJ_DECL(void) pj_cs_del_str( pj_char_spec cs, const char *str);
-
-/**
- * Invert specification.
- * @param cs the scanner character specification.
- */
-PJ_DECL(void) pj_cs_invert( pj_char_spec cs );
-
-/**
- * Check whether the specified character belongs to the specification.
- * @param cs the scanner character specification.
- * @param c the character to check for matching.
- */
-PJ_INLINE(int) pj_cs_match( const pj_char_spec cs, int c )
-{
-    return cs[c];
-}
-
-/**
- * @}
- */
-
-/**
- * @defgroup PJ_SCANNER Text Scanner
- * @ingroup PJ_SCAN
- * @{
- */
-
-/**
- * Flags for scanner.
- */
-enum
-{
-    /** This flags specifies that the scanner should automatically skip
-	whitespaces 
-     */
-    PJ_SCAN_AUTOSKIP_WS = 1,
-
-    /** This flags specifies that the scanner should automatically skip
-        SIP header continuation. This flag implies PJ_SCAN_AUTOSKIP_WS.
-     */
-    PJ_SCAN_AUTOSKIP_WS_HEADER = 3,
-
-    /** Auto-skip new lines.
-     */
-    PJ_SCAN_AUTOSKIP_NEWLINE = 4,
-};
-
-
-/* Forward decl. */
-struct pj_scanner;
-
-
-/**
- * The callback function type to be called by the scanner when it encounters
- * syntax error.
- * @param scanner   The scanner instance that calls the callback .
- */
-typedef void (*pj_syn_err_func_ptr)(struct pj_scanner *scanner);
-
-
-/**
- * The text scanner structure.
- */
-typedef struct pj_scanner
-{
-    char *begin;        /**< Start of input buffer. */
-    char *end;          /**< End of input buffer.   */
-    char *curptr;       /**< Current pointer.       */
-    int  line;          /**< Current line.          */
-    int  col;           /**< Current column.        */
-    int  skip_ws;       /**< Skip whitespace flag.  */
-    pj_syn_err_func_ptr callback;   /**< Syntax error callback. */
-} pj_scanner;
-
-
-/**
- * This structure can be used by application to store the state of the parser,
- * so that the scanner state can be rollback to this state when necessary.
- */
-typedef struct pj_scan_state
-{
-    char *curptr;       /**< Current scanner's pointer. */
-    int   line;         /**< Current line.      */
-    int   col;          /**< Current column.    */
-} pj_scan_state;
-
-
-/**
- * Initialize the scanner. Note that the input string buffer must have
- * length at least buflen+1 because the scanner will NULL terminate the
- * string during initialization.
- *
- * @param scanner   The scanner to be initialized.
- * @param bufstart  The input buffer to scan. Note that buffer[buflen] will be 
- *		    filled with NULL char until scanner is destroyed, so
- *		    the actual buffer length must be at least buflen+1.
- * @param buflen    The length of the input buffer, which normally is
- *		    strlen(bufstart).
- * @param options   Zero, or combination of PJ_SCAN_AUTOSKIP_WS or
- *		    PJ_SCAN_AUTOSKIP_WS_HEADER
- * @param callback  Callback to be called when the scanner encounters syntax
- *		    error condition.
- */
-PJ_DECL(void) pj_scan_init( pj_scanner *scanner, char *bufstart, int buflen, 
-			    unsigned options,
-			    pj_syn_err_func_ptr callback );
-
-
-/** 
- * Call this function when application has finished using the scanner.
- *
- * @param scanner   The scanner.
- */
-PJ_DECL(void) pj_scan_fini( pj_scanner *scanner );
-
-
-/** 
- * Determine whether the EOF condition for the scanner has been met.
- *
- * @param scanner   The scanner.
- *
- * @return Non-zero if scanner is EOF.
- */
-PJ_INLINE(int) pj_scan_is_eof( const pj_scanner *scanner)
-{
-    return scanner->curptr >= scanner->end;
-}
-
-
-/** 
- * Peek strings in current position according to parameter spec, and return
- * the strings in parameter out. The current scanner position will not be
- * moved. If the scanner is already in EOF state, syntax error callback will
- * be called thrown.
- *
- * @param scanner   The scanner.
- * @param spec	    The spec to match input string.
- * @param out	    String to store the result.
- *
- * @return the character right after the peek-ed position or zero if there's
- *	   no more characters.
- */
-PJ_DECL(int) pj_scan_peek( pj_scanner *scanner,
-			    const pj_char_spec spec, pj_str_t *out);
-
-
-/** 
- * Peek len characters in current position, and return them in out parameter.
- * Note that whitespaces or newlines will be returned as it is, regardless
- * of PJ_SCAN_AUTOSKIP_WS settings. If the character left is less than len, 
- * syntax error callback will be called.
- *
- * @param scanner   The scanner.
- * @param len	    Length to peek.
- * @param out	    String to store the result.
- *
- * @return the character right after the peek-ed position or zero if there's
- *	   no more characters.
- */
-PJ_DECL(int) pj_scan_peek_n( pj_scanner *scanner,
-			      pj_size_t len, pj_str_t *out);
-
-
-/** 
- * Peek strings in current position until spec is matched, and return
- * the strings in parameter out. The current scanner position will not be
- * moved. If the scanner is already in EOF state, syntax error callback will
- * be called.
- *
- * @param scanner   The scanner.
- * @param spec	    The peeking will stop when the input match this spec.
- * @param out	    String to store the result.
- *
- * @return the character right after the peek-ed position.
- */
-PJ_DECL(int) pj_scan_peek_until( pj_scanner *scanner,
-				  const pj_char_spec spec, 
-				  pj_str_t *out);
-
-
-/** 
- * Get characters from the buffer according to the spec, and return them
- * in out parameter. The scanner will attempt to get as many characters as
- * possible as long as the spec matches. If the first character doesn't
- * match the spec, or scanner is already in EOF when this function is called,
- * an exception will be thrown.
- *
- * @param scanner   The scanner.
- * @param spec	    The spec to match input string.
- * @param out	    String to store the result.
- */
-PJ_DECL(void) pj_scan_get( pj_scanner *scanner,
-			    const pj_char_spec spec, pj_str_t *out);
-
-
-/** 
- * Get characters between quotes. If current input doesn't match begin_quote,
- * syntax error will be thrown.
- *
- * @param scanner	The scanner.
- * @param begin_quote	The character to begin the quote.
- * @param end_quote	The character to end the quote.
- * @param out		String to store the result.
- */
-PJ_DECL(void) pj_scan_get_quote( pj_scanner *scanner,
-				  int begin_quote, int end_quote, 
-				  pj_str_t *out);
-
-/** 
- * Get N characters from the scanner.
- *
- * @param scanner   The scanner.
- * @param N	    Number of characters to get.
- * @param out	    String to store the result.
- */
-PJ_DECL(void) pj_scan_get_n( pj_scanner *scanner,
-			      unsigned N, pj_str_t *out);
-
-
-/** 
- * Get one character from the scanner.
- *
- * @param scanner   The scanner.
- *
- * @return (unknown)
- */
-PJ_DECL(int) pj_scan_get_char( pj_scanner *scanner );
-
-
-/** 
- * Get a newline from the scanner. A newline is defined as '\\n', or '\\r', or
- * "\\r\\n". If current input is not newline, syntax error will be thrown.
- *
- * @param scanner   The scanner.
- */
-PJ_DECL(void) pj_scan_get_newline( pj_scanner *scanner );
-
-
-/** 
- * Get characters from the scanner and move the scanner position until the
- * current character matches the spec.
- *
- * @param scanner   The scanner.
- * @param spec	    Get until the input match this spec.
- * @param out	    String to store the result.
- */
-PJ_DECL(void) pj_scan_get_until( pj_scanner *scanner,
-				  const pj_char_spec spec, pj_str_t *out);
-
-
-/** 
- * Get characters from the scanner and move the scanner position until the
- * current character matches until_char.
- *
- * @param scanner	The scanner.
- * @param until_char    Get until the input match this character.
- * @param out		String to store the result.
- */
-PJ_DECL(void) pj_scan_get_until_ch( pj_scanner *scanner, 
-				     int until_char, pj_str_t *out);
-
-
-/** 
- * Get characters from the scanner and move the scanner position until the
- * current character matches until_char.
- *
- * @param scanner	The scanner.
- * @param until_spec	Get until the input match any of these characters.
- * @param out		String to store the result.
- */
-PJ_DECL(void) pj_scan_get_until_chr( pj_scanner *scanner,
-				      const char *until_spec, pj_str_t *out);
-
-/** 
- * Advance the scanner N characters, and skip whitespace
- * if necessary.
- *
- * @param scanner   The scanner.
- * @param N	    Number of characters to skip.
- * @param skip	    Flag to specify whether whitespace should be skipped
- *		    after skipping the characters.
- */
-PJ_DECL(void) pj_scan_advance_n( pj_scanner *scanner,
-				  unsigned N, pj_bool_t skip);
-
-
-/** 
- * Compare string in current position with the specified string.
- * 
- * @param scanner   The scanner.
- * @param s	    The string to compare with.
- * @param len	    Length of the string to compare.
- *
- * @return zero, <0, or >0 (just like strcmp()).
- */
-PJ_DECL(int) pj_scan_strcmp( pj_scanner *scanner, const char *s, int len);
-
-
-/** 
- * Case-less string comparison of current position with the specified
- * string.
- *
- * @param scanner   The scanner.
- * @param s	    The string to compare with.
- * @param len	    Length of the string to compare with.
- *
- * @return zero, <0, or >0 (just like strcmp()).
- */
-PJ_DECL(int) pj_scan_stricmp( pj_scanner *scanner, const char *s, int len);
-
-
-/** 
- * Manually skip whitespaces according to flag that was specified when
- * the scanner was initialized.
- *
- * @param scanner   The scanner.
- */
-PJ_DECL(void) pj_scan_skip_whitespace( pj_scanner *scanner );
-
-
-/** 
- * Save the full scanner state.
- *
- * @param scanner   The scanner.
- * @param state	    Variable to store scanner's state.
- */
-PJ_DECL(void) pj_scan_save_state( pj_scanner *scanner, pj_scan_state *state);
-
-
-/** 
- * Restore the full scanner state.
- * Note that this would not restore the string if application has modified
- * it. This will only restore the scanner scanning position.
- *
- * @param scanner   The scanner.
- * @param state	    State of the scanner.
- */
-PJ_DECL(void) pj_scan_restore_state( pj_scanner *scanner, 
-				      pj_scan_state *state);
-
-/**
- * @}
- */
-
-#if PJ_FUNCTIONS_ARE_INLINED
-#  include "scanner_i.h"
-#endif
-
-
-PJ_END_DECL
-
-#endif
-
+/* $Header: /pjproject-0.3/pjlib/include/pj/scanner.h 10    10/14/05 12:26a Bennylp $ */
+
+#ifndef __PJ_PARSER_H__
+#define __PJ_PARSER_H__
+
+/**
+ * @file scanner.h
+ * @brief Text Scanning.
+ */
+
+#include <pj/types.h>
+
+PJ_BEGIN_DECL
+
+/**
+ * @defgroup PJ_SCAN Text Scanning
+ * @ingroup PJ_MISC
+ * @brief
+ * Text scanning utility.
+ */
+
+/**
+ * @defgroup PJ_CHARSPEC Character Filter Specification
+ * @ingroup PJ_SCAN
+ * @brief
+ * The type pj_char_spec is a specification of character set used in
+ * scanner. Application can define multiple character specs, such as to
+ * scan alpha numerics, numbers, tokens, etc.
+ * @{
+ */
+
+/**
+ * This describes the type of individual character specification in
+ * #pj_char_spec.
+ */
+typedef pj_uint8_t pj_char_spec_element_t;
+
+/**
+ * The character specification is implemented as array of boolean flags. Each
+ * flag indicates the membership of the character in the spec. If the flag
+ * at one position is non-zero, then the character at that position belongs
+ * to the specification, and vice versa.
+ */
+typedef pj_char_spec_element_t pj_char_spec[256];
+// Note: it's got to be 256 (not 128) to cater for extended character in input.
+
+/**
+ * Initialize character spec.
+ * @param cs the scanner character specification.
+ */
+PJ_DECL(void) pj_cs_init( pj_char_spec cs);
+
+/**
+ * Set the membership of the specified character to TRUE.
+ * @param cs the scanner character specification.
+ * @param c the character.
+ */
+PJ_DECL(void) pj_cs_set( pj_char_spec cs, int c);
+
+/**
+ * Add the characters in the specified range '[cstart, cend)' to the 
+ * specification (the last character itself ('cend') is not added).
+ * @param cs the scanner character specification.
+ * @param cstart the first character in the range.
+ * @param cend the next character after the last character in the range.
+ */
+PJ_DECL(void) pj_cs_add_range( pj_char_spec cs, int cstart, int cend);
+
+/**
+ * Add alphabetic characters to the specification.
+ * @param cs the scanner character specification.
+ */
+PJ_DECL(void) pj_cs_add_alpha( pj_char_spec cs);
+
+/**
+ * Add numeric characters to the specification.
+ * @param cs the scanner character specification.
+ */
+PJ_DECL(void) pj_cs_add_num( pj_char_spec cs);
+
+/**
+ * Add the characters in the string to the specification.
+ * @param cs the scanner character specification.
+ * @param str the string.
+ */
+PJ_DECL(void) pj_cs_add_str( pj_char_spec cs, const char *str);
+
+/**
+ * Delete characters in the specified range from the specification.
+ * @param cs the scanner character specification.
+ * @param cstart the first character in the range.
+ * @param cend the next character after the last character in the range.
+ */
+PJ_DECL(void) pj_cs_del_range( pj_char_spec cs, int cstart, int cend);
+
+/**
+ * Delete characters in the specified string from the specification.
+ * @param cs the scanner character specification.
+ * @param str the string.
+ */
+PJ_DECL(void) pj_cs_del_str( pj_char_spec cs, const char *str);
+
+/**
+ * Invert specification.
+ * @param cs the scanner character specification.
+ */
+PJ_DECL(void) pj_cs_invert( pj_char_spec cs );
+
+/**
+ * Check whether the specified character belongs to the specification.
+ * @param cs the scanner character specification.
+ * @param c the character to check for matching.
+ */
+PJ_INLINE(int) pj_cs_match( const pj_char_spec cs, int c )
+{
+    return cs[c];
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup PJ_SCANNER Text Scanner
+ * @ingroup PJ_SCAN
+ * @{
+ */
+
+/**
+ * Flags for scanner.
+ */
+enum
+{
+    /** This flags specifies that the scanner should automatically skip
+	whitespaces 
+     */
+    PJ_SCAN_AUTOSKIP_WS = 1,
+
+    /** This flags specifies that the scanner should automatically skip
+        SIP header continuation. This flag implies PJ_SCAN_AUTOSKIP_WS.
+     */
+    PJ_SCAN_AUTOSKIP_WS_HEADER = 3,
+
+    /** Auto-skip new lines.
+     */
+    PJ_SCAN_AUTOSKIP_NEWLINE = 4,
+};
+
+
+/* Forward decl. */
+struct pj_scanner;
+
+
+/**
+ * The callback function type to be called by the scanner when it encounters
+ * syntax error.
+ * @param scanner   The scanner instance that calls the callback .
+ */
+typedef void (*pj_syn_err_func_ptr)(struct pj_scanner *scanner);
+
+
+/**
+ * The text scanner structure.
+ */
+typedef struct pj_scanner
+{
+    char *begin;        /**< Start of input buffer. */
+    char *end;          /**< End of input buffer.   */
+    char *curptr;       /**< Current pointer.       */
+    int  line;          /**< Current line.          */
+    int  col;           /**< Current column.        */
+    int  skip_ws;       /**< Skip whitespace flag.  */
+    pj_syn_err_func_ptr callback;   /**< Syntax error callback. */
+} pj_scanner;
+
+
+/**
+ * This structure can be used by application to store the state of the parser,
+ * so that the scanner state can be rollback to this state when necessary.
+ */
+typedef struct pj_scan_state
+{
+    char *curptr;       /**< Current scanner's pointer. */
+    int   line;         /**< Current line.      */
+    int   col;          /**< Current column.    */
+} pj_scan_state;
+
+
+/**
+ * Initialize the scanner. Note that the input string buffer must have
+ * length at least buflen+1 because the scanner will NULL terminate the
+ * string during initialization.
+ *
+ * @param scanner   The scanner to be initialized.
+ * @param bufstart  The input buffer to scan. Note that buffer[buflen] will be 
+ *		    filled with NULL char until scanner is destroyed, so
+ *		    the actual buffer length must be at least buflen+1.
+ * @param buflen    The length of the input buffer, which normally is
+ *		    strlen(bufstart).
+ * @param options   Zero, or combination of PJ_SCAN_AUTOSKIP_WS or
+ *		    PJ_SCAN_AUTOSKIP_WS_HEADER
+ * @param callback  Callback to be called when the scanner encounters syntax
+ *		    error condition.
+ */
+PJ_DECL(void) pj_scan_init( pj_scanner *scanner, char *bufstart, int buflen, 
+			    unsigned options,
+			    pj_syn_err_func_ptr callback );
+
+
+/** 
+ * Call this function when application has finished using the scanner.
+ *
+ * @param scanner   The scanner.
+ */
+PJ_DECL(void) pj_scan_fini( pj_scanner *scanner );
+
+
+/** 
+ * Determine whether the EOF condition for the scanner has been met.
+ *
+ * @param scanner   The scanner.
+ *
+ * @return Non-zero if scanner is EOF.
+ */
+PJ_INLINE(int) pj_scan_is_eof( const pj_scanner *scanner)
+{
+    return scanner->curptr >= scanner->end;
+}
+
+
+/** 
+ * Peek strings in current position according to parameter spec, and return
+ * the strings in parameter out. The current scanner position will not be
+ * moved. If the scanner is already in EOF state, syntax error callback will
+ * be called thrown.
+ *
+ * @param scanner   The scanner.
+ * @param spec	    The spec to match input string.
+ * @param out	    String to store the result.
+ *
+ * @return the character right after the peek-ed position or zero if there's
+ *	   no more characters.
+ */
+PJ_DECL(int) pj_scan_peek( pj_scanner *scanner,
+			    const pj_char_spec spec, pj_str_t *out);
+
+
+/** 
+ * Peek len characters in current position, and return them in out parameter.
+ * Note that whitespaces or newlines will be returned as it is, regardless
+ * of PJ_SCAN_AUTOSKIP_WS settings. If the character left is less than len, 
+ * syntax error callback will be called.
+ *
+ * @param scanner   The scanner.
+ * @param len	    Length to peek.
+ * @param out	    String to store the result.
+ *
+ * @return the character right after the peek-ed position or zero if there's
+ *	   no more characters.
+ */
+PJ_DECL(int) pj_scan_peek_n( pj_scanner *scanner,
+			      pj_size_t len, pj_str_t *out);
+
+
+/** 
+ * Peek strings in current position until spec is matched, and return
+ * the strings in parameter out. The current scanner position will not be
+ * moved. If the scanner is already in EOF state, syntax error callback will
+ * be called.
+ *
+ * @param scanner   The scanner.
+ * @param spec	    The peeking will stop when the input match this spec.
+ * @param out	    String to store the result.
+ *
+ * @return the character right after the peek-ed position.
+ */
+PJ_DECL(int) pj_scan_peek_until( pj_scanner *scanner,
+				  const pj_char_spec spec, 
+				  pj_str_t *out);
+
+
+/** 
+ * Get characters from the buffer according to the spec, and return them
+ * in out parameter. The scanner will attempt to get as many characters as
+ * possible as long as the spec matches. If the first character doesn't
+ * match the spec, or scanner is already in EOF when this function is called,
+ * an exception will be thrown.
+ *
+ * @param scanner   The scanner.
+ * @param spec	    The spec to match input string.
+ * @param out	    String to store the result.
+ */
+PJ_DECL(void) pj_scan_get( pj_scanner *scanner,
+			    const pj_char_spec spec, pj_str_t *out);
+
+
+/** 
+ * Get characters between quotes. If current input doesn't match begin_quote,
+ * syntax error will be thrown.
+ *
+ * @param scanner	The scanner.
+ * @param begin_quote	The character to begin the quote.
+ * @param end_quote	The character to end the quote.
+ * @param out		String to store the result.
+ */
+PJ_DECL(void) pj_scan_get_quote( pj_scanner *scanner,
+				  int begin_quote, int end_quote, 
+				  pj_str_t *out);
+
+/** 
+ * Get N characters from the scanner.
+ *
+ * @param scanner   The scanner.
+ * @param N	    Number of characters to get.
+ * @param out	    String to store the result.
+ */
+PJ_DECL(void) pj_scan_get_n( pj_scanner *scanner,
+			      unsigned N, pj_str_t *out);
+
+
+/** 
+ * Get one character from the scanner.
+ *
+ * @param scanner   The scanner.
+ *
+ * @return (unknown)
+ */
+PJ_DECL(int) pj_scan_get_char( pj_scanner *scanner );
+
+
+/** 
+ * Get a newline from the scanner. A newline is defined as '\\n', or '\\r', or
+ * "\\r\\n". If current input is not newline, syntax error will be thrown.
+ *
+ * @param scanner   The scanner.
+ */
+PJ_DECL(void) pj_scan_get_newline( pj_scanner *scanner );
+
+
+/** 
+ * Get characters from the scanner and move the scanner position until the
+ * current character matches the spec.
+ *
+ * @param scanner   The scanner.
+ * @param spec	    Get until the input match this spec.
+ * @param out	    String to store the result.
+ */
+PJ_DECL(void) pj_scan_get_until( pj_scanner *scanner,
+				  const pj_char_spec spec, pj_str_t *out);
+
+
+/** 
+ * Get characters from the scanner and move the scanner position until the
+ * current character matches until_char.
+ *
+ * @param scanner	The scanner.
+ * @param until_char    Get until the input match this character.
+ * @param out		String to store the result.
+ */
+PJ_DECL(void) pj_scan_get_until_ch( pj_scanner *scanner, 
+				     int until_char, pj_str_t *out);
+
+
+/** 
+ * Get characters from the scanner and move the scanner position until the
+ * current character matches until_char.
+ *
+ * @param scanner	The scanner.
+ * @param until_spec	Get until the input match any of these characters.
+ * @param out		String to store the result.
+ */
+PJ_DECL(void) pj_scan_get_until_chr( pj_scanner *scanner,
+				      const char *until_spec, pj_str_t *out);
+
+/** 
+ * Advance the scanner N characters, and skip whitespace
+ * if necessary.
+ *
+ * @param scanner   The scanner.
+ * @param N	    Number of characters to skip.
+ * @param skip	    Flag to specify whether whitespace should be skipped
+ *		    after skipping the characters.
+ */
+PJ_DECL(void) pj_scan_advance_n( pj_scanner *scanner,
+				  unsigned N, pj_bool_t skip);
+
+
+/** 
+ * Compare string in current position with the specified string.
+ * 
+ * @param scanner   The scanner.
+ * @param s	    The string to compare with.
+ * @param len	    Length of the string to compare.
+ *
+ * @return zero, <0, or >0 (just like strcmp()).
+ */
+PJ_DECL(int) pj_scan_strcmp( pj_scanner *scanner, const char *s, int len);
+
+
+/** 
+ * Case-less string comparison of current position with the specified
+ * string.
+ *
+ * @param scanner   The scanner.
+ * @param s	    The string to compare with.
+ * @param len	    Length of the string to compare with.
+ *
+ * @return zero, <0, or >0 (just like strcmp()).
+ */
+PJ_DECL(int) pj_scan_stricmp( pj_scanner *scanner, const char *s, int len);
+
+
+/** 
+ * Manually skip whitespaces according to flag that was specified when
+ * the scanner was initialized.
+ *
+ * @param scanner   The scanner.
+ */
+PJ_DECL(void) pj_scan_skip_whitespace( pj_scanner *scanner );
+
+
+/** 
+ * Save the full scanner state.
+ *
+ * @param scanner   The scanner.
+ * @param state	    Variable to store scanner's state.
+ */
+PJ_DECL(void) pj_scan_save_state( pj_scanner *scanner, pj_scan_state *state);
+
+
+/** 
+ * Restore the full scanner state.
+ * Note that this would not restore the string if application has modified
+ * it. This will only restore the scanner scanning position.
+ *
+ * @param scanner   The scanner.
+ * @param state	    State of the scanner.
+ */
+PJ_DECL(void) pj_scan_restore_state( pj_scanner *scanner, 
+				      pj_scan_state *state);
+
+/**
+ * @}
+ */
+
+#if PJ_FUNCTIONS_ARE_INLINED
+#  include "scanner_i.h"
+#endif
+
+
+PJ_END_DECL
+
+#endif
+
