Subversion Repositories Kolibri OS

Rev

Rev 3540 | Rev 5082 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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. struc cp866 [arg]
  101. {
  102. common
  103.   cp866 arg
  104. }
  105.  
  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.  
  126. struc latin1 [arg]
  127. {
  128. common
  129.   latin1 arg
  130. }
  131.  
  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. }
  162.  
  163. struc cp850 [arg]
  164. {
  165. common
  166.   cp850 arg
  167. }
  168.