/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_i18n_ParseResult_idl__
#define __com_sun_star_i18n_ParseResult_idl__

//============================================================================

module com {  module sun {  module star {  module i18n {

//============================================================================

/**
    Parser results returned by
    <member>XCharacterClassification::parseAnyToken()</member> and
    <member>XCharacterClassification::parsePredefinedToken()</member>.
 */

published struct ParseResult
{
    /** Count of ignored leading whitespace, in code points, not
        characters. */
    long    LeadingWhiteSpace;

    /** Code point index of first unprocessed character. */
    long    EndPos;

    /** Number of characters (not code points) of the parsed token, not
        including leading whitespace. */
    long    CharLen;

    /** Value of token in case of numeric. */
    double  Value;

    /** <type>KParseType</type> token type like
        <const>KParseType::IDENTNAME</const>. */
    long    TokenType;

    /** <type>KParseTokens</type> flags of first character of actual
        token matched. If <em>TokenType</em> is a
        <const>KParseType::SINGLE_QUOTE_NAME</const> or a
        <const>KParseType::DOUBLE_QUOTE_STRING</const> the first
        character is the first character inside the quotes, not the
        quote itself. */
    long    StartFlags;

    /** <type>KParseTokens</type> flags of remaining characters of
        actual token matched. */
    long    ContFlags;

    /** If a quoted name or string is encountered the dequoted result
        goes here. */
    string  DequotedNameOrString;

};

//============================================================================
}; }; }; };

#endif
