Implementation
int separate( ClipParam param, String line, bool strToVal ){
int cur;
String token = "";
int len = 0;
bool strFlag = false;
int topCount = 0;
bool formatSeFlag = false;
// 全トークンを削除する
delAll();
cur = 0;
while( cur < line.length ){
if( ClipGlobal.isCharEscape( line, cur ) ){
switch( ClipMath.charAt( line, cur + 1 ) ){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'b':
case 'B':
case 'f':
case 'n':
case 'r':
case 't':
case 'v':
case 'x':
case 'X':
break;
case '\\':
case ClipGlobal.charUtf8Yen:
if( len == 0 ) token = "";
token += ClipMath.charAt( line, cur );
len++;
// そのまま下に流す
continue _default;
_default:
default:
cur++;
if( cur >= line.length ){
continue;
}
break;
}
if( len == 0 ) token = "";
token += ClipMath.charAt( line, cur );
len++;
} else if( (ClipMath.charAt( line, cur ) == '[') && !strFlag ){
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
strFlag = true;
} else if( (ClipMath.charAt( line, cur ) == ']') && strFlag ){
if( len == 0 ){
token = String.fromCharCode( ClipGlobal.codeParamArray );
add( param, token, 1, strToVal );
} else {
addSq( param, token, len, strToVal );
len = 0;
}
strFlag = false;
} else if( strFlag ){
if( len == 0 ) token = "";
token += ClipMath.charAt( line, cur );
len++;
} else {
String curChar = ClipMath.charAt( line, cur );
if( ClipMath.charCodeAt( line, cur ) == ClipGlobal.charCodeSpace ){
curChar = ' ';
}
switch( curChar ){
case ' ':
case '\t':
case '\r':
case '\n':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
break;
case '(':
case ')':
case '{':
case '}':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
switch( curChar ){
case '(':
token = String.fromCharCode( ClipGlobal.codeTop );
if( !formatSeFlag ){
if( topCount >= 0 ){
topCount++;
}
}
break;
case ')':
token = String.fromCharCode( ClipGlobal.codeEnd );
if( !formatSeFlag ){
topCount--;
}
break;
case '{':
token = String.fromCharCode( ClipGlobal.codeArrayTop );
formatSeFlag = true;
break;
case '}':
token = String.fromCharCode( ClipGlobal.codeArrayEnd );
formatSeFlag = false;
break;
}
add( param, token, 1, strToVal );
break;
case ':':
if( len == 0 ) token = "";
token += curChar;
len++;
if( ClipMath.charAt( token, 0 ) == '@' ){
add( param, token, len, strToVal );
len = 0;
}
break;
case '?':
case '=':
case ',':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
switch( curChar ){
case '?': token += String.fromCharCode( ClipGlobal.opConditional ); break;
case ',': token += String.fromCharCode( ClipGlobal.opComma ); break;
case '=':
if( ClipMath.charAt( line, cur + 1 ) == '=' ){
token += String.fromCharCode( ClipGlobal.opEqual );
cur++;
} else {
token += String.fromCharCode( ClipGlobal.opAss );
}
break;
}
add( param, token, 2, strToVal );
break;
case '&':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
switch( ClipMath.charAt( line, cur + 1 ) ){
case '&': token += String.fromCharCode( ClipGlobal.opLogAnd ); cur++; break;
case '=': token += String.fromCharCode( ClipGlobal.opAndAndAss ); cur++; break;
default : token += String.fromCharCode( ClipGlobal.opAnd ); break;
}
add( param, token, 2, strToVal );
break;
case '|':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
switch( ClipMath.charAt( line, cur + 1 ) ){
case '|': token += String.fromCharCode( ClipGlobal.opLogOr ); cur++; break;
case '=': token += String.fromCharCode( ClipGlobal.opOrAndAss ); cur++; break;
default : token += String.fromCharCode( ClipGlobal.opOr ); break;
}
add( param, token, 2, strToVal );
break;
case '*':
case '/':
case '%':
case '^':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
if( ClipMath.charAt( line, cur + 1 ) == '=' ){
switch( curChar ){
case '*': token += String.fromCharCode( ClipGlobal.opMulAndAss ); break;
case '/': token += String.fromCharCode( ClipGlobal.opDivAndAss ); break;
case '%': token += String.fromCharCode( ClipGlobal.opModAndAss ); break;
case '^':
if( param.enableOpPow() && ((param.mode() & ClipGlobal.modeInt) == 0) ){
token += String.fromCharCode( ClipGlobal.opPowAndAss );
} else {
token += String.fromCharCode( ClipGlobal.opXorAndAss );
}
break;
}
cur++;
} else {
switch( curChar ){
case '*':
if( ClipMath.charAt( line, cur + 1 ) == '*' ){
if( ClipMath.charAt( line, cur + 2 ) == '=' ){
token += String.fromCharCode( ClipGlobal.opPowAndAss );
cur += 2;
} else {
token += String.fromCharCode( ClipGlobal.opPow );
cur++;
}
} else {
token += String.fromCharCode( ClipGlobal.opMul );
}
break;
case '/': token += String.fromCharCode( ClipGlobal.opDiv ); break;
case '%': token += String.fromCharCode( ClipGlobal.opMod ); break;
case '^':
if( param.enableOpPow() && ((param.mode() & ClipGlobal.modeInt) == 0) ){
token += String.fromCharCode( ClipGlobal.opPow );
} else {
token += String.fromCharCode( ClipGlobal.opXor );
}
break;
}
}
add( param, token, 2, strToVal );
break;
case '+':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
switch( ClipMath.charAt( line, cur + 1 ) ){
case '=': token += String.fromCharCode( ClipGlobal.opAddAndAss ); cur++; break;
case '+': token += String.fromCharCode( ClipGlobal.opPostfixInc ); cur++; break;
default : token += String.fromCharCode( ClipGlobal.opAdd ); break;
}
add( param, token, 2, strToVal );
break;
case '-':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
switch( ClipMath.charAt( line, cur + 1 ) ){
case '=': token += String.fromCharCode( ClipGlobal.opSubAndAss ); cur++; break;
case '-': token += String.fromCharCode( ClipGlobal.opPostfixDec ); cur++; break;
default : token += String.fromCharCode( ClipGlobal.opSub ); break;
}
add( param, token, 2, strToVal );
break;
case '<':
case '>':
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator );
if( ClipMath.charAt( line, cur + 1 ) == curChar ){
if( ClipMath.charAt( line, cur + 2 ) == '=' ){
switch( curChar ){
case '<': token += String.fromCharCode( ClipGlobal.opShiftLAndAss ); break;
case '>': token += String.fromCharCode( ClipGlobal.opShiftRAndAss ); break;
}
cur += 2;
} else {
switch( curChar ){
case '<': token += String.fromCharCode( ClipGlobal.opShiftL ); break;
case '>': token += String.fromCharCode( ClipGlobal.opShiftR ); break;
}
cur++;
}
} else {
if( ClipMath.charAt( line, cur + 1 ) == '=' ){
switch( curChar ){
case '<': token += String.fromCharCode( ClipGlobal.opLessOrEq ); break;
case '>': token += String.fromCharCode( ClipGlobal.opGreatOrEq ); break;
}
cur++;
} else {
switch( curChar ){
case '<': token += String.fromCharCode( ClipGlobal.opLess ); break;
case '>': token += String.fromCharCode( ClipGlobal.opGreat ); break;
}
}
}
add( param, token, 2, strToVal );
break;
case '!':
if( ClipMath.charAt( line, cur + 1 ) == '=' ){
if( len > 0 ){
add( param, token, len, strToVal );
len = 0;
}
token = String.fromCharCode( ClipGlobal.codeOperator ) + String.fromCharCode( ClipGlobal.opNotEqual );
cur++;
add( param, token, 2, strToVal );
} else {
if( len == 0 ) token = "";
token += curChar;
len++;
}
break;
case 'e':
case 'E':
if( ((param.mode() & ClipGlobal.modeInt) == 0) && (len > 0) ){
if( (ClipMath.charAt( line, cur + 1 ) == '+') || (ClipMath.charAt( line, cur + 1 ) == '-') ){
bool _break = false;
for( int i = 0; i < len; i++ ){
switch( ClipMath.charAt( token, i ) ){
case '+':
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
case 'e':
case 'E':
break;
default:
_break = true;
break;
}
if( _break ){
break;
}
}
if( !_break ){
token += curChar;
cur++;
token += ClipMath.charAt( line, cur );
len += 2;
break;
}
}
}
// そのまま下に流す
continue _default;
_default:
default:
if( len == 0 ) token = "";
token += curChar;
len++;
break;
}
}
cur++;
}
if( len > 0 ){
add( param, token, len, strToVal );
}
if( _top != null ){
if( _top!._code == ClipGlobal.codeSe ){
if( topCount != 0 ){
return ClipGlobal.procErrSeOperand;
}
}
}
return ClipGlobal.noErr;
}