📄 iofun.c
字号:
start_pos = form_pos;
form_pos++;
formatFlagType = FindFormatFlag(formatString,&form_pos,buffer,&longFound);
if (formatFlagType != ' ')
{
strncpy(percentBuffer,&formatString[start_pos],
(STD_SIZE) form_pos-start_pos);
percentBuffer[form_pos-start_pos] = EOS;
if ((! longFound) &&
((formatFlagType == 'd') || (formatFlagType == 'o') ||
(formatFlagType == 'u') || (formatFlagType == 'x')))
{
longFound = TRUE;
percentBuffer[(form_pos-start_pos) - 1] = 'l';
percentBuffer[form_pos-start_pos] = formatFlagType;
percentBuffer[(form_pos-start_pos) + 1] = EOS;
}
if ((theString = PrintFormatFlag(theEnv,percentBuffer,f_cur_arg,formatFlagType,longFound)) == NULL)
{
if (fstr != NULL) rm(theEnv,fstr,fmaxm);
return (hptr);
}
fstr = AppendToString(theEnv,theString,fstr,&fpos,&fmaxm);
if (fstr == NULL) return(hptr);
f_cur_arg++;
}
else
{
fstr = AppendToString(theEnv,buffer,fstr,&fpos,&fmaxm);
if (fstr == NULL) return(hptr);
}
}
}
if (fstr != NULL)
{
hptr = EnvAddSymbol(theEnv,fstr);
if (strcmp(logicalName,"nil") != 0) EnvPrintRouter(theEnv,logicalName,fstr);
rm(theEnv,fstr,fmaxm);
}
else
{ hptr = EnvAddSymbol(theEnv,""); }
return(hptr);
}
/*********************************************************************/
/* ControlStringCheck: Checks the 2nd parameter which is the format */
/* control string to see if there are enough matching arguments. */
/*********************************************************************/
static char *ControlStringCheck(
void *theEnv,
int argCount)
{
DATA_OBJECT t_ptr;
char *str_array;
char print_buff[10];
int longFound;
unsigned i;
int per_count;
if (EnvArgTypeCheck(theEnv,"format",2,STRING,&t_ptr) == FALSE) return(NULL);
per_count = 0;
str_array = ValueToString(t_ptr.value);
for (i= 0 ; str_array[i] != '\0' ; )
{
if (str_array[i] == '%')
{
i++;
if (FindFormatFlag(str_array,&i,print_buff,&longFound) != ' ')
{ per_count++; }
}
else
{ i++; }
}
if (per_count != (argCount - 2))
{
ExpectedCountError(theEnv,"format",EXACTLY,per_count+2);
SetEvaluationError(theEnv,TRUE);
return (NULL);
}
return(str_array);
}
/***********************************************/
/* FindFormatFlag: This function searches for */
/* a format flag in the format string. */
/***********************************************/
static char FindFormatFlag(
char *formatString,
unsigned *a,
char *formatBuffer,
int *longFound)
{
char inchar, formatFlagType;
unsigned start_pos, copy_pos = 0;
/*===========================================================*/
/* Set return values to the default value. A blank character */
/* indicates that no format flag was found which requires a */
/* parameter. The longFound flag indicates whether the */
/* character 'l' was used with the float or integer flag to */
/* indicate a double precision float or a long integer. */
/*===========================================================*/
formatFlagType = ' ';
*longFound = FALSE;
/*=====================================================*/
/* The format flags for carriage returns, line feeds, */
/* horizontal and vertical tabs, and the percent sign, */
/* do not require a parameter. */
/*=====================================================*/
if (formatString[*a] == 'n')
{
sprintf(formatBuffer,"\n");
(*a)++;
return(formatFlagType);
}
else if (formatString[*a] == 'r')
{
sprintf(formatBuffer,"\r");
(*a)++;
return(formatFlagType);
}
else if (formatString[*a] == 't')
{
sprintf(formatBuffer,"\t");
(*a)++;
return(formatFlagType);
}
else if (formatString[*a] == 'v')
{
sprintf(formatBuffer,"\v");
(*a)++;
return(formatFlagType);
}
else if (formatString[*a] == '%')
{
sprintf(formatBuffer,"%%");
(*a)++;
return(formatFlagType);
}
/*======================================================*/
/* Identify the format flag which requires a parameter. */
/*======================================================*/
start_pos = *a;
formatBuffer[copy_pos] = '\0';
while ((formatString[*a] != '%') &&
(formatString[*a] != '\0') &&
((*a - start_pos) < FLAG_MAX))
{
inchar = formatString[*a];
formatBuffer[copy_pos++] = inchar;
formatBuffer[copy_pos] = '\0';
if ( (inchar == 'd') ||
(inchar == 'o') ||
(inchar == 'x') ||
(inchar == 'u') ||
(inchar == 'c') ||
(inchar == 's') ||
(inchar == 'e') ||
(inchar == 'f') ||
(inchar == 'g') )
{
formatFlagType = inchar;
if (formatString[(*a) - 1] == 'l')
{ *longFound = TRUE; }
(*a)++;
return(formatFlagType);
}
(*a)++;
}
return(formatFlagType);
}
/**********************************************************************/
/* PrintFormatFlag: Prints out part of the total format string along */
/* with the argument for that part of the format string. */
/**********************************************************************/
static char *PrintFormatFlag(
void *theEnv,
char *formatString,
int whichArg,
int formatType,
int longFound)
{
DATA_OBJECT theResult;
char *theString, *printBuffer;
unsigned theLength;
void *oldLocale;
/*=================*/
/* String argument */
/*=================*/
switch (formatType)
{
case 's':
if (EnvArgTypeCheck(theEnv,"format",whichArg,SYMBOL_OR_STRING,&theResult) == FALSE) return(NULL);
theLength = strlen(formatString) + strlen(ValueToString(theResult.value)) + 200;
printBuffer = (char *) gm2(theEnv,(sizeof(char) * theLength));
sprintf(printBuffer,formatString,ValueToString(theResult.value));
break;
case 'c':
EnvRtnUnknown(theEnv,whichArg,&theResult);
if ((GetType(theResult) == STRING) ||
(GetType(theResult) == SYMBOL))
{
theLength = strlen(formatString) + 200;
printBuffer = (char *) gm2(theEnv,(sizeof(char) * theLength));
sprintf(printBuffer,formatString,(ValueToString(theResult.value))[0]);
}
else if (GetType(theResult) == INTEGER)
{
theLength = strlen(formatString) + 200;
printBuffer = (char *) gm2(theEnv,(sizeof(char) * theLength));
sprintf(printBuffer,formatString,(char) DOToLong(theResult));
}
else
{
ExpectedTypeError1(theEnv,"format",whichArg,"symbol, string, or integer");
return(NULL);
}
break;
case 'd':
case 'x':
case 'o':
case 'u':
if (EnvArgTypeCheck(theEnv,"format",whichArg,INTEGER_OR_FLOAT,&theResult) == FALSE) return(NULL);
theLength = strlen(formatString) + 200;
printBuffer = (char *) gm2(theEnv,(sizeof(char) * theLength));
oldLocale = EnvAddSymbol(theEnv,setlocale(LC_NUMERIC,NULL));
setlocale(LC_NUMERIC,ValueToString(IOFunctionData(theEnv)->locale));
if (GetType(theResult) == FLOAT)
{
if (longFound)
{ sprintf(printBuffer,formatString,(long) ValueToDouble(theResult.value)); }
else
{ sprintf(printBuffer,formatString,(int) ValueToDouble(theResult.value)); }
}
else
{
if (longFound)
{ sprintf(printBuffer,formatString,(long) ValueToLong(theResult.value)); }
else
{ sprintf(printBuffer,formatString,(int) ValueToLong(theResult.value)); }
}
setlocale(LC_NUMERIC,ValueToString(oldLocale));
break;
case 'f':
case 'g':
case 'e':
if (EnvArgTypeCheck(theEnv,"format",whichArg,INTEGER_OR_FLOAT,&theResult) == FALSE) return(NULL);
theLength = strlen(formatString) + 200;
printBuffer = (char *) gm2(theEnv,(sizeof(char) * theLength));
oldLocale = EnvAddSymbol(theEnv,setlocale(LC_NUMERIC,NULL));
setlocale(LC_NUMERIC,ValueToString(IOFunctionData(theEnv)->locale));
if (GetType(theResult) == FLOAT)
{ sprintf(printBuffer,formatString,ValueToDouble(theResult.value)); }
else
{ sprintf(printBuffer,formatString,(double) ValueToLong(theResult.value)); }
setlocale(LC_NUMERIC,ValueToString(oldLocale));
break;
default:
EnvPrintRouter(theEnv,WERROR," Error in format, the conversion character");
EnvPrintRouter(theEnv,WERROR," for formatted output is not valid\n");
return(FALSE);
}
theString = ValueToString(EnvAddSymbol(theEnv,printBuffer));
rm(theEnv,printBuffer,sizeof(char) * theLength);
return(theString);
}
/******************************************/
/* ReadlineFunction: H/L access routine */
/* for the readline function. */
/******************************************/
globle void ReadlineFunction(
void *theEnv,
DATA_OBJECT_PTR returnValue)
{
char *buffer;
unsigned line_max = 0;
int numberOfArguments;
char *logicalName;
returnValue->type = STRING;
if ((numberOfArguments = EnvArgCountCheck(theEnv,"readline",NO_MORE_THAN,1)) == -1)
{
returnValue->value = (void *) EnvAddSymbol(theEnv,"*** READ ERROR ***");
return;
}
if (numberOfArguments == 0 )
{ logicalName = "stdin"; }
else
{
logicalName = GetLogicalName(theEnv,1,"stdin");
if (logicalName == NULL)
{
IllegalLogicalNameMessage(theEnv,"readline");
SetHaltExecution(theEnv,TRUE);
SetEvaluationError(theEnv,TRUE);
returnValue->value = (void *) EnvAddSymbol(theEnv,"*** READ ERROR ***");
return;
}
}
if (QueryRouters(theEnv,logicalName) == FALSE)
{
UnrecognizedRouterMessage(theEnv,logicalName);
SetHaltExecution(theEnv,TRUE);
SetEvaluationError(theEnv,TRUE);
returnValue->value = (void *) EnvAddSymbol(theEnv,"*** READ ERROR ***");
return;
}
RouterData(theEnv)->CommandBufferInputCount = 0;
buffer = FillBuffer(theEnv,logicalName,&RouterData(theEnv)->CommandBufferInputCount,&line_max);
RouterData(theEnv)->CommandBufferInputCount = -1;
if (GetHaltExecution(theEnv))
{
returnValue->value = (void *) EnvAddSymbol(theEnv,"*** READ ERROR ***");
if (buffer != NULL) rm(theEnv,buffer,(int) sizeof (char) * line_max);
return;
}
if (buffer == NULL)
{
returnValue->value = (void *) EnvAddSymbol(theEnv,"EOF");
returnValue->type = SYMBOL;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -