コード例 #1
0
ファイル: uva_346.c プロジェクト: BGCX262/zuva-svn-to-git
int main() {
	int test;
	char line[1024], doubleName = 0;
	while (gets(line)) {
		int i, j, i1 = -1, i2 = -1, i3 = -1;
		memset(all, 0, sizeof(int) * 12);
		for (j = 0; j < strlen(line) - 1; doubleName ? j += 2 : j++) {
			doubleName = 0;
			if (isalpha(line[j])) {
				if (line[j + 1] == 'b' || line[j + 1] == '#') {
					i = getDoubleIndex(line[j], line[j + 1]);
					doubleName = 1;
				} else {
					i = getSimpleIndex(line[j]);
				}
				if (i1 == -1) {
					i1 = i;
				} else if (i2 == -1) {
					i2 = i;
				} else {
					i3 = i;
					all[i1] = all[i2] = all[i3] = 1;
					int recognized = 0;
					for (i = 0; i < 12; i++) {
						if (all[i] && all[(i + 4) % 12] && all[(i + 7) % 12]) {
							recognized = 1;
							char name[2];
							int r = getSimpleName(i, name);
							if (r != -1) {
								printf("%s is a %c Major chord.\n", line, name[0]);
							} else {
								r = getDoubleName(i, name);
								printf("%s is a %c%c Major chord.\n", line, name[0], name[1]);
							}
							break;
						} else if (all[i] && all[(i + 3) % 12] && all[(i + 7) % 12]) {
							recognized = 1;
							char name[2];
							int r = getSimpleName(i, name);
							if (r != -1) {
								printf("%s is a %c Minor chord.\n", line, name[0]);
							} else {
								r = getDoubleName(i, name);
								printf("%s is a %c%c Major chord.\n", line, name[0], name[1]);
							}
							break;
						}
					}
					if (!recognized) {
						printf("%s is unrecognized.\n", line);
					}
				}
			}
		}
	}

	return 0;
}
コード例 #2
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::merge(const JavaClass *globalInstance) {
    LOG_DEBUG("Merging instance of '%s' with global class info", getSimpleName());
    _clazz = globalInstance->_clazz_global.get();
    _methods = &globalInstance->_methods_global;
    _fields = &globalInstance->_fields_global;
    _default_constructor = globalInstance->_default_constructor;
}
コード例 #3
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::cacheConstructor(JNIEnv *env) {
    LOG_DEBUG("Caching constructor in class '%s'", getSimpleName());
    if (!isInitialized()) {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeIllegalStateException,
                "Attempt to call cacheMethod without having set class info");
        return;
    }

    std::string signature;
    JavaClassUtils::makeSignature(signature, kTypeVoid, NULL);
    _default_constructor = env->GetMethodID(_clazz_global.get(), "<init>", signature.c_str());
    JavaExceptionUtils::checkException(env);
}
コード例 #4
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
bool JavaClass::registerNativeMethods(JNIEnv *env) {
    LOG_DEBUG("Registering native methods on class '%s'", getSimpleName());
    if (_jni_methods.empty()) {
        return false;
    }

    if (!isInitialized()) {
        JavaExceptionUtils::throwRuntimeException(env, "Could not find cached class for %s", getCanonicalName());
        return false;
    }

    bool result = (env->RegisterNatives(_clazz_global.get(), &_jni_methods[0], (jint)_jni_methods.size()) < 0);
    _jni_methods.clear();
    return result;
}
コード例 #5
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::setJavaObject(JNIEnv *env, jobject javaThis) {
    LOG_DEBUG("Setting fields from Java object of type '%s' to native instance", getSimpleName());

    // Set up field mappings, if this has not already been done
    if (_field_mappings.empty()) {
        mapFields();
    }

    for (FieldMap::const_iterator iter = _fields->begin(); iter != _fields->end(); ++iter) {
        std::string key = iter->first;
        LOG_DEBUG("Copying field '%s'", key.c_str());

        jfieldID field = iter->second;
        const FieldMapping *mapping = getFieldMapping(key.c_str());
        if (field != NULL && mapping != NULL) {
            if (TYPE_EQUALS(mapping->type, kTypeInt)) {
                int *address = static_cast<int*>(mapping->address);
                *address = env->GetIntField(javaThis, field);
            } else if (TYPE_EQUALS(mapping->type, kTypeShort)) {
                short *address = static_cast<short*>(mapping->address);
                *address = env->GetShortField(javaThis, field);
            } else if (TYPE_EQUALS(mapping->type, kTypeBool)) {
                bool *address = static_cast<bool*>(mapping->address);
                // The somewhat odd "? true : false" fixes a performance warning on windows,
                // since GetBooleanField actually returns jboolean, not bool.
                *address = env->GetBooleanField(javaThis, field) ? true : false;
            } else if (TYPE_EQUALS(mapping->type, kTypeFloat)) {
                float *address = static_cast<float*>(mapping->address);
                *address = env->GetFloatField(javaThis, field);
            } else if (TYPE_EQUALS(mapping->type, kTypeDouble)) {
                double *address = static_cast<double*>(mapping->address);
                *address = env->GetDoubleField(javaThis, field);
            } else if (TYPE_EQUALS(mapping->type, kTypeString)) {
                jstring string = (jstring)env->GetObjectField(javaThis, field);
                JavaString *address = static_cast<JavaString*>(mapping->address);
                address->set(env, string);
            } else if (TYPE_EQUALS(mapping->type, kTypeByte)) {
                unsigned char *address = static_cast<unsigned char*>(mapping->address);
                *address = env->GetByteField(javaThis, field);
            } else if (TYPE_EQUALS(mapping->type, kTypeChar)) {
                wchar_t *address = static_cast<wchar_t*>(mapping->address);
                *address = env->GetCharField(javaThis, field);
            } else {
                LOG_ERROR("Unable to copy data to field '%s'", key.c_str());
            }
        }
    }
}
コード例 #6
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::addNativeMethod(const char *method_name, void *function, const char *return_type, ...) {
    LOG_DEBUG("Adding native method '%s' to class '%s'", method_name, getSimpleName());
    JNINativeMethod nativeMethod;
    nativeMethod.name = const_cast<char*>(method_name);
    nativeMethod.fnPtr = function;

    va_list arguments;
    va_start(arguments, return_type);
    std::string signature;
    JavaClassUtils::makeSignatureWithList(signature, return_type, arguments);
    nativeMethod.signature = const_cast<char*>(strdup(signature.c_str()));
    LOG_DEBUG("Native signature is '%s'", nativeMethod.signature);
    va_end(arguments);

    _jni_methods.push_back(nativeMethod);
}
コード例 #7
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::cacheField(JNIEnv *env, const char *field_name, const char *field_type) {
    LOG_DEBUG("Caching field '%s' (type %s) in class '%s'", field_name, field_type, getSimpleName());
    if (!isInitialized()) {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeIllegalStateException,
                "Attempt to call cacheField without having set class info");
        return;
    }

    std::string fieldTypeSignature;
    JavaClassUtils::makeNameForSignature(fieldTypeSignature, field_type);
    jfieldID field = env->GetFieldID(_clazz_global.get(), field_name, fieldTypeSignature.c_str());
    JavaExceptionUtils::checkException(env);
    if (field != NULL) {
        _fields_global[field_name] = field;
    } else {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeJavaClass(NoSuchFieldError),
                "Field '%s' (type '%s') not found on class %s",
                field_name, field_type, getCanonicalName());
    }
}
コード例 #8
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
jobject JavaClass::toJavaObject(JNIEnv *env) {
    LOG_DEBUG("Converting native instance of '%s' to Java instance", getSimpleName());

    if (_default_constructor == NULL) {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeIllegalStateException,
                "Cannot call toJavaObject without a constructor (did you forget to call cacheConstructor() in initialize()?");
        return NULL;
    } else if (!isInitialized()) {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeIllegalStateException,
                "Cannot call toJavaObject without registering class info");
        return NULL;
    }

    // Set up field mappings, if this has not already been done
    if (_field_mappings.empty()) {
        mapFields();
    }

    JniLocalRef<jobject> result;
    result.set(env->NewObject(_clazz, _default_constructor));
    return toJavaObject(env, result.leak());
}
コード例 #9
0
ファイル: JavaClass.cpp プロジェクト: whvirgil2015/JniHelpers
void JavaClass::cacheMethod(JNIEnv *env, const char* method_name, const char* return_type, ...) {
    LOG_DEBUG("Caching method '%s' in class '%s'", method_name, getSimpleName());
    if (!isInitialized()) {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeIllegalStateException,
                "Attempt to call cacheMethod without having set class info");
        return;
    }

    va_list arguments;
    va_start(arguments, return_type);
    std::string signature;
    JavaClassUtils::makeSignatureWithList(signature, return_type, arguments);
    va_end(arguments);

    jmethodID method = env->GetMethodID(_clazz_global.get(), method_name, signature.c_str());
    JavaExceptionUtils::checkException(env);
    if (method != NULL) {
        _methods_global[method_name] = method;
    } else {
        JavaExceptionUtils::throwExceptionOfType(env, kTypeJavaClass(NoSuchMethodError),
                "Method '%s' (signature: %s) not found on class '%s'",
                method_name, signature.c_str(), getCanonicalName());
    }
}