summaryrefslogtreecommitdiff
path: root/usr/src/lib/libbc/libc/gen/common/iso.multibyte.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libbc/libc/gen/common/iso.multibyte.c')
-rw-r--r--usr/src/lib/libbc/libc/gen/common/iso.multibyte.c923
1 files changed, 0 insertions, 923 deletions
diff --git a/usr/src/lib/libbc/libc/gen/common/iso.multibyte.c b/usr/src/lib/libbc/libc/gen/common/iso.multibyte.c
deleted file mode 100644
index fb1f1c607f..0000000000
--- a/usr/src/lib/libbc/libc/gen/common/iso.multibyte.c
+++ /dev/null
@@ -1,923 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/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 usr/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 1988 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/types.h>
-#include "codeset.h"
-#include "mbextern.h"
-#include "iso2022.h"
-
-#define TO_MULTI 2
-#define TO_SINGLE 1
-
-#define BIT7ENV 7 /* 7bit enviornment */
-#define BIT8ENV 8 /* 8bit environment */
-#define NUM_OF_STATES 4 /* G0, G1, G2, G3 */
-#define BIT8(_ch) (_ch & 0x80)
-#define MAXSIZE 100 /* ESC LOCK upper lower */
-
-#define USE_STATE 0 /* use the actual _state info */
-#define USE_CONTROL 1 /* use C0 or C1 */
-#define USE_SS2 2 /* use Single shift 2 */
-#define USE_SS3 3 /* use Single shift 3 */
-
-#define G0MASK 0x0000
-#define G1MASK 0x0080
-#define G2MASK 0x8000
-#define G3MASK 0x8080
-#define FINAL 0x33 /* Temporary final character */
-
-#define MMB_CUR_MAX 128
-
-/*
- * Keep state informations
- */
-struct state {
- char width; /* 1 or 2 */
- char final; /* final character */
-};
-
-static char _my_env = BIT7ENV; /* default 7bits environment */
-static struct state Invoked_G0, Invoked_G1;
-static char _currentG0 = G0;
-static char _currentG1 = G1;
-static struct state _des_states[NUM_OF_STATES] = {
- {-1, 0}, {-1, 0}, {-1, 0}, {01, 0}
-};
-
-void _savestates(void); /* save states */
-void _restorestates(void); /* restore states */
-void _initializestates(void);/* Initialize states */
-
-
-/*
- * Variables for wc*tomb*()
- */
-static char _currentOUT = G0; /* G0, G1, G2 or G3 */
-static int prevcsize = 1;
-
-/*
- * mbtowc - subroutine for most iso codeset sequences
- */
-int
-_mbtowc_iso(wchar_t *pwc, char *s, size_t n)
-{
- unsigned char ch;
- unsigned char tch; /* temporary use */
- unsigned char *us = (unsigned char *)s;
- int gen_wide_state = USE_STATE; /* used in gen_wide: */
- int length = 0;
- int len = 0;
- wchar_t wide;
- int mask;
- int i;
-
- isowidth_t * isoinfo = (isowidth_t *) _code_set_info.code_info;
-
- /*
- * initialize _g0_stuff
- */
- if (_des_states[G0].width == -1) {
- _des_states[G0].width = isoinfo->g0_len;
- _des_states[G1].width = isoinfo->g1_len;
- _des_states[G2].width = isoinfo->g2_len;
- _des_states[G3].width = isoinfo->g3_len;
- _my_env = isoinfo->bit_env;
-
- Invoked_G0 = _des_states[G0];
- Invoked_G1 = _des_states[G1];
- }
-
- /*
- * get character and proceed
- */
-loop:
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- switch (ch) { /* get a character */
- /* escape sequence or locking shifts */
- case ESC: /* escape sequence */
- gen_wide_state = USE_STATE; /* used in gen_wide: */
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- switch (ch) {
- /* DESIGNATE */
- case 0x24: /* designate */
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- switch (ch) {
- case 0x28: case 0x29:
- case 0x2A: case 0x2B:
- case 0x2D: case 0x2E:
- case 0x2F:
- tch = ch; /* save this to decide _des_state */
- /* Skip intermidiates */
- do {
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- } while (ch >= 0x20 && ch <= 0x2F);
- if (ch < 0x30) /* ch should be a final character */
- return (-1); /* error */
- if (tch == 0x28)
- i = G0;
- else if (tch == 0x29 || tch == 0x2D)
- i = G1;
- else if (tch == 0x2A || tch == 0x2E)
- i = G2;
- else /* (tch == 0x2B || tch == 0x2F) */
- i = G3;
- /* updates state info */
- _des_states[i].width = TO_MULTI;
- _des_states[i].final = ch;
-
- goto loop;
- break;
- default:
- /* This is an illegal sequence */
- return (-1);
- break;
- }
- break;
- case 0x28: /* designate */
- case 0x29: case 0x2A: case 0x2B:
- case 0x2D: case 0x2E: case 0x2F:
- tch = ch; /* save this to decide _des_state */
- /* Skip intermidiates */
- do {
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- } while (ch >= 0x20 && ch <= 0x2F);
- if (ch < 0x30) /* ch should be a final character */
- return (-1); /* error */
- if (tch == 0x28)
- i = G0;
- else if (tch == 0x29 || tch == 0x2D)
- i = G1;
- else if (tch == 0x2A || tch == 0x2E)
- i = G2;
- else /* (tch == 0x2B || tch == 0x2F) */
- i = G3;
- /* updates state info */
- _des_states[i].width = TO_SINGLE;
- _des_states[i].final = ch;
-
- goto loop;
- break;
-
- /* LOCKING SHIFTS */
- case LS1R: /* locking shift LS1R */;
- Invoked_G1 = _des_states[G1];
- _currentG1 = G1;
- goto loop;
- break;
- case LS2: /* locking shift LS2 */
- Invoked_G0 = _des_states[G2];
- _currentG0 = G2;
- goto loop;
- break;
- case LS2R: /* locking shift LS2R */
- Invoked_G1 = _des_states[G2];
- _currentG1 = G2;
- goto loop;
- break;
- case LS3: /* locking shift LS3 */
- Invoked_G0 = _des_states[G3];
- _currentG0 = G3;
- goto loop;
- break;
- case LS3R: /* locking shift LS3R */
- Invoked_G1 = _des_states[G3];
- _currentG1 = G3;
- goto loop;
- break;
-
- /* CONTROL FUNCTIONS */
- case 0x21: /* C0 sets */
- case 0x22: /* C1 sets */
- do {
- ch = *us++;
- if (++length > n) return (-1); /* too long */
- } while (ch >= 0x20 && ch <= 0x2F);
- if (ch < 0x30) /* ch should be a final character */
- return (-1); /* error */
- goto loop;
- break;
-
- /* SINGLE SHIFT for 7bit environment */
- case SS2_7B: /* Single shift SS2 for 7bits */
- case SS3_7B: /* Single shoft SS3 for 7bits */
- if (ch == SS2_7B)
- gen_wide_state = USE_SS2;
- else
- gen_wide_state = USE_SS3;
- goto loop;
- break;
-
- default: /* should be an error */
- return (-1);
- break;
- }
- /* locking shifts */
- case LS0:
- gen_wide_state = USE_STATE; /* used in gen_wide: */
- Invoked_G0 = _des_states[G0];
- _currentG0 = G0;
- goto loop;
- break;
-
- case LS1:
- gen_wide_state = USE_STATE; /* used in gen_wide: */
- Invoked_G0 = _des_states[G1];
- _currentG0 = G1;
- goto loop;
- break;
-
- /* Single shift SS3 and SS2 for 8bits */
- case SS2_8B:
- case SS3_8B:
- if (ch == SS2_8B)
- gen_wide_state = USE_SS2;
- else
- gen_wide_state = USE_SS3;
- goto loop;
- break;
-
- /* This character is not any special character/
- * It does not change any state.
- * Goto where it generates wide character.
- */
- default:
- /*
- * Use this ch to generate pwc.
- */
- if (ch == 0) { /* end of string or 0 */
- wide = 0;
- mask = 0;
- goto gen_wide;
- }
- break;
- }
-
-
- /*
- * Generate pwc here.
- * The information here is
- * current state and length. If the length is two, you need to
- * read one more character.
- */
- switch (gen_wide_state) {
- case USE_STATE:
- if (BIT8(ch)) { /* 8bit environment ? */
- /* current mode is G1 mode */
- if (Invoked_G1.width == 2) {
- tch = *us++;
- if (++length > n) return (-1);
- wide = ch;
- wide = (wide << 8 | tch);
- }
- else {
- wide = ch;
- }
- if (_currentG1 == G0) mask = G0MASK;
- else if (_currentG1 == G1) mask = G1MASK;
- else if (_currentG1 == G2) mask = G2MASK;
- else mask = G3MASK;
- }
- else {
- /* current mode is G0 mode */
- if (Invoked_G0.width == 2) {
- tch = *us++;
- if (++length > n) return (-1);
- wide = ch;
- wide = (wide << 8 | tch);
- }
- else {
- wide = ch;
- }
- if (_currentG0 == G0) mask = G0MASK;
- else if (_currentG0 == G1) mask = G1MASK;
- else if (_currentG0 == G2) mask = G2MASK;
- else mask = G3MASK;
- }
- break;
- case USE_SS2:
- if (_des_states[G2].width == 2) {
- tch = *us++;
- if (++length > n) return (-1);
- wide = ch;
- wide = (wide << 8 | tch);
- }
- else {
- wide = ch;
- }
- mask = G2MASK;
- break;
- case USE_SS3:
- if (_des_states[G3].width == 2) {
- tch = *us++;
- if (++length > n) return (-1);
- wide = ch;
- wide = (wide << 8 | tch);
- }
- else {
- wide = ch;
- }
- mask = G3MASK;
- break;
- default:
- /* shoult be internal error */
- return (-1);
- break;
- }
-gen_wide:
- wide &= 0x7F7F; /* strip off the top bit */
- wide = wide | mask;
- if (pwc != NULL)
- *pwc = wide;
- return (length);
-}
-
-
-#define MAXMBSIZE 128
-/*
- * mbstowcs()
- */
-size_t
-_mbstowcs_iso(wchar_t *pwcs, unsigned char *s, size_t n)
-{
- int ret1;
- int accsum = 0;
- wchar_t pwc;
-
- /*
- * If pwcs == 0, do nothing.
- */
- if (pwcs == 0)
- return (0);
- /*
- * States things
- */
- _savestates(); _initializestates();
- while (accsum < n) {
- ret1 = _mbtowc_iso (&pwc, (char *)s, MAXMBSIZE);
- if (ret1 < 0)
- return (-1); /* error */
- if (ret1 == 0 || pwc == 0) {
- if (pwcs == 0)
- *pwcs = 0;
- /*
- * Restore states
- */
- _restorestates();
- return (accsum);
- }
- s = s + ret1; /* increment the pointer */
- *pwcs++ = pwc;
- ++accsum;
- }
- /*
- * Restore states
- */
- _restorestates();
- return (accsum);
-}
-
-/*
- * wctomb -
- */
-int
-_wctomb_iso(unsigned char *s, wchar_t pwc)
-{
- unsigned char ch;
- unsigned char tch; /* temporary use */
- unsigned char *us = (unsigned char *)s;
- int gen_wide_state = USE_STATE; /* used in gen_wide: */
- int length = 0;
- int len = 0;
- wchar_t wide;
- unsigned short mode;
- unsigned char buf[MAXSIZE];
- unsigned char *bp;
- int csize, i;
- int n = MMB_CUR_MAX;
-
- isowidth_t * isoinfo = (isowidth_t *) _code_set_info.code_info;
-
- /*
- * If pwc is 0, do this first.
- */
- if (pwc == 0) {
- if (s != 0) {
- *s = 0;
- return (1);
- }
- else {
- return (0);
- }
- }
-
- mode = pwc & G3MASK; /* The mode of this character */
- if (((pwc >> 8) & 0x007f) == 0)
- csize = 1;
- else
- csize = 2;
- bp = buf;
- length = 0;
-#ifdef DDDebug
- if (_my_env == BIT7ENV)
- printf ("7b ");
- else
- printf ("8b ");
- printf ("csize = %d, prevcsize = %d, (%x,%x) ",csize, prevcsize, (pwc>>8)&0x00ff, pwc&0x00ff);
- switch (mode) {
- case G0MASK:
- printf ("G0"); break;
- case G1MASK:
- printf ("G1"); break;
- case G2MASK:
- printf ("G2"); break;
- case G3MASK:
- printf ("G3"); break;
- default:
- printf ("XXXX"); break;
- }
-#endif
-
- switch (_my_env) {
- case BIT7ENV: /* 7 bit environment */
- switch (mode) {
- case G0MASK:
- if (_currentOUT != G0 || prevcsize != csize) {
- _currentOUT = G0;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x28;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x28;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = SI;
- ++length;
- }
- if (csize == 1) {
- *bp++ = pwc & 0x007f;
- ++length;
- }
- else {
- *bp++ = (pwc & 0x7f00) >> 8;
- ++length;
- *bp++ = pwc & 0x007f;
- ++length;
- }
- break;
- case G1MASK:
- if (_currentOUT != G1 || prevcsize != csize) {
- _currentOUT = G1;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x29;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x29;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = SO;
- ++length;
- }
- if (csize == 1) {
- *bp++ = pwc & 0x007f;
- ++length;
- }
- else {
- *bp++ = (pwc & 0x7f00) >> 8;
- ++length;
- *bp++ = pwc & 0x007f;
- ++length;
- }
- break;
- case G2MASK:
- if (_currentOUT != G2 || prevcsize != csize) {
- _currentOUT = G2;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x2A;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x2A;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = ESC; *bp++ = LS2;
- length += 2;
- }
- if (csize == 1) {
- *bp++ = pwc & 0x007f;
- ++length;
- }
- else {
- *bp++ = (pwc & 0x7f00) >> 8;
- ++length;
- *bp++ = pwc & 0x007f;
- ++length;
- }
- break;
- case G3MASK:
- if (_currentOUT != G3 || prevcsize != csize) {
- _currentOUT = G3;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x2B;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x2B;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = ESC; *bp++ = LS3;
- length += 2;
- }
- if (csize == 1) {
- *bp++ = pwc & 0x007f;
- ++length;
- }
- else {
- *bp++ = (pwc & 0x7f00) >> 8;
- ++length;
- *bp++ = pwc & 0x007f;
- ++length;
- }
- break;
- }
- break;
- case BIT8ENV: /* 8 bit environment */
- switch (mode) {
- case G0MASK:
- if (_currentOUT != G0 || prevcsize != csize) {
- _currentOUT = G0;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x28;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x28;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = LS0;
- ++length;
- }
- if (csize == 1) {
- *bp++ = pwc & 0x007f;
- ++length;
- }
- else {
- *bp++ = (pwc & 0x7f00) >> 8;
- ++length;
- *bp++ = pwc & 0x007f;
- ++length;
- }
- break;
- case G1MASK:
- if (_currentOUT != G1 || prevcsize != csize) {
- _currentOUT = G1;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x29;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x29;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = ESC; *bp++ = LS1R;
- length += 2;
- }
-
- /*
- * If state is G1 or G2, or G3, assume that
- * this is 8bit characters. To do this more
- * accurately, wide character needs to be
- * larger than 16 bits to keep more information.
- */
- pwc |= 0x8080;
- if (csize == 1) {
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- else {
- *bp++ = (pwc & 0xff00) >> 8;
- ++length;
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- break;
- case G2MASK:
- if (_currentOUT != G2 || prevcsize != csize) {
- _currentOUT = G2;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x2A;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x2A;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = ESC; *bp++ = LS2R;
- length += 2;
- }
- /*
- * If state is G1 or G2, or G3, assume that
- * this is 8bit characters. To do this more
- * accurately, wide character needs to be
- * larger than 16 bits to keep more information.
- */
- pwc |= 0x8080;
- if (csize == 1) {
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- else {
- *bp++ = (pwc & 0xff00) >> 8;
- ++length;
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- break;
- case G3MASK:
- if (_currentOUT != G3 || prevcsize != csize) {
- _currentOUT = G3;
- if (csize == 2) {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x24;
- *bp++ = 0x2B;
- *bp++ = FINAL;
- length += 4;
- }
- else {
- /*
- * Emit escape sequences
- */
- *bp++ = ESC;
- *bp++ = 0x2B;
- *bp++ = FINAL;
- length += 3;
- }
- *bp++ = ESC; *bp++ = LS3R;
- length += 2;
- }
- /*
- * If state is G1 or G2, or G3, assume that
- * this is 8bit characters. To do this more
- * accurately, wide character needs to be
- * larger than 16 bits to keep more information.
- */
- pwc |= 0x8080;
- if (csize == 1) {
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- else {
- *bp++ = (pwc & 0xff00) >> 8;
- ++length;
- *bp++ = pwc & 0x00ff;
- ++length;
- }
- break;
- }
- break;
- default: /* Should never happens */
- return (-1);
- break;
- }
-
- prevcsize = csize;
-
- if (length > n) {
- return (-1); /* buffer too small */
- }
- for (i = 0; i < length; i++) {
- *s++ = buf[i];
- }
-#ifdef DDDebug
- printf ("\t(");
- for (i = 0; i < length; i++) {
- printf ("%x,", buf[i]);
- }
- printf (")\n");
-#endif
- return (length);
-}
-
-/*
- * wcstombs
- */
-size_t
-_wcstombs_iso(char *s, wchar_t *pwcs, int n)
-{
- int acclen = 0;
- char buf[MMB_CUR_MAX];
- int ret1;
- int i;
-
- if (n < 0)
- return (-1);
- /*
- * Initialize State
- */
- _savestates(); _initializestates();
- while (acclen < n) {
- ret1 = _wctomb_iso ((unsigned char *)buf, *pwcs);
- /*
- * end of string ?
- */
- if (ret1 == 1 && buf[0] == 0) {
- *s = 0;
- /*
- * restore states
- */
- _restorestates();
- return (acclen);
- }
- /*
- * Error ?
- */
- if (ret1 < 0)
- return (-1);
- acclen += ret1;
- for (i = 0; i < ret1; i++)
- *s++ = buf[i];
- ++pwcs;
- }
-
- /*
- * restore states
- */
- _restorestates();
-
- /*
- * return the length
- */
- return (acclen);
-}
-
-
-/*
- * Supplementary routines
- */
-
-void
-_initializestates(void)
-{
- _currentG0 = G0;
- _currentG1 = G1;
-
- _des_states[G0].width = -1; /* This makes it Initialize */
-
- _currentOUT = G0;
- prevcsize = 1;
-}
-
-static char SAVED_currentG0;
-static char SAVED_currentG1;
-static struct state SAVED_des_states[NUM_OF_STATES];
-static struct state SAVED_Invoked_G0, SAVED_Invoked_G1;
-static char SAVED_currentOUT = G0; /* G0, G1, G2 or G3 */
-static int SAVED_prevcsize = 1;
-
-void
-_savestates(void)
-{
-
- SAVED_currentG0 = _currentG0;
- SAVED_currentG1 = _currentG1;
-
- SAVED_des_states[G0] = _des_states[G0];
- SAVED_des_states[G1] = _des_states[G1];
- SAVED_des_states[G2] = _des_states[G2];
- SAVED_des_states[G3] = _des_states[G3];
-
- SAVED_Invoked_G0 = Invoked_G0;
- SAVED_Invoked_G1 = Invoked_G1;
-
- SAVED_currentOUT = _currentOUT;
- SAVED_prevcsize = prevcsize;
-}
-
-void
-_restorestates(void)
-{
- _currentG0 = SAVED_currentG0;
- _currentG1 = SAVED_currentG1;
-
- _des_states[G0] = SAVED_des_states[G0];
- _des_states[G1] = SAVED_des_states[G1];
- _des_states[G2] = SAVED_des_states[G2];
- _des_states[G3] = SAVED_des_states[G3];
-
- Invoked_G0 = SAVED_Invoked_G0;
- Invoked_G1 = SAVED_Invoked_G1;
-
- _currentOUT = SAVED_currentOUT;
- prevcsize = SAVED_prevcsize;
-}