Subversion Repositories Kolibri OS

Rev

Rev 3540 | Rev 5082 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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