separate method

int separate(
  1. ClipParam param,
  2. String line,
  3. bool strToVal
)

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;
}