|  | // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT | 
|  | // file at http://rust-lang.org/COPYRIGHT. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | 
|  | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | 
|  | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | 
|  | // option. This file may not be copied, modified, or distributed | 
|  | // except according to those terms. | 
|  |  | 
|  | // (This used to be in the Rust unicode crate, which is now gone, so we'll | 
|  | // just include it inline.) | 
|  |  | 
|  | // https://tools.ietf.org/html/rfc3629 | 
|  | static UTF8_CHAR_WIDTH: [u8; 256] = [ | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x1F | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x3F | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x5F | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | 
|  | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x7F | 
|  | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | 
|  | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x9F | 
|  | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | 
|  | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xBF | 
|  | 0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, | 
|  | 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xDF | 
|  | 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, // 0xEF | 
|  | 4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, // 0xFF | 
|  | ]; | 
|  |  | 
|  | /// Given a first byte, determine how many bytes are in this UTF-8 character | 
|  | #[inline] | 
|  | pub fn utf8_char_width(b: u8) -> usize { | 
|  | return UTF8_CHAR_WIDTH[b as usize] as usize; | 
|  | } |