コード例 #1
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_uint64_t
ecl_to_uint64_t(cl_object x) {
	if (!ecl_minusp(x)) {
		if (ECL_FIXNUMP(x)) {
			return (ecl_uint64_t)ecl_fixnum(x);
		} else if (!ECL_BIGNUMP(x)) {
			(void)0;
		} else if (mpz_fits_ulong_p(x->big.big_num)) {
			return (ecl_uint64_t)mpz_get_ui(x->big.big_num);
		} else {
			cl_object copy = _ecl_big_register0();
			mpz_fdiv_q_2exp(copy->big.big_num, x->big.big_num, 32);
			if (mpz_fits_ulong_p(copy->big.big_num)) {
				volatile ecl_uint64_t output;
				output = (ecl_uint64_t)mpz_get_ui(copy->big.big_num);
				output = (output << 32) +
					(ecl_uint64_t)mpz_get_ui(x->big.big_num);
				return output;
			}
		}
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),ecl_make_fixnum(0),
				      ecl_one_minus(ecl_ash(ecl_make_fixnum(1), 64))),
			      x);
}
コード例 #2
0
ファイル: num_rand.c プロジェクト: great90/gcl
static object
make_random_state(object rs) {

  object z;
  
  if (rs==Cnil)
    rs=symbol_value(Vrandom_state);
  
  if (rs!=Ct && type_of(rs) != t_random) {
    FEwrong_type_argument(sLrandom_state, rs);
    return(Cnil);
  }
  
  z = alloc_object(t_random);
  init_gmp_rnd_state(&z->rnd.rnd_state);

    
  if (rs == Ct) 
    gmp_randseed_ui(&z->rnd.rnd_state,RS_DEF_INIT);
  else
    memcpy(z->rnd.rnd_state._mp_seed->_mp_d,rs->rnd.rnd_state._mp_seed->_mp_d,
	   rs->rnd.rnd_state._mp_seed->_mp_alloc*sizeof(*z->rnd.rnd_state._mp_seed->_mp_d));
  
#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
  z->rnd.rnd_state._mp_algdata._mp_lc=&Mersenne_Twister_Generator_Noseed;
#endif
  return(z);

}
コード例 #3
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_long_long_t
ecl_to_long_long(cl_object x)
{
	if (ECL_FIXNUMP(x)) {
		return (ecl_long_long_t)ecl_fixnum(x);
	} else if (!ECL_BIGNUMP(x)) {
		(void)0;
	} else if (mpz_fits_slong_p(x->big.big_num)) {
		return (ecl_long_long_t)mpz_get_si(x->big.big_num);
	} else {
		cl_object copy = _ecl_big_register0();
		int i = ECL_LONG_LONG_BITS - FIXNUM_BITS;
		mpz_fdiv_q_2exp(copy->bit.big_num, x->big.big_num, i);
		if (mpz_fits_ulong_p(copy->big.big_num)) {
			volatile ecl_long_long_t output;
			output = mpz_get_si(copy->big.big_num);
			for (i -= FIXNUM_BITS; i; i-= FIXNUM_BITS) {
				output = (output << FIXNUM_BITS);
				output += mpz_get_ui(x->big.big_num);
			}
			return output;
		}
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),
				      ecl_negate(ecl_ash(ecl_make_fixnum(1), ECL_LONG_LONG_BITS-1)),
				      ecl_one_minus(ecl_ash(ecl_make_fixnum(1), ECL_LONG_LONG_BITS-1))),
			      x);
}
コード例 #4
0
ファイル: eval.c プロジェクト: great90/gcl
static object
kar(object x) {
  if (consp(x))
    return(x->c.c_car);
  FEwrong_type_argument(sLcons, x);
  return(Cnil);
}
コード例 #5
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_uint8_t
ecl_to_uint8_t(cl_object x) {
	if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum aux = ecl_fixnum(x);
		if (ecl_likely(aux >= 0 && aux <= 255))
			return (ecl_uint8_t)aux;
	}
	FEwrong_type_argument(cl_list(2, ECL_SYM("UNSIGNED-BYTE",885), ecl_make_fixnum(8)),
			      x);
}
コード例 #6
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_int8_t
ecl_to_int8_t(cl_object x) {
	if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum aux = ecl_fixnum(x);
		if (ecl_likely(aux >= -128 && aux <= 127))
			return (ecl_uint8_t)aux;
	}
	FEwrong_type_argument(cl_list(2, ECL_SYM("SIGNED-BYTE",761), ecl_make_fixnum(8)),
			      x);
}
コード例 #7
0
ファイル: big.o.c プロジェクト: hoobaa/mecl
cl_fixnum
fixint(cl_object x)
{
        if (ECL_FIXNUMP(x))
                return ecl_fixnum(x);
        if (ECL_BIGNUMP(x)) {
                if (mpz_fits_slong_p(x->big.big_num)) {
                        return mpz_get_si(x->big.big_num);
                }
        }
	FEwrong_type_argument(ecl_make_fixnum(/*FIXNUM*/372), x);
}
コード例 #8
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_uint32_t
ecl_to_uint32_t(cl_object x) {
	const uint32_t uint32_max = 0xFFFFFFFFUL;
	if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum y = ecl_fixnum(x);
		if (ecl_likely(y >= 0 && y <= uint32_max)) {
			return (ecl_uint32_t)y;
                }
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),ecl_make_fixnum(0),
				      ecl_make_unsigned_integer(uint32_max)),
			      x);
}
コード例 #9
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
unsigned short
ecl_to_ushort(cl_object x) {
	const unsigned short ushort_max = USHRT_MAX;
        if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum y = ecl_fixnum(x);
		if (ecl_likely(y >= 0 && y <= ushort_max)) {
			return (unsigned short)y;
                }
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),
				      ecl_make_fixnum(0),
				      ecl_make_fixnum(ushort_max)),
			      x);
}
コード例 #10
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
assert_type_non_negative_integer(cl_object p)
{
	cl_type t = ecl_t_of(p);

	if (t == t_fixnum) {
		if (ecl_fixnum_plusp(p))
			return;
	} else if (t == t_bignum) {
		if (_ecl_big_sign(p) >= 0)
			return;
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),ecl_make_fixnum(0),ECL_SYM("*",18)), p);
}
コード例 #11
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
short
ecl_to_short(cl_object x) {
	const short short_min = SHRT_MIN;
	const short short_max = SHRT_MAX;
	if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum y = ecl_fixnum(x);
		if (ecl_likely(y >= short_min && y <= short_max)) {
			return (short)y;
                }
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),
				      ecl_make_fixnum(short_min),
				      ecl_make_fixnum(short_max)),
			      x);
}
コード例 #12
0
ファイル: number.o.c プロジェクト: hoobaa/mecl
ecl_int32_t
ecl_to_int32_t(cl_object x) {
	const int32_t int32_min = -0x80000000L;
	const int32_t int32_max =  0x7FFFFFFFL;
	if (ecl_likely(ECL_FIXNUMP(x))) {
		cl_fixnum y = ecl_fixnum(x);
		if (ecl_likely(y >= int32_min && y <= int32_max)) {
			return (ecl_int32_t)y;
                }
	}
	FEwrong_type_argument(cl_list(3,ECL_SYM("INTEGER",437),
				      ecl_make_integer(int32_min),
				      ecl_make_integer(int32_max)),
			      x);
}
コード例 #13
0
ファイル: big.o.c プロジェクト: hoobaa/mecl
cl_index
fixnnint(cl_object x)
{
        if (ECL_FIXNUMP(x)) {
                cl_fixnum i = ecl_fixnum(x);
                if (i >= 0)
                        return i;
        } else if (ECL_BIGNUMP(x)) {
                if (mpz_fits_ulong_p(x->big.big_num)) {
                        return mpz_get_ui(x->big.big_num);
                }
        }
	FEwrong_type_argument(cl_list(3, ECL_SYM("INTEGER",437), ecl_make_fixnum(0),
				      ecl_make_fixnum(MOST_POSITIVE_FIXNUM)),
			      x);
}
コード例 #14
0
ファイル: num_rand.c プロジェクト: great90/gcl
static object
rando(object x, object rs) {

  enum type tx;
  object base,out,z;
  fixnum fbase;
  double d;
  
  tx = type_of(x);
  if (number_compare(x, small_fixnum(0)) != 1)
    FEwrong_type_argument(TSpositive_number, x);
  
  if (tx==t_bignum) {
    out=new_bignum();
    base=x;
    fbase=-1;
  } else {
    out=big_fixnum1;
    fbase=tx==t_fixnum ? fix(x) : MOST_POSITIVE_FIX;
    mpz_set_si(MP(big_fixnum2),fbase);
    base=big_fixnum2;
  }
  
  mpz_urandomm(MP(out),&rs->rnd.rnd_state,MP(base));
  
  switch (tx) {
    
  case t_fixnum:
    return make_fixnum(mpz_get_si(MP(out)));
  case t_bignum:
    return normalize_big(out);
  case t_shortfloat: case t_longfloat:
    d=mpz_get_d(MP(out));
    d/=(double)fbase;
    z=alloc_object(tx);
    if (tx==t_shortfloat) sf(z)=sf(x)*d; else lf(z)=lf(x)*d;
    return z;
  default:
    FEerror("~S is not an integer nor a floating-point number.", 1, x);
    return(Cnil);
  }
}
コード例 #15
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_cons(cl_object x) {
	FEwrong_type_argument(ecl_make_fixnum(/*CONS*/251), x);
}
コード例 #16
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_size(cl_object x) {
	FEwrong_type_argument(cl_list(3, ECL_SYM("INTEGER",437), ecl_make_fixnum(0),
				      ecl_make_fixnum(MOST_POSITIVE_FIXNUM)),
			      x);
}
コード例 #17
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_list(cl_object x) {
	FEwrong_type_argument(ecl_make_fixnum(/*LIST*/481), x);
}
コード例 #18
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_array(cl_object v)
{
	FEwrong_type_argument(ecl_make_fixnum(/*ARRAY*/96), v);
}
コード例 #19
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_vector(cl_object v)
{
	FEwrong_type_argument(ecl_make_fixnum(/*VECTOR*/898), v);
}
コード例 #20
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_sequence(cl_object x) {
	FEwrong_type_argument(ecl_make_fixnum(/*SEQUENCE*/741), x);
}
コード例 #21
0
ファイル: typespec.o.c プロジェクト: hoobaa/mecl
void
FEtype_error_fixnum(cl_object x) {
	FEwrong_type_argument(ecl_make_fixnum(/*FIXNUM*/372), x);
}
コード例 #22
0
ファイル: misc.c プロジェクト: hitchiker42/my-code
/*	optimize speed 3, debug 3, space 0, safety 2                  */
static cl_object L1seq(cl_narg narg, ...)
{
 cl_object T0;
 struct ecl_ihs_frame ihs;
 const cl_object _ecl_debug_env = ECL_NIL;
 const cl_env_ptr cl_env_copy = ecl_process_env();
 cl_object value0;
 ecl_cs_check(cl_env_copy,value0);
 {
  cl_object V1;
  cl_object V2;
  cl_object V3;
  ecl_va_list args; ecl_va_start(args,narg,narg,0);
  {
   ecl_ihs_push(cl_env_copy,&ihs,VV[0],_ecl_debug_env);
   {
    cl_object keyvars[6];
    cl_parse_key(args,3,L1seqkeys,keyvars,NULL,FALSE);
    ecl_va_end(args);
    if (Null(keyvars[3])) {
     V1 = ecl_make_fixnum(0);
    } else {
     V1 = keyvars[0];
    }
    if (Null(keyvars[4])) {
     V2 = ecl_make_fixnum(10);
    } else {
     V2 = keyvars[1];
    }
    if (Null(keyvars[5])) {
     V3 = ecl_make_fixnum(1);
    } else {
     V3 = keyvars[2];
    }
   }
   {
    cl_object V4;                                 /*  I               */
    cl_object V5;
    cl_object V6;
    {
     T0 = cl_realp(V1);
     if (ecl_unlikely(!((T0)!=ECL_NIL)))
         FEwrong_type_argument(ECL_SYM("REAL",703),V1);
     V4 = V1;
    }
    {
     T0 = cl_realp(V2);
     if (ecl_unlikely(!((T0)!=ECL_NIL)))
         FEwrong_type_argument(ECL_SYM("REAL",703),V2);
     V5 = V2;
    }
    {
     T0 = cl_realp(V3);
     if (ecl_unlikely(!((T0)!=ECL_NIL)))
         FEwrong_type_argument(ECL_SYM("REAL",703),V3);
     V6 = V3;
    }
    {
     static const struct ecl_var_debug_info _ecl_descriptors[]={
     {"#:LOOP-STEP-BY1",_ecl_object_loc}
     ,{"#:LOOP-LIMIT0",_ecl_object_loc}
     ,{"COMMON-LISP-USER::I",_ecl_object_loc}};
     const cl_index _ecl_debug_info_raw[]={
     (cl_index)(_ecl_debug_env),(cl_index)(_ecl_descriptors),(cl_index)(&V6),(cl_index)(&V5),(cl_index)(&V4)};
     ecl_def_ct_vector(_ecl_debug_env,ecl_aet_index,_ecl_debug_info_raw,5,,);
     ihs.lex_env = _ecl_debug_env;
     {
      cl_object V7;
      cl_object V8;
      V7 = ecl_list1(ECL_NIL);
      V8 = V7;
      {
       static const struct ecl_var_debug_info _ecl_descriptors[]={
       {"#:LOOP-LIST-TAIL3",_ecl_object_loc}
       ,{"#:LOOP-LIST-HEAD2",_ecl_object_loc}};
       const cl_index _ecl_debug_info_raw[]={
       (cl_index)(_ecl_debug_env),(cl_index)(_ecl_descriptors),(cl_index)(&V8),(cl_index)(&V7)};
       ecl_def_ct_vector(_ecl_debug_env,ecl_aet_index,_ecl_debug_info_raw,4,,);
       ihs.lex_env = _ecl_debug_env;
L12:;
       if (!(ecl_number_compare(V4,V5)>0)) { goto L14; }
       goto L13;
L14:;
       T0 = V8;
       V8 = ecl_list1(V4);
       cl_rplacd(T0, V8);
       V4 = ecl_plus(V4,V6);
       goto L12;
L13:;
       value0 = ecl_cdr(V7);
       cl_env_copy->nvalues = 1;
       ecl_ihs_pop(cl_env_copy);
       return value0;
      }
      ihs.lex_env = _ecl_debug_env;
     }
    }
    ihs.lex_env = _ecl_debug_env;
   }
  }
 }
}
コード例 #23
0
ファイル: rwlock.o.c プロジェクト: hoobaa/mecl
static void
FEerror_not_a_rwlock(cl_object lock)
{
        FEwrong_type_argument(ECL_SYM("MP::RWLOCK",1435), lock);
}