rust-lzo 0.6.0

A pure rust implementation of lzo converted from Linux's C implementation using corrode
Documentation
extern {
    fn memcpy(
        __dest : *mut ::std::os::raw::c_void,
        __src : *const ::std::os::raw::c_void,
        __n : usize
    ) -> *mut ::std::os::raw::c_void;
    fn memset(
        __s : *mut ::std::os::raw::c_void, __c : i32, __n : usize
    ) -> *mut ::std::os::raw::c_void;
}

unsafe extern fn get_unaligned_le32(
    mut p : *const ::std::os::raw::c_void
) -> u32 {
    let mut ret : u32 = 0i32 as (u32);
    memcpy(
        &mut ret as (*mut u32) as (*mut ::std::os::raw::c_void),
        p,
        ::std::mem::size_of::<u32>()
    );
    ret
}

unsafe extern fn put_unaligned(
    mut v : u32, mut p : *mut ::std::os::raw::c_void
) {
    memcpy(
        p,
        &mut v as (*mut u32) as (*const ::std::os::raw::c_void),
        ::std::mem::size_of::<u32>()
    );
}

unsafe extern fn get_unaligned(
    mut p : *const ::std::os::raw::c_void
) -> u32 {
    let mut ret : u32 = 0i32 as (u32);
    memcpy(
        &mut ret as (*mut u32) as (*mut ::std::os::raw::c_void),
        p,
        ::std::mem::size_of::<u32>()
    );
    ret
}

unsafe extern fn lzo1x_1_do_compress(
    mut in_ : *const u8,
    mut in_len : usize,
    mut out : *mut u8,
    mut out_len : *mut usize,
    mut ti : usize,
    mut wrkmem : *mut ::std::os::raw::c_void
) -> usize {
    let mut ip : *const u8;
    let mut op : *mut u8;
    let in_end : *const u8 = in_.offset(in_len as (isize));
    let ip_end
        : *const u8
        = in_.offset(in_len as (isize)).offset(-(20i32 as (isize)));
    let mut ii : *const u8;
    let dict : *mut u16 = wrkmem as (*mut u16);
    op = out;
    ip = in_;
    ii = ip;
    ip = ip.offset(
             if ti < 4i32 as (usize) {
                 (4i32 as (usize)).wrapping_sub(ti)
             } else {
                 0i32 as (usize)
             } as (isize)
         );
    let mut m_pos : *const u8;
    let mut t : usize;
    let mut m_len : usize;
    let mut m_off : usize;
    let mut dv : u32;
    'loop2: loop {
        ip = ip.offset(
                 1i32 as (isize) + ((ip as (isize)).wrapping_sub(
                                        ii as (isize)
                                    ) / ::std::mem::size_of::<u8>() as (isize) >> 5i32)
             );
        'loop3: loop {
            if ip >= ip_end {
                break 'loop2;
            } else {
                dv = get_unaligned_le32(ip as (*const ::std::os::raw::c_void));
                t = (dv.wrapping_mul(
                         0x1824429di32 as (u32)
                     ) >> 32i32 - 13i32 & (1u32 << 13i32).wrapping_sub(
                                              1i32 as (u32)
                                          )) as (usize);
                m_pos = in_.offset(*dict.offset(t as (isize)) as (isize));
                *dict.offset(t as (isize)) = ((ip as (isize)).wrapping_sub(
                                                  in_ as (isize)
                                              ) / ::std::mem::size_of::<u8>() as (isize)) as (u16);
                if dv != get_unaligned_le32(
                             m_pos as (*const ::std::os::raw::c_void)
                         ) {
                    continue 'loop2;
                } else {
                    ii = ii.offset(-(ti as (isize)));
                    ti = 0i32 as (usize);
                    t = ((ip as (isize)).wrapping_sub(
                             ii as (isize)
                         ) / ::std::mem::size_of::<u8>() as (isize)) as (usize);
                    if t != 0i32 as (usize) {
                        if t <= 3i32 as (usize) {
                            {
                                let _rhs = t;
                                let _lhs = &mut *op.offset(-2i32 as (isize));
                                *_lhs = (*_lhs as (usize) | _rhs) as (u8);
                            }
                            put_unaligned(
                                get_unaligned(
                                    ii as (*const u32) as (*const ::std::os::raw::c_void)
                                ),
                                op as (*mut u32) as (*mut ::std::os::raw::c_void)
                            );
                            op = op.offset(t as (isize));
                        } else if t <= 16i32 as (usize) {
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = t.wrapping_sub(3i32 as (usize)) as (u8);
                            put_unaligned(
                                get_unaligned(
                                    ii as (*const u32) as (*const ::std::os::raw::c_void)
                                ),
                                op as (*mut u32) as (*mut ::std::os::raw::c_void)
                            );
                            put_unaligned(
                                get_unaligned(
                                    ii.offset(
                                        4i32 as (isize)
                                    ) as (*const u32) as (*const ::std::os::raw::c_void)
                                ),
                                op.offset(
                                    4i32 as (isize)
                                ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                            );
                            put_unaligned(
                                get_unaligned(
                                    ii.offset(
                                        8i32 as (isize)
                                    ) as (*const u32) as (*const ::std::os::raw::c_void)
                                ),
                                op.offset(
                                    8i32 as (isize)
                                ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                            );
                            put_unaligned(
                                get_unaligned(
                                    ii.offset(8i32 as (isize)).offset(
                                        4i32 as (isize)
                                    ) as (*const u32) as (*const ::std::os::raw::c_void)
                                ),
                                op.offset(8i32 as (isize)).offset(
                                    4i32 as (isize)
                                ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                            );
                            op = op.offset(t as (isize));
                        } else {
                            if t <= 18i32 as (usize) {
                                *{
                                     let _old = op;
                                     op = op.offset(1 as (isize));
                                     _old
                                 } = t.wrapping_sub(3i32 as (usize)) as (u8);
                            } else {
                                let mut tt : usize = t.wrapping_sub(18i32 as (usize));
                                *{
                                     let _old = op;
                                     op = op.offset(1 as (isize));
                                     _old
                                 } = 0i32 as (u8);
                                'loop10: loop {
                                    if tt > 255i32 as (usize) {
                                        tt = tt.wrapping_sub(255i32 as (usize));
                                        *{
                                             let _old = op;
                                             op = op.offset(1 as (isize));
                                             _old
                                         } = 0i32 as (u8);
                                        continue 'loop10;
                                    } else {
                                        break 'loop10;
                                    }
                                }
                                *{
                                     let _old = op;
                                     op = op.offset(1 as (isize));
                                     _old
                                 } = tt as (u8);
                            }
                            'loop14: loop {
                                put_unaligned(
                                    get_unaligned(
                                        ii as (*const u32) as (*const ::std::os::raw::c_void)
                                    ),
                                    op as (*mut u32) as (*mut ::std::os::raw::c_void)
                                );
                                put_unaligned(
                                    get_unaligned(
                                        ii.offset(
                                            4i32 as (isize)
                                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                                    ),
                                    op.offset(
                                        4i32 as (isize)
                                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                                );
                                put_unaligned(
                                    get_unaligned(
                                        ii.offset(
                                            8i32 as (isize)
                                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                                    ),
                                    op.offset(
                                        8i32 as (isize)
                                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                                );
                                put_unaligned(
                                    get_unaligned(
                                        ii.offset(8i32 as (isize)).offset(
                                            4i32 as (isize)
                                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                                    ),
                                    op.offset(8i32 as (isize)).offset(
                                        4i32 as (isize)
                                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                                );
                                op = op.offset(16i32 as (isize));
                                ii = ii.offset(16i32 as (isize));
                                t = t.wrapping_sub(16i32 as (usize));
                                if t >= 16i32 as (usize) {
                                    continue 'loop14;
                                } else {
                                    break 'loop14;
                                }
                            }
                            if t > 0i32 as (usize) {
                                'loop17: loop {
                                    *{
                                         let _old = op;
                                         op = op.offset(1 as (isize));
                                         _old
                                     } = *{
                                              let _old = ii;
                                              ii = ii.offset(1 as (isize));
                                              _old
                                          };
                                    if {
                                           t = t.wrapping_sub(1 as (usize));
                                           t
                                       } > 0i32 as (usize) {
                                        continue 'loop17;
                                    } else {
                                        break 'loop17;
                                    }
                                }
                            }
                        }
                    }
                    m_len = 4i32 as (usize);
                    if *ip.offset(m_len as (isize)) as (i32) == *m_pos.offset(
                                                                     m_len as (isize)
                                                                 ) as (i32) {
                        'loop22: loop {
                            m_len = m_len.wrapping_add(1i32 as (usize));
                            if *ip.offset(m_len as (isize)) as (i32) != *m_pos.offset(
                                                                             m_len as (isize)
                                                                         ) as (i32) {
                                break 'loop22;
                            } else {
                                m_len = m_len.wrapping_add(1i32 as (usize));
                                if *ip.offset(m_len as (isize)) as (i32) != *m_pos.offset(
                                                                                 m_len as (isize)
                                                                             ) as (i32) {
                                    break 'loop22;
                                } else {
                                    m_len = m_len.wrapping_add(1i32 as (usize));
                                    if *ip.offset(m_len as (isize)) as (i32) != *m_pos.offset(
                                                                                     m_len as (isize)
                                                                                 ) as (i32) {
                                        break 'loop22;
                                    } else {
                                        m_len = m_len.wrapping_add(1i32 as (usize));
                                        if *ip.offset(m_len as (isize)) as (i32) != *m_pos.offset(
                                                                                         m_len as (isize)
                                                                                     ) as (i32) {
                                            break 'loop22;
                                        } else {
                                            m_len = m_len.wrapping_add(1i32 as (usize));
                                            if *ip.offset(
                                                    m_len as (isize)
                                                ) as (i32) != *m_pos.offset(
                                                                   m_len as (isize)
                                                               ) as (i32) {
                                                break 'loop22;
                                            } else {
                                                m_len = m_len.wrapping_add(1i32 as (usize));
                                                if *ip.offset(
                                                        m_len as (isize)
                                                    ) as (i32) != *m_pos.offset(
                                                                       m_len as (isize)
                                                                   ) as (i32) {
                                                    break 'loop22;
                                                } else {
                                                    m_len = m_len.wrapping_add(1i32 as (usize));
                                                    if *ip.offset(
                                                            m_len as (isize)
                                                        ) as (i32) != *m_pos.offset(
                                                                           m_len as (isize)
                                                                       ) as (i32) {
                                                        break 'loop22;
                                                    } else {
                                                        m_len = m_len.wrapping_add(1i32 as (usize));
                                                        if ip.offset(m_len as (isize)) >= ip_end {
                                                            break 'loop22;
                                                        } else if *ip.offset(
                                                                       m_len as (isize)
                                                                   ) as (i32) == *m_pos.offset(
                                                                                      m_len as (isize)
                                                                                  ) as (i32) {
                                                            continue 'loop22;
                                                        } else {
                                                            break 'loop22;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    m_off = ((ip as (isize)).wrapping_sub(
                                 m_pos as (isize)
                             ) / ::std::mem::size_of::<u8>() as (isize)) as (usize);
                    ip = ip.offset(m_len as (isize));
                    ii = ip;
                    if m_len <= 8i32 as (usize) && (m_off <= 0x800i32 as (usize)) {
                        m_off = m_off.wrapping_sub(1i32 as (usize));
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_len.wrapping_sub(
                                  1i32 as (usize)
                              ) << 5i32 | (m_off & 7i32 as (usize)) << 2i32) as (u8);
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_off >> 3i32) as (u8);
                        continue 'loop3;
                    } else if m_off <= 0x4000i32 as (usize) {
                        m_off = m_off.wrapping_sub(1i32 as (usize));
                        if m_len <= 33i32 as (usize) {
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = (32i32 as (usize) | m_len.wrapping_sub(
                                                         2i32 as (usize)
                                                     )) as (u8);
                        } else {
                            m_len = m_len.wrapping_sub(33i32 as (usize));
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = (32i32 | 0i32) as (u8);
                            'loop42: loop {
                                if m_len > 255i32 as (usize) {
                                    m_len = m_len.wrapping_sub(255i32 as (usize));
                                    *{
                                         let _old = op;
                                         op = op.offset(1 as (isize));
                                         _old
                                     } = 0i32 as (u8);
                                    continue 'loop42;
                                } else {
                                    break 'loop42;
                                }
                            }
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = m_len as (u8);
                        }
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_off << 2i32) as (u8);
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_off >> 6i32) as (u8);
                        continue 'loop3;
                    } else {
                        m_off = m_off.wrapping_sub(0x4000i32 as (usize));
                        if m_len <= 9i32 as (usize) {
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = (16i32 as (usize) | m_off >> 11i32 & 8i32 as (usize) | m_len.wrapping_sub(
                                                                                            2i32 as (usize)
                                                                                        )) as (u8);
                        } else {
                            m_len = m_len.wrapping_sub(9i32 as (usize));
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = (16i32 as (usize) | m_off >> 11i32 & 8i32 as (usize)) as (u8);
                            'loop35: loop {
                                if m_len > 255i32 as (usize) {
                                    m_len = m_len.wrapping_sub(255i32 as (usize));
                                    *{
                                         let _old = op;
                                         op = op.offset(1 as (isize));
                                         _old
                                     } = 0i32 as (u8);
                                    continue 'loop35;
                                } else {
                                    break 'loop35;
                                }
                            }
                            *{
                                 let _old = op;
                                 op = op.offset(1 as (isize));
                                 _old
                             } = m_len as (u8);
                        }
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_off << 2i32) as (u8);
                        *{
                             let _old = op;
                             op = op.offset(1 as (isize));
                             _old
                         } = (m_off >> 6i32) as (u8);
                        continue 'loop3;
                    }
                }
            }
        }
    }
    *out_len = ((op as (isize)).wrapping_sub(
                    out as (isize)
                ) / ::std::mem::size_of::<u8>() as (isize)) as (usize);
    ((in_end as (isize)).wrapping_sub(
         ii.offset(-(ti as (isize))) as (isize)
     ) / ::std::mem::size_of::<u8>() as (isize)) as (usize)
}

#[no_mangle]
pub unsafe extern fn lzo1x_1_compress(
    mut in_ : *const u8,
    mut in_len : usize,
    mut out : *mut u8,
    mut out_len : *mut usize,
    mut wrkmem : *mut ::std::os::raw::c_void
) -> i32 {
    let mut ip : *const u8 = in_;
    let mut op : *mut u8 = out;
    let mut l : usize = in_len;
    let mut t : usize = 0i32 as (usize);
    'loop1: loop {
        if l > 20i32 as (usize) {
            let mut ll
                : usize
                = if l <= (0xbfffi32 + 1i32) as (usize) {
                      l
                  } else {
                      (0xbfffi32 + 1i32) as (usize)
                  };
            let mut ll_end : usize = (ip as (usize)).wrapping_add(ll);
            if ll_end.wrapping_add(t.wrapping_add(ll) >> 5i32) <= ll_end {
                break 'loop1;
            } else {
                memset(
                    wrkmem,
                    0i32,
                    ((1u32 << 13i32) as (usize)).wrapping_mul(
                        ::std::mem::size_of::<u16>()
                    )
                );
                t = lzo1x_1_do_compress(ip,ll,op,out_len,t,wrkmem);
                ip = ip.offset(ll as (isize));
                op = op.offset(*out_len as (isize));
                l = l.wrapping_sub(ll);
                continue 'loop1;
            }
        } else {
            break 'loop1;
        }
    }
    t = t.wrapping_add(l);
    if t > 0i32 as (usize) {
        let mut ii
            : *const u8
            = in_.offset(in_len as (isize)).offset(-(t as (isize)));
        if op == out && (t <= 238i32 as (usize)) {
            *{
                 let _old = op;
                 op = op.offset(1 as (isize));
                 _old
             } = (17i32 as (usize)).wrapping_add(t) as (u8);
        } else if t <= 3i32 as (usize) {
            let _rhs = t;
            let _lhs = &mut *op.offset(-2i32 as (isize));
            *_lhs = (*_lhs as (usize) | _rhs) as (u8);
        } else if t <= 18i32 as (usize) {
            *{
                 let _old = op;
                 op = op.offset(1 as (isize));
                 _old
             } = t.wrapping_sub(3i32 as (usize)) as (u8);
        } else {
            let mut tt : usize = t.wrapping_sub(18i32 as (usize));
            *{
                 let _old = op;
                 op = op.offset(1 as (isize));
                 _old
             } = 0i32 as (u8);
            'loop9: loop {
                if tt > 255i32 as (usize) {
                    tt = tt.wrapping_sub(255i32 as (usize));
                    *{
                         let _old = op;
                         op = op.offset(1 as (isize));
                         _old
                     } = 0i32 as (u8);
                    continue 'loop9;
                } else {
                    break 'loop9;
                }
            }
            *{
                 let _old = op;
                 op = op.offset(1 as (isize));
                 _old
             } = tt as (u8);
        }
        if t >= 16i32 as (usize) {
            'loop16: loop {
                put_unaligned(
                    get_unaligned(
                        ii as (*const u32) as (*const ::std::os::raw::c_void)
                    ),
                    op as (*mut u32) as (*mut ::std::os::raw::c_void)
                );
                put_unaligned(
                    get_unaligned(
                        ii.offset(
                            4i32 as (isize)
                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                    ),
                    op.offset(
                        4i32 as (isize)
                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                );
                put_unaligned(
                    get_unaligned(
                        ii.offset(
                            8i32 as (isize)
                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                    ),
                    op.offset(
                        8i32 as (isize)
                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                );
                put_unaligned(
                    get_unaligned(
                        ii.offset(8i32 as (isize)).offset(
                            4i32 as (isize)
                        ) as (*const u32) as (*const ::std::os::raw::c_void)
                    ),
                    op.offset(8i32 as (isize)).offset(
                        4i32 as (isize)
                    ) as (*mut u32) as (*mut ::std::os::raw::c_void)
                );
                op = op.offset(16i32 as (isize));
                ii = ii.offset(16i32 as (isize));
                t = t.wrapping_sub(16i32 as (usize));
                if t >= 16i32 as (usize) {
                    continue 'loop16;
                } else {
                    break 'loop16;
                }
            }
        }
        if t > 0i32 as (usize) {
            'loop19: loop {
                *{
                     let _old = op;
                     op = op.offset(1 as (isize));
                     _old
                 } = *{
                          let _old = ii;
                          ii = ii.offset(1 as (isize));
                          _old
                      };
                if {
                       t = t.wrapping_sub(1 as (usize));
                       t
                   } > 0i32 as (usize) {
                    continue 'loop19;
                } else {
                    break 'loop19;
                }
            }
        }
    }
    *{
         let _old = op;
         op = op.offset(1 as (isize));
         _old
     } = (16i32 | 1i32) as (u8);
    *{
         let _old = op;
         op = op.offset(1 as (isize));
         _old
     } = 0i32 as (u8);
    *{
         let _old = op;
         op = op.offset(1 as (isize));
         _old
     } = 0i32 as (u8);
    *out_len = ((op as (isize)).wrapping_sub(
                    out as (isize)
                ) / ::std::mem::size_of::<u8>() as (isize)) as (usize);
    0i32
}