use crate::sexprec::{SEXP, SEXPREC, SEXPTYPE};
use ::libc;
extern "C" {
#[no_mangle]
fn sqrt(_: libc::c_double) -> libc::c_double;
#[no_mangle]
fn error(_: *const libc::c_char, _: ...) -> !;
#[no_mangle]
fn isReal(s: SEXP) -> Rboolean;
#[no_mangle]
fn LENGTH(x: SEXP) -> libc::c_int;
#[no_mangle]
fn REAL(x: SEXP) -> *mut libc::c_double;
#[no_mangle]
fn coerceVector(_: SEXP, _: SEXPTYPE) -> SEXP;
#[no_mangle]
fn duplicate(_: SEXP) -> SEXP;
#[no_mangle]
fn isInteger(_: SEXP) -> Rboolean;
#[no_mangle]
fn protect(_: SEXP) -> SEXP;
#[no_mangle]
fn unprotect(_: libc::c_int);
#[no_mangle]
fn dcgettext(
__domainname: *const libc::c_char,
__msgid: *const libc::c_char,
__category: libc::c_int,
) -> *mut libc::c_char;
}
pub type Rboolean = libc::c_uint;
pub const TRUE: Rboolean = 1;
pub const FALSE: Rboolean = 0;
#[no_mangle]
pub unsafe extern "C" fn monoFC_mod(
mut m: *mut libc::c_double,
mut S: *mut libc::c_double,
mut n: libc::c_int,
) {
if n < 2 as libc::c_int {
error(dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"n must be at least two\x00" as *const u8 as *const libc::c_char,
5 as libc::c_int,
));
}
let mut k: libc::c_int = 0 as libc::c_int;
while k < n - 1 as libc::c_int {
let mut Sk: libc::c_double = *S.offset(k as isize);
let mut k1: libc::c_int = k + 1 as libc::c_int;
if Sk == 0.0f64 {
let ref mut fresh0 = *m.offset(k1 as isize);
*fresh0 = 0.0f64;
*m.offset(k as isize) = *fresh0
} else {
let mut alpha: libc::c_double = *m.offset(k as isize) / Sk;
let mut beta: libc::c_double = *m.offset(k1 as isize) / Sk;
let mut a2b3: libc::c_double = 0.;
let mut ab23: libc::c_double = 0.;
a2b3 = 2 as libc::c_int as libc::c_double * alpha + beta
- 3 as libc::c_int as libc::c_double;
if a2b3 > 0 as libc::c_int as libc::c_double
&& {
ab23 = alpha + 2 as libc::c_int as libc::c_double * beta
- 3 as libc::c_int as libc::c_double;
(ab23) > 0 as libc::c_int as libc::c_double
}
&& alpha * (a2b3 + ab23) < a2b3 * a2b3
{
let mut tauS: libc::c_double =
3 as libc::c_int as libc::c_double * Sk / sqrt(alpha * alpha + beta * beta);
*m.offset(k as isize) = tauS * alpha;
*m.offset(k1 as isize) = tauS * beta
}
}
k += 1
}
}
#[no_mangle]
pub unsafe extern "C" fn monoFC_m(mut m: SEXP, mut Sx: SEXP) -> SEXP {
let mut val: SEXP = 0 as *mut SEXPREC;
let mut n: libc::c_int = LENGTH(m);
if isInteger(m) as u64 != 0 {
val = protect(coerceVector(m, 14 as libc::c_int as SEXPTYPE))
} else {
if isReal(m) as u64 == 0 {
error(dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"Argument m must be numeric\x00" as *const u8 as *const libc::c_char,
5 as libc::c_int,
));
}
val = protect(duplicate(m))
}
if n < 2 as libc::c_int {
error(dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"length(m) must be at least two\x00" as *const u8 as *const libc::c_char,
5 as libc::c_int,
));
}
if isReal(Sx) as u64 == 0 || LENGTH(Sx) != n - 1 as libc::c_int {
error(dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"Argument Sx must be numeric vector one shorter than m[]\x00" as *const u8
as *const libc::c_char,
5 as libc::c_int,
));
}
monoFC_mod(REAL(val), REAL(Sx), n);
unprotect(1 as libc::c_int);
return val;
}