OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [gnu/] [gcj/] [convert/] [natInput_EUCJIS.cc] - Blame information for rev 756

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 756 jeremybenn
/* Copyright (C) 1999  Free Software Foundation
2
 
3
   This file is part of libgcj.
4
 
5
This software is copyrighted work licensed under the terms of the
6
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
7
details.  */
8
 
9
#include <config.h>
10
#include <gcj/cni.h>
11
#include <gnu/gcj/convert/Input_EUCJIS.h>
12
 
13
#define ERROR_CHAR 0xFFFD
14
 
15
extern unsigned short JIS0208_to_Unicode[84][94];
16
extern unsigned short JIS0212_to_Unicode[76][94];
17
 
18
jint
19
gnu::gcj::convert::Input_EUCJIS::read(jcharArray outbuffer, jint outpos,
20
                                      jint count)
21
{
22
  jint start_outpos = outpos;
23
  for (;;)
24
    {
25
      if (outpos - start_outpos >= count)
26
        break;
27
      if (inpos >= inlength)
28
        break;
29
      int b = ((unsigned char*) elements(inbuffer))[inpos++];
30
      if (codeset == 0)  // ASCII or JIS-Roman
31
        {
32
          if (b < 128)
33
            {
34
#if 1
35
              // Technically, we should translate 0x5c to Yen symbol;
36
              // in practice, it is not clear.
37
              if (b == 0x5c)
38
                b = 0x00A5;  // Yen sign.
39
#endif
40
              elements(outbuffer)[outpos++] = (char) b;
41
            }
42
          else
43
            {
44
              if (b == 0x8E) // SS2
45
                codeset = 2;
46
              else if (b == 0x8F) // SS3
47
                codeset = 3;
48
              else
49
                {
50
                  codeset = 1;
51
                  first_byte = b;
52
                }
53
            }
54
        }
55
      else if (codeset == 1) // JIS X 0208:1997
56
        {
57
          first_byte -= 0x80 + 33;
58
          b -= 0x80 + 33;
59
          if ((unsigned) first_byte >= 84 || (unsigned) b >= 94)
60
            b = ERROR_CHAR;
61
          else
62
            {
63
              b = JIS0208_to_Unicode[first_byte][b];
64
              if (b == 0)
65
                b = ERROR_CHAR;
66
            }
67
          elements(outbuffer)[outpos++] = b;
68
          codeset = 0;
69
        }
70
      else if (codeset == 2) // Half-width katakana
71
        {
72
          if (b >= 0xA1 && b <= 0xDF)
73
            b += 0xFF61 - 0xA1;
74
          else
75
            b = ERROR_CHAR;
76
          elements(outbuffer)[outpos++] = b;
77
          codeset = 0;
78
        }
79
      else if (codeset == 3) // second byte of JIS X 0212-1990
80
        {
81
          first_byte = b;
82
          codeset = 4;
83
        }
84
      else // codeset == 4 // third byte of JIS X 0212-1990
85
        {
86
          first_byte -= 0x80 + 34;
87
          b -= 0x80 + 33;
88
          if ((unsigned) first_byte >= 76 || (unsigned) b >= 94)
89
            b = ERROR_CHAR;
90
          else
91
            {
92
              b = JIS0208_to_Unicode[first_byte][b];
93
              if (b == 0)
94
                b = ERROR_CHAR;
95
            }
96
          elements(outbuffer)[outpos++] = b;
97
          codeset = 0;
98
        }
99
    }
100
  return outpos - start_outpos;
101
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.