#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE, DWORD, LPVOID )
{
    return TRUE;
}

static int args_typecheck( struct ARGS *args, char *types ) // 引数のチェック
{
	struct ARGS *p;

	p = args;

	if (p == NULL) {
		if (types == NULL || types[0] == 0)
			return 1; // OK
		else
			return 0; // NG
	}

	do {
		switch ( p->type ) {
			case UFCT_ARG_INT:
				if (*types != 'i')
					return 0; // NG
				break;

			case UFCT_ARG_STRING:
				if (*types != 's')
					return 0; // NG
				break;

			case UFCT_ARG_INTS:
				if (*types != 'a')
					return 0; // NG
				break;

			case UFCT_ARG_STRINGS:
				if (*types != 'r')
					return 0; // NG
				break;
		}
		
		types++;
	} while( (p = p->next) != NULL );

	if ( *types == 0 ) // argsが終端に達したとき、typeも終端に達したか?
		return 1; // OK
	else
		return 0; // NG
}

DllExport UINT br2eCheckSubkeyEntry( HWND hWnd, struct ARGS *args )
{
	if ( args_typecheck( args, "s" ) ) {
		char *p;
		// ARG1.text : これが xxx\yyy の形をしているかどうかをチェックする
		// 正しければ1, 間違っていれば（中に\が1つも含まれていなければ0を返す）

		p = strchr(ARG1.text, '\\');
		if ( p && ARG1.text != p && *(p+1) != 0 ) {
			return 1;
		}
	}

	return 0;
}

DllExport HGLOBAL br2eGetSubkey( HWND hWnd, struct ARGS *args )
{
	if ( args_typecheck( args, "s" ) ) {
		// ARG1.text - xxx\yyy のxxxの部分を返す。
		char *buf = _strdup( ARG1.text ), *p, *mem;
		HGLOBAL hMem;

		p = strchr(buf, '\\');
		if ( p ) {
			*p = 0; // \\ を終端文字 \0 に置き換える
			hMem = GlobalAlloc(GHND, lstrlen(buf)+1);
			mem = (char *)GlobalLock( hMem );
			lstrcpy(mem, buf);
			GlobalUnlock( hMem );
			safefree( buf );
			return hMem;
		}
		else { // \\ が無かったら
            safefree( buf );
			return 0; // エラー
		}
	}

	return 0;
}

DllExport HGLOBAL br2eGetValue( HWND hWnd, struct ARGS *args )
{
	if ( args_typecheck( args, "s" ) ) {
		// ARG1.text - xxx\yyy のyyyの部分を返す。\が複数ある場合は、1つめの\を区切りの\と見なす
		char *buf = _strdup( ARG1.text ), *p, *mem;
		HGLOBAL hMem;

		p = strchr(buf, '\\');
		if ( p ) {
			p++; // \\ のすぐ隣からが、得たい文字列
			hMem = GlobalAlloc(GHND, lstrlen(p)+1);
			mem = (char *)GlobalLock( hMem );
			lstrcpy(mem, p);
			GlobalUnlock( hMem );
			safefree( buf );
			return hMem;
		}
		else { // \\ が無かったら
            safefree( buf );
			return 0; // エラー
		}
	}

	return 0;
}
