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

📄 strngfun.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   /*================================================*/   /* Function lowcase expects exactly one argument. */   /*================================================*/   if (EnvArgCountCheck(theEnv,"lowcase",EXACTLY,1) == -1)     {      SetpType(returnValue,STRING);      SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,""));      return;     }   /*==================================================*/   /* The argument should be of type symbol or string. */   /*==================================================*/   if (EnvArgTypeCheck(theEnv,"lowcase",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 lowercasing   */   /* upper case alphabetic characters.                    */   /*======================================================*/   osptr = DOToString(theArg);   slen = strlen(osptr) + 1;   nsptr = (char *) gm2(theEnv,slen);   for (i = 0  ; i < slen ; i++)     {      if (isupper(osptr[i]))        { nsptr[i] = (char) tolower(osptr[i]); }      else        { nsptr[i] = osptr[i]; }     }   /*========================================*/   /* Return the lowercased string and clean */   /* up the temporary memory used.          */   /*========================================*/   SetpType(returnValue,GetType(theArg));   SetpValue(returnValue,(void *) EnvAddSymbol(theEnv,nsptr));   rm(theEnv,nsptr,slen);  }/********************************************//* StrCompareFunction: H/L access routine   *//*   for the str-compare function.          *//********************************************/globle long long StrCompareFunction(  void *theEnv)  {   int numArgs, length;   DATA_OBJECT arg1, arg2, arg3;   long long returnValue;   /*=======================================================*/   /* Function str-compare expects either 2 or 3 arguments. */   /*=======================================================*/   if ((numArgs = EnvArgRangeCheck(theEnv,"str-compare",2,3)) == -1) return(0L);   /*=============================================================*/   /* The first two arguments should be of type symbol or string. */   /*=============================================================*/   if (EnvArgTypeCheck(theEnv,"str-compare",1,SYMBOL_OR_STRING,&arg1) == FALSE)     { return(0L); }   if (EnvArgTypeCheck(theEnv,"str-compare",2,SYMBOL_OR_STRING,&arg2) == FALSE)     { return(0L); }   /*===================================================*/   /* Compare the strings. Use the 3rd argument for the */   /* maximum length of comparison, if it is provided.  */   /*===================================================*/   if (numArgs == 3)     {      if (EnvArgTypeCheck(theEnv,"str-compare",3,INTEGER,&arg3) == FALSE)        { return(0L); }      length = CoerceToInteger(GetType(arg3),GetValue(arg3));      returnValue = strncmp(DOToString(arg1),DOToString(arg2),                            (STD_SIZE) length);     }   else     { returnValue = strcmp(DOToString(arg1),DOToString(arg2)); }   /*========================================================*/   /* Return Values are as follows:                          */   /* -1 is returned if <string-1> is less than <string-2>.  */   /*  1 is return if <string-1> is greater than <string-2>. */   /*  0 is returned if <string-1> is equal to <string-2>.   */   /*========================================================*/   if (returnValue < 0) returnValue = -1;   else if (returnValue > 0) returnValue = 1;   return(returnValue);  }/*******************************************//* SubStringFunction: H/L access routine   *//*   for the sub-string function.          *//*******************************************/globle void *SubStringFunction(  void *theEnv)  {   DATA_OBJECT theArgument;   char *tempString, *returnString;   int start, end, i, j;   void *returnValue;   /*===================================*/   /* Check and retrieve the arguments. */   /*===================================*/   if (EnvArgCountCheck(theEnv,"sub-string",EXACTLY,3) == -1)     { return((void *) EnvAddSymbol(theEnv,"")); }   if (EnvArgTypeCheck(theEnv,"sub-string",1,INTEGER,&theArgument) == FALSE)     { return((void *) EnvAddSymbol(theEnv,"")); }   start = CoerceToInteger(theArgument.type,theArgument.value) - 1;   if (EnvArgTypeCheck(theEnv,"sub-string",2,INTEGER,&theArgument) == FALSE)     {  return((void *) EnvAddSymbol(theEnv,"")); }   end = CoerceToInteger(theArgument.type,theArgument.value) - 1;   if (EnvArgTypeCheck(theEnv,"sub-string",3,SYMBOL_OR_STRING,&theArgument) == FALSE)     { return((void *) EnvAddSymbol(theEnv,"")); }   /*================================================*/   /* If parameters are out of range return an error */   /*================================================*/   if (start < 0) start = 0;   if (end > (int) strlen(DOToString(theArgument)))     { end = (int) strlen(DOToString(theArgument)); }   /*==================================*/   /* If the start is greater than the */   /* end, return a null string.       */   /*==================================*/   if (start > end)     { return((void *) EnvAddSymbol(theEnv,"")); }   /*=============================================*/   /* Otherwise, allocate the string and copy the */   /* designated portion of the old string to the */   /* new string.                                 */   /*=============================================*/   else     {      returnString = (char *) gm2(theEnv,(unsigned) (end - start + 2));  /* (end - start) inclusive + EOS */      tempString = DOToString(theArgument);      for(j=0, i=start;i <= end; i++, j++)        { *(returnString+j) = *(tempString+i); }      *(returnString+j) = '\0';     }   /*========================*/   /* Return the new string. */   /*========================*/   returnValue = (void *) EnvAddSymbol(theEnv,returnString);   rm(theEnv,returnString,(unsigned) (end - start + 2));   return(returnValue);  }/******************************************//* StrIndexFunction: H/L access routine   *//*   for the sub-index function.          *//******************************************/globle void StrIndexFunction(  void *theEnv,  DATA_OBJECT_PTR result)  {   DATA_OBJECT theArgument1, theArgument2;   char *strg1, *strg2;   size_t i, j;   result->type = SYMBOL;   result->value = EnvFalseSymbol(theEnv);   /*===================================*/   /* Check and retrieve the arguments. */   /*===================================*/   if (EnvArgCountCheck(theEnv,"str-index",EXACTLY,2) == -1) return;   if (EnvArgTypeCheck(theEnv,"str-index",1,SYMBOL_OR_STRING,&theArgument1) == FALSE) return;   if (EnvArgTypeCheck(theEnv,"str-index",2,SYMBOL_OR_STRING,&theArgument2) == FALSE) return;   strg1 = DOToString(theArgument1);   strg2 = DOToString(theArgument2);   /*=================================*/   /* Find the position in string2 of */   /* string1 (counting from 1).      */   /*=================================*/   if (strlen(strg1) == 0)     {      result->type = INTEGER;      result->value = (void *) EnvAddLong(theEnv,(long long) strlen(strg2) + 1LL);      return;     }   for (i=1; *strg2; i++, strg2++)     {      for (j=0; *(strg1+j) && *(strg1+j) == *(strg2+j); j++)        { /* Do Nothing */ }      if (*(strg1+j) == '\0')        {         result->type = INTEGER;         result->value = (void *) EnvAddLong(theEnv,(long long) i);         return;        }     }   return;  }/********************************************//* StringToFieldFunction: H/L access routine *//*   for the string-to-field function.       *//********************************************/globle void StringToFieldFunction(  void *theEnv,  DATA_OBJECT *returnValue)  {   DATA_OBJECT theArg;   /*========================================================*/   /* Function string-to-field expects exactly one argument. */   /*========================================================*/   if (EnvArgCountCheck(theEnv,"string-to-field",EXACTLY,1) == -1)     {      returnValue->type = STRING;      returnValue->value = (void *) EnvAddSymbol(theEnv,"*** ERROR ***");      return;     }   /*==================================================*/   /* The argument should be of type symbol or string. */   /*==================================================*/   if (EnvArgTypeCheck(theEnv,"string-to-field",1,SYMBOL_OR_STRING,&theArg) == FALSE)     {      returnValue->type = STRING;      returnValue->value = (void *) EnvAddSymbol(theEnv,"*** ERROR ***");      return;     }   /*================================*/   /* Convert the string to an atom. */   /*================================*/   StringToField(theEnv,DOToString(theArg),returnValue);  }/*************************************************************//* StringToField: Converts a string to an atomic data value. *//*************************************************************/globle void StringToField(  void *theEnv,  char *theString,  DATA_OBJECT *returnValue)  {   struct token theToken;   /*====================================*/   /* Open the string as an input source */   /* and retrieve the first value.      */   /*====================================*/   OpenStringSource(theEnv,"string-to-field-str",theString,0);   GetToken(theEnv,"string-to-field-str",&theToken);   CloseStringSource(theEnv,"string-to-field-str");   /*====================================================*/   /* Copy the token to the return value data structure. */   /*====================================================*/   returnValue->type = theToken.type;   if ((theToken.type == FLOAT) || (theToken.type == STRING) ||#if OBJECT_SYSTEM       (theToken.type == INSTANCE_NAME) ||#endif       (theToken.type == SYMBOL) || (theToken.type == INTEGER))     { returnValue->value = theToken.value; }   else if (theToken.type == STOP)     {      returnValue->type = SYMBOL;      returnValue->value = (void *) EnvAddSymbol(theEnv,"EOF");     }   else if (theToken.type == UNKNOWN_VALUE)     {      returnValue->type = STRING;      returnValue->value = (void *) EnvAddSymbol(theEnv,"*** ERROR ***");     }   else     {      returnValue->type = STRING;      returnValue->value = (void *) EnvAddSymbol(theEnv,theToken.printForm);     }  }  #if (! RUN_TIME) && (! BLOAD_ONLY)/**************************************//* EvalFunction: H/L access routine   *//*   for the eval function.           *//**************************************/globle void EvalFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {   DATA_OBJECT theArg;   /*=============================================*/   /* Function eval expects exactly one argument. */   /*=============================================*/   if (EnvArgCountCheck(theEnv,"eval",EXACTLY,1) == -1)     {      SetpType(returnValue,SYMBOL);      SetpValue(returnValue,EnvFalseSymbol(theEnv));      return;     }   /*==================================================*/   /* The argument should be of type SYMBOL or STRING. */   /*==================================================*/

⌨️ 快捷键说明

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