/**
 * Copyright (C) 2009 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Mobile Communication Division,
 * Digital Media & Communications Business, Samsung Electronics Co., Ltd.
 *
 * This software and its documentation are confidential and proprietary
 * information of Samsung Electronics Co., Ltd.  No part of the software and
 * documents may be copied, reproduced, transmitted, translated, or reduced to
 * any electronic medium or machine-readable form without the prior written
 * consent of Samsung Electronics.
 *
 * Samsung Electronics makes no representations with respect to the contents,
 * and assumes no responsibility for any errors that might appear in the
 * software and documents. This publication and the contents hereof are subject
 * to change without notice.
 */
#include <sys/mman.h>
#include <fcntl.h>
#include "log.h"
#include "et9alphaUtil.h"
#include "et9imuUtil.h"
#ifndef LOAD_DB_FROM_FILE
#include "gen_option.h"
#endif
#include "et9misc.h"
#ifdef ET9_ALPHABETIC_MODULE
/*----------------------------------------------------------------------------
 * External Variables
 *----------------------------------------------------------------------------*/
#ifndef LOAD_DB_FROM_FILE
#if defined(_FEATURE_SUPPORT_LANG_GEORGIAN_)
extern const ET9U8 ET9FARDATA l0196b00[];
extern const ET9U8 ET9FARDATA l0196b01[];
extern const ET9U8 ET9FARDATA l0196b02[];
extern const ET9U8 ET9FARDATA l0196b03[];
extern const ET9U8 ET9FARDATA l0196b04[];
extern const ET9U8 ET9FARDATA l0196b05[];
extern const ET9U8 ET9FARDATA l0196b06[];
extern const ET9U8 ET9FARDATA l0196b07[];
extern const ET9U8 ET9FARDATA l0196b08[];
extern const ET9U8 ET9FARDATA l0196b09[];
extern const ET9U8 ET9FARDATA l0196b10[];
extern const ET9U8 ET9FARDATA l0196b11[];
extern const ET9U8 ET9FARDATA l0196b12[];
extern const ET9U8 ET9FARDATA l0196b13[];
extern const ET9U8 ET9FARDATA l0196b14[];
extern const ET9U8 ET9FARDATA l0196b15[];
extern const ET9U8 ET9FARDATA l0196b16[];
extern const ET9U8 ET9FARDATA l0196b17[];
extern const ET9U8 ET9FARDATA l0196b18[];
#endif

#if defined(_FEATURE_SUPPORT_LANG_ARMENIAN_)
extern const ET9U8 ET9FARDATA l0190b00[];
extern const ET9U8 ET9FARDATA l0190b01[];
extern const ET9U8 ET9FARDATA l0190b02[];
extern const ET9U8 ET9FARDATA l0190b03[];
extern const ET9U8 ET9FARDATA l0190b04[];
extern const ET9U8 ET9FARDATA l0190b05[];
extern const ET9U8 ET9FARDATA l0190b06[];
extern const ET9U8 ET9FARDATA l0190b07[];
extern const ET9U8 ET9FARDATA l0190b08[];
extern const ET9U8 ET9FARDATA l0190b09[];
extern const ET9U8 ET9FARDATA l0190b10[];
extern const ET9U8 ET9FARDATA l0190b11[];
extern const ET9U8 ET9FARDATA l0190b12[];
extern const ET9U8 ET9FARDATA l0190b13[];
extern const ET9U8 ET9FARDATA l0190b14[];
extern const ET9U8 ET9FARDATA l0190b15[];
extern const ET9U8 ET9FARDATA l0190b16[];
extern const ET9U8 ET9FARDATA l0190b17[];
extern const ET9U8 ET9FARDATA l0190b18[];
#endif

#if defined(_FEATURE_SUPPORT_LANG_AZERBAIJANI_)
extern const ET9U8 ET9FARDATA l0171b00[];
extern const ET9U8 ET9FARDATA l0171b01[];
extern const ET9U8 ET9FARDATA l0171b02[];
extern const ET9U8 ET9FARDATA l0171b03[];
extern const ET9U8 ET9FARDATA l0171b04[];
extern const ET9U8 ET9FARDATA l0171b05[];
extern const ET9U8 ET9FARDATA l0171b06[];
extern const ET9U8 ET9FARDATA l0171b07[];
extern const ET9U8 ET9FARDATA l0171b08[];
extern const ET9U8 ET9FARDATA l0171b09[];
extern const ET9U8 ET9FARDATA l0171b10[];
extern const ET9U8 ET9FARDATA l0171b11[];
extern const ET9U8 ET9FARDATA l0171b12[];
extern const ET9U8 ET9FARDATA l0171b13[];
extern const ET9U8 ET9FARDATA l0171b14[];
extern const ET9U8 ET9FARDATA l0171b15[];
extern const ET9U8 ET9FARDATA l0171b16[];
extern const ET9U8 ET9FARDATA l0171b17[];
extern const ET9U8 ET9FARDATA l0171b18[];
extern const ET9U8 ET9FARDATA l0171b19[];
#endif

#if defined(_FEATURE_SUPPORT_LANG_FARSI_) 
extern const ET9U8 ET9FARDATA l0141b00[];
extern const ET9U8 ET9FARDATA l0141b01[];
extern const ET9U8 ET9FARDATA l0141b02[];
extern const ET9U8 ET9FARDATA l0141b03[];
extern const ET9U8 ET9FARDATA l0141b04[];
extern const ET9U8 ET9FARDATA l0141b05[];
extern const ET9U8 ET9FARDATA l0141b06[];
extern const ET9U8 ET9FARDATA l0141b07[];
extern const ET9U8 ET9FARDATA l0141b08[];
extern const ET9U8 ET9FARDATA l0141b09[];
extern const ET9U8 ET9FARDATA l0141b10[];
#endif
///////////////////////////////////

#if defined(_FEATURE_SUPPORT_LANG_ARABIC_) 
extern const ET9U8 ET9FARDATA l0101b00[];
extern const ET9U8 ET9FARDATA l0101b01[];
extern const ET9U8 ET9FARDATA l0101b02[];
extern const ET9U8 ET9FARDATA l0101b03[];
extern const ET9U8 ET9FARDATA l0101b04[];
extern const ET9U8 ET9FARDATA l0101b05[];
extern const ET9U8 ET9FARDATA l0101b06[];
extern const ET9U8 ET9FARDATA l0101b07[];
extern const ET9U8 ET9FARDATA l0101b08[];
extern const ET9U8 ET9FARDATA l0101b09[];
extern const ET9U8 ET9FARDATA l0101b10[];
extern const ET9U8 ET9FARDATA l0101b11[];
extern const ET9U8 ET9FARDATA l0101b12[];
extern const ET9U8 ET9FARDATA l0101b13[];
#endif//_FEATURE_SUPPORT_LANG_ARABIC_ 
#if defined(_FEATURE_SUPPORT_LANG_URDU_) 
extern const ET9U8 ET9FARDATA l0132b00[];
extern const ET9U8 ET9FARDATA l0132b01[];
extern const ET9U8 ET9FARDATA l0132b02[];
#endif//_FEATURE_SUPPORT_LANG_URDU_
#if defined(_FEATURE_SUPPORT_LANG_HEBREW_)
extern const ET9U8 ET9FARDATA l0113b00[];
extern const ET9U8 ET9FARDATA l0113b01[];
extern const ET9U8 ET9FARDATA l0113b02[];
extern const ET9U8 ET9FARDATA l0113b03[];
extern const ET9U8 ET9FARDATA l0113b04[];
extern const ET9U8 ET9FARDATA l0113b05[];
extern const ET9U8 ET9FARDATA l0113b06[];
extern const ET9U8 ET9FARDATA l0113b07[];
extern const ET9U8 ET9FARDATA l0113b08[];
extern const ET9U8 ET9FARDATA l0113b09[];
#endif//_FEATURE_SUPPORT_LANG_HEBREW_

#if defined(_FEATURE_SUPPORT_LANG_CZECH_)
extern const ET9U8 ET9FARDATA l0105b00[];
extern const ET9U8 ET9FARDATA l0105b01[];
extern const ET9U8 ET9FARDATA l0105b02[];
extern const ET9U8 ET9FARDATA l0105b03[];
#endif//_FEATURE_SUPPORT_LANG_CZECH_
#if defined(_FEATURE_SUPPORT_LANG_SERBIAN_)
extern const ET9U8 ET9FARDATA l01128b00[];
extern const ET9U8 ET9FARDATA l01128b01[];
extern const ET9U8 ET9FARDATA l01128b02[];
extern const ET9U8 ET9FARDATA l01128b03[];
extern const ET9U8 ET9FARDATA l01128b04[];
extern const ET9U8 ET9FARDATA l01128b05[];
extern const ET9U8 ET9FARDATA l01128b06[];
extern const ET9U8 ET9FARDATA l01128b07[];
extern const ET9U8 ET9FARDATA l01128b08[];
extern const ET9U8 ET9FARDATA l01128b09[];
extern const ET9U8 ET9FARDATA l01128b10[];
extern const ET9U8 ET9FARDATA l01128b11[];
extern const ET9U8 ET9FARDATA l01128b12[];
#endif//_FEATURE_SUPPORT_LANG_SERBIAN_
#if defined(_FEATURE_SUPPORT_LANG_LATVIAN_)
extern const ET9U8 ET9FARDATA l0138b00[];
extern const ET9U8 ET9FARDATA l0138b01[];
extern const ET9U8 ET9FARDATA l0138b02[];
extern const ET9U8 ET9FARDATA l0138b03[];
extern const ET9U8 ET9FARDATA l0138b04[];
extern const ET9U8 ET9FARDATA l0138b05[];
extern const ET9U8 ET9FARDATA l0138b06[];
extern const ET9U8 ET9FARDATA l0138b07[];
extern const ET9U8 ET9FARDATA l0138b08[];
extern const ET9U8 ET9FARDATA l0138b09[];
extern const ET9U8 ET9FARDATA l0138b10[];
extern const ET9U8 ET9FARDATA l0138b11[];
extern const ET9U8 ET9FARDATA l0138b12[];
extern const ET9U8 ET9FARDATA l0138b13[];
extern const ET9U8 ET9FARDATA l0138b14[];
extern const ET9U8 ET9FARDATA l0138b15[];
#endif//_FEATURE_SUPPORT_LANG_LATVIAN_
#if defined(_FEATURE_SUPPORT_LANG_ESTONIAN_)
extern const ET9U8 ET9FARDATA l0137b00[];
extern const ET9U8 ET9FARDATA l0137b01[];
extern const ET9U8 ET9FARDATA l0137b02[];
extern const ET9U8 ET9FARDATA l0137b03[];
extern const ET9U8 ET9FARDATA l0137b04[];
extern const ET9U8 ET9FARDATA l0137b05[];
extern const ET9U8 ET9FARDATA l0137b06[];
extern const ET9U8 ET9FARDATA l0137b07[];
extern const ET9U8 ET9FARDATA l0137b08[];
extern const ET9U8 ET9FARDATA l0137b09[];
extern const ET9U8 ET9FARDATA l0137b10[];
extern const ET9U8 ET9FARDATA l0137b11[];
extern const ET9U8 ET9FARDATA l0137b12[];
extern const ET9U8 ET9FARDATA l0137b13[];
extern const ET9U8 ET9FARDATA l0137b14[];
extern const ET9U8 ET9FARDATA l0137b15[];
extern const ET9U8 ET9FARDATA l0137b16[];
extern const ET9U8 ET9FARDATA l0137b17[];
extern const ET9U8 ET9FARDATA l0137b18[];
extern const ET9U8 ET9FARDATA l0137b19[];
extern const ET9U8 ET9FARDATA l0137b20[];
extern const ET9U8 ET9FARDATA l0137b21[];
extern const ET9U8 ET9FARDATA l0137b22[];
extern const ET9U8 ET9FARDATA l0137b23[];
#endif//_FEATURE_SUPPORT_LANG_ESTONIAN_
#if defined(_FEATURE_SUPPORT_LANG_LITHUANIAN_)
extern const ET9U8 ET9FARDATA l0139b00[];
extern const ET9U8 ET9FARDATA l0139b01[];
extern const ET9U8 ET9FARDATA l0139b02[];
extern const ET9U8 ET9FARDATA l0139b03[];
extern const ET9U8 ET9FARDATA l0139b04[];
extern const ET9U8 ET9FARDATA l0139b05[];
extern const ET9U8 ET9FARDATA l0139b06[];
extern const ET9U8 ET9FARDATA l0139b07[];
extern const ET9U8 ET9FARDATA l0139b08[];
extern const ET9U8 ET9FARDATA l0139b09[];
extern const ET9U8 ET9FARDATA l0139b10[];
extern const ET9U8 ET9FARDATA l0139b11[];
extern const ET9U8 ET9FARDATA l0139b12[];
extern const ET9U8 ET9FARDATA l0139b13[];
extern const ET9U8 ET9FARDATA l0139b14[];
extern const ET9U8 ET9FARDATA l0139b15[];
extern const ET9U8 ET9FARDATA l0139b16[];
extern const ET9U8 ET9FARDATA l0139b17[];
extern const ET9U8 ET9FARDATA l0139b18[];
extern const ET9U8 ET9FARDATA l0139b19[];
extern const ET9U8 ET9FARDATA l0139b20[];
#endif//_FEATURE_SUPPORT_LANG_LITHUANIAN_
#if defined(_FEATURE_SUPPORT_LANG_BULGARIAN_)
extern const ET9U8 ET9FARDATA l0102b00[];
extern const ET9U8 ET9FARDATA l0102b01[];
extern const ET9U8 ET9FARDATA l0102b02[];
extern const ET9U8 ET9FARDATA l0102b03[];
extern const ET9U8 ET9FARDATA l0102b04[];
extern const ET9U8 ET9FARDATA l0102b05[];
extern const ET9U8 ET9FARDATA l0102b06[];
extern const ET9U8 ET9FARDATA l0102b07[];
extern const ET9U8 ET9FARDATA l0102b08[];
extern const ET9U8 ET9FARDATA l0102b09[];
extern const ET9U8 ET9FARDATA l0102b10[];
extern const ET9U8 ET9FARDATA l0102b11[];
extern const ET9U8 ET9FARDATA l0102b12[];
extern const ET9U8 ET9FARDATA l0102b13[];
extern const ET9U8 ET9FARDATA l0102b14[];
extern const ET9U8 ET9FARDATA l0102b15[];
extern const ET9U8 ET9FARDATA l0102b16[];
extern const ET9U8 ET9FARDATA l0102b17[];
extern const ET9U8 ET9FARDATA l0102b18[];
extern const ET9U8 ET9FARDATA l0102b19[];
extern const ET9U8 ET9FARDATA l0102b20[];
extern const ET9U8 ET9FARDATA l0102b21[];
extern const ET9U8 ET9FARDATA l0102b22[];
extern const ET9U8 ET9FARDATA l0102b23[];
extern const ET9U8 ET9FARDATA l0102b24[];
#endif//_FEATURE_SUPPORT_LANG_BULGARIAN_
#if defined(_FEATURE_SUPPORT_LANG_DANISH_)
extern const ET9U8 ET9FARDATA l0106b00[];
extern const ET9U8 ET9FARDATA l0106b01[];
#endif//_FEATURE_SUPPORT_LANG_DANISH_
#if defined(_FEATURE_SUPPORT_LANG_GERMAN_)
extern const ET9U8 ET9FARDATA l0107b00[];
extern const ET9U8 ET9FARDATA l0107b01[];
#endif//_FEATURE_SUPPORT_LANG_GERMAN_
#if defined(_FEATURE_SUPPORT_LANG_GREEK_)
extern const ET9U8 ET9FARDATA l0108b00[];
extern const ET9U8 ET9FARDATA l0108b01[];
extern const ET9U8 ET9FARDATA l0108b02[];
extern const ET9U8 ET9FARDATA l0108b03[];
#endif//_FEATURE_SUPPORT_LANG_GREEK_
#if defined(_FEATURE_SUPPORT_LANG_ENGLISH_)
extern const ET9U8 ET9FARDATA l0109b00[];
extern const ET9U8 ET9FARDATA l0109b01[];
#endif//_FEATURE_SUPPORT_LANG_ENGLISH_
#if defined(_FEATURE_SUPPORT_LANG_SPANISH_)
extern const ET9U8 ET9FARDATA l0110b00[];
extern const ET9U8 ET9FARDATA l0110b01[];
#endif//_FEATURE_SUPPORT_LANG_SPANISH_
#if defined(_FEATURE_SUPPORT_LANG_FINNISH_)
extern const ET9U8 ET9FARDATA l0111b00[];
extern const ET9U8 ET9FARDATA l0111b01[];
extern const ET9U8 ET9FARDATA l0111b02[];
extern const ET9U8 ET9FARDATA l0111b03[];
extern const ET9U8 ET9FARDATA l0111b04[];
#endif//_FEATURE_SUPPORT_LANG_FINNISH_
#if defined(_FEATURE_SUPPORT_LANG_FRENCH_)
extern const ET9U8 ET9FARDATA l0112b00[];
extern const ET9U8 ET9FARDATA l0112b01[];
#endif//_FEATURE_SUPPORT_LANG_FRENCH_
#if defined(_FEATURE_SUPPORT_LANG_CROATIAN_)
extern const ET9U8 ET9FARDATA l0189b00[];
extern const ET9U8 ET9FARDATA l0189b01[];
extern const ET9U8 ET9FARDATA l0189b02[];
#endif//_FEATURE_SUPPORT_LANG_CROATIAN_
#if defined(_FEATURE_SUPPORT_LANG_HUNGARIAN_)
extern const ET9U8 ET9FARDATA l0114b00[];
extern const ET9U8 ET9FARDATA l0114b01[];
extern const ET9U8 ET9FARDATA l0114b02[];
extern const ET9U8 ET9FARDATA l0114b03[]; 
#endif//_FEATURE_SUPPORT_LANG_HUNGARIAN_
#if defined(_FEATURE_SUPPORT_LANG_ITALIAN_)
extern const ET9U8 ET9FARDATA l0116b00[];
extern const ET9U8 ET9FARDATA l0116b01[];
#endif//_FEATURE_SUPPORT_LANG_ITALIAN_
#if defined(_FEATURE_SUPPORT_LANG_DUTCH_)
extern const ET9U8 ET9FARDATA l0119b00[];
extern const ET9U8 ET9FARDATA l0119b01[];
#endif//_FEATURE_SUPPORT_LANG_DUTCH_
#if defined(_FEATURE_SUPPORT_LANG_NORWEGIAN_)
extern const ET9U8 ET9FARDATA l0120b00[];
extern const ET9U8 ET9FARDATA l0120b01[];
#endif//_FEATURE_SUPPORT_LANG_NORWEGIAN_
#if defined(_FEATURE_SUPPORT_LANG_POLISH_)
extern const ET9U8 ET9FARDATA l0121b00[];
extern const ET9U8 ET9FARDATA l0121b01[];
extern const ET9U8 ET9FARDATA l0121b02[];
extern const ET9U8 ET9FARDATA l0121b03[];
#endif//_FEATURE_SUPPORT_LANG_POLISH_
#if defined(_FEATURE_SUPPORT_LANG_PORTUGUESE_)
extern const ET9U8 ET9FARDATA l0122b00[];
extern const ET9U8 ET9FARDATA l0122b01[];
#endif//_FEATURE_SUPPORT_LANG_PORTUGUESE_
#if defined(_FEATURE_SUPPORT_LANG_ROMANIAN_)
extern const ET9U8 ET9FARDATA l0124b00[];
extern const ET9U8 ET9FARDATA l0124b01[];
extern const ET9U8 ET9FARDATA l0124b02[];
#endif//_FEATURE_SUPPORT_LANG_ROMANIAN_
#if defined(_FEATURE_SUPPORT_LANG_RUSSIAN_)
extern const ET9U8 ET9FARDATA l0125b00[];
extern const ET9U8 ET9FARDATA l0125b01[];
extern const ET9U8 ET9FARDATA l0125b02[];
extern const ET9U8 ET9FARDATA l0125b03[];
#endif//_FEATURE_SUPPORT_LANG_RUSSIAN_
#if defined(_FEATURE_SUPPORT_LANG_SWEDISH_)
extern const ET9U8 ET9FARDATA l0129b00[];
extern const ET9U8 ET9FARDATA l0129b01[];
#endif//_FEATURE_SUPPORT_LANG_SWEDISH_
#if defined(_FEATURE_SUPPORT_LANG_TURKISH_)
extern const ET9U8 ET9FARDATA l0131b00[];
extern const ET9U8 ET9FARDATA l0131b01[];
extern const ET9U8 ET9FARDATA l0131b02[];
extern const ET9U8 ET9FARDATA l0131b03[];
extern const ET9U8 ET9FARDATA l0131b04[];
extern const ET9U8 ET9FARDATA l0131b05[];
extern const ET9U8 ET9FARDATA l0131b06[];
extern const ET9U8 ET9FARDATA l0131b07[];
extern const ET9U8 ET9FARDATA l0131b08[];
extern const ET9U8 ET9FARDATA l0131b09[];
extern const ET9U8 ET9FARDATA l0131b10[];
extern const ET9U8 ET9FARDATA l0131b11[];
extern const ET9U8 ET9FARDATA l0131b12[];
extern const ET9U8 ET9FARDATA l0131b13[];
extern const ET9U8 ET9FARDATA l0131b14[];
extern const ET9U8 ET9FARDATA l0131b15[];
extern const ET9U8 ET9FARDATA l0131b16[];
extern const ET9U8 ET9FARDATA l0131b17[];
extern const ET9U8 ET9FARDATA l0131b18[];
extern const ET9U8 ET9FARDATA l0131b19[];
extern const ET9U8 ET9FARDATA l0131b20[];
extern const ET9U8 ET9FARDATA l0131b21[];
extern const ET9U8 ET9FARDATA l0131b22[];
extern const ET9U8 ET9FARDATA l0131b23[];
extern const ET9U8 ET9FARDATA l0131b24[];
extern const ET9U8 ET9FARDATA l0131b25[];
extern const ET9U8 ET9FARDATA l0131b26[];
#endif//_FEATURE_SUPPORT_LANG_TURKISH_
#if defined(_FEATURE_SUPPORT_LANG_SLOVAK_)
extern const ET9U8 ET9FARDATA l0127b00[];
extern const ET9U8 ET9FARDATA l0127b01[];
extern const ET9U8 ET9FARDATA l0127b02[];
extern const ET9U8 ET9FARDATA l0127b03[];
extern const ET9U8 ET9FARDATA l0127b04[];
extern const ET9U8 ET9FARDATA l0127b05[];
extern const ET9U8 ET9FARDATA l0127b06[];
extern const ET9U8 ET9FARDATA l0127b07[];
extern const ET9U8 ET9FARDATA l0127b08[];
extern const ET9U8 ET9FARDATA l0127b09[];
extern const ET9U8 ET9FARDATA l0127b10[];
extern const ET9U8 ET9FARDATA l0127b11[];
extern const ET9U8 ET9FARDATA l0127b12[];
extern const ET9U8 ET9FARDATA l0127b13[];
extern const ET9U8 ET9FARDATA l0127b14[];
extern const ET9U8 ET9FARDATA l0127b15[];
#endif//_FEATURE_SUPPORT_LANG_SLOVAK_
#if defined(_FEATURE_SUPPORT_LANG_UKRAINIAN_)
extern const ET9U8 ET9FARDATA l0134b00[];
extern const ET9U8 ET9FARDATA l0134b01[];
extern const ET9U8 ET9FARDATA l0134b02[];
extern const ET9U8 ET9FARDATA l0134b03[];
extern const ET9U8 ET9FARDATA l0134b04[];
extern const ET9U8 ET9FARDATA l0134b05[];
extern const ET9U8 ET9FARDATA l0134b06[];
extern const ET9U8 ET9FARDATA l0134b07[];
extern const ET9U8 ET9FARDATA l0134b08[];
extern const ET9U8 ET9FARDATA l0134b09[];
extern const ET9U8 ET9FARDATA l0134b10[];
extern const ET9U8 ET9FARDATA l0134b11[];
extern const ET9U8 ET9FARDATA l0134b12[];
extern const ET9U8 ET9FARDATA l0134b13[];
extern const ET9U8 ET9FARDATA l0134b14[];
extern const ET9U8 ET9FARDATA l0134b15[];
extern const ET9U8 ET9FARDATA l0134b16[];
#endif//_FEATURE_SUPPORT_LANG_UKRAINIAN_
#if defined(_FEATURE_SUPPORT_LANG_KAZAKH_)
extern const ET9U8 ET9FARDATA l0197b00[];
extern const ET9U8 ET9FARDATA l0197b01[];
extern const ET9U8 ET9FARDATA l0197b02[];
extern const ET9U8 ET9FARDATA l0197b03[];
extern const ET9U8 ET9FARDATA l0197b04[];
extern const ET9U8 ET9FARDATA l0197b05[];
extern const ET9U8 ET9FARDATA l0197b06[];
extern const ET9U8 ET9FARDATA l0197b07[];
extern const ET9U8 ET9FARDATA l0197b08[];
extern const ET9U8 ET9FARDATA l0197b09[];
#endif//_FEATURE_SUPPORT_LANG_KAZAKH_
#if defined(_FEATURE_SUPPORT_LANG_SLOVENIAN_)
extern const ET9U8 ET9FARDATA l0136b00[];
extern const ET9U8 ET9FARDATA l0136b01[];
extern const ET9U8 ET9FARDATA l0136b02[];
extern const ET9U8 ET9FARDATA l0136b03[];
extern const ET9U8 ET9FARDATA l0136b04[];
extern const ET9U8 ET9FARDATA l0136b05[];
extern const ET9U8 ET9FARDATA l0136b06[];
extern const ET9U8 ET9FARDATA l0136b07[];
extern const ET9U8 ET9FARDATA l0136b08[];
extern const ET9U8 ET9FARDATA l0136b09[];
extern const ET9U8 ET9FARDATA l0136b10[];
extern const ET9U8 ET9FARDATA l0136b11[];
extern const ET9U8 ET9FARDATA l0136b12[];
extern const ET9U8 ET9FARDATA l0136b13[];
extern const ET9U8 ET9FARDATA l0136b14[];
#endif//_FEATURE_SUPPORT_LANG_SLOVENIAN_
#if defined(_FEATURE_SUPPORT_LANG_ICELANDIC_)
extern const ET9U8 ET9FARDATA l0115b00[];
extern const ET9U8 ET9FARDATA l0115b01[];
extern const ET9U8 ET9FARDATA l0115b02[];
extern const ET9U8 ET9FARDATA l0115b03[];
extern const ET9U8 ET9FARDATA l0115b04[];
extern const ET9U8 ET9FARDATA l0115b05[];
extern const ET9U8 ET9FARDATA l0115b06[];
extern const ET9U8 ET9FARDATA l0115b07[];
#endif//_FEATURE_SUPPORT_LANG_ICELANDIC_
#endif /* LOAD_DB_FROM_FILE */

/*----------------------------------------------------------------------------
 * Global Variables
 *----------------------------------------------------------------------------*/
ET9AWPrivWordInfo      g_pWordList;
ET9AWPrivWordInfo      g_pLastWord;              /**< the word with the lowest prio */
ET9AWPrivWordInfo      g_pLastSpcWord;           /**< the spc word with the lowest prio */
ET9AWPrivWordInfo      g_pLastCompletionWord;    /**< the completion word with the lowest prio */
ET9AWWordInfo*          g_pWordInfo;

ET9WordSymbInfo        g_pWordSymbInfo;          /**< entered symbols */
ET9AWASDBInfo          g_pASDBInfo;              /**< ASDB info */
ET9AWLingCmnInfo       g_pLingCmnInfo;

/*----------------------------------------------------------------------------
 * Local Variables
 *----------------------------------------------------------------------------*/
#ifdef LOAD_DB_FROM_FILE
static ET9U16          curLDBCode = 0;
static ET9U16          curFirstLdbCode = 0;
static ET9U16          curSecondLdbCode = 0;
static ET9U16          curChangeBufferIndex = 1;
static FILE           *pLDBFileHandle = NULL;
static FILE           *pFilstLDBFileHandle = NULL;
static FILE           *pSecondLDBFileHandle = NULL;
static LDBFileInfo     LDBFileList[MAX_LDB_LIST];
LDBFileInfo           *pLDBFileList = LDBFileList;
#ifdef USE_HEAP_BUFFER
#define MAX_LDB_SIZE   (5 * 1024 * 1024) /* 5MB */

static ET9U32          curLDBMaxOffset = 0;
static ET9U32          firstLDBMaxOffset = 0;
static ET9U32          secondLDBMaxOffset = 0;
static ET9U8           LDBBuffer[MAX_LDB_SIZE];
static ET9U8           FirstLDBBuffer[MAX_LDB_SIZE];
static ET9U8           SecondLDBBuffer[MAX_LDB_SIZE];
#endif /* USE_HEAP_BUFFER */
#endif /* LOAD_DB_FROM_FILE */

//ET9LDBDATA *g_ldbData = NULL;
ET9LDBDATA g_ldbData[2] = {0, };

/*
struct ldbData{
	int mLdbId;
	char *mLdbData;
	int mLdbDataSize;
};
*/


/*----------------------------------------------------------------------------
 * Callback Functions
 *----------------------------------------------------------------------------*/
 /*
ET9STATUS ET9FARCALL ET9ReadTUDB(ET9U8 ET9FARDATA * const pData, 
                                 ET9U16 wSize,
                                 ET9U8 ET9FARDATA * const pTUDB,
                                 ET9U32 dwOffset)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}
*/
/*
ET9STATUS ET9FARCALL ET9WriteTUDB(ET9U8 ET9FARDATA * const pData,
                                  ET9U16 wSize,
                                  ET9U8 ET9FARDATA * const pTUDB,
                                  ET9U32 dwOffset)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}
*/

ET9STATUS ET9FARCALL ET9AW_ReadMdbData(
    ET9AWLingInfo *pLingInfo,    /**< I   - pointer to FieldInfo struct owning MDB */
    ET9REQMDB eMdbRequestType,   /**< I   - MDB request type. Should be one of the values defined above */
    ET9U16    wWordLen,          /**< I   - word length */
    ET9U16    wMaxWordLen,       /**< I   - maximum word length */
    ET9SYMB  *psBuildTxtBuf,     /**< O   - word to return */
    ET9U16   *pwActWordLen,      /**< O   - length of the returned word */
    ET9U32   *pdwWordListIdx     /**< I/O - MDB word list index */
)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}

#ifdef LOAD_DB_FROM_FILE
void CloseLdbFileHandle()
{
	if (pLDBFileHandle != NULL)
		fclose(pLDBFileHandle);
	pLDBFileHandle = NULL;
}

void CloseFirstLdbFileHandle()
{
	if(pFilstLDBFileHandle != NULL)
		fclose(pFilstLDBFileHandle);
	pFilstLDBFileHandle = NULL;
}

void CloseSecondLdbFileHandle()
{
	if(pSecondLDBFileHandle != NULL)
		fclose(pSecondLDBFileHandle);
	pSecondLDBFileHandle = NULL;
}

ET9BOOL SetChangeBufferIndex(ET9U16 curLdbCode) {
	ET9BOOL resultUpdateLdbBuffer = FALSE;
	
	if (curFirstLdbCode == curLdbCode) {
		curChangeBufferIndex = 2;
	} else if (curSecondLdbCode == curLdbCode) {
		curChangeBufferIndex = 1;
	} else {
		resultUpdateLdbBuffer = TRUE;
	}

	return resultUpdateLdbBuffer;
}

ET9U8 * GetLdbFilePath(ET9U16 ldbCode)
{
	ET9U16 i;
	for (i = 0; i < MAX_LDB_LIST; i++)
	{
		if (ldbCode == LDBFileList[i].ldbCode)
			return LDBFileList[i].filePath;
	}

	return NULL;
}

ET9U32 GetLdbFileSize(ET9U16 ldbCode)
{
	ET9U16 i;
	for (i = 0; i < MAX_LDB_LIST; i++)
	{
		if (ldbCode == LDBFileList[i].ldbCode)
			return LDBFileList[i].fileSize;
	}

	return 0;
}

void InitLDBCache() {
	g_ldbData[0].mLdbId = 0;
	g_ldbData[1].mLdbId = 0;
}

void DeleteLdb(ET9U16 ldbCode) {
	ET9U16 ldbIndex = MAX_LDB_LIST;
	ldbIndex = getLdbIndex(ldbCode);
	if ( MAX_LDB_LIST != ldbIndex) {
		remove(pLDBFileList[ldbIndex].filePath);
	}
}

#ifdef ET9_DIRECT_LDB_ACCESS

ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, 
                                      ET9U8 * ET9FARDATA * ppbSrc,
                                      ET9U32 *pdwSizeInBytes)
{
 ET9STATUS   wStatus     = ET9STATUS_NONE;
 ET9LDBDATA *tmpLdb      = NULL;
 ET9U32      dwBytesRead = 0;
 ET9U32      ldbCode     = 0;
 ET9U8       *ldbData     = NULL;
 ET9U32         ldbDataSize;
  FILE       *file;

 if (pLingInfo == NULL) {
  return ET9STATUS_ERROR;
 }

 ldbCode = pLingInfo->pLingCmnInfo->dwLdbNum;
 
 //if ((ldbCode & 0xff) == ET9PLIDChineseSimplified) {
 // ldbCode = ET9PLIDChineseSimplified;
 //}
  
 if (g_ldbData[0].mLdbId == ldbCode) {
  curChangeBufferIndex = 0;
  tmpLdb = &g_ldbData[0];
 } else if (g_ldbData[1].mLdbId == ldbCode) {
  curChangeBufferIndex = 1;
  tmpLdb = &g_ldbData[1];
 }

 if (tmpLdb != NULL) {
  *ppbSrc = tmpLdb->mLdbData;
  *pdwSizeInBytes = tmpLdb->mLdbDataSize;
  return ET9STATUS_NONE;
 }

 file = fopen((char *)GetLdbFilePath(ldbCode), "r");
 
 if (file != NULL) {
  fseek(file, 0L, SEEK_END);
  ldbDataSize = (int)ftell(file);
  fseek(file, 0L, SEEK_SET);
        //__android_log_print(ANDROID_LOG_DEBUG,"KJH","ldbDataSize : %d", ldbDataSize);
  if (ldbDataSize) {
   if ((ldbData = (char*) malloc(ldbDataSize)) != 0) {
    if (fread(ldbData, 1, ldbDataSize, file) == (size_t)ldbDataSize) {
     fclose(file);
          curChangeBufferIndex = 1 - curChangeBufferIndex;

          tmpLdb = &g_ldbData[curChangeBufferIndex];
          if (tmpLdb->mLdbData != NULL) {
           free(tmpLdb->mLdbData);
          }
        tmpLdb->mLdbId       = ldbCode;
        tmpLdb->mLdbData     = ldbData;
        tmpLdb->mLdbDataSize = ldbDataSize;

     *ppbSrc = ldbData;
     *pdwSizeInBytes = ldbDataSize;

     return ET9STATUS_NONE;
    }

    free(ldbData);
   }else {
	   __android_log_print(ANDROID_LOG_DEBUG,"SamsungIME","ET9AW_LdbReadData : malloc failed");
   }
  }
  fclose(file);
 } else {
   __android_log_print(ANDROID_LOG_DEBUG,"SamsungIME","ET9AW_LdbReadData : file is null");
}
 __android_log_print(ANDROID_LOG_DEBUG,"SamsungIME","ET9AW_LdbReadData, ldbcode : %d", ldbCode);

 return ET9STATUS_READ_DB_FAIL;
}





ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9CPLingInfo *pLingInfo, 
                                      ET9U8 * ET9FARDATA * ppbSrc,
                                      ET9U32 *pdwSizeInBytes)
{
	ET9STATUS   wStatus     = ET9STATUS_NONE;
	ET9LDBDATA *tmpLdb      = NULL;
	ET9U32      dwBytesRead = 0;
	ET9U32      ldbCode     = 0;
	ET9U8       *ldbData     = NULL;
	ET9U32         ldbDataSize;
       FILE       *file;

	if (pLingInfo == NULL) {
		return ET9STATUS_ERROR;
	}

       ldbCode = (ET9U16)(pLingInfo->dwLdbNum);
	//if ((ldbCode & 0xff) == ET9PLIDChineseSimplified) {
	//	ldbCode = ET9PLIDChineseSimplified;
	//}
  
	if (g_ldbData[0].mLdbId == ldbCode) {
		curChangeBufferIndex = 0;
		tmpLdb = &g_ldbData[0];
	} else if (g_ldbData[1].mLdbId == ldbCode) {
		curChangeBufferIndex = 1;
		tmpLdb = &g_ldbData[1];
	}

	if (tmpLdb != NULL) {
		*ppbSrc = tmpLdb->mLdbData;
		*pdwSizeInBytes = tmpLdb->mLdbDataSize;
		return ET9STATUS_NONE;
	}

	file = fopen((char *)GetLdbFilePath(ldbCode), "r");

	if (file != NULL) {
		fseek(file, 0L, SEEK_END);
		ldbDataSize = (int)ftell(file);
		fseek(file, 0L, SEEK_SET);
        //__android_log_print(ANDROID_LOG_DEBUG,"KJH","ldbDataSize2 : %d", ldbDataSize);
		if (ldbDataSize) {
			if ((ldbData = (char*) malloc(ldbDataSize)) != 0) {
				if (fread(ldbData, 1, ldbDataSize, file) == (size_t)ldbDataSize) {
					fclose(file);
					curChangeBufferIndex = 1 - curChangeBufferIndex;
					tmpLdb = &g_ldbData[curChangeBufferIndex];
					if (tmpLdb->mLdbData) {
						free(tmpLdb->mLdbData);
					}
					tmpLdb->mLdbId       = ldbCode;
					tmpLdb->mLdbData     = ldbData;
					tmpLdb->mLdbDataSize = ldbDataSize;

					*ppbSrc = ldbData;
					*pdwSizeInBytes = ldbDataSize;

					return ET9STATUS_NONE;
				}
				free(ldbData);
			}
		}
		fclose(file);
	}

	return ET9STATUS_READ_DB_FAIL;
}

#else
ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead)
{
	ET9STATUS          wStatus        = ET9STATUS_NONE;
	ET9U32             dwBytesRead    = 0;
	ET9U32             dwFirstLdbBytesRead = 0;
	ET9U32             dwSecondLdbBytesRead = 0;
	ET9U16             ldbCode        = 0;
	ET9BOOL            updateLdbBuffer = FALSE;
#ifdef USE_HEAP_BUFFER
	ET9U32             dwSrcSize      = 0;
	ET9U8 ET9FARDATA  *pSrc;
#endif /* USE_HEAP_BUFFER */

	*pdwNumberOfBytesRead = 0;
	ldbCode = pLingInfo->pLingCmnInfo->dwLdbNum;

	updateLdbBuffer = SetChangeBufferIndex(ldbCode);
	
	if (updateLdbBuffer && curChangeBufferIndex == 1) {

		CloseFirstLdbFileHandle();
		   
		pFilstLDBFileHandle = fopen((char*)GetLdbFilePath(ldbCode), "r");

		if (pFilstLDBFileHandle == NULL)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}
#ifdef USE_HEAP_BUFFER
		memset(FirstLDBBuffer, 0x00, sizeof(FirstLDBBuffer));
		firstLDBMaxOffset = GetLdbFileSize(ldbCode);

		dwFirstLdbBytesRead = fread(FirstLDBBuffer, sizeof(ET9U8), firstLDBMaxOffset, pFilstLDBFileHandle);

		if (dwFirstLdbBytesRead <= 0)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}

		fclose(pFilstLDBFileHandle);
        //__android_log_print(ANDROID_LOG_DEBUG,"KJH","dwFirstLdbBytesRead : %d", dwFirstLdbBytesRead);
#endif

		curFirstLdbCode = ldbCode;
		curChangeBufferIndex = 2;
	} else if (updateLdbBuffer && curChangeBufferIndex == 2) {

		CloseSecondLdbFileHandle();
		
		pSecondLDBFileHandle = fopen((char*)GetLdbFilePath(ldbCode), "r");

		if (pSecondLDBFileHandle == NULL)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}
#ifdef USE_HEAP_BUFFER
		memset(SecondLDBBuffer, 0x00, sizeof(SecondLDBBuffer));
		secondLDBMaxOffset = GetLdbFileSize(ldbCode);

		dwSecondLdbBytesRead = fread(SecondLDBBuffer, sizeof(ET9U8), secondLDBMaxOffset, pSecondLDBFileHandle);
        //__android_log_print(ANDROID_LOG_DEBUG,"KJH","dwFirstLdbBytesRead2 : %d", dwFirstLdbBytesRead);
		if (dwSecondLdbBytesRead <= 0)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}

		fclose(pSecondLDBFileHandle);
#endif

		curSecondLdbCode = ldbCode;
		curChangeBufferIndex = 1;
	}
	
/*
	if (ldbCode != curLDBCode || pLDBFileHandle == NULL)
	{
		if (pLDBFileHandle != NULL)
		{
			fclose(pLDBFileHandle);
			pLDBFileHandle = NULL;
		}

		pLDBFileHandle = fopen((char *)GetLdbFilePath(ldbCode), "r");

		if (pLDBFileHandle == NULL)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}
#ifdef USE_HEAP_BUFFER
		memset(LDBBuffer, 0x00, sizeof(LDBBuffer));
		curLDBMaxOffset = GetLdbFileSize(ldbCode);

		dwBytesRead = fread(LDBBuffer, sizeof(ET9U8), curLDBMaxOffset, pLDBFileHandle);

		if (dwBytesRead <= 0)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}

		fclose(pLDBFileHandle);
#endif
	}*/

#ifdef USE_HEAP_BUFFER

       if (curFirstLdbCode== ldbCode) {
	       if ((dwOffset + dwNumberOfBytesToRead) > firstLDBMaxOffset)
			dwSrcSize = firstLDBMaxOffset - dwOffset;
		else
			dwSrcSize = dwNumberOfBytesToRead;

		if (dwOffset < firstLDBMaxOffset) {
			pSrc = &FirstLDBBuffer[dwOffset];
			*pdwNumberOfBytesRead = dwSrcSize;
		
			while (dwSrcSize--)
				*pbDst++ = *pSrc++;
		}
       } else if (curSecondLdbCode== ldbCode) {
		if ((dwOffset + dwNumberOfBytesToRead) > secondLDBMaxOffset)
			dwSrcSize = secondLDBMaxOffset - dwOffset;
		else
			dwSrcSize = dwNumberOfBytesToRead;

		if (dwOffset < secondLDBMaxOffset) {
			pSrc = &SecondLDBBuffer[dwOffset];
			*pdwNumberOfBytesRead = dwSrcSize;

			while (dwSrcSize--)
				*pbDst++ = *pSrc++;
		}
	}
	
	/*
	if ((dwOffset + dwNumberOfBytesToRead) > curLDBMaxOffset)
		dwSrcSize = curLDBMaxOffset - dwOffset;
	else
		dwSrcSize = dwNumberOfBytesToRead;

	if (dwOffset < curLDBMaxOffset)
	{
		pSrc = &LDBBuffer[dwOffset];
		*pdwNumberOfBytesRead = dwSrcSize;

		while (dwSrcSize--)
			*pbDst++ = *pSrc++;
	} */
	
#else /* USE_HEAP_BUFFER */
	if (fseek(pLDBFileHandle, dwOffset, SEEK_SET) == -1)
		return wStatus;

	dwBytesRead = fread(pbDst, sizeof(ET9U8), dwNumberOfBytesToRead, pLDBFileHandle);
        //__android_log_print(ANDROID_LOG_DEBUG,"KJH","dwBytesRead : %d", dwBytesRead);
	if (dwBytesRead > 0)
		*pdwNumberOfBytesRead = dwBytesRead;

	//if (pLDBFileHandle != NULL)
	//{
	//	fclose(pLDBFileHandle);
	//	pLDBFileHandle = NULL;
	//}
#endif /* USE_HEAP_BUFFER */

	curLDBCode = ldbCode;

	return wStatus;
}

ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9CPLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead)
{
	ET9STATUS          wStatus        = ET9STATUS_NONE;
	ET9U32             dwBytesRead    = 0;
	ET9U16             ldbCode        = 0;
#ifdef USE_HEAP_BUFFER
	ET9U32             dwSrcSize      = 0;
	ET9U8 ET9FARDATA  *pSrc;
#endif /* USE_HEAP_BUFFER */

	*pdwNumberOfBytesRead = 0;
	ldbCode = (ET9U16)(pLingInfo->dwLdbNum);

	if (ldbCode != curLDBCode || pLDBFileHandle == NULL)
	{
		if (pLDBFileHandle != NULL)
		{
			fclose(pLDBFileHandle);
			pLDBFileHandle = NULL;
		}

		pLDBFileHandle = fopen((char *)GetLdbFilePath(ldbCode), "r");

		if (pLDBFileHandle == NULL)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}
#ifdef USE_HEAP_BUFFER
		memset(LDBBuffer, 0x00, sizeof(LDBBuffer));
		curLDBMaxOffset = GetLdbFileSize(ldbCode);

		dwBytesRead = fread(LDBBuffer, sizeof(ET9U8), curLDBMaxOffset, pLDBFileHandle);

		if (dwBytesRead <= 0)
		{
			wStatus = ET9STATUS_READ_DB_FAIL;
			return wStatus;
		}

		fclose(pLDBFileHandle);
#endif
	}

#ifdef USE_HEAP_BUFFER
	if ((dwOffset + dwNumberOfBytesToRead) > curLDBMaxOffset)
		dwSrcSize = curLDBMaxOffset - dwOffset;
	else
		dwSrcSize = dwNumberOfBytesToRead;

	if (dwOffset < curLDBMaxOffset)
	{
		pSrc = &LDBBuffer[dwOffset];
		*pdwNumberOfBytesRead = dwSrcSize;

		while (dwSrcSize--)
			*pbDst++ = *pSrc++;
	}
#else /* USE_HEAP_BUFFER */
	if (fseek(pLDBFileHandle, dwOffset, SEEK_SET) == -1)
		return wStatus;

	dwBytesRead = fread(pbDst, sizeof(ET9U8), dwNumberOfBytesToRead, pLDBFileHandle);

	if (dwBytesRead > 0)
		*pdwNumberOfBytesRead = dwBytesRead;

	//if (pLDBFileHandle != NULL)
	//{
	//	fclose(pLDBFileHandle);
	//	pLDBFileHandle = NULL;
	//}
#endif /* USE_HEAP_BUFFER */

	curLDBCode = ldbCode;

	return wStatus;

}
#endif

#else /* LOAD_DB_FROM_FILE */
#ifdef ET9_DIRECT_LDB_ACCESS
ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead))
{
	ET9STATUS wStatus = ET9STATUS_NONE;
	
	//TODO

	return wStatus;
}

ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead))
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}
#else /* ET9_DIRECT_LDB_ACCESS */
/*---------------------------------------------------------------------------
 *
 *   Function: ET9AWLdbReadData
 *
 *   Synopsis: This function reads LDB data
 *
 *      Input: pLingInfo            = Pointer to Alpha information structure.
 *             dwOffset             = offset to read from
 *             nNumberOfBytesToRead = Specifies the number of bytes to be read. 
 *             pbDst                = buffer for the data
 *             pNumberOfBytesRead   = Pointer to the variable that receives 
 *                                    the number of bytes read
 *
 *     Return: ET9STATUS_NONE on success, otherwise return ET9 error code.
 *                                                                            
 *---------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead)
{
    ET9STATUS          wStatus = ET9STATUS_NONE;
    ET9U8 ET9FARDATA   *pBlock;
    ET9U8 ET9FARDATA   *pSrc;
    ET9U32             dwBlockSize;
    ET9U32             dwSrcSize;
    ET9U32             dwBlockOffset;
    ET9U32             dwSrcOffset;

    *pdwNumberOfBytesRead = 0;

    while (dwNumberOfBytesToRead) {
        pBlock = NULL;
        dwBlockSize = 0;
        dwSrcOffset = 0;

        switch (pLingInfo->pLingCmnInfo->dwLdbNum) {
#if defined(_FEATURE_SUPPORT_LANG_AZERBAIJANI_)
        	case ( 1 * 256) + 71 : /* Azerbaijani */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0171b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0171b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0171b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0171b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0171b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0171b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0171b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0171b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0171b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0171b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0171b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0171b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0171b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0171b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0171b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0171b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0171b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0171b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 291840) {pBlock = (ET9U8 ET9FARDATA *)l0171b18; dwBlockSize = 15360; dwSrcOffset = 276480;}
            else if (dwOffset < 302537) {pBlock = (ET9U8 ET9FARDATA *)l0171b19; dwBlockSize = 10697; dwSrcOffset = 291840;}
            break;
#endif //_FEATURE_SUPPORT_LANG_AZERBAIJANI_		

#if defined(_FEATURE_SUPPORT_LANG_ARMENIAN_)
        case ( 1 * 256) + 90 : /* Armenian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0190b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0190b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0190b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0190b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0190b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0190b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0190b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0190b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0190b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0190b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0190b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0190b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0190b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0190b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0190b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0190b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0190b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0190b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 290013) {pBlock = (ET9U8 ET9FARDATA *)l0190b18; dwBlockSize = 13533; dwSrcOffset = 276480;}
            break;
#endif //_FEATURE_SUPPORT_LANG_ARMENIAN_		

#if defined(_FEATURE_SUPPORT_LANG_GEORGIAN_)
        case ( 1 * 256) + 96 : /* Georgian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0196b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0196b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0196b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0196b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0196b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0196b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0196b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0196b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0196b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0196b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0196b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0196b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0196b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0196b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0196b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0196b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0196b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0196b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 280444) {pBlock = (ET9U8 ET9FARDATA *)l0196b18; dwBlockSize = 3964; dwSrcOffset = 276480;}
            break;
#endif //_FEATURE_SUPPORT_LANG_GEORGIAN_		

#if defined(_FEATURE_SUPPORT_LANG_FARSI_)		
		case ( 1 * 256) + 41 : /* Farsi */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0141b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0141b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0141b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0141b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0141b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0141b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0141b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0141b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0141b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0141b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 154738) {pBlock = (ET9U8 ET9FARDATA *)l0141b10; dwBlockSize = 1138; dwSrcOffset = 153600;}
            break;
#endif //_FEATURE_SUPPORT_LANG_FARSI_		
////////////////////////////////////

#if defined(_FEATURE_SUPPORT_LANG_ARABIC_)		
		case ( 1 * 256) +  1 : /* Arabic */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0101b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0101b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0101b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0101b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0101b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0101b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0101b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0101b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0101b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0101b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0101b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0101b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0101b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 209954) {pBlock = (ET9U8 ET9FARDATA *)l0101b13; dwBlockSize = 10274; dwSrcOffset = 199680;}
            break;
#endif //_FEATURE_SUPPORT_LANG_ARABIC_		
#if defined(_FEATURE_SUPPORT_LANG_URDU_)		
		case ( 1 * 256) + 32 : /* Urdu */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0132b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0132b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  45796) {pBlock = (ET9U8 ET9FARDATA *)l0132b02; dwBlockSize = 15076; dwSrcOffset = 30720;}
            break;
#endif //_FEATURE_SUPPORT_LANG_URDU_
#if defined(_FEATURE_SUPPORT_LANG_HEBREW_)
        case ( 1 * 256) + 13 : /* Hebrew */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0113b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0113b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0113b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0113b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0113b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0113b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0113b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0113b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0113b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 150542) {pBlock = (ET9U8 ET9FARDATA *)l0113b09; dwBlockSize = 12302; dwSrcOffset = 138240;}
            break;
#endif//_FEATURE_SUPPORT_LANG_HEBREW_
#if defined(_FEATURE_SUPPORT_LANG_CZECH_)
        case ( 1 * 256) +  5 : /* Czech */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0105b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0105b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0105b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 278381) {pBlock = (ET9U8 ET9FARDATA *)l0105b03; dwBlockSize = 32621; dwSrcOffset = 245760;}
            break;
#endif //_FEATURE_SUPPORT_LANG_CZECH_
#if defined(_FEATURE_SUPPORT_LANG_SERBIAN_)
        case ( 1 * 256) + 128 : /* Serbian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l01128b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l01128b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l01128b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l01128b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l01128b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l01128b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l01128b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l01128b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l01128b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l01128b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l01128b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l01128b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 198420) {pBlock = (ET9U8 ET9FARDATA *)l01128b12; dwBlockSize = 14100; dwSrcOffset = 184320;}
            break;
#endif //_FEATURE_SUPPORT_LANG_SERBIAN_
#if defined(_FEATURE_SUPPORT_LANG_LATVIAN_)
        case ( 1 * 256) + 38 : /* Latvian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0138b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0138b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0138b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0138b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0138b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0138b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0138b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0138b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0138b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0138b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0138b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0138b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0138b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0138b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0138b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 235094) {pBlock = (ET9U8 ET9FARDATA *)l0138b15; dwBlockSize = 4694; dwSrcOffset = 230400;}
            break;
#endif //_FEATURE_SUPPORT_LANG_LATVIAN_
#if defined(_FEATURE_SUPPORT_LANG_LITHUANIAN_)
        case ( 1 * 256) + 39 : /* Lithuanian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0139b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0139b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0139b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0139b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0139b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0139b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0139b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0139b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0139b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0139b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0139b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0139b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0139b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0139b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0139b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0139b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0139b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0139b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 291840) {pBlock = (ET9U8 ET9FARDATA *)l0139b18; dwBlockSize = 15360; dwSrcOffset = 276480;}
            else if (dwOffset < 307200) {pBlock = (ET9U8 ET9FARDATA *)l0139b19; dwBlockSize = 15360; dwSrcOffset = 291840;}
            else if (dwOffset < 312558) {pBlock = (ET9U8 ET9FARDATA *)l0139b20; dwBlockSize = 5358; dwSrcOffset = 307200;}
            break;
#endif //_FEATURE_SUPPORT_LANG_LITHUANIAN_
#if defined(_FEATURE_SUPPORT_LANG_DANISH_)
        case ( 1 * 256) +  6 : /* Danish */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0106b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 157221) {pBlock = (ET9U8 ET9FARDATA *)l0106b01; dwBlockSize = 75301; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_DANISH_
#if defined(_FEATURE_SUPPORT_LANG_GERMAN_)
        case ( 1 * 256) +  7 : /* German */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0107b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 132027) {pBlock = (ET9U8 ET9FARDATA *)l0107b01; dwBlockSize = 50107; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_GERMAN_
#if defined(_FEATURE_SUPPORT_LANG_GREEK_)
        case ( 1 * 256) +  8 : /* Greek */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0108b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0108b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0108b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 304545) {pBlock = (ET9U8 ET9FARDATA *)l0108b03; dwBlockSize = 58785; dwSrcOffset = 245760;}
            break;
#endif //_FEATURE_SUPPORT_LANG_GREEK_
#if defined(_FEATURE_SUPPORT_LANG_ENGLISH_)
        case ( 1 * 256) +  9 : /* English */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0109b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset <  98056) {pBlock = (ET9U8 ET9FARDATA *)l0109b01; dwBlockSize = 16136; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_ENGLISH_
#if defined(_FEATURE_SUPPORT_LANG_SPANISH_)
        case ( 1 * 256) + 10 : /* Spanish */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0110b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 113946) {pBlock = (ET9U8 ET9FARDATA *)l0110b01; dwBlockSize = 32026; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_SPANISH_
#if defined(_FEATURE_SUPPORT_LANG_FINNISH_)
        case ( 1 * 256) + 11 : /* Finnish */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0111b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0111b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0111b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 327680) {pBlock = (ET9U8 ET9FARDATA *)l0111b03; dwBlockSize = 81920; dwSrcOffset = 245760;}
            else if (dwOffset < 340759) {pBlock = (ET9U8 ET9FARDATA *)l0111b04; dwBlockSize = 13079; dwSrcOffset = 327680;}
            break;
#endif //_FEATURE_SUPPORT_LANG_FINNISH_
#if defined(_FEATURE_SUPPORT_LANG_FRENCH_)
        case ( 1 * 256) + 12 : /* French */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0112b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 121890) {pBlock = (ET9U8 ET9FARDATA *)l0112b01; dwBlockSize = 39970; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_FRENCH_
#if defined(_FEATURE_SUPPORT_LANG_CROATIAN_)
        case ( 1 * 256) + 89 : /* Croatian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0189b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0189b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 204801) {pBlock = (ET9U8 ET9FARDATA *)l0189b02; dwBlockSize = 40961; dwSrcOffset = 163840;}
            break;
#endif //_FEATURE_SUPPORT_LANG_CROATIAN_
#if defined(_FEATURE_SUPPORT_LANG_HUNGARIAN_)
        case ( 1 * 256) + 14 : /* Hungarian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0114b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0114b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0114b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 302853) {pBlock = (ET9U8 ET9FARDATA *)l0114b03; dwBlockSize = 57093; dwSrcOffset = 245760;}
            break;
#endif //_FEATURE_SUPPORT_LANG_HUNGARIAN_
#if defined(_FEATURE_SUPPORT_LANG_ITALIAN_)
        case ( 1 * 256) + 16 : /* Italian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0116b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 134345) {pBlock = (ET9U8 ET9FARDATA *)l0116b01; dwBlockSize = 52425; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_ITALIAN_
#if defined(_FEATURE_SUPPORT_LANG_DUTCH_)
        case ( 1 * 256) + 19 : /* Dutch */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0119b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 132541) {pBlock = (ET9U8 ET9FARDATA *)l0119b01; dwBlockSize = 50621; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_DUTCH_
#if defined(_FEATURE_SUPPORT_LANG_NORWEGIAN_)
        case ( 1 * 256) + 20 : /* Norwegian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0120b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 159734) {pBlock = (ET9U8 ET9FARDATA *)l0120b01; dwBlockSize = 77814; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_NORWEGIAN_
#if defined(_FEATURE_SUPPORT_LANG_POLISH_)
        case ( 1 * 256) + 21 : /* Polish */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0121b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0121b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0121b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 255454) {pBlock = (ET9U8 ET9FARDATA *)l0121b03; dwBlockSize = 9694; dwSrcOffset = 245760;}
            break;
#endif //_FEATURE_SUPPORT_LANG_POLISH_
#if defined(_FEATURE_SUPPORT_LANG_PORTUGUESE_)
        case ( 1 * 256) + 22 : /* Portuguese */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0122b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset <  98333) {pBlock = (ET9U8 ET9FARDATA *)l0122b01; dwBlockSize = 16413; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_PORTUGUESE_
#if defined(_FEATURE_SUPPORT_LANG_ROMANIAN_)
        case ( 1 * 256) + 24 : /* Romanian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0124b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0124b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 163899) {pBlock = (ET9U8 ET9FARDATA *)l0124b02; dwBlockSize = 59; dwSrcOffset = 163840;}
            break;
#endif //_FEATURE_SUPPORT_LANG_ROMANIAN_
#if defined(_FEATURE_SUPPORT_LANG_RUSSIAN_)
        case ( 1 * 256) + 25 : /* Russian */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0125b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 163840) {pBlock = (ET9U8 ET9FARDATA *)l0125b01; dwBlockSize = 81920; dwSrcOffset = 81920;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0125b02; dwBlockSize = 81920; dwSrcOffset = 163840;}
            else if (dwOffset < 309799) {pBlock = (ET9U8 ET9FARDATA *)l0125b03; dwBlockSize = 64039; dwSrcOffset = 245760;}
            break;
#endif //_FEATURE_SUPPORT_LANG_RUSSIAN_
#if defined(_FEATURE_SUPPORT_LANG_SWEDISH_)
        case ( 1 * 256) + 29 : /* Swedish */
            if (dwOffset <  81920) {pBlock = (ET9U8 ET9FARDATA *)l0129b00; dwBlockSize = 81920; dwSrcOffset = 0;}
            else if (dwOffset < 144958) {pBlock = (ET9U8 ET9FARDATA *)l0129b01; dwBlockSize = 63038; dwSrcOffset = 81920;}
            break;
#endif //_FEATURE_SUPPORT_LANG_SWEDISH_
#if defined(_FEATURE_SUPPORT_LANG_TURKISH_)
        case ( 1 * 256) + 31 : /* Turkish */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0131b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0131b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0131b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0131b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0131b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0131b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0131b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0131b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0131b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0131b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0131b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0131b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0131b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0131b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0131b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0131b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0131b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0131b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 291840) {pBlock = (ET9U8 ET9FARDATA *)l0131b18; dwBlockSize = 15360; dwSrcOffset = 276480;}
            else if (dwOffset < 307200) {pBlock = (ET9U8 ET9FARDATA *)l0131b19; dwBlockSize = 15360; dwSrcOffset = 291840;}
            else if (dwOffset < 322560) {pBlock = (ET9U8 ET9FARDATA *)l0131b20; dwBlockSize = 15360; dwSrcOffset = 307200;}
            else if (dwOffset < 337920) {pBlock = (ET9U8 ET9FARDATA *)l0131b21; dwBlockSize = 15360; dwSrcOffset = 322560;}
            else if (dwOffset < 353280) {pBlock = (ET9U8 ET9FARDATA *)l0131b22; dwBlockSize = 15360; dwSrcOffset = 337920;}
            else if (dwOffset < 368640) {pBlock = (ET9U8 ET9FARDATA *)l0131b23; dwBlockSize = 15360; dwSrcOffset = 353280;}
            else if (dwOffset < 384000) {pBlock = (ET9U8 ET9FARDATA *)l0131b24; dwBlockSize = 15360; dwSrcOffset = 368640;}
            else if (dwOffset < 399360) {pBlock = (ET9U8 ET9FARDATA *)l0131b25; dwBlockSize = 15360; dwSrcOffset = 384000;}
            else if (dwOffset < 409834) {pBlock = (ET9U8 ET9FARDATA *)l0131b26; dwBlockSize = 10474; dwSrcOffset = 399360;}
            break;
#endif //_FEATURE_SUPPORT_LANG_TURKISH_
#if defined(_FEATURE_SUPPORT_LANG_SLOVAK_)
        case ( 1 * 256) + 27 : /* Slovak */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0127b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0127b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0127b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0127b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0127b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0127b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0127b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0127b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0127b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0127b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0127b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0127b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0127b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0127b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0127b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 243597) {pBlock = (ET9U8 ET9FARDATA *)l0127b15; dwBlockSize = 13197; dwSrcOffset = 230400;}
            break;
#endif //_FEATURE_SUPPORT_LANG_SLOVAK_
#if defined(_FEATURE_SUPPORT_LANG_UKRAINIAN_)
        case ( 1 * 256) + 34 : /* Ukrainian */
	    if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0134b00; dwBlockSize = 15360; dwSrcOffset = 0;}
	    else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0134b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
	    else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0134b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
	    else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0134b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
	    else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0134b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
	    else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0134b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
	    else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0134b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
	    else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0134b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
	    else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0134b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
	    else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0134b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
	    else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0134b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
	    else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0134b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
	    else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0134b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
	    else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0134b13; dwBlockSize = 15360; dwSrcOffset = 199680;}	
	    else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0134b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
	    else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0134b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
	    else if (dwOffset < 254851) {pBlock = (ET9U8 ET9FARDATA *)l0134b16; dwBlockSize = 9091; dwSrcOffset = 245760;}
	    break;
#endif//_FEATURE_SUPPORT_LANG_UKRAINIAN_
#if defined(_FEATURE_SUPPORT_LANG_KAZAKH_)
        case ( 1 * 256) + 97 : /* Kazakh */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0197b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0197b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0197b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0197b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0197b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0197b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0197b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0197b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0197b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 150947) {pBlock = (ET9U8 ET9FARDATA *)l0197b09; dwBlockSize = 12707; dwSrcOffset = 138240;}
            break;
#endif//_FEATURE_SUPPORT_LANG_KAZAKH_
#if defined(_FEATURE_SUPPORT_LANG_SLOVENIAN_)
        case ( 1 * 256) + 36 : /* Slovenian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0136b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0136b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0136b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0136b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0136b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0136b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0136b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0136b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0136b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0136b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0136b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0136b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0136b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0136b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 220870) {pBlock = (ET9U8 ET9FARDATA *)l0136b14; dwBlockSize = 5830; dwSrcOffset = 215040;}
            break;
#endif//_FEATURE_SUPPORT_LANG_SLOVENIAN_
#if defined(_FEATURE_SUPPORT_LANG_BULGARIAN_)
        case ( 1 * 256) +  2 : /* Bulgarian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0102b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0102b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0102b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0102b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0102b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0102b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0102b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0102b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0102b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0102b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0102b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0102b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0102b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0102b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0102b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0102b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0102b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0102b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 291840) {pBlock = (ET9U8 ET9FARDATA *)l0102b18; dwBlockSize = 15360; dwSrcOffset = 276480;}
            else if (dwOffset < 307200) {pBlock = (ET9U8 ET9FARDATA *)l0102b19; dwBlockSize = 15360; dwSrcOffset = 291840;}
            else if (dwOffset < 322560) {pBlock = (ET9U8 ET9FARDATA *)l0102b20; dwBlockSize = 15360; dwSrcOffset = 307200;}
            else if (dwOffset < 337920) {pBlock = (ET9U8 ET9FARDATA *)l0102b21; dwBlockSize = 15360; dwSrcOffset = 322560;}
            else if (dwOffset < 353280) {pBlock = (ET9U8 ET9FARDATA *)l0102b22; dwBlockSize = 15360; dwSrcOffset = 337920;}
            else if (dwOffset < 368640) {pBlock = (ET9U8 ET9FARDATA *)l0102b23; dwBlockSize = 15360; dwSrcOffset = 353280;}
            else if (dwOffset < 377450) {pBlock = (ET9U8 ET9FARDATA *)l0102b24; dwBlockSize = 8810; dwSrcOffset = 368640;}
            break;
#endif//_FEATURE_SUPPORT_LANG_BULGARIAN_
#if defined(_FEATURE_SUPPORT_LANG_ESTONIAN_)
        case ( 1 * 256) + 37 : /* Estonian */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0137b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0137b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0137b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0137b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0137b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0137b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0137b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 122880) {pBlock = (ET9U8 ET9FARDATA *)l0137b07; dwBlockSize = 15360; dwSrcOffset = 107520;}
            else if (dwOffset < 138240) {pBlock = (ET9U8 ET9FARDATA *)l0137b08; dwBlockSize = 15360; dwSrcOffset = 122880;}
            else if (dwOffset < 153600) {pBlock = (ET9U8 ET9FARDATA *)l0137b09; dwBlockSize = 15360; dwSrcOffset = 138240;}
            else if (dwOffset < 168960) {pBlock = (ET9U8 ET9FARDATA *)l0137b10; dwBlockSize = 15360; dwSrcOffset = 153600;}
            else if (dwOffset < 184320) {pBlock = (ET9U8 ET9FARDATA *)l0137b11; dwBlockSize = 15360; dwSrcOffset = 168960;}
            else if (dwOffset < 199680) {pBlock = (ET9U8 ET9FARDATA *)l0137b12; dwBlockSize = 15360; dwSrcOffset = 184320;}
            else if (dwOffset < 215040) {pBlock = (ET9U8 ET9FARDATA *)l0137b13; dwBlockSize = 15360; dwSrcOffset = 199680;}
            else if (dwOffset < 230400) {pBlock = (ET9U8 ET9FARDATA *)l0137b14; dwBlockSize = 15360; dwSrcOffset = 215040;}
            else if (dwOffset < 245760) {pBlock = (ET9U8 ET9FARDATA *)l0137b15; dwBlockSize = 15360; dwSrcOffset = 230400;}
            else if (dwOffset < 261120) {pBlock = (ET9U8 ET9FARDATA *)l0137b16; dwBlockSize = 15360; dwSrcOffset = 245760;}
            else if (dwOffset < 276480) {pBlock = (ET9U8 ET9FARDATA *)l0137b17; dwBlockSize = 15360; dwSrcOffset = 261120;}
            else if (dwOffset < 291840) {pBlock = (ET9U8 ET9FARDATA *)l0137b18; dwBlockSize = 15360; dwSrcOffset = 276480;}
            else if (dwOffset < 307200) {pBlock = (ET9U8 ET9FARDATA *)l0137b19; dwBlockSize = 15360; dwSrcOffset = 291840;}
            else if (dwOffset < 322560) {pBlock = (ET9U8 ET9FARDATA *)l0137b20; dwBlockSize = 15360; dwSrcOffset = 307200;}
            else if (dwOffset < 337920) {pBlock = (ET9U8 ET9FARDATA *)l0137b21; dwBlockSize = 15360; dwSrcOffset = 322560;}
            else if (dwOffset < 353280) {pBlock = (ET9U8 ET9FARDATA *)l0137b22; dwBlockSize = 15360; dwSrcOffset = 337920;}
            else if (dwOffset < 357909) {pBlock = (ET9U8 ET9FARDATA *)l0137b23; dwBlockSize = 4629; dwSrcOffset = 353280;}
            break;
#endif//_FEATURE_SUPPORT_LANG_ESTONIAN_
#if defined(_FEATURE_SUPPORT_LANG_ICELANDIC_)
        case ( 1 * 256) + 15 : /* Icelandic */
            if (dwOffset <  15360) {pBlock = (ET9U8 ET9FARDATA *)l0115b00; dwBlockSize = 15360; dwSrcOffset = 0;}
            else if (dwOffset <  30720) {pBlock = (ET9U8 ET9FARDATA *)l0115b01; dwBlockSize = 15360; dwSrcOffset = 15360;}
            else if (dwOffset <  46080) {pBlock = (ET9U8 ET9FARDATA *)l0115b02; dwBlockSize = 15360; dwSrcOffset = 30720;}
            else if (dwOffset <  61440) {pBlock = (ET9U8 ET9FARDATA *)l0115b03; dwBlockSize = 15360; dwSrcOffset = 46080;}
            else if (dwOffset <  76800) {pBlock = (ET9U8 ET9FARDATA *)l0115b04; dwBlockSize = 15360; dwSrcOffset = 61440;}
            else if (dwOffset <  92160) {pBlock = (ET9U8 ET9FARDATA *)l0115b05; dwBlockSize = 15360; dwSrcOffset = 76800;}
            else if (dwOffset < 107520) {pBlock = (ET9U8 ET9FARDATA *)l0115b06; dwBlockSize = 15360; dwSrcOffset = 92160;}
            else if (dwOffset < 115055) {pBlock = (ET9U8 ET9FARDATA *)l0115b07; dwBlockSize = 7535; dwSrcOffset = 107520;}
            break;
#endif//_FEATURE_SUPPORT_LANG_ICELANDIC_
        default :
            wStatus = ET9STATUS_READ_DB_FAIL;
            break;
        }

        if (pBlock == NULL) {
            return wStatus;
        }

        dwBlockOffset = (ET9U32)(dwOffset - dwSrcOffset);
        pSrc = &pBlock[dwBlockOffset];
        if ((dwBlockOffset + dwNumberOfBytesToRead) > dwBlockSize) {
            dwSrcSize = (ET9U32)(dwBlockSize - dwBlockOffset);
        }
        else {
            dwSrcSize = dwNumberOfBytesToRead;
        }
        dwOffset = dwSrcOffset + dwBlockSize;
        dwNumberOfBytesToRead -= dwSrcSize;

        *pdwNumberOfBytesRead += dwSrcSize;

        while (dwSrcSize--) {
            *pbDst++ = *pSrc++;
        }

    }

    return wStatus;

}

ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead))
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}
#endif /* ET9_DIRECT_LDB_ACCESS */
#endif /* LOAD_DB_FROM_FILE */

ET9STATUS ET9FARCALL ET9AW_RUDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}

ET9STATUS ET9FARCALL ET9AW_CDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}

ET9STATUS ET9FARCALL ET9AW_ASDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}

/*----------------------------------------------------------------------------
 * Get Functions
 *----------------------------------------------------------------------------*/
#ifdef ET9_FULL_INTERFACE
ET9STATUS ET9FARCALL ET9AW_GetMDBInfo(JNIEnv *env, jclass jcls, ET9AWMDBInfo *sMDBInfo, jobject jobj)
{
	jclass cls;

	if(env == NULL || sMDBInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	sMDBInfo->wStatus = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wStatus", "S"));
	sMDBInfo->pReadMdbData = ET9AW_ReadMdbData; // TODO:callback

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetBaseLingInfo(JNIEnv *env, jclass jcls, ET9BaseLingInfo *Base, jobject jobj)
{
	jclass cls;
	jobject jobj_pWordSymbInfo;

	if(env == NULL || Base == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	Base->bSelListInvalidated = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSelListInvalidated", "Z"));
	Base->bSymbsInfoInvalidated = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSymbsInfoInvalidated", "Z"));

	GetBooleanObjectArray(env, jcls, Base->bSymbInvalidated,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bSymbInvalidated", "[Z")), ET9MAXWORDSIZE);

	GetBooleanObjectArray(env, jcls, Base->bLockInvalidated, 
	 	(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bLockInvalidated", "[Z")), ET9MAXWORDSIZE);

	Base->pWordSymbInfo = &g_pWordSymbInfo;
	jobj_pWordSymbInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pWordSymbInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9WordSymbInfo;"));
	ET9Word_GetWordSymbInfo(env, jcls, Base->pWordSymbInfo, jobj_pWordSymbInfo);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetRUDBInfo(JNIEnv *env, jclass jcls, ET9AWRUDBInfo *pRUDBInfo, jobject jobj)
{
	jclass cls;

	if(env == NULL || pRUDBInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pRUDBInfo->wDataSize          = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataSize", "S"));
	pRUDBInfo->wDataCheck         = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataCheck", "S"));
	pRUDBInfo->wUpdateCounter     = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wUpdateCounter", "S"));
	pRUDBInfo->wUDBWordCount      = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wUDBWordCount", "S"));
	pRUDBInfo->wRDBWordCount      = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wRDBWordCount", "S"));
	pRUDBInfo->wRemainingMemory   = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wRemainingMemory", "S"));
	pRUDBInfo->wLastDelCutOffFreq = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLastDelCutOffFreq", "S"));
	pRUDBInfo->wSavedOffset       = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSavedOffset", "S"));
	pRUDBInfo->dwOffsetSaver      = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver", "I"));

	GetShortObjectArray(env, jcls, pRUDBInfo->wSizeOffset,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "wSizeOffset", "[S")), 10);

	GetByteObjectArray(env, jcls, pRUDBInfo->bDataArea,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bDataArea", "[B")), 1);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetCDBInfo(JNIEnv *env, jclass jcls, ET9AWCDBInfo *pCDBInfo, jobject jobj)
{
	jclass cls;

	if(env == NULL || pCDBInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pCDBInfo->wDataSize      = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataSize", "S"));
	pCDBInfo->wUpdateCounter = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wUpdateCounter", "S"));
	pCDBInfo->wDataEndOffset = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataEndOffset", "S"));
	pCDBInfo->wSavedOffset   = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSavedOffset", "S"));
	pCDBInfo->dwOffsetSaver  = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver", "I"));

	GetShortObjectArray(env, jcls, pCDBInfo->sDataArea,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sDataArea", "[S")), 1);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetLdbASRecMap(JNIEnv *env, jclass jcls, ET9LdbASRecMap *sLdbASRecord, jobject jobj)
{
	jclass cls;

	if(env == NULL || sLdbASRecord == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	sLdbASRecord->wLDBID          = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLDBID",          "S"));
	sLdbASRecord->wTotalRecords   = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wTotalRecords",   "S"));
	sLdbASRecord->wEnabledRecords = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wEnabledRecords", "S"));

	GetByteObjectArray(env, jcls, sLdbASRecord->bMap,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bMap", "[B")), ET9MAXLDBSUPPORTEDASRECORDS/8);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetASDBInfo(JNIEnv *env, jclass jcls, ET9AWASDBInfo *pASDBInfo, jobject jobj)
{
	int i;
	jclass cls;
	jobject jobj_sLdbASRecord, jobj_sLdbASRecord_sub;

	if(env == NULL || pASDBInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pASDBInfo->wDataSize        = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataSize",        "S"));
	pASDBInfo->wDataCheck       = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wDataCheck",       "S"));
	pASDBInfo->wEntryCount      = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wEntryCount",      "S"));
	pASDBInfo->wRemainingMemory = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wRemainingMemory", "S"));
	pASDBInfo->dwOffsetSaver    = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver",    "I"));
	pASDBInfo->wSavedOffset     = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSavedOffset",     "S"));
	pASDBInfo->wSavedRecordNum  = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSavedRecordNum",  "S"));
	pASDBInfo->dwRecordNumSaver = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwRecordNumSaver", "I"));

	GetShortObjectArray(env, jcls, pASDBInfo->wSizeOffset,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "wSizeOffset", "[S")), ET9NUMASDBSIZERANGES);

	GetShortObjectArray(env, jcls, pASDBInfo->wLDBUseTracker,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "wLDBUseTracker", "[S")), ET9MAXASDBLANGUAGERECORDS);

// TODO:object array
/* //SJKO_TEST 
	jobj_sLdbASRecord = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sLdbASRecord",   "[Lcom/xt9/core/Xt9Datatype$S_ET9LdbASRecMap;"));
	for(i = 0; i < ET9MAXASDBLANGUAGERECORDS; i++)
	{
		jobj_sLdbASRecord_sub = (*env)->GetObjectArrayElement(env, jobj_sLdbASRecord, i);
		ET9_GetLdbASRecMap(env, jcls, &pASDBInfo->sLdbASRecord[i], jobj_sLdbASRecord_sub);
	}

	GetByteObjectArray(env, jcls, pASDBInfo->bDataArea,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bDataArea", "[B")), 1);
*/
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALdbHeaderData(JNIEnv *env, jclass jcls, ET9ALdbHeaderData *header, jobject jobj)
{
	jclass cls;

	if(env == NULL || header == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	header->bPosCount                       = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bPosCount",                       "B"));

	GetByteObjectArray(env, jcls, header->pbCharacterEncodeTable,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbCharacterEncodeTable", "[B")), ALDB_HEADER_MAX_DIRECT_ENCODE);

	header->wCharacterEncodeExtendCount     = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCharacterEncodeExtendCount",     "S"));
	header->sCharacterEncodeExtendFirstChar = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "sCharacterEncodeExtendFirstChar", "S"));
	header->sCharacterEncodeExtendLastChar  = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "sCharacterEncodeExtendLastChar",  "S"));
	header->wCharacterDecodeCount           = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCharacterDecodeCount",           "S"));

	GetShortObjectArray(env, jcls, header->psCharacterDecodeTable,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "psCharacterDecodeTable", "[S")), ALDB_HEADER_MAX_CHAR_CODES);

	GetByteObjectArray(env, jcls, header->pbOneByteCodes,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbOneByteCodes", "[B")), ALDB_HEADER_ONE_BYTE_SIZE+1);

	GetByteObjectArray(env, jcls, header->pbOneByteLengths,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbOneByteLengths", "[B")), ALDB_HEADER_ONE_BYTE_SIZE);

	GetByteObjectArray(env, jcls, header->pbPosOrder,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbPosOrder", "[B")), ET9MAXLDBWORDSIZE);

	GetIntObjectArray(env, jcls, (jint *)header->pdwIntervalOffsets,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pdwIntervalOffsets", "[I")), ET9MAXLDBWORDSIZE+1);

	header->wCodeNone                       = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCodeNone",                       "S"));
	header->wCodeZero                       = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCodeZero",                       "S"));
	header->wCodeIntervalEnd                = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalEnd",                "S"));
	header->wCodeIntervalJump               = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalJump",               "S"));
	header->wCodeIntervalExtend             = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalExtend",             "S"));
	header->bHasUppercase                   = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bHasUppercase",                   "Z"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALdbCompareData(JNIEnv *env, jclass jcls, ET9ALdbCompareData *compare, jobject jobj)
{
	int i, j;
	jclass cls;
	jobject jobj_ppbActive,     jobj_ppbActive_sub;
	jobject jobj_ppbExact,      jobj_ppbExact_sub;
	jobject jobj_pppbActiveSpc, jobj_pppbActiveSpc_sub, jobj_pppbActiveSpc_sub_sub;
	jobject jobj_ppbFreq,       jobj_ppbFreq_sub;


	if(env == NULL || compare == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	compare->wLength             = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wLength",             "S"));
	compare->bActiveCmpLength    = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bActiveCmpLength",    "B"));
	compare->bSpcActive          = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcActive",          "Z"));
	compare->bFirstPosSetOpt     = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bFirstPosSetOpt",     "Z"));

	compare->bSpcExactCompare    = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcExactCompare",    "Z"));
	compare->bSpcFilteredCompare = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcFilteredCompare", "Z"));
	compare->bSpcExactFilter     = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcExactFilter",     "Z"));

	compare->bSpcMaxEdits        = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bSpcMaxEdits",        "B"));
	compare->bSpcLengthOffset    = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bSpcLengthOffset",    "B"));

	compare->bPosLo              = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bPosLo",              "B"));
	compare->bPosHi              = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bPosHi",              "B"));

	jobj_ppbActive = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ppbActive", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_POS; i++)
	{
		jobj_ppbActive_sub = (*env)->GetObjectArrayElement(env, jobj_ppbActive, i);
		GetByteObjectArray(env, jcls, compare->ppbActive[i], jobj_ppbActive_sub, ALDB_COMPARE_MAX_CODE_BYTES);
	}

	jobj_ppbExact = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ppbExact", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_POS; i++)
	{
		jobj_ppbExact_sub = (*env)->GetObjectArrayElement(env, jobj_ppbExact, i);
		GetByteObjectArray(env, jcls, compare->ppbExact[i], jobj_ppbExact_sub, ALDB_COMPARE_MAX_CODE_BYTES);
	}

	jobj_pppbActiveSpc = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pppbActiveSpc", "[[[B"));

// TODO:primitive_multi_array
/*
	for(i = 0; i < ALDB_COMPARE_MAX_DIST_LENGTHS; i++)
	{
		jobj_pppbActiveSpc_sub = (*env)->GetObjectArrayElement(env, jobj_pppbActiveSpc, i);

		for(j = 0; j < ALDB_COMPARE_MAX_POS; j++)
		{
			jobj_pppbActiveSpc_sub_sub = (*env)->GetObjectArrayElement(env, jobj_pppbActiveSpc_sub, j);
		GetByteObjectArray(env, jcls, compare->pppbActiveSpc[j], jobj_pppbActiveSpc_sub_sub, ALDB_COMPARE_MAX_CODE_BYTES);
		}
	}
*/
// TODO:primitive_multi_array

	jobj_ppbFreq = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ppbFreq", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_FREQ_POS; i++)
	{
		jobj_ppbFreq_sub = (*env)->GetObjectArrayElement(env, jobj_ppbFreq, i);
		GetByteObjectArray(env, jcls, compare->ppbFreq[i], jobj_ppbFreq_sub, ALDB_HEADER_MAX_CHAR_CODES);
	}

	GetByteObjectArray(env, jcls, compare->pbLocked,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbLocked", "[B")), ALDB_COMPARE_MAX_POS);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALdbCursorData(JNIEnv *env, jclass jcls, ET9ALdbCursorData *pCursors, jobject jobj)
{
	jclass cls;

	if(env == NULL || pCursors == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pCursors->dwStartPos         = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwStartPos",         "I"));
	pCursors->dwEndPos           = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwEndPos",           "I"));
	pCursors->dwJumpPos          = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwJumpPos",          "I"));
	pCursors->dwJumpAddress      = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwJumpAddress",      "I"));
	pCursors->dwSourceDataStart  = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwSourceDataStart",  "I"));
	pCursors->dwSourceDataLength = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwSourceDataLength", "I"));
	pCursors->wCode              = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCode",              "S"));

//#ifdef ET9_DIRECT_LDB_ACCESS
//	pCursors->pbCurrData         = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "pbCurrData",         "B"));
//#else
	GetByteObjectArray(env, jcls, pCursors->pbCurrData,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbCurrData", "[B")), 1);

	pCursors->dwCurrCacheStart   = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwCurrCacheStart",   "I"));

	GetByteObjectArray(env, jcls, pCursors->pbCacheEnd,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbCacheEnd", "[B")), 1);

	GetByteObjectArray(env, jcls, pCursors->pbCache,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbCache", "[B")), ALDB_CURSOR_DATA_CACHE_SIZE);
//#endif

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALdbSearchData(JNIEnv *env, jclass jcls, ET9ALdbSearchData *search, jobject jobj)
{
	jclass cls;

	if(env == NULL || search == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	GetShortObjectArray(env, jcls, search->psTarget,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "psTarget", "[S")), 1);

	GetShortObjectArray(env, jcls, search->pwLength,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pwLength", "[S")), 1);

	search->wTargetLength         = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wTargetLength",        "S"));

	search->dwCurrItem            = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwCurrItem",           "I"));
	search->bExhausted            = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bExhausted",           "Z"));

	search->bCurrWordLength       = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bCurrWordLength",      "B"));
	search->dwWordLengthEndPos    = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwWordLengthEndPos",   "I"));

	search->bSpcCompare           = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcCompare",          "Z"));
	search->dwSpcControlEndPos    = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwSpcControlEndPos",   "I"));
	search->dwRegNonMatchEndPos   = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwRegNonMatchEndPos",  "I"));

	search->bSpcNonZeroPos        = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bSpcNonZeroPos",       "B"));
	search->bSpcControlPos        = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bSpcControlPos",       "B"));

	search->bRegCmpLength         = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bRegCmpLength",        "B"));

	GetByteObjectArray(env, jcls, search->pbRegPosCurrOrder,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbRegPosCurrOrder", "[B")), ET9MAXLDBWORDSIZE);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALdb(JNIEnv *env, jclass jcls, ET9ALdb *ALdb, jobject jobj)
{
	int i;
	jclass cls;
	jobject jobj_header, jobj_compare, jobj_pCursors, jobj_search;
	jobject jobj_pCursors_sub;

	if(env == NULL || ALdb == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	jobj_header = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "header",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbHeaderData;"));
	ET9_GetALdbHeaderData(env, jcls, &ALdb->header, jobj_header);

	jobj_compare = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "compare",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbCompareData;"));
	ET9_GetALdbCompareData(env, jcls, &ALdb->compare, jobj_compare);

// TODO:object array
/* //SJKO_TEST
	jobj_pCursors = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pCursors",   "[Lcom/xt9/core/Xt9Datatype$S_ET9ALdbCursorData;"));
	for(i = 0; i < ET9MAXLDBWORDSIZE; i++)
	{
		jobj_pCursors_sub = (*env)->GetObjectArrayElement(env, jobj_pCursors, i);
		ET9_GetALdbCursorData(env, jcls, &ALdb->pCursors[i], jobj_pCursors_sub);
	}
*/
	jobj_search = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "search",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbSearchData;"));
	ET9_GetALdbSearchData(env, jcls, &ALdb->search, jobj_search);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_GetALDBAutoSub(JNIEnv *env, jclass jcls, ET9ALDBAutoSub *sLDBAutoSub, jobject jobj)
{
	jclass cls;

	if(env == NULL || sLDBAutoSub == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	sLDBAutoSub->bSupported           = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bSupported",           "B"));
	sLDBAutoSub->bLSASDBVersion       = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bLSASDBVersion",       "B"));
	sLDBAutoSub->bLSASDBLangID        = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bLSASDBLangID",        "B"));
	sLDBAutoSub->wNumEntries          = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wNumEntries",          "S"));
	sLDBAutoSub->dwLSASDBStartAddress = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwLSASDBStartAddress", "I"));
	sLDBAutoSub->dwLSASDBEndAddress   = (*env)->GetIntField  (env, jobj, (*env)->GetFieldID(env, cls, "dwLSASDBEndAddress",   "I"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetPrivWordInfo(JNIEnv *env, jclass jcls, ET9AWPrivWordInfo *PrivWordInfo, jobject jobj)
{
	jclass cls;
	jobject jobj_Base;

	if(env == NULL || PrivWordInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	jobj_Base = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "Base",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWWordInfo;"));
	ET9AW_GetWordInfo(env, jcls, &PrivWordInfo->Base, jobj_Base);

	PrivWordInfo->nTotFreq         = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "nTotFreq",         "I"));
	PrivWordInfo->wWordFreq        = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wWordFreq",        "S"));
	PrivWordInfo->wWordFreqIndex   = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wWordFreqIndex",   "S"));
	PrivWordInfo->wTapFreq         = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wTapFreq",         "S"));
	PrivWordInfo->bWordSrc         = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bWordSrc",         "B"));
	PrivWordInfo->bWordQuality     = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bWordQuality",     "B"));
	PrivWordInfo->bEditDistSpc     = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bEditDistSpc",     "B"));
	PrivWordInfo->bEditDistStem    = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bEditDistStem",    "B"));
	PrivWordInfo->bHasPrimEditDist = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bHasPrimEditDist", "Z"));
	PrivWordInfo->bIsUDBWord       = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bIsUDBWord",       "Z"));
	PrivWordInfo->bIsGroupBase     = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bIsGroupBase",     "Z"));
	PrivWordInfo->bGroupCount      = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bGroupCount",      "B"));
	PrivWordInfo->bCDBTrigram      = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bCDBTrigram",      "B"));

	return ET9STATUS_NONE;
}


ET9STATUS ET9FARCALL ET9_GetASPCCompareData(JNIEnv *env, jclass jcls, ET9ASPCCompareData *sCmpData, jobject jobj)
{
	int i;
	jclass cls;
	jobject jobj_ppbFreqRowStore, jobj_ppbFreqRowStore_sub;
	jobject jobj_ppbCmpResultRowStore, jobj_ppbCmpResultRowStore_sub;

	if(env == NULL || sCmpData == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	jobj_ppbFreqRowStore = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ppbFreqRowStore", "[[B"));
	for(i = 0; i < ET9_SPC_ED_CALC_ROWS; i++)
	{
		jobj_ppbFreqRowStore_sub = (*env)->GetObjectArrayElement(env, jobj_ppbFreqRowStore, i);
		GetByteObjectArray(env, jcls, sCmpData->ppbFreqRowStore[i], jobj_ppbFreqRowStore_sub, ET9_SPC_ED_STORE_ROW_LEN);
	}

	jobj_ppbCmpResultRowStore = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ppbFreqRowStore", "[[B"));
	for(i = 0; i < ET9_SPC_ED_CALC_ROWS; i++)
	{
		jobj_ppbCmpResultRowStore_sub = (*env)->GetObjectArrayElement(env, jobj_ppbCmpResultRowStore, i);
		GetByteObjectArray(env, jcls, sCmpData->ppbCmpResultRowStore[i], jobj_ppbCmpResultRowStore_sub, ET9_SPC_ED_STORE_ROW_LEN);
	}

	return ET9STATUS_NONE;
}


ET9STATUS ET9FARCALL ET9_GetASpc(JNIEnv *env, jclass jcls, ET9ASpc *ASpc, jobject jobj)
{
	jclass cls;
	jobject jobj_sCmpData;

	if(env == NULL || ASpc == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	ASpc->eMode         = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "eMode",         "B"));
	ASpc->wMaxSlstCount = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wMaxSlstCount", "S"));
	ASpc->eSearchFilter = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "eSearchFilter", "B"));

	jobj_sCmpData = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sCmpData",   "Lcom/xt9/core/Xt9Datatype$S_ET9ASPCCompareData;"));
	ET9_GetASPCCompareData(env, jcls, &ASpc->sCmpData, jobj_sCmpData);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetCaptureBuild(JNIEnv *env, jclass jcls, ET9AWCaptureBuild *pCaptures, jobject jobj)
{
	jclass cls;

	if(env == NULL || pCaptures == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pCaptures->bIsValid     = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bIsValid",     "B"));
	pCaptures->wWordLen     = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wWordLen",     "S"));
	pCaptures->wWordCompLen = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wWordCompLen", "S"));
	pCaptures->wSymbolLen   = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSymbolLen",   "S"));

	GetShortObjectArray(env, jcls, pCaptures->sWord,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sWord", "[C")), ET9MAXWORDSIZE);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetCaptureAction(JNIEnv *env, jclass jcls, ET9AWCaptureAction *pCaptureActions, jobject jobj)
{
	jclass cls;

	if(env == NULL || pCaptureActions == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	pCaptureActions->bPop             = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bPop",             "B"));
	pCaptureActions->sbAddWordLen     = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "sbAddWordLen",     "B"));
	pCaptureActions->sbAddWordCompLen = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "sbAddWordCompLen", "B"));
	pCaptureActions->bAddSymbolLen    = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bAddSymbolLen",    "B"));

	return ET9STATUS_NONE;
}


ET9STATUS ET9FARCALL ET9AW_GetBuildInfo(JNIEnv *env, jclass jcls, ET9AWBuildInfo *sBuildInfo, jobject jobj)
{
	int i;
	jclass cls;
	jobject jobj_pCaptures, jobj_pCaptures_sub;
	jobject jobj_pCaptureActions, jobj_pCaptureActions_sub;

	
	if(env == NULL || sBuildInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	sBuildInfo->bCurrCapture        = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bCurrCapture",        "B"));
	sBuildInfo->bCaptureInvalidated = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bCaptureInvalidated", "B"));

	GetByteObjectArray(env, jcls, sBuildInfo->pbFlushPos,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbFlushPos", "[B")), ET9MAXWORDSIZE);

	GetByteObjectArray(env, jcls, sBuildInfo->pbFlushLen,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbFlushLen", "[B")), ET9MAXWORDSIZE);

	GetShortObjectArray(env, jcls, sBuildInfo->pwDefaultPos,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pwDefaultPos", "[S")), ET9MAXWORDSIZE);

	GetByteObjectArray(env, jcls, sBuildInfo->pbDefaultLen,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbDefaultLen", "[B")), ET9MAXWORDSIZE);

	GetByteObjectArray(env, jcls, sBuildInfo->pbDefaultCompLen,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pbDefaultCompLen", "[B")), ET9MAXWORDSIZE);

	GetShortObjectArray(env, jcls, sBuildInfo->psFlushedSymbs,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "psFlushedSymbs", "[S")), ET9MAXWORDSIZE);

	GetShortObjectArray(env, jcls, sBuildInfo->psDefaultSymbs,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "psDefaultSymbs", "[S")), ET9DEFAULTSTORESIZE);

	GetByteObjectArray(env, jcls, sBuildInfo->bLanguageSource,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bLanguageSource", "[B")), ET9MAXWORDSIZE);

// TODO:object array
/* //SJKO_TEST
	jobj_pCaptures = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pCaptures",   "[Lcom/xt9/core/Xt9Datatype$S_ET9AWCaptureBuild;"));
	for(i = 0; i < ET9MAXBUILDCAPTURES; i++)
	{
		jobj_pCaptures_sub = (*env)->GetObjectArrayElement(env, jobj_pCaptures, i);
		ET9AW_GetCaptureBuild(env, jcls, &sBuildInfo->pCaptures[i], jobj_pCaptures_sub);
	}
*/

// TODO:object array
/* //SJKO_TEST
	jobj_pCaptureActions = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pCaptureActions",   "[Lcom/xt9/core/Xt9Datatype$S_ET9AWCaptureAction;"));
	for(i = 0; i < ET9MAXWORDSIZE; i++)
	{
		jobj_pCaptureActions_sub = (*env)->GetObjectArrayElement(env, jobj_pCaptureActions, i);
		ET9AW_GetCaptureAction(env, jcls, &sBuildInfo->pCaptureActions[i], jobj_pCaptureActions_sub);
	}
*/
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetLingCmnPrivate(JNIEnv *env, jclass jcls, ET9AWLingCmnPrivate *Private, jobject jobj)
{
	jclass cls;
	jobject jobj_ALdb, jobj_sLDBAutoSub, jobj_pWordList, jobj_ASpc, jobj_sBuildInfo,
		jobj_LeftHandWord, jobj_pLastWord, jobj_pLastSpcWord, jobj_pLastCompletionWord;

	if(env == NULL || Private == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	GetByteObjectArray(env, jcls, Private->pUDBGetEntry,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pUDBGetEntry", "[B")), 1);

	GetByteObjectArray(env, jcls, Private->pASDBGetEntry,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pASDBGetEntry", "[B")), 1);

	Private->wLdbASGetEntryRec        = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLdbASGetEntryRec",        "S"));
	Private->bTotalExpTermPuncts      = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bTotalExpTermPuncts",      "B"));

	GetShortObjectArray(env, jcls, Private->sExpTermPuncts,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sExpTermPuncts", "[S")), ET9MAX_EXP_TERM_PUNCTS);

	Private->sExpEmbeddedPunct        = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "sExpEmbeddedPunct",        "S"));

	jobj_ALdb = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ALdb", "Lcom/xt9/core/Xt9Datatype$S_ET9ALdb;"));
	ET9_GetALdb(env, jcls, &Private->ALdb, jobj_ALdb);

	jobj_sLDBAutoSub = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sLDBAutoSub", "Lcom/xt9/core/Xt9Datatype$S_ET9ALDBAutoSub;"));
	ET9_GetALDBAutoSub(env, jcls, &Private->sLDBAutoSub, jobj_sLDBAutoSub);

	Private->wPreviousWordLanguage    = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wPreviousWordLanguage",    "S"));
	Private->bListSize                = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bListSize",                "B"));

	Private->pWordList = &g_pWordList;
	jobj_pWordList = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pWordList", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_GetPrivWordInfo(env, jcls, Private->pWordList, jobj_pWordList);

	GetByteObjectArray(env, jcls, Private->bWordList,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bWordList", "[B")), ET9MAXSELLISTSIZE);

	Private->bDefaultIndex            = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bDefaultIndex",            "B"));
	Private->bExactIndex              = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bExactIndex",              "B"));

	Private->bContextWordSize         = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bContextWordSize",         "B"));
	Private->bPreviousContextWordSize = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "bPreviousContextWordSize", "B"));

	GetShortObjectArray(env, jcls, Private->sContextWord,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sContextWord", "[S")), ET9MAXWORDSIZE);

	GetShortObjectArray(env, jcls, Private->sPreviousContextWord,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sPreviousContextWord", "[S")), ET9MAXWORDSIZE);

	Private->eSelectionListMode       = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "eSelectionListMode",       "B"));
	Private->wWordStemsPoint          = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wWordStemsPoint",          "S"));
	Private->wWordCompletionPoint     = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wWordCompletionPoint",     "S"));
	Private->wMaxCompletionCount      = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wMaxCompletionCount",      "S"));

	jobj_ASpc = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "ASpc", "Lcom/xt9/core/Xt9Datatype$S_ET9ASpc;"));
	ET9_GetASpc(env, jcls, &Private->ASpc, jobj_ASpc);


	Private->wCurrBuildLang           = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCurrBuildLang",           "S"));
	Private->wCurrBuildSecondLanguage = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCurrBuildSecondLanguage", "S"));
	Private->wCurrLockPoint           = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wCurrLockPoint",           "S"));
	Private->eCurrSelectionListMode   = (*env)->GetByteField (env, jobj, (*env)->GetFieldID(env, cls, "eCurrSelectionListMode",   "B"));

	Private->bLastBuildLen            = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bLastBuildLen",          "B"));
	Private->bLastBuildShrinking      = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bLastBuildShrinking",    "Z"));
	Private->bTotalSymbInputs         = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bTotalSymbInputs",       "B"));

	jobj_sBuildInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sBuildInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWBuildInfo;"));
	ET9AW_GetBuildInfo(env, jcls, &Private->sBuildInfo, jobj_sBuildInfo);

	Private->dwStateBits              = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwStateBits",             "I"));
	Private->dwDevStateBits           = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "dwDevStateBits",          "I"));
	Private->bRequiredFound           = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bRequiredFound",          "Z"));
	Private->bSpcDuringBuild          = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bSpcDuringBuild",         "Z"));
	Private->snLinSearchCount         = (*env)->GetIntField    (env, jobj, (*env)->GetFieldID(env, cls, "snLinSearchCount",        "I"));
	Private->bHasRealWord             = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bHasRealWord",            "Z"));	

	jobj_LeftHandWord = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "LeftHandWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_GetPrivWordInfo(env, jcls, &Private->LeftHandWord, jobj_LeftHandWord);

	Private->bStemsAllowed            = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bStemsAllowed",           "Z"));
	Private->wMaxWordLength           = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wMaxWordLength",          "S"));
	Private->wTotalWordInserts        = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wTotalWordInserts",       "S"));

	Private->bTotalWords              = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bTotalWords",             "B"));
	Private->bTotalSpcWords           = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bTotalSpcWords",          "B"));
	Private->bTotalCompletionWords    = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bTotalCompletionWords",   "B"));

	Private->pLastWord = &g_pLastWord;
	jobj_pLastWord = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pLastWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_GetPrivWordInfo(env, jcls, Private->pLastWord, jobj_pLastWord);

	Private->pLastSpcWord = &g_pLastSpcWord;
	jobj_pLastSpcWord = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pLastSpcWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_GetPrivWordInfo(env, jcls, Private->pLastSpcWord, jobj_pLastSpcWord);

	Private->pLastCompletionWord = &g_pLastCompletionWord;
	jobj_pLastCompletionWord = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pLastCompletionWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_GetPrivWordInfo(env, jcls, Private->pLastCompletionWord, jobj_pLastCompletionWord);

	Private->bPrimaryFence            = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bPrimaryFence",           "B"));
	Private->bPrimaryFence            = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bPrimaryFence",           "B"));

	GetByteObjectArray(env, jcls, Private->bLangSupported,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "bLangSupported", "[B")), ET9MAXWORDSIZE);

//#ifdef ET9_ACTIVATE_SLST_STATS
/*
    struct ET9AWSlstStats_s
    {
        ET9U32              dwBuildCount;
        ET9U32              dwInsertCount;
        ET9U32              dwTotInsertCount;
        ET9U32              dwTotInsertDiscarded;
        ET9U32              dwTotInsertReplacing;
        ET9U32              dwTotInsertDuplicate;
        ET9U32              dwMaxListInserts;

        ET9U32              dwBuildCountAcc;
        ET9U32              dwInsertCountAcc;
        ET9U32              dwTotInsertCountAcc;
        ET9U32              dwTotInsertDiscardedAcc;
        ET9U32              dwTotInsertReplacingAcc;
        ET9U32              dwTotInsertDuplicateAcc;
        ET9U32              dwMaxListInsertsAcc;
    } sStats;
*/
//#endif

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetLingCmnInfo(JNIEnv *env, jclass jcls, ET9AWLingCmnInfo *pLingCmnInfo, jobject jobj)
{
	jclass cls;
	jobject jobj_Base, jobj_pRUDBInfo, jobj_pCDBInfo, jobj_pASDBInfo, jobj_Private;

	if(env == NULL || pLingCmnInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	jobj_Base = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "Base",   "Lcom/xt9/core/Xt9Datatype$S_ET9BaseLingInfo;"));
	ET9_GetBaseLingInfo(env, jcls, &pLingCmnInfo->Base, jobj_Base);
	
	pLingCmnInfo->dwStateBits   = (*env)->GetIntField(env, jobj, (*env)->GetFieldID(env, cls, "dwStateBits", "I"));
	pLingCmnInfo->dwLdbNum       = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLdbNum", "S"));
	pLingCmnInfo->dwFirstLdbNum  = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wFirstLdbNum", "S"));
	pLingCmnInfo->dwSecondLdbNum = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSecondLdbNum", "S"));

	pLingCmnInfo->pRUDBInfo = &g_pRUDBInfo;
	jobj_pRUDBInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pRUDBInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWRUDBInfo;"));
	ET9AW_GetRUDBInfo(env, jcls, pLingCmnInfo->pRUDBInfo, jobj_pRUDBInfo);

	pLingCmnInfo->pCDBInfo = &g_pCDBInfo;
	jobj_pCDBInfo  = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pCDBInfo",  "Lcom/xt9/core/Xt9Datatype$S_ET9AWCDBInfo;"));
	ET9AW_GetCDBInfo(env, jcls, pLingCmnInfo->pCDBInfo, jobj_pCDBInfo);

	pLingCmnInfo->pASDBInfo = &g_pASDBInfo;
	jobj_pASDBInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pASDBInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWASDBInfo;"));
	ET9AW_GetASDBInfo(env, jcls, pLingCmnInfo->pASDBInfo, jobj_pASDBInfo);

	jobj_Private   = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingComPrivate;"));
	ET9AW_GetLingCmnPrivate(env, jcls, &pLingCmnInfo->Private, jobj_Private);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetLingPrivate(JNIEnv *env, jclass jcls, ET9AWLingPrivate *Private, jobject jobj)
{
	jclass cls;

	if(env == NULL || Private == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

// TODO:callback    ET9CONVERTSYMBCALLBACK  pConvertSymb;
// TODO:voidp    void                   *pConvertSymbInfo;

//#ifdef ET9_DIRECT_LDB_ACCESS
//    struct
//    {
//        ET9U8  ET9FARDATA   *pLdbData;              /**< pointer to a byte array holding the whole LDB */
//        ET9U32              dwLdbDataSize;          /**< size of the whole LDB */
//    } ALdb;
//#endif /* ET9_DIRECT_LDB_ACCESS */

	Private->wInfoInitOK = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wInfoInitOK", "S"));
	Private->wLDBInitOK =  (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLDBInitOK",  "S"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_GetLingInfo(JNIEnv *env, jclass jcls, ET9AWLingInfo *pLingInfo, jobject jobj)
{
	jclass cls;
	jobject jobj_sMDBInfo, jobj_pLingCmnInfo, jobj_Private;

	if(env == NULL || pLingInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	cls = (*env)->GetObjectClass(env, jobj);

	// TODO:voidp pLingInfo->pPublicExtension

	jobj_sMDBInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sMDBInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWMDBInfo;"));
	ET9AW_GetMDBInfo(env, jcls, &pLingInfo->sMDBInfo, jobj_sMDBInfo);

	pLingInfo->ET9AWLdbReadData = ET9AW_LdbReadData;   // TODO:callback
	pLingInfo->pRUDBWriteData 	= ET9AW_RUDBWriteData; // TODO:callback
	pLingInfo->pCDBWriteData	= ET9AW_CDBWriteData;  // TODO:callback
	pLingInfo->pASDBWriteData 	= ET9AW_ASDBWriteData; // TODO:callback

	pLingInfo->pLingCmnInfo = &g_pLingCmnInfo;
	jobj_pLingCmnInfo = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "pLingCmnInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingCmnInfo;"));
	ET9AW_GetLingCmnInfo(env, jcls, pLingInfo->pLingCmnInfo, jobj_pLingCmnInfo);

	jobj_Private = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingPrivate;"));
	ET9AW_GetLingPrivate(env, jcls, &pLingInfo->Private, jobj_Private);

	return ET9STATUS_NONE;
}
#endif // ET9_FULL_INTERFACE

#ifdef ET9_LITE_INTERFACE
ET9STATUS ET9FARCALL ET9AW_GetWordInfo(JNIEnv *env, jclass jcls, ET9AWWordInfo *Base, jobject jobj)
{
	jclass cls;

	if(env == NULL || Base == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	Base->wWordLen         = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wWordLen",         "S"));
//	Base->wWordCompLen     = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wWordCompLen",     "S"));
	Base->wSubstitutionLen = (*env)->GetShortField  (env, jobj, (*env)->GetFieldID(env, cls, "wSubstitutionLen", "S"));
//	Base->bIsTerm          = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bIsTerm",          "Z"));
//	Base->bIsSpellCorr     = (*env)->GetBooleanField(env, jobj, (*env)->GetFieldID(env, cls, "bIsSpellCorr",     "Z"));
//	Base->bWordSource      = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bWordSource",      "B"));
//	Base->bLangIndex       = (*env)->GetByteField   (env, jobj, (*env)->GetFieldID(env, cls, "bLangIndex",       "B"));

	GetShortObjectArray(env, jcls, Base->sWord,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sWord", "[S")), ET9MAXWORDSIZE);

	GetShortObjectArray(env, jcls, Base->sSubstitution,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sSubstitution", "[S")), ET9MAXSUBSTITUTIONSIZE);

	return ET9STATUS_NONE;
}
#endif // ET9_LITE_INTERFACE

/*----------------------------------------------------------------------------
 * Set Functions
 *----------------------------------------------------------------------------*/

#ifdef ET9_FULL_INTERFACE
ET9STATUS ET9FARCALL ET9AW_SetMDBInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWMDBInfo sMDBInfo)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wStatus", "S"), sMDBInfo.wStatus);
	// TODO:callback sMDBInfo.pReadMdbData

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetBaseLingInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9BaseLingInfo Base)
{
	jclass cls;
	jobject jobj_pWordSymbInfo;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSelListInvalidated", "Z"), Base.bSelListInvalidated);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSymbsInfoInvalidated", "Z"), Base.bSymbsInfoInvalidated);

	SetBooleanObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bSymbInvalidated", "[Z")), Base.bSymbInvalidated, ET9MAXWORDSIZE);

	SetBooleanObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bLockInvalidated", "[Z")), Base.bLockInvalidated, ET9MAXWORDSIZE);

	jobj_pWordSymbInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pWordSymbInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9WordSymbInfo;"));
	ET9Word_SetWordSymbInfo(env, jcls, &jobj_pWordSymbInfo, *Base.pWordSymbInfo);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetRUDBInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWRUDBInfo pRUDBInfo)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataSize",          "S"), pRUDBInfo.wDataSize);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataCheck",         "S"), pRUDBInfo.wDataCheck);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wUpdateCounter",     "S"), pRUDBInfo.wUpdateCounter);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wUDBWordCount",      "S"), pRUDBInfo.wUDBWordCount);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wRDBWordCount",      "S"), pRUDBInfo.wRDBWordCount);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wRemainingMemory",   "S"), pRUDBInfo.wRemainingMemory);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLastDelCutOffFreq", "S"), pRUDBInfo.wLastDelCutOffFreq);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSavedOffset",       "S"), pRUDBInfo.wSavedOffset);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver",      "I"), pRUDBInfo.dwOffsetSaver);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "wSizeOffset", "[S")), pRUDBInfo.wSizeOffset, 10);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bDataArea", "[B")), pRUDBInfo.bDataArea, 1);


	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetCDBInfo(JNIEnv *env, jclass jcls, jobject *jobj ,ET9AWCDBInfo pCDBInfo)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataSize",      "S"), pCDBInfo.wDataSize);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wUpdateCounter", "S"), pCDBInfo.wUpdateCounter);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataEndOffset", "S"), pCDBInfo.wDataEndOffset);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSavedOffset",   "S"), pCDBInfo.wSavedOffset);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver",  "I"), pCDBInfo.dwOffsetSaver);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sDataArea", "[S")), pCDBInfo.sDataArea, 1);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetLdbASRecMap(JNIEnv *env, jclass jcls, jobject *jobj, ET9LdbASRecMap sLdbASRecord)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLDBID",          "S"), sLdbASRecord.wLDBID);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wTotalRecords",   "S"), sLdbASRecord.wTotalRecords);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wEnabledRecords", "S"), sLdbASRecord.wEnabledRecords);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bMap", "[B")), sLdbASRecord.bMap, ET9MAXLDBSUPPORTEDASRECORDS/8);


	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetASDBInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWASDBInfo pASDBInfo)
{
	int i;
	jclass cls;
	jobject jobj_sLdbASRecord, jobj_sLdbASRecord_sub;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataSize",        "S"), pASDBInfo.wDataSize);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wDataCheck",       "S"), pASDBInfo.wDataCheck);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wEntryCount",      "S"), pASDBInfo.wEntryCount);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wRemainingMemory", "S"), pASDBInfo.wRemainingMemory);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwOffsetSaver",    "I"), pASDBInfo.dwOffsetSaver);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSavedOffset",     "S"), pASDBInfo.wSavedOffset);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSavedRecordNum",  "S"), pASDBInfo.wSavedRecordNum);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwRecordNumSaver", "I"), pASDBInfo.dwRecordNumSaver);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "wSizeOffset", "[S")), pASDBInfo.wSizeOffset, ET9NUMASDBSIZERANGES);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "wLDBUseTracker", "[S")), pASDBInfo.wLDBUseTracker, ET9MAXASDBLANGUAGERECORDS);

// TODO:object array
//SJKO_TEST
/*
	jobj_sLdbASRecord = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sLdbASRecord",   "[Lcom/xt9/core/Xt9Datatype$S_ET9LdbASRecMap;"));
	for(i = 0; i < ET9MAXASDBLANGUAGERECORDS; i++)
	{
		jobj_sLdbASRecord_sub = (*env)->GetObjectArrayElement(env, jobj_sLdbASRecord, i);
		ET9_SetLdbASRecMap(env, jcls, &jobj_sLdbASRecord_sub, pASDBInfo.sLdbASRecord[i]);
	}
*/
	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bDataArea", "[B")), pASDBInfo.bDataArea, 1);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALdbHeaderData(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbHeaderData header)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bPosCount",                       "B"), header.bPosCount);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbCharacterEncodeTable", "[B")), header.pbCharacterEncodeTable, ALDB_HEADER_MAX_DIRECT_ENCODE);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCharacterEncodeExtendCount",     "S"), header.wCharacterEncodeExtendCount);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "sCharacterEncodeExtendFirstChar", "S"), header.sCharacterEncodeExtendFirstChar);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "sCharacterEncodeExtendLastChar",  "S"), header.sCharacterEncodeExtendLastChar);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCharacterDecodeCount",           "S"), header.wCharacterDecodeCount);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "psCharacterDecodeTable", "[S")), header.psCharacterDecodeTable, ALDB_HEADER_MAX_CHAR_CODES);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbOneByteCodes", "[B")), header.pbOneByteCodes, ALDB_HEADER_ONE_BYTE_SIZE+1);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbOneByteLengths", "[B")), header.pbOneByteLengths, ALDB_HEADER_ONE_BYTE_SIZE);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbPosOrder", "[B")), header.pbPosOrder, ET9MAXLDBWORDSIZE);

	SetIntObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pdwIntervalOffsets", "[I")), (jint *)header.pdwIntervalOffsets, ET9MAXLDBWORDSIZE+1);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCodeNone",                       "S"), header.wCodeNone);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCodeZero",                       "S"), header.wCodeZero);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalEnd",                "S"), header.wCodeIntervalEnd);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalJump",               "S"), header.wCodeIntervalJump);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCodeIntervalExtend",             "S"), header.wCodeIntervalExtend);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bHasUppercase",                   "Z"),header.bHasUppercase);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALdbCompareData(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbCompareData compare)
{
	int i, j;
	jclass cls;
	jobject jobj_ppbActive,     jobj_ppbActive_sub;
	jobject jobj_ppbExact,      jobj_ppbExact_sub;
	jobject jobj_pppbActiveSpc, jobj_pppbActiveSpc_sub, jobj_pppbActiveSpc_sub_sub;
	jobject jobj_ppbFreq,       jobj_ppbFreq_sub;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wLength",             "S"), compare.wLength);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bActiveCmpLength",    "B"), compare.bActiveCmpLength);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcActive",          "Z"), compare.bSpcActive);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bFirstPosSetOpt",     "Z"), compare.bFirstPosSetOpt);

	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcExactCompare",    "Z"), compare.bSpcExactCompare);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcFilteredCompare", "Z"), compare.bSpcFilteredCompare);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcExactFilter",     "Z"), compare.bSpcExactFilter);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bSpcMaxEdits",        "B"), compare.bSpcMaxEdits);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bSpcLengthOffset",    "B"), compare.bSpcLengthOffset);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bPosLo",              "B"), compare.bPosLo);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bPosHi",              "B"), compare.bPosHi);


	jobj_ppbActive = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ppbActive", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_POS; i++)
	{
		jobj_ppbActive_sub = (*env)->GetObjectArrayElement(env, jobj_ppbActive, i);
		SetByteObjectArray(env, jcls, jobj_ppbActive_sub, compare.ppbActive[i], ALDB_COMPARE_MAX_CODE_BYTES);
	}

	jobj_ppbExact = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ppbExact", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_POS; i++)
	{
		jobj_ppbExact_sub = (*env)->GetObjectArrayElement(env, jobj_ppbExact, i);
		SetByteObjectArray(env, jcls, jobj_ppbExact_sub, compare.ppbExact[i], ALDB_COMPARE_MAX_CODE_BYTES);
	}

// TODO:primitive_multi_array	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "pppbActiveSpc",       "B"), compare.pppbActiveSpc);

	jobj_ppbFreq = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ppbFreq", "[[B"));
	for(i = 0; i < ALDB_COMPARE_MAX_FREQ_POS; i++)
	{
		jobj_ppbFreq_sub = (*env)->GetObjectArrayElement(env, jobj_ppbFreq, i);
		SetByteObjectArray(env, jcls, jobj_ppbFreq_sub, compare.ppbFreq[i], ALDB_HEADER_MAX_CHAR_CODES);
	}

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbLocked", "[B")), compare.pbLocked, ALDB_COMPARE_MAX_POS);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALdbCursorData(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbCursorData pCursors)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwStartPos",         "I"), pCursors.dwStartPos);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwEndPos",           "I"), pCursors.dwEndPos);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwJumpPos",          "I"), pCursors.dwJumpPos);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwJumpAddress",      "I"), pCursors.dwJumpAddress);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwSourceDataStart",  "I"), pCursors.dwSourceDataStart);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwSourceDataLength", "I"), pCursors.dwSourceDataLength);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCode",              "S"), pCursors.wCode);

//#ifdef ET9_DIRECT_LDB_ACCESS
//	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "pbCurrData",         "B"), pCursors.pbCurrData);
//#else
	SetByteObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbCurrData", "[B")), pCursors.pbCurrData, 1);

	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwCurrCacheStart",   "I"), pCursors.dwCurrCacheStart);

	SetByteObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbCacheEnd", "[B")), pCursors.pbCacheEnd,1);

	SetByteObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbCache", "[B")), pCursors.pbCache, ALDB_CURSOR_DATA_CACHE_SIZE);
//#endif

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALdbSearchData(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbSearchData search)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "psTarget", "[S")), search.psTarget, 1);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pwLength", "[S")), search.pwLength, 1);

	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wTargetLength",        "S"), search.wTargetLength);

	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwCurrItem",           "I"), search.dwCurrItem);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bExhausted",           "Z"), search.bExhausted);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bCurrWordLength",      "B"), search.bCurrWordLength);
	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwWordLengthEndPos",   "I"), search.dwWordLengthEndPos);

	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcCompare",          "Z"), search.bSpcCompare);
	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwSpcControlEndPos",   "I"), search.dwSpcControlEndPos);
	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwRegNonMatchEndPos",  "I"), search.dwRegNonMatchEndPos);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bSpcNonZeroPos",       "B"), search.bSpcNonZeroPos);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bSpcControlPos",       "B"), search.bSpcControlPos);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bRegCmpLength",        "B"), search.bRegCmpLength);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbRegPosCurrOrder", "[B")), search.pbRegPosCurrOrder, ET9MAXLDBWORDSIZE);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALdb(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdb ALdb)
{
	int i;
	jclass cls;
	jobject jobj_header, jobj_compare, jobj_pCursors, jobj_search;
	jobject jobj_pCursors_sub;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	jobj_header = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "header",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbHeaderData;"));
	ET9_SetALdbHeaderData(env, jcls, &jobj_header, ALdb.header);

	jobj_compare = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "compare",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbCompareData;"));
	ET9_SetALdbCompareData(env, jcls, &jobj_compare, ALdb.compare);
// TODO:object array
/*
	jobj_pCursors = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pCursors",   "[Lcom/xt9/core/Xt9Datatype$S_ET9ALdbCursorData;"));
	for(i = 0; i < ET9MAXLDBWORDSIZE; i++)
	{
		jobj_pCursors_sub = (*env)->GetObjectArrayElement(env, jobj_pCursors, i);
		ET9_SetALdbCursorData(env, jcls, &jobj_pCursors_sub, ALdb->pCursors[i]);
	}
*/
	jobj_search = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "search",   "Lcom/xt9/core/Xt9Datatype$S_ET9ALdbSearchData;"));
	ET9_SetALdbSearchData(env, jcls, &jobj_search, ALdb.search);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetALDBAutoSub(JNIEnv *env, jclass jcls, jobject *jobj, ET9ALDBAutoSub sLDBAutoSub)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bSupported",           "B"), sLDBAutoSub.bSupported);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bLSASDBVersion",       "B"), sLDBAutoSub.bLSASDBVersion);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bLSASDBLangID",        "B"), sLDBAutoSub.bLSASDBLangID);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wNumEntries",          "S"), sLDBAutoSub.wNumEntries);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwLSASDBStartAddress", "I"), sLDBAutoSub.dwLSASDBStartAddress);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwLSASDBEndAddress",   "I"), sLDBAutoSub.dwLSASDBEndAddress);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetPrivWordInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWPrivWordInfo PrivWordInfo)
{
	jclass cls;
	jobject jobj_Base;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	jobj_Base = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "Base",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWWordInfo;"));
	ET9AW_SetWordInfo(env, jcls, &jobj_Base, PrivWordInfo.Base);

	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "nTotFreq",         "I"), PrivWordInfo.nTotFreq);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wWordFreq",        "S"), PrivWordInfo.wWordFreq);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wWordFreqIndex",   "S"), PrivWordInfo.wWordFreqIndex);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wTapFreq",         "S"), PrivWordInfo.wTapFreq);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bWordSrc",         "B"), PrivWordInfo.bWordSrc);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bWordQuality",     "B"), PrivWordInfo.bWordQuality);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bEditDistSpc",     "B"), PrivWordInfo.bEditDistSpc);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bEditDistStem",    "B"), PrivWordInfo.bEditDistStem);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bHasPrimEditDist", "Z"), PrivWordInfo.bHasPrimEditDist);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bIsUDBWord",       "Z"), PrivWordInfo.bIsUDBWord);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bIsGroupBase",     "Z"), PrivWordInfo.bIsGroupBase);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bGroupCount",      "B"), PrivWordInfo.bGroupCount);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bCDBTrigram",      "B"), PrivWordInfo.bCDBTrigram);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetASPCCompareData(JNIEnv *env, jclass jcls, jobject *jobj, ET9ASPCCompareData sCmpData)
{
	int i;
	jclass cls;
	jobject jobj_ppbFreqRowStore, jobj_ppbFreqRowStore_sub;
	jobject jobj_ppbCmpResultRowStore, jobj_ppbCmpResultRowStore_sub;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	jobj_ppbFreqRowStore = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ppbFreqRowStore", "[[B"));
	for(i = 0; i < ET9_SPC_ED_CALC_ROWS; i++)
	{
		jobj_ppbFreqRowStore_sub = (*env)->GetObjectArrayElement(env, jobj_ppbFreqRowStore, i);
		SetByteObjectArray(env, jcls, jobj_ppbFreqRowStore_sub, sCmpData.ppbFreqRowStore[i], ET9_SPC_ED_STORE_ROW_LEN);
	}

	jobj_ppbCmpResultRowStore = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ppbCmpResultRowStore", "[[B"));
	for(i = 0; i < ET9_SPC_ED_CALC_ROWS; i++)
	{
		jobj_ppbCmpResultRowStore_sub = (*env)->GetObjectArrayElement(env, jobj_ppbCmpResultRowStore, i);
		SetByteObjectArray(env, jcls, jobj_ppbCmpResultRowStore_sub, sCmpData.ppbCmpResultRowStore[i], ET9_SPC_ED_STORE_ROW_LEN);
	}

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9_SetASpc(JNIEnv *env, jclass jcls, jobject *jobj, ET9ASpc ASpc)
{
	jclass cls;
	jobject jobj_sCmpData;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "eMode",         "B"), ASpc.eMode);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wMaxSlstCount", "S"), ASpc.wMaxSlstCount);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "eSearchFilter", "B"), ASpc.eSearchFilter);

	jobj_sCmpData = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sCmpData",   "Lcom/xt9/core/Xt9Datatype$S_ET9ASPCCompareData;"));
	ET9_SetASPCCompareData(env, jcls, &jobj_sCmpData, ASpc.sCmpData);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetCaptureBuild(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWCaptureBuild pCaptures)
{
	jclass cls;

	if(env == NULL || jobj== NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bIsValid",     "B"), pCaptures.bIsValid);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wWordLen",     "S"), pCaptures.wWordLen);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wWordCompLen", "S"), pCaptures.wWordCompLen);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSymbolLen",   "S"), pCaptures.wSymbolLen);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sWord", "[C")), pCaptures.sWord, ET9MAXWORDSIZE);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetCaptureAction(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWCaptureAction pCaptureActions)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField(env, *jobj, (*env)->GetFieldID(env, cls, "bPop",             "B"), pCaptureActions.bPop);
	(*env)->SetByteField(env, *jobj, (*env)->GetFieldID(env, cls, "sbAddWordLen",     "B"), pCaptureActions.sbAddWordLen);
	(*env)->SetByteField(env, *jobj, (*env)->GetFieldID(env, cls, "sbAddWordCompLen", "B"), pCaptureActions.sbAddWordCompLen);
	(*env)->SetByteField(env, *jobj, (*env)->GetFieldID(env, cls, "bAddSymbolLen",    "B"), pCaptureActions.bAddSymbolLen);

	return ET9STATUS_NONE;
}


ET9STATUS ET9FARCALL ET9AW_SetBuildInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWBuildInfo sBuildInfo)
{
	int i;
	jclass cls;
	jobject jobj_pCaptures, jobj_pCaptures_sub;
	jobject jobj_pCaptureActions, jobj_pCaptureActions_sub;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bCurrCapture",        "B"), sBuildInfo.bCurrCapture);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bCaptureInvalidated", "B"), sBuildInfo.bCaptureInvalidated);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbFlushPos", "[B")), sBuildInfo.pbFlushPos, ET9MAXWORDSIZE);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbFlushLen", "[B")), sBuildInfo.pbFlushLen, ET9MAXWORDSIZE);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pwDefaultPos", "[S")), sBuildInfo.pwDefaultPos, ET9MAXWORDSIZE);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbDefaultLen", "[B")), sBuildInfo.pbDefaultLen, ET9MAXWORDSIZE);

	SetByteObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pbDefaultCompLen", "[B")), sBuildInfo.pbDefaultCompLen, ET9MAXWORDSIZE);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "psFlushedSymbs", "[S")), sBuildInfo.psFlushedSymbs, ET9MAXWORDSIZE);

	SetShortObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "psDefaultSymbs", "[S")), sBuildInfo.psDefaultSymbs, ET9DEFAULTSTORESIZE);

	SetByteObjectArray(env, jcls,
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bLanguageSource", "[B")), sBuildInfo.bLanguageSource, ET9MAXWORDSIZE);

// TODO:object array
//SJKO_TEST
/*
	jobj_pCaptures = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pCaptures",   "[Lcom/xt9/core/Xt9Datatype$S_ET9AWCaptureBuild;"));

	for(i = 0; i < ET9MAXBUILDCAPTURES; i++)
	{
		jobj_pCaptures_sub = (*env)->GetObjectArrayElement(env, jobj_pCaptures, i);
		ET9AW_SetCaptureBuild(env, jcls, &jobj_pCaptures_sub, sBuildInfo.pCaptures[i]);
	}
*/

// TODO:object array
/*
	jobj_pCaptureActions = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pCaptureActions",   "[Lcom/xt9/core/Xt9Datatype$S_ET9AWCaptureAction;"));

	for(i = 0; i < ET9MAXWORDSIZE; i++)
	{
		jobj_pCaptureActions_sub = (*env)->GetObjectArrayElement(env, jobj_pCaptureActions, i);
		ET9AW_SetCaptureAction(env, jcls, &jobj_pCaptureActions_sub, sBuildInfo.pCaptureActions[i]);
	}
*/
	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetLingCmnPrivate(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingCmnPrivate Private)
{
	jclass cls;
	jobject jobj_ALdb, jobj_sLDBAutoSub, jobj_pWordList, jobj_ASpc, jobj_sBuildInfo,
		jobj_LeftHandWord, jobj_pLastWord, jobj_pLastSpcWord, jobj_pLastCompletionWord;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pUDBGetEntry", "[B")), Private.pUDBGetEntry, 1);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pASDBGetEntry", "[B")), Private.pASDBGetEntry, 1);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLdbASGetEntryRec",        "S"), Private.wLdbASGetEntryRec);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bTotalExpTermPuncts",      "B"), Private.bTotalExpTermPuncts);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sExpTermPuncts", "[S")), Private.sExpTermPuncts, ET9MAX_EXP_TERM_PUNCTS);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "sExpEmbeddedPunct",        "S"), Private.sExpEmbeddedPunct);

	jobj_ALdb = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ALdb", "Lcom/xt9/core/Xt9Datatype$S_ET9ALdb;"));
	ET9_SetALdb(env, jcls, &jobj_ALdb, Private.ALdb);

	jobj_sLDBAutoSub = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sLDBAutoSub", "Lcom/xt9/core/Xt9Datatype$S_ET9ALDBAutoSub;"));
	ET9_SetALDBAutoSub(env, jcls, &jobj_sLDBAutoSub, Private.sLDBAutoSub);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wPreviousWordLanguage",    "S"), Private.wPreviousWordLanguage);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bListSize",                "B"), Private.bListSize);

	jobj_pWordList = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pWordList", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_SetPrivWordInfo(env, jcls, &jobj_pWordList, *Private.pWordList);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bWordList", "[B")), Private.bWordList, ET9MAXSELLISTSIZE);


	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bDefaultIndex",            "B"), Private.bDefaultIndex);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bExactIndex",              "B"), Private.bExactIndex);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bContextWordSize",         "B"), Private.bContextWordSize);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "bPreviousContextWordSize", "B"), Private.bPreviousContextWordSize);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sContextWord", "[S")), Private.sContextWord, ET9MAXWORDSIZE);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sPreviousContextWord", "[S")), Private.sPreviousContextWord, ET9MAXWORDSIZE);

	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "eSelectionListMode",       "B"), Private.eSelectionListMode);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wWordStemsPoint",          "S"), Private.wWordStemsPoint);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wWordCompletionPoint",     "S"), Private.wWordCompletionPoint);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wMaxCompletionCount",      "S"), Private.wMaxCompletionCount);

	jobj_ASpc = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "ASpc", "Lcom/xt9/core/Xt9Datatype$S_ET9ASpc;"));
	ET9_SetASpc(env, jcls, &jobj_ASpc, Private.ASpc);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCurrBuildLang",           "S"), Private.wCurrBuildLang);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCurrBuildSecondLanguage", "S"), Private.wCurrBuildSecondLanguage);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wCurrLockPoint",           "S"), Private.wCurrLockPoint);
	(*env)->SetByteField (env, *jobj, (*env)->GetFieldID(env, cls, "eCurrSelectionListMode",   "B"), Private.eCurrSelectionListMode);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bLastBuildLen",          "B"), Private.bLastBuildLen);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bLastBuildShrinking",    "Z"), Private.bLastBuildShrinking);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bTotalSymbInputs",       "B"), Private.bTotalSymbInputs);

	jobj_sBuildInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sBuildInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWBuildInfo;"));
	ET9AW_SetBuildInfo(env, jcls, &jobj_sBuildInfo, Private.sBuildInfo);

	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwStateBits",             "I"), Private.dwStateBits);
	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "dwDevStateBits",          "I"), Private.dwDevStateBits);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bRequiredFound",          "Z"), Private.bRequiredFound);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bSpcDuringBuild",         "Z"), Private.bSpcDuringBuild);
	(*env)->SetIntField    (env, *jobj, (*env)->GetFieldID(env, cls, "snLinSearchCount",        "I"), Private.snLinSearchCount);
	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bHasRealWord",            "Z"), Private.bHasRealWord);	

	jobj_LeftHandWord = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "LeftHandWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_SetPrivWordInfo(env, jcls, &jobj_LeftHandWord, Private.LeftHandWord);

	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bStemsAllowed",           "Z"), Private.bStemsAllowed);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wMaxWordLength",          "S"), Private.wMaxWordLength);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wTotalWordInserts",       "S"), Private.wTotalWordInserts);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bTotalWords",             "B"), Private.bTotalWords);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bTotalSpcWords",          "B"), Private.bTotalSpcWords);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bTotalCompletionWords",   "B"), Private.bTotalCompletionWords);

	jobj_pLastWord = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pLastWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_SetPrivWordInfo(env, jcls, &jobj_pLastWord, *Private.pLastWord);

	jobj_pLastSpcWord = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pLastSpcWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_SetPrivWordInfo(env, jcls, &jobj_pLastSpcWord, *Private.pLastSpcWord);

	jobj_pLastCompletionWord = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pLastCompletionWord", "Lcom/xt9/core/Xt9Datatype$S_ET9AWPrivWordInfo;"));
	ET9AW_SetPrivWordInfo(env, jcls, &jobj_pLastCompletionWord, *Private.pLastCompletionWord);

	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bPrimaryFence",           "B"), Private.bPrimaryFence);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bPrimaryFence",           "B"), Private.bPrimaryFence);

	SetByteObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "bLangSupported", "[B")), Private.bLangSupported, ET9MAXWORDSIZE);


//#ifdef ET9_ACTIVATE_SLST_STATS
/*
    struct ET9AWSlstStats_s
    {
        ET9U32              dwBuildCount;
        ET9U32              dwInsertCount;
        ET9U32              dwTotInsertCount;
        ET9U32              dwTotInsertDiscarded;
        ET9U32              dwTotInsertReplacing;
        ET9U32              dwTotInsertDuplicate;
        ET9U32              dwMaxListInserts;

        ET9U32              dwBuildCountAcc;
        ET9U32              dwInsertCountAcc;
        ET9U32              dwTotInsertCountAcc;
        ET9U32              dwTotInsertDiscardedAcc;
        ET9U32              dwTotInsertReplacingAcc;
        ET9U32              dwTotInsertDuplicateAcc;
        ET9U32              dwMaxListInsertsAcc;
    } sStats;
*/
//#endif

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetLingCmnInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingCmnInfo pLingCmnInfo)
{
	jclass cls;
	jobject jobj_Base, jobj_pRUDBInfo, jobj_pCDBInfo, jobj_pASDBInfo, jobj_Private;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	jobj_Base = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "Base",   "Lcom/xt9/core/Xt9Datatype$S_ET9BaseLingInfo;"));
	ET9_SetBaseLingInfo(env, jcls, &jobj_Base, pLingCmnInfo.Base);
	
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwStateBits",   "I"), pLingCmnInfo.dwStateBits);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLdbNum",       "S"), pLingCmnInfo.dwLdbNum);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wFirstLdbNum",  "S"), pLingCmnInfo.dwFirstLdbNum);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSecondLdbNum", "S"), pLingCmnInfo.dwSecondLdbNum);

	jobj_pRUDBInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pRUDBInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWRUDBInfo;"));
	ET9AW_SetRUDBInfo(env, jcls, &jobj_pRUDBInfo, *pLingCmnInfo.pRUDBInfo);

	jobj_pCDBInfo  = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pCDBInfo",  "Lcom/xt9/core/Xt9Datatype$S_ET9AWCDBInfo;"));
	ET9AW_SetCDBInfo(env, jcls, &jobj_pCDBInfo, *pLingCmnInfo.pCDBInfo);

	jobj_pASDBInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pASDBInfo", "Lcom/xt9/core/Xt9Datatype$S_ET9AWASDBInfo;"));
	ET9AW_SetASDBInfo(env, jcls, &jobj_pASDBInfo, *pLingCmnInfo.pASDBInfo);

	jobj_Private   = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingComPrivate;"));
	ET9AW_SetLingCmnPrivate(env, jcls, &jobj_Private, pLingCmnInfo.Private);

	return ET9STATUS_NONE;
}


ET9STATUS ET9FARCALL ET9AW_SetLingPrivate(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingPrivate Private)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

// TODO:callback    ET9CONVERTSYMBCALLBACK  pConvertSymb;
// TODO:voidp    void                   *pConvertSymbInfo;

//#ifdef ET9_DIRECT_LDB_ACCESS
//    struct
//    {
//        ET9U8  ET9FARDATA   *pLdbData;              /**< pointer to a byte array holding the whole LDB */
//        ET9U32              dwLdbDataSize;          /**< size of the whole LDB */
//    } ALdb;
//#endif /* ET9_DIRECT_LDB_ACCESS */

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wInfoInitOK", "S"), Private.wInfoInitOK);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLDBInitOK",  "S"), Private.wLDBInitOK);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AW_SetLingInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingInfo pLingInfo)
{
	jclass cls;
	jobject jobj_sMDBInfo, jobj_pLingCmnInfo, jobj_Private;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	cls = (*env)->GetObjectClass(env, *jobj);

	// TODO:voidp pLingInfo.pPublicExtension

	jobj_sMDBInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sMDBInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWMDBInfo;"));
	ET9AW_SetMDBInfo(env, jcls, &jobj_sMDBInfo, pLingInfo.sMDBInfo);

	// TODO:callback pLingInfo.ET9AWLdbReadData
	// TODO:callback pLingInfo.pRUDBWriteData
	// TODO:callback pLingInfo.pCDBWriteData
	// TODO:callback pLingInfo.pASDBWriteData

	jobj_pLingCmnInfo = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "pLingCmnInfo",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingCmnInfo;"));
	ET9AW_SetLingCmnInfo(env, jcls, &jobj_pLingCmnInfo, *pLingInfo.pLingCmnInfo);

	jobj_Private = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWLingPrivate;"));
	ET9AW_SetLingPrivate(env, jcls, &jobj_Private, pLingInfo.Private);

	return ET9STATUS_NONE;
}
#endif // ET9_FULL_INTERFACE

#ifdef ET9_LITE_INTERFACE
ET9STATUS ET9FARCALL ET9AW_SetWordInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWWordInfo Base)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;
	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wWordLen",         "S"), Base.wWordLen);
//	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wWordCompLen",     "S"), Base.wWordCompLen);
	(*env)->SetShortField  (env, *jobj, (*env)->GetFieldID(env, cls, "wSubstitutionLen", "S"), Base.wSubstitutionLen);
//	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bIsTerm",          "Z"), Base.bIsTerm);
//	(*env)->SetBooleanField(env, *jobj, (*env)->GetFieldID(env, cls, "bIsSpellCorr",     "Z"), Base.bIsSpellCorr);
	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bWordSource",      "B"), Base.bWordSource);
//	(*env)->SetByteField   (env, *jobj, (*env)->GetFieldID(env, cls, "bLangIndex",       "B"), Base.bLangIndex);

	(*env)->SetShortField   (env, *jobj, (*env)->GetFieldID(env, cls, "wContextKillLen",      "S"), Base.wContextKillLen);

	(*env)->SetShortField   (env, *jobj, (*env)->GetFieldID(env, cls, "wContextReplaceLen",      "S"), Base.wContextReplaceLen);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sWord", "[S")), Base.sWord, ET9MAXWORDSIZE);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sSubstitution", "[S")), Base.sSubstitution, ET9MAXSUBSTITUTIONSIZE);

	return ET9STATUS_NONE;
}
#endif // ET9_LITE_INTERFACE

 /*---------------------------------------------------------------------------*/
 /**
  * @disassemble tone cobined chracters
  *
  * @param[in]       psInBuf           Pointer to source.
  * @param[in]       dwInBufLen        Length of source.
  * @param[in]       dwWordStart       The index of the first character of the word. (the word being reselected).
  * @param[in]       wWordLen          The number of chars in the word.

  * @param[out]      psOutBuf          Pointer to destination.
  * @param[in, out]  pwOutBufLen       Pointer to Max Length of destination buffer / returns length of output buffer.
  * @param[out]      pdwOutWordStart   The index of the first character of the destination word.
  * @param[out]      pwOutWordLen      The number of chars in the destination word.
  *
  */

void Util_VietDisassembleTone(ET9SYMB      * const psInBuf,
                              ET9U32         const dwInBufLen,
                              ET9U32         const dwWordStart,
                              ET9U16         const wWordLen,
                              ET9SYMB      * const psOutBuf,
                              ET9U32       * const pwOutBufLen,
                              ET9U32       * const pdwOutWordStart,
                              ET9U16       * const pwOutWordLen)
{
    ET9U32 dwInBufCnt, dwOutBufCnt, dwStartPos;
    ET9U16 wOutWordLenCnt;
    ET9BOOL bBeforWord = TRUE, bAfterWord = FALSE;

    dwStartPos = dwWordStart;
    wOutWordLenCnt = wWordLen;

    for (dwInBufCnt = 0, dwOutBufCnt = 0; dwInBufCnt < dwInBufLen; ++dwInBufCnt, ++dwOutBufCnt) {

        if (dwOutBufCnt > (*pwOutBufLen-3))
            break;

        if (dwInBufCnt == dwWordStart)
            bBeforWord = FALSE;

        if (dwInBufCnt >= (dwWordStart + wWordLen))
            bAfterWord = TRUE;

        psOutBuf[dwOutBufCnt] = psInBuf[dwInBufCnt];

        switch (psOutBuf[dwOutBufCnt])
        {
            case 0x00C0:
                psOutBuf[dwOutBufCnt] = 0x41;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00C1:
                psOutBuf[dwOutBufCnt] = 0x41;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00C3:
                psOutBuf[dwOutBufCnt] = 0x41;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA2:
                psOutBuf[dwOutBufCnt] = 0x41;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA0:
                psOutBuf[dwOutBufCnt] = 0x41;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00C8:
                psOutBuf[dwOutBufCnt] = 0x45;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00C9:
                psOutBuf[dwOutBufCnt] = 0x45;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBC:
                psOutBuf[dwOutBufCnt] = 0x45;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBA:
                psOutBuf[dwOutBufCnt] = 0x45;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB8:
                psOutBuf[dwOutBufCnt] = 0x45;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00CC:
                psOutBuf[dwOutBufCnt] = 0x49;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00CD:
                psOutBuf[dwOutBufCnt] = 0x49;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x0128:
                psOutBuf[dwOutBufCnt] = 0x49;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC8:
                psOutBuf[dwOutBufCnt] = 0x49;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECA:
                psOutBuf[dwOutBufCnt] = 0x49;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00D2:
                psOutBuf[dwOutBufCnt] = 0x4F;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00D3:
                psOutBuf[dwOutBufCnt] = 0x4F;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00D5:
                psOutBuf[dwOutBufCnt] = 0x4F;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECE:
                psOutBuf[dwOutBufCnt] = 0x4F;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECC:
                psOutBuf[dwOutBufCnt] = 0x4F;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00D9:
                psOutBuf[dwOutBufCnt] = 0x55;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00DA:
                psOutBuf[dwOutBufCnt] = 0x55;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x0168:
                psOutBuf[dwOutBufCnt] = 0x55;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE6:
                psOutBuf[dwOutBufCnt] = 0x55;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE4:
                psOutBuf[dwOutBufCnt] = 0x55;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EF2:
                psOutBuf[dwOutBufCnt] = 0x59;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00DD:
                psOutBuf[dwOutBufCnt] = 0x59;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF8:
                psOutBuf[dwOutBufCnt] = 0x59;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF6:
                psOutBuf[dwOutBufCnt] = 0x59;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF4:
                psOutBuf[dwOutBufCnt] = 0x59;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00E0:
                psOutBuf[dwOutBufCnt] = 0x61;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00E1:
                psOutBuf[dwOutBufCnt] = 0x61;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00E3:
                psOutBuf[dwOutBufCnt] = 0x61;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA3:
                psOutBuf[dwOutBufCnt] = 0x61;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA1:
                psOutBuf[dwOutBufCnt] = 0x61;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00E8:
                psOutBuf[dwOutBufCnt] = 0x65;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00E9:
                psOutBuf[dwOutBufCnt] = 0x65;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBD:
                psOutBuf[dwOutBufCnt] = 0x65;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBB:
                psOutBuf[dwOutBufCnt] = 0x65;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB9:
                psOutBuf[dwOutBufCnt] = 0x65;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00EC:
                psOutBuf[dwOutBufCnt] = 0x69;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00ED:
                psOutBuf[dwOutBufCnt] = 0x69;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x0129:
                psOutBuf[dwOutBufCnt] = 0x69;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC9:
                psOutBuf[dwOutBufCnt] = 0x69;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECB:
                psOutBuf[dwOutBufCnt] = 0x69;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00F2:
                psOutBuf[dwOutBufCnt] = 0x6F;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00F3:
                psOutBuf[dwOutBufCnt] = 0x6F;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00F5:
                psOutBuf[dwOutBufCnt] = 0x6F;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECF:
                psOutBuf[dwOutBufCnt] = 0x6F;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ECD:
                psOutBuf[dwOutBufCnt] = 0x6F;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x00F9:
                psOutBuf[dwOutBufCnt] = 0x75;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00FA:
                psOutBuf[dwOutBufCnt] = 0x75;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x0169:
                psOutBuf[dwOutBufCnt] = 0x75;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE7:
                psOutBuf[dwOutBufCnt] = 0x75;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE5:
                psOutBuf[dwOutBufCnt] = 0x75;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EF3:
                psOutBuf[dwOutBufCnt] = 0x79;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x00FD:
                psOutBuf[dwOutBufCnt] = 0x79;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF9:
                psOutBuf[dwOutBufCnt] = 0x79;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF7:
                psOutBuf[dwOutBufCnt] = 0x79;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF5:
                psOutBuf[dwOutBufCnt] = 0x79;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EA6:
                psOutBuf[dwOutBufCnt] = 0xC2;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA4:
                psOutBuf[dwOutBufCnt] = 0xC2;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAA:
                psOutBuf[dwOutBufCnt] = 0xC2;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA8:
                psOutBuf[dwOutBufCnt] = 0xC2;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAC:
                psOutBuf[dwOutBufCnt] = 0xC2;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EC0:
                psOutBuf[dwOutBufCnt] = 0xCA;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBE:
                psOutBuf[dwOutBufCnt] = 0xCA;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC4:
                psOutBuf[dwOutBufCnt] = 0xCA;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC2:
                psOutBuf[dwOutBufCnt] = 0xCA;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC6:
                psOutBuf[dwOutBufCnt] = 0xCA;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EA7:
                psOutBuf[dwOutBufCnt] = 0xE2;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA5:
                psOutBuf[dwOutBufCnt] = 0xE2;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAB:
                psOutBuf[dwOutBufCnt] = 0xE2;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EA9:
                psOutBuf[dwOutBufCnt] = 0xE2;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAD:
                psOutBuf[dwOutBufCnt] = 0xE2;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EC1:
                psOutBuf[dwOutBufCnt] = 0xEA;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EBF:
                psOutBuf[dwOutBufCnt] = 0xEA;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC5:
                psOutBuf[dwOutBufCnt] = 0xEA;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC3:
                psOutBuf[dwOutBufCnt] = 0xEA;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EC7:
                psOutBuf[dwOutBufCnt] = 0xEA;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1ED2:
                psOutBuf[dwOutBufCnt] = 0xD4;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED0:
                psOutBuf[dwOutBufCnt] = 0xD4;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED6:
                psOutBuf[dwOutBufCnt] = 0xD4;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED4:
                psOutBuf[dwOutBufCnt] = 0xD4;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED8:
                psOutBuf[dwOutBufCnt] = 0xD4;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1ED3:
                psOutBuf[dwOutBufCnt] = 0xF4;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED1:
                psOutBuf[dwOutBufCnt] = 0xF4;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED7:
                psOutBuf[dwOutBufCnt] = 0xF4;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED5:
                psOutBuf[dwOutBufCnt] = 0xF4;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1ED9:
                psOutBuf[dwOutBufCnt] = 0xF4;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EB0:
                psOutBuf[dwOutBufCnt] = 0x102;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAE:
                psOutBuf[dwOutBufCnt] = 0x102;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB4:
                psOutBuf[dwOutBufCnt] = 0x102;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB2:
                psOutBuf[dwOutBufCnt] = 0x102;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB6:
                psOutBuf[dwOutBufCnt] = 0x102;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EB1:
                psOutBuf[dwOutBufCnt] = 0x103;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EAF:
                psOutBuf[dwOutBufCnt] = 0x103;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB5:
                psOutBuf[dwOutBufCnt] = 0x103;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB3:
                psOutBuf[dwOutBufCnt] = 0x103;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EB7:
                psOutBuf[dwOutBufCnt] = 0x103;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EDC:
                psOutBuf[dwOutBufCnt] = 0x1A0;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EDA:
                psOutBuf[dwOutBufCnt] = 0x1A0;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE0:
                psOutBuf[dwOutBufCnt] = 0x1A0;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EDE:
                psOutBuf[dwOutBufCnt] = 0x1A0;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE2:
                psOutBuf[dwOutBufCnt] = 0x1A0;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EDD:
                psOutBuf[dwOutBufCnt] = 0x1A1;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EDB:
                psOutBuf[dwOutBufCnt] = 0x1A1;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE1:
                psOutBuf[dwOutBufCnt] = 0x1A1;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EDF:
                psOutBuf[dwOutBufCnt] = 0x1A1;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE3:
                psOutBuf[dwOutBufCnt] = 0x1A1;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EEA:
                psOutBuf[dwOutBufCnt] = 0x1AF;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE8:
                psOutBuf[dwOutBufCnt] = 0x1AF;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EEE:
                psOutBuf[dwOutBufCnt] = 0x1AF;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EEC:
                psOutBuf[dwOutBufCnt] = 0x1AF;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF0:
                psOutBuf[dwOutBufCnt] = 0x1AF;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;

            case 0x1EEB:
                psOutBuf[dwOutBufCnt] = 0x1B0;
                psOutBuf[++dwOutBufCnt] = 0x0300;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EE9:
                psOutBuf[dwOutBufCnt] = 0x1B0;
                psOutBuf[++dwOutBufCnt] = 0x0301;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EEF:
                psOutBuf[dwOutBufCnt] = 0x1B0;
                psOutBuf[++dwOutBufCnt] = 0x0303;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EED:
                psOutBuf[dwOutBufCnt] = 0x1B0;
                psOutBuf[++dwOutBufCnt] = 0x0309;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            case 0x1EF1:
                psOutBuf[dwOutBufCnt] = 0x1B0;
                psOutBuf[++dwOutBufCnt] = 0x0323;
                if (bBeforWord)
                    ++dwStartPos;
                else if (!bAfterWord)
                    ++wOutWordLenCnt;
                break;
            default :
                break;
        }
    }

    psOutBuf[dwOutBufCnt] = 0;

    if (pwOutBufLen) {
        *pwOutBufLen = dwOutBufCnt;
    }

    if (pdwOutWordStart) {
        *pdwOutWordStart = dwStartPos;
    }

    if (pwOutWordLen) {
        *pwOutWordLen = wOutWordLenCnt;
    }

}

ET9BOOL IsVietnameseTone(ET9WordSymbInfo * const pWordSymbInfo, ET9U16 symIndex, ET9SYMB * const pSymb)
{
    ET9SymbInfo *pSymbInfo = &pWordSymbInfo->SymbsInfo[symIndex];
    *pSymb = _ET9Symb_LowerChar(pSymbInfo, 0, 0);

    switch (*pSymb) {
    case 0x0300:
    case 0x0301:
	case 0x0303:
    case 0x0309:
    case 0x0323:
        return 1;
    }

    return 0;
}

ET9BOOL IsVietnameseToneAllowed(ET9WordSymbInfo * const pWordSymbInfo,
                                       ET9U16            const symIndex,
                                       ET9BOOL         * const isTone,
                                       ET9SYMB         * const pSymb)
{
    if (IsVietnameseTone(pWordSymbInfo, symIndex, pSymb)) {
        *isTone = TRUE;
        return 1;
    }

    *isTone = FALSE;

    switch (*pSymb) {

    case 0x0061:
    case 0x0103:
    case 0x00E2:
    case 0x0065:
    case 0x00EA:
    case 0x0069:
    case 0x006F:
    case 0x00F4:
    case 0x01A1:
    case 0x0075:
    case 0x0079:
    case 0x01B0:

        return 1;
    }

    return 0;
}



#endif // ET9_ALPHABETIC_MODULE

