/* * This file is part of DGD, http://dgd-osr.sourceforge.net/ * Copyright (C) 1993-2010 Dworkin B.V. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ # ifndef FUNCDEF # include "kfun.h" # endif # ifdef FUNCDEF FUNCDEF("fabs", kf_fabs, pt_fabs, 0) # else char pt_fabs[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->fabs() * DESCRIPTION: return the absolute value of a float */ int kf_fabs(f) frame *f; { xfloat flt; i_add_ticks(f, 1); GET_FLT(f->sp, flt); FLT_ABS(flt.high, flt.low); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("floor", kf_floor, pt_floor, 0) # else char pt_floor[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->floor() * DESCRIPTION: round the argument downwards */ int kf_floor(f) register frame *f; { xfloat flt; i_add_ticks(f, 1); GET_FLT(f->sp, flt); flt_floor(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("ceil", kf_ceil, pt_ceil, 0) # else char pt_ceil[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->ceil() * DESCRIPTION: round the argument upwards */ int kf_ceil(f) register frame *f; { xfloat flt; i_add_ticks(f, 1); GET_FLT(f->sp, flt); flt_ceil(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("fmod", kf_fmod, pt_fmod, 0) # else char pt_fmod[] = { C_TYPECHECKED | C_STATIC, 2, 0, 0, 8, T_FLOAT, T_FLOAT, T_FLOAT }; /* * NAME: kfun->fmod() * DESCRIPTION: compute fmod */ int kf_fmod(f) register frame *f; { xfloat f1, f2; i_add_ticks(f, 1); GET_FLT(f->sp, f2); f->sp++; GET_FLT(f->sp, f1); flt_fmod(&f1, &f2); PUT_FLT(f->sp, f1); return 0; } # endif # ifdef FUNCDEF FUNCDEF("frexp", kf_frexp, pt_frexp, 0) # else char pt_frexp[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, (1 << REFSHIFT) | T_MIXED, T_FLOAT }; /* * NAME: kfun->frexp() * DESCRIPTION: split a float into a fraction and an exponent */ int kf_frexp(f) register frame *f; { xfloat flt; Int num; array *a; i_add_ticks(f, 2); GET_FLT(f->sp, flt); num = flt_frexp(&flt); a = arr_new(f->data, 2L); PUT_FLTVAL(&a->elts[0], flt); PUT_INTVAL(&a->elts[1], num); PUT_ARRVAL(f->sp, a); return 0; } # endif # ifdef FUNCDEF FUNCDEF("ldexp", kf_ldexp, pt_ldexp, 0) # else char pt_ldexp[] = { C_TYPECHECKED | C_STATIC, 2, 0, 0, 8, T_FLOAT, T_FLOAT, T_INT }; /* * NAME: kfun->ldexp() * DESCRIPTION: make a float from a fraction and an exponent */ int kf_ldexp(f) register frame *f; { xfloat flt; i_add_ticks(f, 1); GET_FLT(f->sp + 1, flt); flt_ldexp(&flt, f->sp->u.number); f->sp++; PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("modf", kf_modf, pt_modf, 0) # else char pt_modf[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, (1 << REFSHIFT) | T_FLOAT, T_FLOAT }; /* * NAME: kfun->modf() * DESCRIPTION: split float into fraction and integer part */ int kf_modf(f) register frame *f; { xfloat f1, f2; array *a; i_add_ticks(f, 2); GET_FLT(f->sp, f1); flt_modf(&f1, &f2); a = arr_new(f->data, 2L); PUT_FLTVAL(&a->elts[0], f1); PUT_FLTVAL(&a->elts[1], f2); PUT_ARRVAL(f->sp, a); return 0; } # endif # ifdef FUNCDEF FUNCDEF("exp", kf_exp, pt_exp, 0) # else char pt_exp[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->exp() * DESCRIPTION: compute exp */ int kf_exp(f) register frame *f; { xfloat flt; i_add_ticks(f, 21); GET_FLT(f->sp, flt); flt_exp(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("log", kf_log, pt_log, 0) # else char pt_log[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->log() * DESCRIPTION: compute log */ int kf_log(f) register frame *f; { xfloat flt; i_add_ticks(f, 35); GET_FLT(f->sp, flt); flt_log(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("log10", kf_log10, pt_log10, 0) # else char pt_log10[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->log10() * DESCRIPTION: compute log10 */ int kf_log10(f) register frame *f; { xfloat flt; i_add_ticks(f, 41); GET_FLT(f->sp, flt); flt_log10(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("pow", kf_pow, pt_pow, 0) # else char pt_pow[] = { C_TYPECHECKED | C_STATIC, 2, 0, 0, 8, T_FLOAT, T_FLOAT, T_FLOAT }; /* * NAME: kfun->pow() * DESCRIPTION: compute pow */ int kf_pow(f) register frame *f; { xfloat f1, f2; i_add_ticks(f, 48); GET_FLT(f->sp, f2); f->sp++; GET_FLT(f->sp, f1); flt_pow(&f1, &f2); PUT_FLT(f->sp, f1); return 0; } # endif # ifdef FUNCDEF FUNCDEF("sqrt", kf_sqrt, pt_sqrt, 0) # else char pt_sqrt[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->sqrt() * DESCRIPTION: compute sqrt */ int kf_sqrt(f) register frame *f; { xfloat flt; i_add_ticks(f, 11); GET_FLT(f->sp, flt); flt_sqrt(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("cos", kf_cos, pt_cos, 0) # else char pt_cos[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->cos() * DESCRIPTION: compute cos */ int kf_cos(f) register frame *f; { xfloat flt; i_add_ticks(f, 25); GET_FLT(f->sp, flt); flt_cos(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("sin", kf_sin, pt_sin, 0) # else char pt_sin[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->sin() * DESCRIPTION: compute sin */ int kf_sin(f) register frame *f; { xfloat flt; i_add_ticks(f, 25); GET_FLT(f->sp, flt); flt_sin(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("tan", kf_tan, pt_tan, 0) # else char pt_tan[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->tan() * DESCRIPTION: compute tan */ int kf_tan(f) register frame *f; { xfloat flt; i_add_ticks(f, 31); GET_FLT(f->sp, flt); flt_tan(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("acos", kf_acos, pt_acos, 0) # else char pt_acos[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->acos() * DESCRIPTION: compute acos */ int kf_acos(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_acos(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("asin", kf_asin, pt_asin, 0) # else char pt_asin[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->asin() * DESCRIPTION: compute asin */ int kf_asin(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_asin(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("atan", kf_atan, pt_atan, 0) # else char pt_atan[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->atan() * DESCRIPTION: compute atan */ int kf_atan(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_atan(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("atan2", kf_atan2, pt_atan2, 0) # else char pt_atan2[] = { C_TYPECHECKED | C_STATIC, 2, 0, 0, 8, T_FLOAT, T_FLOAT, T_FLOAT }; /* * NAME: kfun->atan2() * DESCRIPTION: compute atan2 */ int kf_atan2(f) register frame *f; { xfloat f1, f2; i_add_ticks(f, 27); GET_FLT(f->sp, f2); f->sp++; GET_FLT(f->sp, f1); flt_atan2(&f1, &f2); PUT_FLT(f->sp, f1); return 0; } # endif # ifdef FUNCDEF FUNCDEF("cosh", kf_cosh, pt_cosh, 0) # else char pt_cosh[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->cosh() * DESCRIPTION: compute cosh */ int kf_cosh(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_cosh(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("sinh", kf_sinh, pt_sinh, 0) # else char pt_sinh[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->sinh() * DESCRIPTION: compute sinh */ int kf_sinh(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_sinh(&flt); PUT_FLT(f->sp, flt); return 0; } # endif # ifdef FUNCDEF FUNCDEF("tanh", kf_tanh, pt_tanh, 0) # else char pt_tanh[] = { C_TYPECHECKED | C_STATIC, 1, 0, 0, 7, T_FLOAT, T_FLOAT }; /* * NAME: kfun->tanh() * DESCRIPTION: compute tanh */ int kf_tanh(f) register frame *f; { xfloat flt; i_add_ticks(f, 24); GET_FLT(f->sp, flt); flt_tanh(&flt); PUT_FLT(f->sp, flt); return 0; } # endif