builtin: getchar for unicode characters
							parent
							
								
									04ff9ede9f
								
							
						
					
					
						commit
						602e472b8a
					
				|  | @ -131,3 +131,52 @@ pub fn string_from_wide2(_wstr &u16, len int) string { | |||
|         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