Subversion Repositories Kolibri OS

Rev

Rev 4135 | Go to most recent revision | Details | 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
 
100
; Latin-1 encoding
101
; 0x00-0xFF - trivial map
102
macro latin1 [arg]
103
{ local offs, char, graph
104
  offs = 0
105
  while 1
106
    fetch_utf8_char arg, offs, char, graph
107
    if char = -1
108
      break
109
    end if
110
    if graph
111
      db graph
112
    else if char < 0x100
113
      db char
114
    else
115
      .err Failed to convert to Latin-1
116
    end if
117
  end while
118
}
119
 
120
; CP850 encoding
121
macro cp850 [arg]
122
{ local offs, char, graph
123
  offs = 0
124
  while 1
125
    fetch_utf8_char arg, offs, char, graph
126
    if char = -1
127
      break
128
    end if
129
    if graph
130
      db graph
131
    else if char < 0x80
132
      db char
133
    else if char = 0xBF
134
      db 0xA8
135
    else if char = 0xE1
136
      db 0xA0
137
    else if char = 0xE9
138
      db 0x82
139
    else if char = 0xED
140
      db 0xA1
141
    else if char = 0xF3
142
      db 0xA2
143
    else if char = 0xFA
144
      db 0xA3
145
    else
146
      err Failed to convert to CP850
147
    end if
148
  end while
149
}