зеркало из https://github.com/mozilla/gecko-dev.git
81 строка
2.5 KiB
C
81 строка
2.5 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/* autokr.c */
|
|
|
|
#include "intlpriv.h"
|
|
#include "xp.h"
|
|
#include "libi18n.h"
|
|
|
|
MODULE_PRIVATE int16 intl_detect_KCSID( uint16 defaultCSID, const unsigned char *buf, int32 len )
|
|
{
|
|
register const unsigned char *cp = buf;
|
|
/* CS_2022_KR is 7bit. Scan to end of 7bit data or legitimate KOREAN ESC sequence. */
|
|
while( len && !( *cp & 0x80 ) ){
|
|
/* CS_2022_KR ESC $ ) C */
|
|
if(( cp[0] == ESC && len > 3 && ( cp[1] == '$' && cp[2] == ')' && cp[3] == 'C' ) ) ||
|
|
(SI == *cp) || (SO == *cp) )
|
|
return CS_2022_KR;
|
|
cp++, len--;
|
|
}
|
|
|
|
if( len > 0 ) return CS_KSC_8BIT; /* it is not Roman */
|
|
|
|
return CS_ASCII; /* Could be any of the 3... */
|
|
}
|
|
|
|
|
|
|
|
/* Auto Detect Korean Char Code Conversion : jliu */
|
|
MODULE_PRIVATE unsigned char *
|
|
autoKCCC (CCCDataObject obj, const unsigned char *s, int32 l)
|
|
{
|
|
int16 doc_csid = 0;
|
|
|
|
/* Use 1st stream data block to guess doc Korean CSID. */
|
|
doc_csid = intl_detect_KCSID (INTL_GetCCCDefaultCSID(obj),(const unsigned char *) s, l);
|
|
|
|
if( doc_csid == CS_ASCII ){ /* return s unconverted and */
|
|
INTL_SetCCCLen(obj, l);
|
|
return (unsigned char *)s; /* autodetect next block of stream data */
|
|
}
|
|
|
|
/* Setup converter function for success streams data blocks */
|
|
|
|
(void)INTL_GetCharCodeConverter( doc_csid, INTL_GetCCCToCSID(obj), obj );
|
|
INTL_CallCCCReportAutoDetect(obj, doc_csid);
|
|
|
|
|
|
/* If no conversion needed, change put_block module for successive
|
|
* data blocks. For current data block, return unmodified buffer.
|
|
*/
|
|
if (INTL_GetCCCCvtfunc(obj) == NULL) {
|
|
INTL_SetCCCLen(obj, l);
|
|
return((unsigned char *) s);
|
|
}
|
|
/* For initial block, must call converter directly. Success calls
|
|
* to the converter will be called directly from net_CharCodeConv()
|
|
*/
|
|
return (unsigned char *)(INTL_GetCCCCvtfunc(obj)) (obj, (const unsigned char*)s, l);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|