Subversion Repositories Kolibri OS

Rev

Rev 4135 | Rev 5082 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4850 mario79 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2013-2014. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 4850 $
9
 
10
 
3540 clevermous 11
; fetch the UTF-8 character in string+offs to char
12
; common part for all encodings: translate pseudographics
13
; Pseudographics for the boot screen:
14
; 0x2500 -> 0xC4, 0x2502 -> 0xB3, 0x250C -> 0xDA, 0x2510 -> 0xBF,
15
; 0x2514 -> 0xC0, 0x2518 -> 0xD9, 0x252C -> 0xC2, 0x2534 -> 0xC1, 0x2551 -> 0xBA
16
macro fetch_utf8_char string, offs, char, graph
17
{ local first_byte, b
18
  virtual at 0
19
    db string
20
    if offs >= $
21
      char = -1
22
    else
23
      ; fetch first byte
24
      load first_byte byte from offs
25
      if first_byte < 0x80
26
        char = first_byte
27
        offs = offs + 1
28
      else if first_byte < 0xC0
29
        .err Invalid UTF-8 string
30
      else if first_byte < 0xE0
31
        char = first_byte and 0x1F
32
        load b byte from offs + 1
33
        char = (char shl 6) + (b and 0x3F)
34
        offs = offs + 2
35
      else if first_byte < 0xF0
36
        char = first_byte and 0xF
37
        load b byte from offs + 1
38
        char = (char shl 6) + (b and 0x3F)
39
        load b byte from offs + 2
40
        char = (char shl 6) + (b and 0x3F)
41
        offs = offs + 3
42
      else if first_byte < 0xF8
43
        char = first_byte and 0x7
44
        load b byte from offs + 1
45
        char = (char shl 6) + (b and 0x3F)
46
        load b byte from offs + 2
47
        char = (char shl 6) + (b and 0x3F)
48
        load b byte from offs + 3
49
        char = (char shl 6) + (b and 0x3F)
50
        offs = offs + 4
51
      else
52
        .err Invalid UTF-8 string
53
      end if
54
    end if
55
  end virtual
56
  if char = 0x2500
57
    graph = 0xC4
58
  else if char = 0x2502
59
    graph = 0xB3
60
  else if char = 0x250C
61
    graph = 0xDA
62
  else if char = 0x2510
63
    graph = 0xBF
64
  else if char = 0x2514
65
    graph = 0xC0
66
  else if char = 0x2518
67
    graph = 0xD9
68
  else if char = 0x252C
69
    graph = 0xC2
70
  else if char = 0x2534
71
    graph = 0xC1
72
  else if char = 0x2551
73
    graph = 0xBA
74
  else
75
    graph = 0
76
  end if
77
}
78
 
79
; Russian: use CP866.
80
; 0x00-0x7F - trivial map
81
; 0x410-0x43F -> 0x80-0xAF
82
; 0x440-0x44F -> 0xE0-0xEF
83
; 0x401 -> 0xF0, 0x451 -> 0xF1
84
macro cp866 [arg]
85
{ local offs, char, graph
86
  offs = 0
87
  while 1
88
    fetch_utf8_char arg, offs, char, graph
89
    if char = -1
90
      break
91
    end if
92
    if graph
93
      db graph
94
    else if char < 0x80
95
      db char
96
    else if char = 0x401
97
      db 0xF0
98
    else if char = 0x451
99
      db 0xF1
100
    else if (char < 0x410) | (char > 0x44F)
101
      .err Failed to convert to CP866
102
    else if char < 0x440
103
      db char - 0x410 + 0x80
104
    else
105
      db char - 0x440 + 0xE0
106
    end if
107
  end while
108
}
109
 
4135 clevermous 110
struc cp866 [arg]
111
{
112
common
113
  cp866 arg
114
}
115
 
3540 clevermous 116
; Latin-1 encoding
117
; 0x00-0xFF - trivial map
118
macro latin1 [arg]
119
{ local offs, char, graph
120
  offs = 0
121
  while 1
122
    fetch_utf8_char arg, offs, char, graph
123
    if char = -1
124
      break
125
    end if
126
    if graph
127
      db graph
128
    else if char < 0x100
129
      db char
130
    else
131
      .err Failed to convert to Latin-1
132
    end if
133
  end while
134
}
135
 
4135 clevermous 136
struc latin1 [arg]
137
{
138
common
139
  latin1 arg
140
}
141
 
3540 clevermous 142
; CP850 encoding
143
macro cp850 [arg]
144
{ local offs, char, graph
145
  offs = 0
146
  while 1
147
    fetch_utf8_char arg, offs, char, graph
148
    if char = -1
149
      break
150
    end if
151
    if graph
152
      db graph
153
    else if char < 0x80
154
      db char
155
    else if char = 0xBF
156
      db 0xA8
157
    else if char = 0xE1
158
      db 0xA0
159
    else if char = 0xE9
160
      db 0x82
161
    else if char = 0xED
162
      db 0xA1
163
    else if char = 0xF3
164
      db 0xA2
165
    else if char = 0xFA
166
      db 0xA3
167
    else
168
      err Failed to convert to CP850
169
    end if
170
  end while
171
}
4135 clevermous 172
 
173
struc cp850 [arg]
174
{
175
common
176
  cp850 arg
177
}