/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1994 by Sun Microsystems, Inc. */ #ifndef _UTF2NBYTE_H_ #define _UTF2NBYTE_H_ #include "hangulcode.h" typedef struct __conv_desc { unsigned short ci, v, cf; enum { E, CI, V, CF } prev_state; enum { ASCII, WANSUNG } state; } _conv_desc; #define RESET_CONV_DESC()\ cd->ci = cd->v = cd->cf = CVC_FILL; cd->prev_state = E; #define PROCESS_PRIOR_CVC()\ {\ int i;\ register int j;\ char c[5];\ \ if (cd->prev_state != E)\ {\ i = 0;\ if ((cd->ci <= 18 || cd->ci == CVC_FILL) &&\ (cd->v <= 20 || cd->v == CVC_FILL) &&\ (cd->cf <= 28 || cd->cf == CVC_FILL))\ {\ c[i] = (char)Y19_32[cd->ci != CVC_FILL ?\ cd->ci + 1 : 0] + '@';\ if (c[i] > '@')\ i++;\ c[i] = (char)Y21_32[cd->v != CVC_FILL ? cd->v +\ (short)(cd->v + 1) / 3 + 2 : 1] + '`';\ if (c[i] > 'a')\ echo_vowel(c, &i);\ c[i] = (char)Y28_32[cd->cf != CVC_FILL ?\ cd->cf - 1 : 0] + '@';\ if (c[i] > '@')\ echo_consonant(c, &i);\ \ if ((obtail - ob) < (i + (cd->state == ASCII ?\ 1 : 0)))\ {\ errno = E2BIG;\ ret_val = (size_t)-1;\ break;\ }\ if (cd->state == ASCII)\ {\ *ob++ = SO;\ cd->state = WANSUNG;\ }\ for (j = 0; j < i; j++)\ *ob++ = c[j];\ }\ else\ {\ /* Let's assume the code is non-identical. */\ if (cd->state == WANSUNG)\ {\ if ((obtail - ob) < 3)\ {\ errno = E2BIG;\ ret_val = (size_t)-1;\ break;\ }\ *ob++ = SI;\ cd->state = ASCII;\ }\ else if ((obtail - ob) < 2)\ {\ errno = E2BIG;\ ret_val = (size_t)-1;\ break;\ }\ *ob++ = NON_IDENTICAL;\ *ob++ = NON_IDENTICAL;\ ret_val += 2;\ }\ RESET_CONV_DESC();\ }\ } #endif /* _UTF2NBYTE_H_ */