This commit is contained in:
Zachary Pierson
2017-04-04 18:46:05 -05:00
7 changed files with 70 additions and 75 deletions
+2 -6
View File
@@ -194,9 +194,6 @@ last_write_time_by_name :: proc(name: string) -> File_Time {
}
read_entire_file :: proc(name: string) -> ([]byte, bool) {
buf: [300]byte;
copy(buf[..], cast([]byte)name);
@@ -208,13 +205,12 @@ read_entire_file :: proc(name: string) -> ([]byte, bool) {
defer close(fd);
length: i64;
file_size_ok := win32.GetFileSizeEx(cast(win32.Handle)fd, ^length) != 0;
if !file_size_ok {
if ok := win32.GetFileSizeEx(cast(win32.Handle)fd, ^length) != 0; !ok {
return nil, false;
}
data := make([]byte, length);
if ^data[0] == nil {
if data == nil {
return nil, false;
}
+58
View File
@@ -0,0 +1,58 @@
REPLACEMENT_CHAR :: '\uFFFD';
MAX_RUNE :: '\U0010FFFF';
_surr1 :: 0xd800;
_surr2 :: 0xdc00;
_surr3 :: 0xe000;
_surr_self :: 0x10000;
is_surrogate :: proc(r: rune) -> bool {
return _surr1 <= r && r < _surr3;
}
decode_surrogate_pair :: proc(r1, r2: rune) -> rune {
if _surr1 <= r1 && r1 < _surr2 && _surr2 <= r2 && r2 < _surr3 {
return (r1-_surr1)<<10 | (r2 - _surr2) + _surr_self;
}
return REPLACEMENT_CHAR;
}
encode_surrogate_pair :: proc(r: rune) -> (r1, r2: rune) {
if r < _surr_self || r > MAX_RUNE {
return REPLACEMENT_CHAR, REPLACEMENT_CHAR;
}
r -= _surr_self;
return _surr1 + (r>>10)&0x3ff, _surr2 + r&0x3ff;
}
encode :: proc(d: []u16, s: []rune) {
n := len(s);
for r in s {
if r >= _surr_self {
n++;
}
}
max_n := min(len(d), n);
n = 0;
for r in s {
match {
case 0 <= r && r < _surr1, _surr3 <= r && r < _surr_self:
d[n] = cast(u16)r;
n++;
case _surr_self <= r && r <= MAX_RUNE:
r1, r2 := encode_surrogate_pair(r);
d[n] = cast(u16)r1;
d[n+1] = cast(u16)r2;
n += 2;
default:
d[n] = cast(u16)REPLACEMENT_CHAR;
n++;
}
}
}