1*16d86563SAlexander Pyhalov /* 2*16d86563SAlexander Pyhalov * CDDL HEADER START 3*16d86563SAlexander Pyhalov * 4*16d86563SAlexander Pyhalov * The contents of this file are subject to the terms of the 5*16d86563SAlexander Pyhalov * Common Development and Distribution License (the "License"). 6*16d86563SAlexander Pyhalov * You may not use this file except in compliance with the License. 7*16d86563SAlexander Pyhalov * 8*16d86563SAlexander Pyhalov * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE 9*16d86563SAlexander Pyhalov * or http://www.opensolaris.org/os/licensing. 10*16d86563SAlexander Pyhalov * See the License for the specific language governing permissions 11*16d86563SAlexander Pyhalov * and limitations under the License. 12*16d86563SAlexander Pyhalov * 13*16d86563SAlexander Pyhalov * When distributing Covered Code, include this CDDL HEADER in each 14*16d86563SAlexander Pyhalov * file and include the License file at src/OPENSOLARIS.LICENSE. 15*16d86563SAlexander Pyhalov * If applicable, add the following below this CDDL HEADER, with the 16*16d86563SAlexander Pyhalov * fields enclosed by brackets "[]" replaced with your own identifying 17*16d86563SAlexander Pyhalov * information: Portions Copyright [yyyy] [name of copyright owner] 18*16d86563SAlexander Pyhalov * 19*16d86563SAlexander Pyhalov * CDDL HEADER END 20*16d86563SAlexander Pyhalov */ 21*16d86563SAlexander Pyhalov /* 22*16d86563SAlexander Pyhalov * Copyright (c) 1994 by Sun Microsystems, Inc. 23*16d86563SAlexander Pyhalov */ 24*16d86563SAlexander Pyhalov 25*16d86563SAlexander Pyhalov 26*16d86563SAlexander Pyhalov 27*16d86563SAlexander Pyhalov #ifndef _UTF2NBYTE_H_ 28*16d86563SAlexander Pyhalov #define _UTF2NBYTE_H_ 29*16d86563SAlexander Pyhalov 30*16d86563SAlexander Pyhalov 31*16d86563SAlexander Pyhalov #include "hangulcode.h" 32*16d86563SAlexander Pyhalov 33*16d86563SAlexander Pyhalov typedef struct __conv_desc { 34*16d86563SAlexander Pyhalov unsigned short ci, v, cf; 35*16d86563SAlexander Pyhalov enum { E, CI, V, CF } prev_state; 36*16d86563SAlexander Pyhalov enum { ASCII, WANSUNG } state; 37*16d86563SAlexander Pyhalov } _conv_desc; 38*16d86563SAlexander Pyhalov 39*16d86563SAlexander Pyhalov #define RESET_CONV_DESC()\ 40*16d86563SAlexander Pyhalov cd->ci = cd->v = cd->cf = CVC_FILL; cd->prev_state = E; 41*16d86563SAlexander Pyhalov #define PROCESS_PRIOR_CVC()\ 42*16d86563SAlexander Pyhalov {\ 43*16d86563SAlexander Pyhalov int i;\ 44*16d86563SAlexander Pyhalov register int j;\ 45*16d86563SAlexander Pyhalov char c[5];\ 46*16d86563SAlexander Pyhalov \ 47*16d86563SAlexander Pyhalov if (cd->prev_state != E)\ 48*16d86563SAlexander Pyhalov {\ 49*16d86563SAlexander Pyhalov i = 0;\ 50*16d86563SAlexander Pyhalov if ((cd->ci <= 18 || cd->ci == CVC_FILL) &&\ 51*16d86563SAlexander Pyhalov (cd->v <= 20 || cd->v == CVC_FILL) &&\ 52*16d86563SAlexander Pyhalov (cd->cf <= 28 || cd->cf == CVC_FILL))\ 53*16d86563SAlexander Pyhalov {\ 54*16d86563SAlexander Pyhalov c[i] = (char)Y19_32[cd->ci != CVC_FILL ?\ 55*16d86563SAlexander Pyhalov cd->ci + 1 : 0] + '@';\ 56*16d86563SAlexander Pyhalov if (c[i] > '@')\ 57*16d86563SAlexander Pyhalov i++;\ 58*16d86563SAlexander Pyhalov c[i] = (char)Y21_32[cd->v != CVC_FILL ? cd->v +\ 59*16d86563SAlexander Pyhalov (short)(cd->v + 1) / 3 + 2 : 1] + '`';\ 60*16d86563SAlexander Pyhalov if (c[i] > 'a')\ 61*16d86563SAlexander Pyhalov echo_vowel(c, &i);\ 62*16d86563SAlexander Pyhalov c[i] = (char)Y28_32[cd->cf != CVC_FILL ?\ 63*16d86563SAlexander Pyhalov cd->cf - 1 : 0] + '@';\ 64*16d86563SAlexander Pyhalov if (c[i] > '@')\ 65*16d86563SAlexander Pyhalov echo_consonant(c, &i);\ 66*16d86563SAlexander Pyhalov \ 67*16d86563SAlexander Pyhalov if ((obtail - ob) < (i + (cd->state == ASCII ?\ 68*16d86563SAlexander Pyhalov 1 : 0)))\ 69*16d86563SAlexander Pyhalov {\ 70*16d86563SAlexander Pyhalov errno = E2BIG;\ 71*16d86563SAlexander Pyhalov ret_val = (size_t)-1;\ 72*16d86563SAlexander Pyhalov break;\ 73*16d86563SAlexander Pyhalov }\ 74*16d86563SAlexander Pyhalov if (cd->state == ASCII)\ 75*16d86563SAlexander Pyhalov {\ 76*16d86563SAlexander Pyhalov *ob++ = SO;\ 77*16d86563SAlexander Pyhalov cd->state = WANSUNG;\ 78*16d86563SAlexander Pyhalov }\ 79*16d86563SAlexander Pyhalov for (j = 0; j < i; j++)\ 80*16d86563SAlexander Pyhalov *ob++ = c[j];\ 81*16d86563SAlexander Pyhalov }\ 82*16d86563SAlexander Pyhalov else\ 83*16d86563SAlexander Pyhalov {\ 84*16d86563SAlexander Pyhalov /* Let's assume the code is non-identical. */\ 85*16d86563SAlexander Pyhalov if (cd->state == WANSUNG)\ 86*16d86563SAlexander Pyhalov {\ 87*16d86563SAlexander Pyhalov if ((obtail - ob) < 3)\ 88*16d86563SAlexander Pyhalov {\ 89*16d86563SAlexander Pyhalov errno = E2BIG;\ 90*16d86563SAlexander Pyhalov ret_val = (size_t)-1;\ 91*16d86563SAlexander Pyhalov break;\ 92*16d86563SAlexander Pyhalov }\ 93*16d86563SAlexander Pyhalov *ob++ = SI;\ 94*16d86563SAlexander Pyhalov cd->state = ASCII;\ 95*16d86563SAlexander Pyhalov }\ 96*16d86563SAlexander Pyhalov else if ((obtail - ob) < 2)\ 97*16d86563SAlexander Pyhalov {\ 98*16d86563SAlexander Pyhalov errno = E2BIG;\ 99*16d86563SAlexander Pyhalov ret_val = (size_t)-1;\ 100*16d86563SAlexander Pyhalov break;\ 101*16d86563SAlexander Pyhalov }\ 102*16d86563SAlexander Pyhalov *ob++ = NON_IDENTICAL;\ 103*16d86563SAlexander Pyhalov *ob++ = NON_IDENTICAL;\ 104*16d86563SAlexander Pyhalov ret_val += 2;\ 105*16d86563SAlexander Pyhalov }\ 106*16d86563SAlexander Pyhalov RESET_CONV_DESC();\ 107*16d86563SAlexander Pyhalov }\ 108*16d86563SAlexander Pyhalov } 109*16d86563SAlexander Pyhalov 110*16d86563SAlexander Pyhalov 111*16d86563SAlexander Pyhalov #endif /* _UTF2NBYTE_H_ */ 112