Subversion Repositories Kolibri OS

Rev

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

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