package jmathlib.toolbox.string;
import jmathlib.core.tokens.Token;
import jmathlib.core.tokens.OperandToken;
import jmathlib.core.tokens.numbertokens.*;
import jmathlib.core.functions.ExternalFunction;
import jmathlib.core.interpreter.GlobalValues;
import jmathlib.core.tokens.CharToken;
/**An external function for finding a string within another*/
public class findstr extends ExternalFunction
{
/**finds shorter string within a longer one
@param operands[0] = first string
@param operands[1] = second string*/
public OperandToken evaluate(Token[] operands, GlobalValues globals)
{
OperandToken result = null;
if (getNArgIn(operands) !=2)
throwMathLibException("findstr: number of arguments !=2");
//Check the parameters
if ( !(operands[0] instanceof CharToken))
throwMathLibException("findstr: works only on strings");
if ( !(operands[1] instanceof CharToken))
throwMathLibException("findstr: works only on strings");
String string1 = ((CharToken)operands[0]).toString();
String string2 = ((CharToken)operands[1]).toString();
int index = 0;
int count = 0;
double lastpos = 0;
if(string1.length() < string2.length())
{
double[][] tempResults = new double[1][string2.length()];
do
{
index = string2.indexOf(string1);
if(index > -1)
{
tempResults[0][count] = index + lastpos + 1;
lastpos = tempResults[0][count];
count++;
string2 = string2.substring(index + 1, string2.length());
jmathlib.core.interpreter.ErrorLogger.debugLine(string2);
}
}while(index > -1);
double[][] results = new double[1][count];
for(index = 0; index < count; index++)
{
results[0][index] = tempResults[0][index];
}
result = new DoubleNumberToken(results);
}
else
{
double[][] tempResults = new double[1][string1.length()];
do
{
index = string1.indexOf(string2);
if(index > -1)
{
tempResults[0][count] = index + lastpos + 1;
lastpos = tempResults[0][count];
count++;
string1 = string1.substring(index + 1, string1.length());
}
}while(index > -1);
double[][] results = new double[1][count];
for(index = 0; index < count; index++)
{
results[0][index] = tempResults[0][index];
}
result = new DoubleNumberToken(results);
}
return result;
}
}
/*
@GROUP
char
@SYNTAX
findstr(string1, string2)
@DOC
Finds all occcurences of the shorter string within the longer
@NOTES
.
@EXAMPLES
<programlisting>
findstr("this is a test string", "is") = [3, 6]
findstr("is", "this is a test string") = [3, 6]
</programlisting>
@SEE
strfind
*/