builtin: getchar for unicode characters
							parent
							
								
									04ff9ede9f
								
							
						
					
					
						commit
						602e472b8a
					
				|  | @ -131,3 +131,52 @@ pub fn string_from_wide2(_wstr &u16, len int) string { | ||||||
|         return '' |         return '' | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // Calculate length to read from the first byte
 | ||||||
|  | fn utf8_len(c byte) int { | ||||||
|  |   mut b := 0 | ||||||
|  |   mut x := c | ||||||
|  | 
 | ||||||
|  |   if ((x & 240) != 0) { //0xF0
 | ||||||
|  |     x >>= 4 | ||||||
|  |   } else { | ||||||
|  |     b += 4 | ||||||
|  |   } | ||||||
|  |   if ((x & 12) != 0) { //0x0C
 | ||||||
|  |     x >>= 2 | ||||||
|  |   } else { | ||||||
|  |     b += 2 | ||||||
|  |   } | ||||||
|  |   if ((x & 2) == 0) { //0x02
 | ||||||
|  |     b++ | ||||||
|  |   } | ||||||
|  |   return b | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Reads an utf8 character from standard input
 | ||||||
|  | pub fn utf8_getchar() int { | ||||||
|  |   c := int(C.getchar()) | ||||||
|  |   len := utf8_len(~c) | ||||||
|  | 
 | ||||||
|  |   if c < 0 { | ||||||
|  |     return 0 | ||||||
|  |   } else if (len == 0) { | ||||||
|  |     return c | ||||||
|  |   } else if (len == 1) { | ||||||
|  |     return -1 | ||||||
|  |   } else { | ||||||
|  |     mut uc := int(c & ((1 << (7 - len)) - 1)) | ||||||
|  |     for i := 0; i + 1 < len; i++ { | ||||||
|  |       c2 := int(C.getchar()) | ||||||
|  |       if c2 != -1 && (c2 >> 6) == 2 { | ||||||
|  |         uc <<= 6 | ||||||
|  |         uc |= int((c2 & 63)) | ||||||
|  |       }  else if (c2 == -1) { | ||||||
|  |         return 0 | ||||||
|  |       } else { | ||||||
|  |         return -1 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return uc | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue