All pastes #636281 Raw Edit

Something

public text v1 · immutable
#636281 ·published 2007-07-27 19:28 UTC
rendered paste body
// =====================================================================================================================================
// allen_cpu_lib_trigonometry.c - Allen version 2.0
// ===================================================================================================================================== 
//
// This file is part of the Allen Library.
// Last modified: Saturday July 14, 2007.
//
// Copyright (c) 2007, Archville, BSD License.
// A copy can be found here: http://www.opensource.org/licenses/bsd-license.php
// Initally based on Salvatore <antirez> Sanfilippo within Picol 0.1.0
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, 
// are permitted provided that the following conditions are met:
//
//  * Redistributions of source code must retain the above copyright notice, 
//    this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above copyright notice, 
//    this list of conditions and the following disclaimer in the documentation 
//    and/or other materials provided with the distribution.
//  * Neither the name of the Garabatos de licor nor the names of its contributors may 
//    be used to endorse or promote products derived from this software 
//    without specific prior written permission.
//
// This software is provided by the copyright holders and contributors
// "as is" and any express or implied warranties, including, but not
// limited to, the implied warranties of merchantability and fitness for
// a particular purpose are disclaimed. in no event shall the copyright owner or
// contributors be liable for any direct, indirect, incidental, special,
// exemplary, or consequential damages (including, but not limited to,
// procurement of substitute goods or services; loss of use, data, or
// profits; or business interruption) however caused and on any theory of
// liability, whether in contract, strict liability, or tort (including
// negligence or otherwise) arising in any way out of the use of this
// software, even if advised of the possibility of such damage.

// =====================================================================================================================================
// Include libraries.
// =====================================================================================================================================

#include <stdio.h>                       // Standard input/output.
#include <stdlib.h>                      // Standard C libraries.
#include <string.h>                      // String libraries.
#include <math.h>                        // Math libraries.
#include <ctype.h>                       // Types and conversion libraries.

#include "allen_interpreter.h"           // Main interpreter library.
#include "allen_parser.h"                // Main parser library.

// =====================================================================================================================================
// Parameters.
// =====================================================================================================================================

#define TLIB_TRIG_BSIZE  1024            // Buffer size.

// =====================================================================================================================================
// Possible errors.
// =====================================================================================================================================

#define TLIB_TRIG_EHLP   "trig.?: command not found in library" // Error: Command not found in math library.

// =====================================================================================================================================
// Tokens.
// ====================================================================================================================================

#define TLIB_TRIG_SIN     "trig.sin"     // Sine.
#define TLIB_TRIG_COS     "trig.cos"     // Cosine.
#define TLIB_TRIG_TAN     "trig.tan"     // Tangent. 
#define TLIB_TRIG_SEC     "trig.sec"     // Secant.
#define TLIB_TRIG_COSEC   "trig.cosec"   // Cosecant.
#define TLIB_TRIG_COTAN   "trig.cotan"   // Cotangent.
#define TLIB_TRIG_ASIN    "trig.asin"    // Arc sine.
#define TLIB_TRIG_ACOS    "trig.acos"    // Arc cosine.
#define TLIB_TRIG_ATAN    "trig.atan"    // Arc tangent.
#define TLIB_TRIG_ASEC    "trig.asec"    // Arc secant.
#define TLIB_TRIG_ACOSEC  "trig.acosec"  // Arc cosecant.
#define TLIB_TRIG_ACOTAN  "trig.acotan"  // Arc cotangent.
#define TLIB_TRIG_HSIN    "trig.sinh"    // Hyperbolic sine.
#define TLIB_TRIG_HCOS    "trig.cosh"    // Hyperbolic cosine.
#define TLIB_TRIG_HTAN    "trig.tanh"    // Hyperbolic tangent.
#define TLIB_TRIG_HSEC    "trig.sech"    // Hyperbolic secant.
#define TLIB_TRIG_HCOSEC  "trig.cosech"  // Hyperbolic cosecant.
#define TLIB_TRIG_HCOTAN  "trig.cotanh"  // Hyperbolic cotangent.
#define TLIB_TRIG_HASIN   "trig.asinh"   // Hyperbolic arc sine.
#define TLIB_TRIG_HACOS   "trig.acosh"   // Hyperbolic arc cosine.
#define TLIB_TRIG_HATAN   "trig.atanh"   // Hyperbolic arc tangent.
#define TLIB_TRIG_HASEC   "trig.asech"   // Hyperbolic arc secant.
#define TLIB_TRIG_HACOSEC "trig.acosech" // Hyperbolic arc cosecant.
#define TLIB_TRIG_HACOTAN "trig.acotanh" // Hyperbolic arc cotangent.

// =====================================================================================================================================
// Helper Function.
// =====================================================================================================================================

#define TLIB_TRIG_HLP     "trig.?"       // Helper function.
#define TLIB_TRIG_NIL     "nil"          // Null value.

// =====================================================================================================================================
// Basic math operators.
// =====================================================================================================================================

// Allows to perform regular trigonometric operations on value lists
// and return results based on their expresions.

// Index:                              Example:             Result:
// AllenVM_CPU_LIB_TRIG_SIN();      ::  trig.sin     -1    -0.841471
// AllenVM_CPU_LIB_TRIG_COS();      ::  trig.cos      0     1.000000
// AllenVM_CPU_LIB_TRIG_TAN();      ::  trig.tan      5    -3.380515
// AllenVM_CPU_LIB_TRIG_SEC();      ::  trig.sec     -1     1.850816
// AllenVM_CPU_LIB_TRIG_COSEC();    ::  trig.cosec    20    1.095356
// AllenVM_CPU_LIB_TRIG_COTAN();    ::  trig.cotan    10    1.542351
// AllenVM_CPU_LIB_TRIG_ASIN();     ::  trig.asin     0.7   0.775397
// AllenVM_CPU_LIB_TRIG_ACOS();     ::  trig.acos     0     1.570796
// AllenVM_CPU_LIB_TRIG_ATAN();     ::  trig.atan     0.12  0.119429
// AllenVM_CPU_LIB_TRIG_ASEC();     ::  trig.asec     2     1.047198
// AllenVM_CPU_LIB_TRIG_ACOSEC();   ::  trig.acosec   2     0.523599
// AllenVM_CPU_LIB_TRIG_ACOTAN();   ::  trig.acotan   2     0.463648 
// AllenVM_CPU_LIB_TRIG_HSIN();     ::  trig.sinh     5    74.203209 
// AllenVM_CPU_LIB_TRIG_HCOS();     ::  trig.cosh     4    27.308233
// AllenVM_CPU_LIB_TRIG_HTAN();     ::  trig.tanh     9     1.000000
// AllenVM_CPU_LIB_TRIG_HSEC();     ::  trig.sech     0     1.000000
// AllenVM_CPU_LIB_TRIG_HCOSEC();   ::  trig.cosech   0.5   1.919035
// AllenVM_CPU_LIB_TRIG_HCOTAN();   ::  trig.cotanh   0.5   2.163953
// AllenVM_CPU_LIB_TRIG_HASIN();    ::  trig.asinh    2     1.443635
// AllenVM_CPU_LIB_TRIG_HACOS();    ::  trig.acosh    2     1.316958
// AllenVM_CPU_LIB_TRIG_HATAN();    ::  trig.atanh    0.4   0.423649
// AllenVM_CPU_LIB_TRIG_HASEC();    ::  trig.asech    0.4   1.566799
// AllenVM_CPU_LIB_TRIG_HACOSEC();  ::  trig.acosech  1     0.881374
// AllenVM_CPU_LIB_TRIG_HACOTAN();  ::  trig.acotanh  20    0.050042 

// Total: 24.

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_SIN();
// Purpose:     Sine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_SIN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = sin(atof(argv[1]));                                                           // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_COS();
// Purpose:     Cosine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_COS(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = cos(atof(argv[1]));                                                           // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_TAN();
// Purpose:     Tangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_TAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = tan(atof(argv[1]));                                                           // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_SEC();
// Purpose:     Secant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_SEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / cos(atof(argv[1]));                                                     // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_COSEC();
// Purpose:     Cosecant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_COSEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / sin(atof(argv[1]));                                                     // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_COTAN();
// Purpose:     Cotangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_COTAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / tan(atof(argv[1]));                                                     // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ASIN();
// Purpose:     Arc Sine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ASIN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = asin(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ACOS();
// Purpose:     Arc Cosine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ACOS(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = acos(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ATAN();
// Purpose:     Arc Tangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ATAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = atan(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ASEC();
// Purpose:     Arc Secant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ASEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = acos(1.0 / atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ACOSEC();
// Purpose:     Arc Cosecant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ACOSEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = asin(1.0 / atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ACOTAN();
// Purpose:     Arc Cotangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_ACOTAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = atan(1.0 / atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HSIN();
// Purpose:     Hyperbolic Sine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HSIN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = sinh(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HCOS();
// Purpose:     Hyperbolic Cosine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HCOS(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = cosh(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HTAN();
// Purpose:     Hyperbolic Tangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HTAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = tanh(atof(argv[1]));                                                          // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HSEC();
// Purpose:     Hyperbolic Secant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HSEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / cosh(atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HCOSEC();
// Purpose:     Hyperbolic Cosecant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HCOSEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / sinh(atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HCOTAN();
// Purpose:     Hyperbolic Cotangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HCOTAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = 1.0 / tanh(atof(argv[1]));                                                    // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HASIN();
// Purpose:     Hyperbolic Arc sine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HASIN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = asinh(atof(argv[1]));                                                         // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HACOS();
// Purpose:     Hyperbolic Arc Cosine.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HACOS(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = acosh(atof(argv[1]));                                                         // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HATAN();
// Purpose:     Hyperbolic Arc Tangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HATAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = atanh(atof(argv[1]));                                                         // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HASEC();
// Purpose:     Hyperbolic Arc Secant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HASEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = acosh(1.0 / atof(argv[1]));                                                   // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HACOSEC();
// Purpose:     Hyperbolic Arc Cosecant.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HACOSEC(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = asinh(1.0 / atof(argv[1]));                                                   // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HACOTAN();
// Purpose:     Hyperbolic Arc Cotangent.
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HACOTAN(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.
 float c = atanh(1.0 / atof(argv[1]));                                                   // Calculate.

 char buf[TLIB_TRIG_BSIZE];                                                              // Create buffer.
 snprintf(buf,TLIB_TRIG_BSIZE,"%f",c);                                                   // Copy result to buffer as float.
 AllenVM_InterpSetResult(i,buf);                                                         // Set interpreter result.
 return Allen_VM_OK;                                                                     // Everything ok.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_HLP();
// Purpose:     Adds help facilities
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_TRIG_HLP(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc != 2) return AllenVM_CPU_Error(i,argv[0]);                                      // Check parameters.

 if(!strcmp(TLIB_TRIG_SIN,argv[1])) {                                                    // Compare parameters.
  puts("Description: Returns the sine of arg.");                                         // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.sin -1 => -0.841471");                                              // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_SIN);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_COS,argv[1])) {                                                    // Compare parameters.
  puts("Description: Returns the cosine of arg.");                                       // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cos 0 => 1.000000");                                                // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_COS);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_TAN,argv[1])) {                                                    // Compare parameters.
  puts("Description: Returns the tangent of arg.");                                      // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.tan 5 => -3.380515");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_TAN);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_SEC,argv[1])) {                                                    // Compare parameters.
  puts("Description: Returns the secant of arg.");                                       // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.sec -1 => 1.850816");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_SEC);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_COSEC,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the cosecant of arg.");                                     // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cosec 20 => 1.095356");                                             // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_COSEC);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_COTAN,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the cotangent of arg.");                                    // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cotan 10 => 1.542351");                                             // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_COTAN);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ASIN,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the arc sine of arg.");                                     // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.asin 0.7 => -0.775397");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ASIN);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ACOS,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the arc cosine of arg.");                                   // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acos 0 => 1.570796");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ACOS);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ATAN,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the arc tangent of arg.");                                  // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.atan 0.12 => 0.119429");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ATAN);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ASEC,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the arc secant of arg.");                                   // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.asec 2 => 1.047198");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ASEC);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ACOSEC,argv[1])) {                                                 // Compare parameters.
  puts("Description: Returns the arc cosecant of arg.");                                 // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acosec 2  => 0.523599");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ACOSEC);                                           // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_ACOTAN,argv[1])) {                                                 // Compare parameters.
  puts("Description: Returns the arc cotangent of arg.");                                // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acotan 2 => 0.463648");                                             // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_ACOTAN);                                           // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HSIN,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the hyperbolic sine of arg.");                              // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.sinh 5 => 74.203209");                                              // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HSIN);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HCOS,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the hyperbolic cosine of arg.");                            // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cosh 4 => 27.308233");                                              // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HCOS);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HTAN,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the hyperbolic tangent of arg.");                           // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.tanh 9 => 1.000000");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HTAN);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HSEC,argv[1])) {                                                   // Compare parameters.
  puts("Description: Returns the hyperbolic secant of arg.");                            // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.sech 0 => 1.000000");                                               // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HSEC);                                             // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HCOSEC,argv[1])) {                                                 // Compare parameters.
  puts("Description: Returns the hyperbolic cosecant of arg.");                          // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cosech 0.5 => 1.919035");                                           // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HCOSEC);                                           // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HCOTAN,argv[1])) {                                                 // Compare parameters.
  puts("Description: Returns the hyperbolic cotangent of arg.");                         // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.cotanh 0.5 => 2.163953");                                           // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HCOTAN);                                           // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HASIN,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the hyperbolic arc sine of arg.");                          // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.asinh 2 => 1.443635");                                              // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HASIN);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HACOS,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the hyperbolic arc cosine of arg.");                        // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acosh 2 => 1.316958");                                              // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HACOS);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HATAN,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the hyperbolic arc tangent of arg.");                       // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.atanh 0.4 => 0.423649");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HATAN);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HASEC,argv[1])) {                                                  // Compare parameters.
  puts("Description: Returns the hyperbolic arc secant of arg.");                        // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.asech 0.4 => 1.566799");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HASEC);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HACOSEC,argv[1])) {                                                // Compare parameters.
  puts("Description: Returns the hyperbolic arc cosecant of arg.");                      // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acosech 1 => 0.881374");                                            // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HACOSEC);                                          // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_TRIG_HACOTAN,argv[1])) {                                                // Compare parameters.
  puts("Description: Returns the hyperbolic arc cotangent of arg.");                     // Description.
  puts("Returns: Float number from expression result.");                                 // Returns.
  puts("Sample: trig.acotanh 20 => 0.050042 ");                                          // Sample function.
  puts("Parameters: min: 1 max: 1");                                                     // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_TRIG_HACOTAN);                                          // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 AllenVM_InterpSetResult(i,TLIB_TRIG_NIL);                                               // Set interpreter result. 
 return AllenVM_CPU_Error(i,TLIB_TRIG_EHLP);                                             // Command not found.
}

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_TRIG_ADD();
// Purpose:     Add instructions to the CPU.
// Returns:     Void (nothing).
// -------------------------------------------------------------------------------------------------------------------------------------

void AllenVM_CPU_LIB_TRIG_ADD(struct AllenInterp *i) {
 AllenVM_InterpSetCommand(i,TLIB_TRIG_SIN,     AllenVM_CPU_LIB_TRIG_SIN,     NULL);      // Sine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_COS,     AllenVM_CPU_LIB_TRIG_COS,     NULL);      // Cosine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_TAN,     AllenVM_CPU_LIB_TRIG_TAN,     NULL);      // Tangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_SEC,     AllenVM_CPU_LIB_TRIG_SEC,     NULL);      // Secant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_COSEC,   AllenVM_CPU_LIB_TRIG_COSEC,   NULL);      // Cosecant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_COTAN,   AllenVM_CPU_LIB_TRIG_COTAN,   NULL);      // Cotangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ASIN,    AllenVM_CPU_LIB_TRIG_ASIN,    NULL);      // Arc Sine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ACOS,    AllenVM_CPU_LIB_TRIG_ACOS,    NULL);      // Arc Cosine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ATAN,    AllenVM_CPU_LIB_TRIG_ATAN,    NULL);      // Arc Tangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ASEC,    AllenVM_CPU_LIB_TRIG_ASEC,    NULL);      // Arc Secant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ACOSEC,  AllenVM_CPU_LIB_TRIG_ACOSEC,  NULL);      // Arc Cosecant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_ACOTAN,  AllenVM_CPU_LIB_TRIG_ACOTAN,  NULL);      // Arc Cotangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HSIN,    AllenVM_CPU_LIB_TRIG_HSIN,    NULL);      // Hyperbolic Sine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HCOS,    AllenVM_CPU_LIB_TRIG_HCOS,    NULL);      // Hyperbolic Cosine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HTAN,    AllenVM_CPU_LIB_TRIG_HTAN,    NULL);      // Hyperbolic Tangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HSEC,    AllenVM_CPU_LIB_TRIG_HSEC,    NULL);      // Hyperbolic Secant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HCOSEC,  AllenVM_CPU_LIB_TRIG_HCOSEC,  NULL);      // Hyperbolic Cosecant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HCOTAN,  AllenVM_CPU_LIB_TRIG_HCOTAN,  NULL);      // Hyperbolic Cotangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HASIN,   AllenVM_CPU_LIB_TRIG_HASIN,   NULL);      // Hyperbolic Arc Sine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HACOS,   AllenVM_CPU_LIB_TRIG_HACOS,   NULL);      // Hyperbolic Arc Cosine.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HATAN,   AllenVM_CPU_LIB_TRIG_HATAN,   NULL);      // Hyperbolic Arc Tangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HASEC,   AllenVM_CPU_LIB_TRIG_HASEC,   NULL);      // Hyperbolic Arc Secant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HACOSEC, AllenVM_CPU_LIB_TRIG_HACOSEC, NULL);      // Hyperbolic Arc Cosecant.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HACOTAN, AllenVM_CPU_LIB_TRIG_HACOTAN, NULL);      // Hyperbolic Arc Cotangent.
 AllenVM_InterpSetCommand(i,TLIB_TRIG_HLP,     AllenVM_CPU_LIB_TRIG_HLP,     NULL);      // Helper function.
}

// =====================================================================================================================================
// EOF
// =====================================================================================================================================
// Compiler parameters: Gcc -O2 -lm
// Recommended editor: Scite/Gedit/Vim.