    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    use crate::digit_table::*;
    use core::ptr;

    #[cfg_attr(feature = "no-panic", inline)]
    pub unsafe fn write_exponent3(mut k: isize, mut result: *mut u8) -> usize {
        let sign = k < 0;
        if sign {
            *result = b'-';
            result = result.offset(1);
            k = -k;
        }

        debug_assert!(k < 1000);
        if k >= 100 {
            *result = b'0' + (k / 100) as u8;
            k %= 100;
            let d = DIGIT_TABLE.as_ptr().offset(k * 2);
            ptr::copy_nonoverlapping(d, result.offset(1), 2);
            sign as usize + 3
        } else if k >= 10 {
            let d = DIGIT_TABLE.as_ptr().offset(k * 2);
            ptr::copy_nonoverlapping(d, result, 2);
            sign as usize + 2
        } else {
            *result = b'0' + k as u8;
            sign as usize + 1
        }
    }

    #[cfg_attr(feature = "no-panic", inline)]
    pub unsafe fn write_exponent2(mut k: isize, mut result: *mut u8) -> usize {
        let sign = k < 0;
        if sign {
            *result = b'-';
            result = result.offset(1);
            k = -k;
        }

        debug_assert!(k < 100);
        if k >= 10 {
            let d = DIGIT_TABLE.as_ptr().offset(k * 2);
            ptr::copy_nonoverlapping(d, result, 2);
            sign as usize + 2
        } else {
            *result = b'0' + k as u8;
            sign as usize + 1
        }
    }