📄 strngfun.c
字号:
DATA_OBJECT_PTR returnValue)
{
DATA_OBJECT theArg;
unsigned i;
size_t slen;
char *osptr, *nsptr;
/*================================================*/
/* 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 int StrCompareFunction(
void *theEnv)
{
int numArgs, length;
DATA_OBJECT arg1, arg2, arg3;
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;
int 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) strlen(strg2) + 1L);
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) 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;
/*=============================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -