// WbData.cpp
//
// static data & search routines for Korean Word Breaker
//
// Copyright 2000 Microsoft Corp.
//
// Modification History:
//  02 JUN 2000   bhshin    added IsOneJosaContentRec helper
//  20 APR 2000	  bhshin	created

#include "StdAfx.h"
#include "KorWbrk.h"
#include "WbData.h"
#include "unikor.h"

////////////////////////////////////////////////////////////////////////////////
// Function for binary search

int BinarySearchForWCHAR(const WCHAR *pwchrgTable, int crgTable, WCHAR wchSearch)
{
	int iLeft, iRight, iMiddle;
	int nComp;
	
	iLeft = 0;
	iRight = crgTable;

	while (iLeft <= iRight) 
	{
		iMiddle = (iLeft + iRight) >> 1;
		
		nComp = pwchrgTable[iMiddle] - wchSearch;

		if (nComp < 0) 
		{
			iLeft = iMiddle + 1;
		}
		else
		{
			if (nComp == 0) 
				return iMiddle; // found
			else if (nComp > 0) 
				iRight = iMiddle - 1;
		}
	}	

	return -1; // not found
}

////////////////////////////////////////////////////////////////////////////////
// One Josa Content Word (sorted list)

static const WCHAR wchrgOneJosaContent[] = {
	0xAC00, // °¡
	0xAC01, // °¢
	0xAC04, // °£
	0xAC10, // °¨
	0xAC1C, // °³
	0xAC1D, // °´
	0xAC74, // °Ç
	0xAC8C, // °Ô
	0xACBD, // °æ
	0xACC4, // °è
	0xACE0, // °í
	0xACF5, // °ø
	0xACF6, // °ù
	0xACFC, // °ú
	0xAD00, // °ü
	0xAD11, // ±¤
	0xAD6C, // ±¸
	0xAD6D, // ±¹
	0xAD70, // ±º
	0xAD8C, // ±Ç
	0xAE30, // ±â
	0xAE38, // ±æ
	0xAE54, // ±ò
	0xAECF, // ²¯
	0xAED8, // ²²
	0xAF34, // ²Ã
	0xAFBC, // ²Û
	0xB098, // ³ª
	0xB0B4, // ³»
	0xB124, // ³×
	0xB140, // ³à
	0xB144, // ³â
	0xB2E8, // ´Ü
	0xB2F4, // ´ã
	0xB2F9, // ´ç
	0xB300, // ´ë
	0xB301, // ´ì
	0xB370, // µ¥
	0xB3C4, // µµ
	0xB3D9, // µ¿
	0xB780, // ¶õ
	0xB791, // ¶û
	0xB825, // ·Â
	0xB839, // ·É
	0xB85C, // ·Î
	0xB85D, // ·Ï
	0xB860, // ·Ð
	0xB8CC, // ·á
	0xB8E8, // ·ç
	0xB958, // ·ù
	0xB960, // ·ü
	0xB9AC, // ¸®
	0xB9BC, // ¸²
	0xB9C9, // ¸·
	0xB9CC, // ¸¸
	0xB9DD, // ¸Á
	0xB9E1, // ¸Ã
	0xB9E4, // ¸Å
	0xBA74, // ¸é
	0xBA85, // ¸í
	0xBAA8, // ¸ð
	0xBB38, // ¹®
	0xBB3C, // ¹°
	0xBBFC, // ¹Î
	0xBC18, // ¹Ý
	0xBC1C, // ¹ß
	0xBC29, // ¹æ
	0xBC30, // ¹è
	0xBC31, // ¹é
	0xBC94, // ¹ü
	0xBC95, // ¹ý
	0xBCC4, // º°
	0xBCF4, // º¸
	0xBCF5, // º¹
	0xBD80, // ºÎ
	0xBD84, // ºÐ
	0xBE44, // ºñ
	0xBED8, // »¹
	0xC0AC, // »ç
	0xC0B0, // »ê
	0xC0C1, // »ó
	0xC0C8, // »õ
	0xC0DD, // »ý
	0xC11D, // ¼®
	0xC120, // ¼±
	0xC124, // ¼³
	0xC131, // ¼º
	0xC18C, // ¼Ò
	0xC190, // ¼Õ
	0xC218, // ¼ö
	0xC21C, // ¼ø
	0xC220, // ¼ú
	0xC2DC, // ½Ã
	0xC2DD, // ½Ä
	0xC2E4, // ½Ç
	0xC2EC, // ½É
	0xC528, // ¾¾
	0xC529, // ¾¿
	0xC544, // ¾Æ
	0xC548, // ¾È
	0xC554, // ¾Ï
	0xC560, // ¾Ö
	0xC561, // ¾×
	0xC591, // ¾ç
	0xC5B4, // ¾î
	0xC5C5, // ¾÷
	0xC5EC, // ¿©
	0xC624, // ¿À
	0xC625, // ¿Á
	0xC639, // ¿Ë
	0xC655, // ¿Õ
	0xC694, // ¿ä
	0xC695, // ¿å
	0xC6A9, // ¿ë
	0xC6D0, // ¿ø
	0xC728, // À²
	0xC774, // ÀÌ
	0xC778, // ÀÎ
	0xC77C, // ÀÏ
	0xC784, // ÀÓ
	0xC790, // ÀÚ
	0xC791, // ÀÛ
	0xC7A5, // Àå
	0xC7AC, // Àç
	0xC801, // Àû
	0xC804, // Àü
	0xC810, // Á¡
	0xC815, // Á¤
	0xC81C, // Á¦
	0xC870, // Á¶
	0xC871, // Á·
	0xC885, // Á¾
	0xC88C, // ÁÂ
	0xC8FC, // ÁÖ
	0xC99D, // Áõ
	0xC9C0, // Áö
	0xC9C4, // Áø
	0xC9C8, // Áú
	0xC9D1, // Áý
	0xC9DD, // Â¦
	0xC9F8, // Â°
	0xCB5D, // Âä
	0xCBE4, // Âë
	0xCC3D, // Ã¢
	0xCC44, // Ã¤
	0xCC45, // Ã¥
	0xCC98, // Ã³
	0xCC9C, // Ãµ
	0xCCA0, // Ã¶
	0xCCA9, // Ã¸
	0xCCAD, // Ã»
	0xCCB4, // Ã¼
	0xCD0C, // ÃÌ
	0xCE21, // Ãø
	0xCE35, // Ãþ
	0xCE58, // Ä¡
	0xD0D5, // ÅÁ
	0xD1B5, // Åë
	0xD30C, // ÆÄ
	0xD310, // ÆÇ
	0xD488, // Ç°
	0xD48D, // Ç³
	0xD544, // ÇÊ
	0xD559, // ÇÐ
	0xD560, // ÇÒ
	0xD56D, // Ç×
	0xD574, // ÇØ
	0xD589, // Çà
	0xD615, // Çü
	0xD638, // È£
	0xD654, // È­
	0xD68C, // È¸
};

BOOL IsOneJosaContent(WCHAR wchInput)
{
	int cOneJosaContent = sizeof(wchrgOneJosaContent)/sizeof(wchrgOneJosaContent[0]);
	
	if (BinarySearchForWCHAR(wchrgOneJosaContent, cOneJosaContent, wchInput) == -1)
		return FALSE;
	else
		return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
// One Josa Content Word (sorted list)

static const WCHAR wchrgNoPrefix[] = {
	0xAC00, // °¡
	0xACE0, // °í
	0xACFC, // °ú
	0xAD6C, // ±¸
	0xAE09, // ±Þ
	0xB0A8, // ³²
	0xB2E4, // ´Ù
	0xB300, // ´ë
	0xBB34, // ¹«
	0xBBF8, // ¹Ì
	0xBC18, // ¹Ý
	0xBC31, // ¹é
	0xBC94, // ¹ü
	0xBCF8, // º»
	0xBD80, // ºÎ
	0xBD88, // ºÒ
	0xBE44, // ºñ
	0xC0DD, // »ý
	0xC120, // ¼±
	0xC131, // ¼º
	0xC18C, // ¼Ò
	0xC18D, // ¼Ó
	0xC591, // ¾ç
	0xC5EC, // ¿©
	0xC5ED, // ¿ª
	0xC5F0, // ¿¬
	0xC655, // ¿Õ
	0xC694, // ¿ä
	0xC6D0, // ¿ø
	0xC7AC, // Àç
	0xC800, // Àú
	0xC8FC, // ÁÖ
	0xC900, // ÁØ
	0xC904, // ÁÙ
	0xC911, // Áß
	0xC9DD, // Â¦
	0xCD08, // ÃÊ
	0xCD1D, // ÃÑ
	0xCD5C, // ÃÖ
	0xCE5C, // Ä£
	0xD070, // Å«
	0xD0C8, // Å»
	0xD1B5, // Åë
	0xD53C, // ÇÇ
	0xD55C, // ÇÑ
	0xD587, // ÇÞ
	0xD5DB, // Çê
	0xD638, // È£
};

BOOL IsNoPrefix(WCHAR wchInput)
{
	int cNoPrefix = sizeof(wchrgNoPrefix)/sizeof(wchrgNoPrefix[0]);
	
	if (BinarySearchForWCHAR(wchrgNoPrefix, cNoPrefix, wchInput) == -1)
		return FALSE;
	else
		return TRUE;
}



