diff --git a/utshell-0.5/r_expr/src/lib.rs b/utshell-0.5/r_expr/src/lib.rs index 15ad0a8d5ba87cc619bc03270608dddfde6613fb..9583efeb7c7f841ffb7ec925304010e98a8a2611 100644 --- a/utshell-0.5/r_expr/src/lib.rs +++ b/utshell-0.5/r_expr/src/lib.rs @@ -330,4 +330,43 @@ unsafe extern "C" fn expr_bind_array_element( b"../expr.c\0" as *const u8 as *const libc::c_char, 387 as libc::c_int, ); +} + +#[no_mangle] +unsafe extern "C" fn ipow(mut base: intmax_t, mut exp: intmax_t) -> intmax_t { + let mut result: intmax_t = 0; + result = 1 as libc::c_int as intmax_t; + while exp != 0 { + if exp & 1 as libc::c_int as libc::c_long != 0 { + result *= base; + } + exp >>= 1 as libc::c_int; + base *= base; + } + return result; +} + +#[no_mangle] +unsafe extern "C" fn exp1() -> intmax_t { + let mut val: intmax_t = 0; + if curtok == '!' as i32 { + readtok(); + val = (exp1() == 0) as libc::c_int as intmax_t; + lasttok = 6 as libc::c_int; + } else if curtok == '~' as i32 { + readtok(); + val = !exp1(); + lasttok = 6 as libc::c_int; + } else if curtok == '-' as i32 { + readtok(); + val = -exp1(); + lasttok = 6 as libc::c_int; + } else if curtok == '+' as i32 { + readtok(); + val = exp1(); + lasttok = 6 as libc::c_int; + } else { + val = exp0(); + } + return val; } \ No newline at end of file