⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strngfun.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.23  01/31/05            */   /*                                                     */   /*               STRING FUNCTIONS MODULE               */   /*******************************************************//*************************************************************//* Purpose: Contains the code for several string functions   *//*   including str-cat, sym-cat, str-length, str-compare,    *//*   upcase, lowcase, sub-string, str-index, eval, and       *//*   build.                                                  *//*                                                           *//* Principal Programmer(s):                                  *//*      Gary D. Riley                                        *//*                                                           *//* Contributing Programmer(s):                               *//*      Barry Cameron                                        *//*                                                           *//* Revision History:                                         *//*      6.23: Correction for FalseSymbol/TrueSymbol. DR0859  *//*                                                           *//*************************************************************/#define _STRNGFUN_SOURCE_#include "setup.h"#if STRING_FUNCTIONS#include <stdio.h>#define _STDIO_INCLUDED_#include <ctype.h>#include <string.h>#include "argacces.h"#include "commline.h"#include "constrct.h"#include "cstrcpsr.h"#include "engine.h"#include "envrnmnt.h"#include "exprnpsr.h"#include "extnfunc.h"#include "memalloc.h"#include "prcdrpsr.h"#include "router.h"#include "strngrtr.h"#include "scanner.h"#include "sysdep.h"#if DEFRULE_CONSTRUCT#include "drive.h"#endif#include "strngfun.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/   static void                    StrOrSymCatFunction(void *,DATA_OBJECT_PTR,unsigned short);/******************************************//* StringFunctionDefinitions: Initializes *//*   the string manipulation functions.   *//******************************************/globle void StringFunctionDefinitions(  void *theEnv)  {#if ! RUN_TIME   EnvDefineFunction2(theEnv,"str-cat", 'k', PTIEF StrCatFunction, "StrCatFunction", "1*");   EnvDefineFunction2(theEnv,"sym-cat", 'k', PTIEF SymCatFunction, "SymCatFunction", "1*");   EnvDefineFunction2(theEnv,"str-length", 'g', PTIEF StrLengthFunction, "StrLengthFunction", "11j");   EnvDefineFunction2(theEnv,"str-compare", 'g', PTIEF StrCompareFunction, "StrCompareFunction", "23*jji");   EnvDefineFunction2(theEnv,"upcase", 'j', PTIEF UpcaseFunction, "UpcaseFunction", "11j");   EnvDefineFunction2(theEnv,"lowcase", 'j', PTIEF LowcaseFunction, "LowcaseFunction", "11j");   EnvDefineFunction2(theEnv,"sub-string", 's', PTIEF SubStringFunction, "SubStringFunction", "33*iij");   EnvDefineFunction2(theEnv,"str-index", 'u', PTIEF StrIndexFunction, "StrIndexFunction", "22j");   EnvDefineFunction2(theEnv,"eval", 'u', PTIEF EvalFunction, "EvalFunction", "11k");   EnvDefineFunction2(theEnv,"build", 'b', PTIEF BuildFunction, "BuildFunction", "11k");   EnvDefineFunction2(theEnv,"string-to-field", 'u', PTIEF StringToFieldFunction, "StringToFieldFunction", "11j");#else#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif#endif  }/****************************************//* StrCatFunction: H/L access routine   *//*   for the str-cat function.          *//****************************************/globle void StrCatFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {      StrOrSymCatFunction(theEnv,returnValue,STRING);  }/****************************************//* SymCatFunction: H/L access routine   *//*   for the sym-cat function.          *//****************************************/globle void SymCatFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {   StrOrSymCatFunction(theEnv,returnValue,SYMBOL);  }/********************************************************//* StrOrSymCatFunction: Driver routine for implementing *//*   the str-cat and sym-cat functions.                 *//********************************************************/static void StrOrSymCatFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue,  unsigned short returnType)  {   DATA_OBJECT theArg;   int numArgs, i, total, j;   char *theString;   SYMBOL_HN **arrayOfStrings;   SYMBOL_HN *hashPtr;   char *functionName;   /*============================================*/   /* Determine the calling function name.       */   /* Store the null string or the symbol nil as */   /* the return value in the event of an error. */   /*============================================*/   SetpType(returnValue,returnType);   if (returnType == STRING)     {      functionName = "str-cat";      SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,""));     }   else     {      functionName = "sym-cat";      SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,"nil"));     }   /*===============================================*/   /* Determine the number of arguments as create a */   /* string array which is large enough to store   */   /* the string representation of each argument.   */   /*===============================================*/   numArgs = EnvRtnArgCount(theEnv);   arrayOfStrings = (SYMBOL_HN **) gm1(theEnv,(int) sizeof(SYMBOL_HN *) * numArgs);   for (i = 0; i < numArgs; i++)        { arrayOfStrings[i] = NULL; }   /*=============================================*/   /* Evaluate each argument and store its string */   /* representation in the string array.         */   /*=============================================*/   total = 1;   for (i = 1 ; i <= numArgs ; i++)     {      EnvRtnUnknown(theEnv,i,&theArg);      switch(GetType(theArg))        {         case STRING:#if OBJECT_SYSTEM         case INSTANCE_NAME:#endif         case SYMBOL:           hashPtr = (SYMBOL_HN *) GetValue(theArg);           arrayOfStrings[i-1] = hashPtr;           IncrementSymbolCount(hashPtr);            break;         case FLOAT:           hashPtr = (SYMBOL_HN *) EnvAddSymbol(theEnv,FloatToString(theEnv,ValueToDouble(GetValue(theArg))));           arrayOfStrings[i-1] = hashPtr;           IncrementSymbolCount(hashPtr);           break;         case INTEGER:           hashPtr = (SYMBOL_HN *) EnvAddSymbol(theEnv,LongIntegerToString(theEnv,ValueToLong(GetValue(theArg))));           arrayOfStrings[i-1] = hashPtr;           IncrementSymbolCount(hashPtr);           break;         default:           ExpectedTypeError1(theEnv,functionName,i,"string, instance name, symbol, float, or integer");           SetEvaluationError(theEnv,TRUE);           break;        }      if (EvaluationData(theEnv)->EvaluationError)        {         for (i = 0; i < numArgs; i++)           {            if (arrayOfStrings[i] != NULL)              { DecrementSymbolCount(theEnv,arrayOfStrings[i]); }           }         rm(theEnv,arrayOfStrings,sizeof(SYMBOL_HN *) * numArgs);         return;        }      total += (int) strlen(ValueToString(arrayOfStrings[i - 1]));     }   /*=========================================================*/   /* Allocate the memory to store the concatenated string or */   /* symbol, then copy the values in the string array to the */   /* memory just allocated.                                  */   /*=========================================================*/   theString = (char *) gm2(theEnv,(sizeof(char) * total));   j = 0;   for (i = 0 ; i < numArgs ; i++)     {      gensprintf(&theString[j],"%s",ValueToString(arrayOfStrings[i]));      j += (int) strlen(ValueToString(arrayOfStrings[i]));     }   /*=========================================*/   /* Return the concatenated value and clean */   /* up the temporary memory used.           */   /*=========================================*/   SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,theString));   rm(theEnv,theString,sizeof(char) * total);   for (i = 0; i < numArgs; i++)     {      if (arrayOfStrings[i] != NULL)        { DecrementSymbolCount(theEnv,arrayOfStrings[i]); }     }   rm(theEnv,arrayOfStrings,sizeof(SYMBOL_HN *) * numArgs);  }/*******************************************//* StrLengthFunction: H/L access routine   *//*   for the str-length function.          *//*******************************************/globle long long StrLengthFunction(  void *theEnv)  {   DATA_OBJECT theArg;   /*===================================================*/   /* Function str-length expects exactly one argument. */   /*===================================================*/   if (EnvArgCountCheck(theEnv,"str-length",EXACTLY,1) == -1)     { return(-1LL); }   /*==================================================*/   /* The argument should be of type symbol or string. */   /*==================================================*/   if (EnvArgTypeCheck(theEnv,"str-length",1,SYMBOL_OR_STRING,&theArg) == FALSE)     { return(-1LL); }   /*============================================*/   /* Return the length of the string or symbol. */   /*============================================*/   return( (long long) strlen(DOToString(theArg)));  }/****************************************//* UpcaseFunction: H/L access routine   *//*   for the upcase function.           *//****************************************/globle void UpcaseFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {   DATA_OBJECT theArg;   unsigned i;   size_t slen;   char *osptr, *nsptr;   /*===============================================*/   /* Function upcase expects exactly one argument. */   /*===============================================*/   if (EnvArgCountCheck(theEnv,"upcase",EXACTLY,1) == -1)     {      SetpType(returnValue,STRING);      SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,""));      return;     }   /*==================================================*/   /* The argument should be of type symbol or string. */   /*==================================================*/   if (EnvArgTypeCheck(theEnv,"upcase",1,SYMBOL_OR_STRING,&theArg) == FALSE)     {      SetpType(returnValue,STRING);      SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,""));      return;     }   /*======================================================*/   /* Allocate temporary memory and then copy the original */   /* string or symbol to that memory, while uppercasing   */   /* lower case alphabetic characters.                    */   /*======================================================*/   osptr = DOToString(theArg);   slen = strlen(osptr) + 1;   nsptr = (char *) gm2(theEnv,slen);   for (i = 0  ; i < slen ; i++)     {      if (islower(osptr[i]))        { nsptr[i] = (char) toupper(osptr[i]); }      else        { nsptr[i] = osptr[i]; }     }   /*========================================*/   /* Return the uppercased string and clean */   /* up the temporary memory used.          */   /*========================================*/   SetpType(returnValue,GetType(theArg));   SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,nsptr));   rm(theEnv,nsptr,slen);  }/*****************************************//* LowcaseFunction: H/L access routine   *//*   for the lowcase function.           *//*****************************************/globle void LowcaseFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {   DATA_OBJECT theArg;   unsigned i;   size_t slen;   char *osptr, *nsptr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -