/*
*******************************************************************************
*
* Copyright (C) 2003, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
* file name: unorm_it.h
* encoding: US-ASCII
* tab size: 8 (not used)
* indentation:4
*
* created on: 2003jan21
* created by: Markus W. Scherer
*/
#ifndef __UNORM_IT_H__
#define __UNORM_IT_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
#include "unicode/uiter.h"
#include "unicode/unorm.h"
/**
* Normalizing UCharIterator wrapper.
* This internal API basically duplicates the functionality of the C++ Normalizer
* but
* - it actually implements a character iterator (UCharIterator)
* with few restrictions (see unorm_setIter())
* - it supports UCharIterator getState()/setState()
* - it uses lower-level APIs and buffers more text and states,
* hopefully resulting in higher performance
*
* Usage example:
* \code
* function(UCharIterator *srcIter) {
* UNormIterator *uni;
* UCharIterator *iter;
* UErrorCode errorCode;
*
* errorCode=U_ZERO_ERROR;
* uni=unorm_openIter(&errorCode);
* if(U_FAILURE(errorCode)) {
* // report error
* return;
* }
*
* iter=unorm_setIter(uni, srcIter, UNORM_FCD, &errorCode);
* if(U_FAILURE(errorCode)) {
* // report error
* } else {
* // use iter to iterate over the canonically ordered
* // version of srcIter's text
* uint32_t state;
*
* ...
*
* state=uiter_getState(iter);
* if(state!=UITER_NO_STATE) {
* // use valid state, store it, use iter some more
* ...
*
* // later restore iter to the saved state:
* uiter_setState(iter, state, &errorCode);
*
* ...
* }
*
* ...
* }
* unorm_closeIter(uni);
* }
* \endcode
*
* See also the ICU test suites.
*
* @internal
*/
struct UNormIterator;
typedef struct UNormIterator UNormIterator;
/**
* Size of a stack buffer to hold a UNormIterator, see the stackMem parameter
* of unorm_openIter().
*
* @internal
*/
#define UNORM_ITER_SIZE 1024
/**
* Open a normalizing iterator. Must be closed later.
* Use unorm_setIter().
*
* @param stackMem Pointer to preallocated (stack-allocated) buffer to hold
* the UNormIterator if possible; can be NULL.
* @param stackMemSize Number of bytes at stackMem; can be 0,
* or should be >= UNORM_ITER_SIZE for a non-NULL stackMem.
* @param pErrorCode ICU error code
* @return an allocated and pre-initialized UNormIterator
* @internal
*/
U_CAPI UNormIterator * U_EXPORT2
unorm_openIter(void *stackMem, int32_t stackMemSize, UErrorCode *pErrorCode);
/**
* Close a normalizing iterator.
*
* @param uni UNormIterator from unorm_openIter()
* @internal
*/
U_CAPI void U_EXPORT2
unorm_closeIter(UNormIterator *uni);
/**
* Set a UCharIterator and a normalization mode for the normalizing iterator
* to wrap. The normalizing iterator will read from the character iterator,
* normalize the text, and in turn deliver it with its own wrapper UCharIterator
* interface which it returns.
*
* The source iterator remains at its current position through the unorm_setIter()
* call but will be used and moved as soon as the
* the returned normalizing iterator is.
*
* The returned interface pointer is valid for as long as the normalizing iterator
* is open and until another unorm_setIter() call is made on it.
*
* The normalizing iterator's UCharIterator interface has the following properties:
* - getIndex() and move() will almost always return UITER_UNKNOWN_INDEX
* - getState() will return UITER_NO_STATE for unknown states for positions
* that are not at normalization boundaries
*
* @param uni UNormIterator from unorm_openIter()
* @param iter The source text UCharIterator to be wrapped. It is aliases into the normalizing iterator.
* Must support getState() and setState().
* @param mode The normalization mode.
* @param pErrorCode ICU error code
* @return an alias to the normalizing iterator's UCharIterator interface
* @internal
*/
U_CAPI UCharIterator * U_EXPORT2
unorm_setIter(UNormIterator *uni, UCharIterator *iter, UNormalizationMode mode, UErrorCode *pErrorCode);
#endif /* uconfig.h switches */
#endif