Apps: fixed 3 programs for using a long path in parameters
[kolibrios.git] / programs / encoding.inc
blob7a1aa9adec1f664b95adbcffc127bd10158d31d7
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;                                                              ;;
3 ;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
4 ;; Distributed under terms of the GNU General Public License    ;;
5 ;;                                                              ;;
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ; fetch the UTF-8 character in addrspace:offs to char
9 macro fetch_utf8_char addrspace, offs, char
10 { local first_byte, b
11   ; fetch first byte
12   load first_byte byte from addrspace:offs
13   if first_byte < 0x80
14     char = first_byte
15     offs = offs + 1
16   else if first_byte < 0xC0
17     err Invalid UTF-8 string
18   else if first_byte < 0xE0
19     char = first_byte and 0x1F
20     load b byte from addrspace:offs + 1
21     char = (char shl 6) + (b and 0x3F)
22     offs = offs + 2
23   else if first_byte < 0xF0
24     char = first_byte and 0xF
25     load b byte from addrspace:offs + 1
26     char = (char shl 6) + (b and 0x3F)
27     load b byte from addrspace:offs + 2
28     char = (char shl 6) + (b and 0x3F)
29     offs = offs + 3
30   else if first_byte < 0xF8
31     char = first_byte and 0x7
32     load b byte from addrspace:offs + 1
33     char = (char shl 6) + (b and 0x3F)
34     load b byte from addrspace:offs + 2
35     char = (char shl 6) + (b and 0x3F)
36     load b byte from addrspace:offs + 3
37     char = (char shl 6) + (b and 0x3F)
38     offs = offs + 4
39   else
40     err Invalid UTF-8 string
41   end if
44 ; Worker macro for all encodings.
45 ; Common part for all encodings: map characters 0-0x7F trivially,
46 ; translate pseudographics.
47 ; Pseudographics for the boot screen:
48 ; 0x2500 -> 0xC4, 0x2502 -> 0xB3, 0x250C -> 0xDA, 0x2510 -> 0xBF,
49 ; 0x2514 -> 0xC0, 0x2518 -> 0xD9, 0x252C -> 0xC2, 0x2534 -> 0xC1, 0x2551 -> 0xBA
50 macro convert_utf8 encoding, [arg]
51 { common
52   local ..addrspace, offs, char
53   offs = 0
54   virtual at 0
55   ..addrspace:: db arg
56   ..addrspace#.size = $
57   end virtual
58   while offs < ..addrspace#.size
59     fetch_utf8_char ..addrspace, offs, char
60     if char = 0x2500
61       db 0xC4
62     else if char = 0x2502
63       db 0xB3
64     else if char = 0x250C
65       db 0xDA
66     else if char = 0x2510
67       db 0xBF
68     else if char = 0x2514
69       db 0xC0
70     else if char = 0x2518
71       db 0xD9
72     else if char = 0x252C
73       db 0xC2
74     else if char = 0x2534
75       db 0xC1
76     else if char = 0x2551
77       db 0xBA
78     else if char < 0x80
79       db char
80     else
81       encoding char
82     end if
83   end while
86 macro declare_encoding encoding
88   macro encoding [arg]
89   \{ common convert_utf8 encoding#char, arg \}
90   struc encoding [arg]
91   \{ common convert_utf8 encoding#char, arg \}
92   macro encoding#char char
95 ; Russian: use CP866.
96 ; 0x410-0x43F -> 0x80-0xAF
97 ; 0x440-0x44F -> 0xE0-0xEF
98 ; 0x401 -> 0xF0, 0x451 -> 0xF1
99 declare_encoding cp866
101   if char = 0x401
102     db 0xF0
103   else if char = 0x451
104     db 0xF1
105   else if (char < 0x410) | (char > 0x44F)
106     err Failed to convert to CP866
107   else if char < 0x440
108     db char - 0x410 + 0x80
109   else
110     db char - 0x440 + 0xE0
111   end if
114 ; Latin-1 encoding
115 ; 0x00-0xFF - trivial map
116 declare_encoding latin1
118   if char < 0x100
119     db char
120   else
121     err Failed to convert to Latin-1
122   end if
125 ; CP850 encoding
126 declare_encoding cp850
128   if char = 0xBF
129     db 0xA8
130   else if char = 0xE1
131     db 0xA0
132   else if char = 0xE9
133     db 0x82
134   else if char = 0xED
135     db 0xA1
136   else if char = 0xF3
137     db 0xA2
138   else if char = 0xFA
139     db 0xA3
140   else
141     err Failed to convert to CP850
142   end if