LineParser &LineParser::parse( int argn, char *const *argv ) { int val, arg, diff; Mixed optional; const option_s *begin = &(*this->lp_data.pd_options.begin()); while( (val = getopt_long(argn, argv, this->lp_data.pd_optstring.c_str(), begin, NULL)) != EOF ) { if( val == 'h' ) { this->lp_data.pd_progname.assign( argv[0] ); throw ShowHelp( this->lp_data ); } else if( val == '?' ) { this->lp_data.pd_progname.assign( argv[0] ); throw InvalidOption( this->lp_data, optopt ); } else if( this->lp_data.pd_argmap.count(val) != 0 ) { switch( this->lp_data.pd_argmap[val] ) { case no_argument: this->lp_map.insert( map<char, Mixed>::value_type((char) val, Mixed(true)) ); break; case required_argument: this->lp_map.insert( map<char, Mixed>::value_type((char) val, Mixed(optarg)) ); break; case optional_argument: default: if( optarg == NULL ) { if( (optind < argn) && (argv[optind][0] != '-') ) { optional.setStringValue( argv[optind] ); optind += 1; } else optional.setLogicalValue( true ); } else optional.setStringValue( optarg ); this->lp_map.insert( map<char, Mixed>::value_type((char) val, optional) ); break; } } } diff = argn - optind; if( (((this->lp_data.pd_paramnumber == (int) ParserData::one_or_more) && (diff > 0)) || ((this->lp_data.pd_paramnumber == (int) ParserData::zero_or_more) && (diff >= 0)) || ((this->lp_data.pd_paramnumber >= 0) && (diff == this->lp_data.pd_paramnumber))) ) { for( arg = optind; arg < argn; arg++ ) this->lp_arguments.push_back( argv[arg] ); } else { this->lp_data.pd_progname.assign( argv[0] ); throw InvalidArgNumber( this->lp_data, diff ); } return *this; }
TestData() { IntFunction(1, 2, 3); LongFunction(1, 2); StringFunction("argument"); CharFunction('a'); DwordPtrFunction((DWORD*)0x2929292); Mixed((DWORD*)0x9999, "kjhljl", 2); PassingReference(*this); PointerToPointer(0); }
void tbl_nativeDoMixed(M doMixed, T* pTable, JNIEnv* env, jlong columnIndex, jlong rowIndex, jobject jMixedValue) { DataType valueType = GetMixedObjectType(env, jMixedValue); switch(valueType) { case type_Int: { jlong longValue = GetMixedIntValue(env, jMixedValue); (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed(static_cast<int64_t>(longValue))); return; } case type_Float: { jfloat floatValue = GetMixedFloatValue(env, jMixedValue); (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed(floatValue)); return; } case type_Double: { jdouble doubleValue = GetMixedDoubleValue(env, jMixedValue); (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed(doubleValue)); return; } case type_Bool: { jboolean boolValue = GetMixedBooleanValue(env, jMixedValue); (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed(boolValue != 0 ? true : false)); return; } case type_String: { jstring stringValue = GetMixedStringValue(env, jMixedValue); JStringAccessor string(env, stringValue); // throws (pTable->*doMixed)( S(columnIndex), S(rowIndex), StringData(string)); return; } case type_DateTime: { jlong dateTimeValue = GetMixedDateTimeValue(env, jMixedValue); DateTime date(dateTimeValue); (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed(date)); return; } case type_Binary: { jint mixedBinaryType = GetMixedBinaryType(env, jMixedValue); if (mixedBinaryType == 0) { jbyteArray dataArray = GetMixedByteArrayValue(env, jMixedValue); if (!dataArray) break; char* data = reinterpret_cast<char*>(env->GetByteArrayElements(dataArray, NULL)); if (!data) break; size_t size = S(env->GetArrayLength(dataArray)); (pTable->*doMixed)( S(columnIndex), S(rowIndex), BinaryData(data, size)); env->ReleaseByteArrayElements(dataArray, reinterpret_cast<jbyte*>(data), 0); return; } else if (mixedBinaryType == 1) { jobject jByteBuffer = GetMixedByteBufferValue(env, jMixedValue); if (!jByteBuffer) break; BinaryData binaryData; if (GetBinaryData(env, jByteBuffer, binaryData)) (pTable->*doMixed)( S(columnIndex), S(rowIndex), binaryData); return; } break; // failed } case type_Table: { (pTable->*doMixed)( S(columnIndex), S(rowIndex), Mixed::subtable_tag()); return; } case type_Mixed: break; case type_Link: break; case type_LinkList: break; } TR_ERR("ERROR: nativeSetMixed() failed.") ThrowException(env, IllegalArgument, "nativeSetMixed()"); }