Subversion Repositories Kolibri OS

Rev

Rev 4429 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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