All pastes #636531 Raw Edit

Anonymous

public text v1 · immutable
#636531 ·published 2007-07-28 00:04 UTC
rendered paste body
// =====================================================================================================================================
// allen_cpu_lib_comparisons.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_CMP_BSIZE  1024         // Buffer size.

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

#define TLIB_CMP_EHLP  "cmp.?: command not found in library" // Error: Command not found in comparisons library.

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

#define TLIB_CMP_GT     ">"          // Greater.
#define TLIB_CMP_GTLT   "->"         // Ordered mayor/minor. (restrictive)
#define TLIB_CMP_GTEQLT "+>"         // Ordered mayor/minor. (non restrictive)
#define TLIB_CMP_LT     "<"          // Lesser.
#define TLIB_CMP_LTGT   "<-"         // Ordered minor/major. (restrictive)
#define TLIB_CMP_LTEQGT "<+"         // Ordered minor/major. (non restrictive)
#define TLIB_CMP_EQ     "="          // Equal.
#define TLIB_CMP_NQ     "!"          // Not equal.
#define TLIB_CMP_GEQ    "=>"         // Greater or equal.
#define TLIB_CMP_LEQ    "<="         // Less or equal.

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

#define TLIB_CMP_HLP    "cmp.?"      // Helper function.
#define TLIB_CMP_NIL    "nil"        // Null value.

// =====================================================================================================================================
// Basic comparison operators.
// =====================================================================================================================================

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

// Index:                              Example:   Result:
// AllenVM_CPU_LIB_CMP_GT();      ::   > 10 2     1.000000
// AllenVM_CPU_LIB_CMP_GTLT();    ::   -> 1 2 3   0.000000
// AllenVM_CPU_LIB_CMP_GTEQLT();  ::   +> 3 2 2   1.000000
// AllenVM_CPU_LIB_CMP_LT();      ::   < 20 1     0.000000
// AllenVM_CPU_LIB_CMP_LTGT();    ::   <- 1 2 3   1.000000
// AllenVM_CPU_LIB_CMP_LTEQGT();  ::   <+ 2 2 3   1.000000
// AllenVM_CPU_LIB_CMP_EQ();      ::   = 4 4      1.000000
// AllenVM_CPU_LIB_CMP_NQ();      ::   ! 2 3      1.000000
// AllenVM_CPU_LIB_CMP_GEQ();     ::   => 10 1    1.000000
// AllenVM_CPU_LIB_CMP_LEQ();     ::   <= 2 2     1.000000

// Total: 10.

// -------------------------------------------------------------------------------------------------------------------------------------
// Function:    AllenVM_CPU_LIB_CMP_GT();
// Purpose:     Greater than.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_GT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=1; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_GTLT();
// Purpose:     Ordered from mayor to minor. (restrictive)
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_GTLT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p; register float c=1;                                                     // Parameters.

 for(p=2; p<argc-1; ++p)                                                                 // Loop through parameters.
  if(atof(argv[p]) <= atof(argv[p+1])) { c=0; break; }                                   // Ordered from mayor to minor.

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_GTEQLT();
// Purpose:     Ordered from mayor to minor. (not restrictive)
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_GTEQLT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p; register float c=1;                                                     // Parameters.

 for(p=2; p<argc-1; ++p)                                                                 // Loop through parameters.
  if(atof(argv[p]) < atof(argv[p+1])) { c=0; break; }                                    // Ordered from mayor to minor. (not rest)

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_LT();
// Purpose:     Less than.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_LT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=2; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_LTGT();
// Purpose:     Ordered from minor to major (restrictive).
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_LTGT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p; register float c=1;                                                     // Parameters.

 for(p=2; p<argc-1; ++p)                                                                 // Loop through parameters.
  if(atof(argv[p]) >= atof(argv[p+1])) { c=0; break; }                                   // Ordered from minor to mayor.

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_LTEQGT();
// Purpose:     Ordered from minor to major (non restrictive).
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_LTEQGT(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p; register float c=1;                                                     // Parameters.

 for(p=2; p<argc-1; ++p)                                                                 // Loop through parameters.
  if(atof(argv[p]) > atof(argv[p+1])) { c=0; break; }                                    // Ordered from minor to mayor. (not rest)

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_EQ();
// Purpose:     Equal.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_EQ(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=3; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_NQ();
// Purpose:     Not equal.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_NQ(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=4; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_GEQ();
// Purpose:     Greater or equal than.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_GEQ(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=5; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_LEQ();
// Purpose:     Less or equal than.
// Returns:     0/1 wether false/true.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_LEQ(struct AllenInterp *i, int argc, char **argv, void *pd) {
 if(argc < 3) return AllenVM_CPU_Error(i,argv[0]);                                       // Check parameters.
 register int p,op=6; register float c=1;                                                // Parameters.

 for(p=2; p<argc; ++p) {                                                                 // Loop through parameters.
  if(atof(argv[p])==0) {                                                                 // Check if we want to change operator.
   if(!strcmp(TLIB_CMP_GT,  argv[p])) { op = 1; continue; }                              // Change operator: Greater than.
   if(!strcmp(TLIB_CMP_LT,  argv[p])) { op = 2; continue; }                              // Change operator: Less than.
   if(!strcmp(TLIB_CMP_EQ,  argv[p])) { op = 3; continue; }                              // Change operator: Equal to.
   if(!strcmp(TLIB_CMP_NQ,  argv[p])) { op = 4; continue; }                              // Change operator: Not equal.
   if(!strcmp(TLIB_CMP_GEQ, argv[p])) { op = 5; continue; }                              // Change operator: Greater or equal.
   if(!strcmp(TLIB_CMP_LEQ, argv[p])) { op = 6; continue; }                              // Change operator: Less or equal.
  }
  switch(op) {                                                                           // Check current operator.
   case 1: if(atof(argv[1]) <= atof(argv[p])) c=0; break;                                // Operate: Greater than.
   case 2: if(atof(argv[1]) >= atof(argv[p])) c=0; break;                                // Operate: Less than.
   case 3: if(atof(argv[1]) != atof(argv[p])) c=0; break;                                // Operate: Equal to.
   case 4: if(atof(argv[1]) == atof(argv[p])) c=0; break;                                // Operate: Not equal.
   case 5: if(atof(argv[1]) <  atof(argv[p])) c=0; break;                                // Operate: Greater or equal.
   case 6: if(atof(argv[1]) >  atof(argv[p])) c=0; break;                                // Operate: Less or equal.
  }}

 char buf[TLIB_CMP_BSIZE];                                                               // Create buffer.
 snprintf(buf,TLIB_CMP_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_CMP_HLP();
// Purpose:     Adds help facilities
// Returns:     Expression result.
// -------------------------------------------------------------------------------------------------------------------------------------

static int AllenVM_CPU_LIB_CMP_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_CMP_GT,argv[1])) {                                                      // Compare parameters.
  puts("Description: Greater than expression.");                                         // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: > 2 10 => 0.000000");                                                    // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_GT);                                                // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_GTLT,argv[1])) {                                                    // Compare parameters.
  puts("Description: Ordered mayor/minor (restrictive).");                               // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: -> 10 2 => 1.000000");                                                   // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_GTLT);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_GTEQLT,argv[1])) {                                                  // Compare parameters.
  puts("Description: Ordered mayor/minor (non restrictive).");                           // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: +> 10 10 2 => 1.000000");                                                // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_GTEQLT);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_LT,argv[1])) {                                                      // Compare parameters.
  puts("Description: Less than expression.");                                            // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: < 10 2 => 0.000000");                                                    // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_LT);                                                // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_LTGT,argv[1])) {                                                    // Compare parameters.
  puts("Description: Ordered minor/major (restrictive).");                               // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: <- 8 9 10 => 1.000000");                                                 // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_LTGT);                                              // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_LTEQGT,argv[1])) {                                                  // Compare parameters.
  puts("Description: Ordered minor/major (non restrictive.");                            // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: <+ 8 8 9 9 10 => 1.000000");                                             // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_LTEQGT);                                            // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_EQ,argv[1])) {                                                      // Compare parameters.
  puts("Description: Equal to expression.");                                             // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: = 2 10 => 0.000000");                                                    // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_EQ);                                                // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_NQ,argv[1])) {                                                      // Compare parameters.
  puts("Description: Not equal to expression.");                                         // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: ! 2 10 => 1.000000");                                                    // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_NQ);                                                // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_GEQ,argv[1])) {                                                     // Compare parameters.
  puts("Description: Greater or equal expression.");                                     // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: => 5 4 => 1.000000");                                                    // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_GEQ);                                               // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

 if(!strcmp(TLIB_CMP_LEQ,argv[1])) {                                                     // Compare parameters.
  puts("Description: Less or equal expression.");                                        // Description.
  puts("Returns: Float 1/0 wether the expression is true/false.");                       // Returns.
  puts("Sample: <= 21 22 => 1.000000");                                                  // Sample function.
  puts("Parameters: min: 2 max: ANY");                                                   // Parameters needed.
  AllenVM_InterpSetResult(i,TLIB_CMP_LEQ);                                               // Set interpreter result. 
  return Allen_VM_OK; }                                                                  // Everything ok.

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

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

void AllenVM_CPU_LIB_CMP_ADD(struct AllenInterp *i) {
 AllenVM_InterpSetCommand(i,TLIB_CMP_GT,    AllenVM_CPU_LIB_CMP_GT,     NULL);           // Greater.
 AllenVM_InterpSetCommand(i,TLIB_CMP_GTLT,  AllenVM_CPU_LIB_CMP_GTLT,   NULL);           // Ordered mayor/minor (restrictive).
 AllenVM_InterpSetCommand(i,TLIB_CMP_GTEQLT,AllenVM_CPU_LIB_CMP_GTEQLT, NULL);           // Ordered mayor/minor (non restrictive).
 AllenVM_InterpSetCommand(i,TLIB_CMP_LT,    AllenVM_CPU_LIB_CMP_LT,     NULL);           // Lesser.
 AllenVM_InterpSetCommand(i,TLIB_CMP_LTGT,  AllenVM_CPU_LIB_CMP_LTGT,   NULL);           // Ordered minor/major (restrictive).
 AllenVM_InterpSetCommand(i,TLIB_CMP_LTEQGT,AllenVM_CPU_LIB_CMP_LTEQGT, NULL);           // Ordered minor/major (non restrictive).
 AllenVM_InterpSetCommand(i,TLIB_CMP_EQ,    AllenVM_CPU_LIB_CMP_EQ,     NULL);           // Equal.
 AllenVM_InterpSetCommand(i,TLIB_CMP_NQ,    AllenVM_CPU_LIB_CMP_NQ,     NULL);           // Not equal.
 AllenVM_InterpSetCommand(i,TLIB_CMP_GEQ,   AllenVM_CPU_LIB_CMP_GEQ,    NULL);           // Greater or equal.
 AllenVM_InterpSetCommand(i,TLIB_CMP_LEQ,   AllenVM_CPU_LIB_CMP_LEQ,    NULL);           // Less or equal.
 AllenVM_InterpSetCommand(i,TLIB_CMP_HLP,   AllenVM_CPU_LIB_CMP_HLP,    NULL);           // Helper function.
}

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