/*****************************************************************************
*
* FILE NAME:    Util.c
*
* DESCRIPTION:	プロジェクトのユーティリティ関数群
*
\*****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <rt.h>

#include "SampleAPP.h"

#pragma check_stack(off)
#pragma optimize("", off)


/*****************************************************************************
*
* FUNCTION:		Catalog
*
* PARAMETERS:	1. どのプロジェクトハンドルを使用するかをプロジェクトハンドルで指定
*				2. カタログされるオブジェクトハンドルを指定
*				3. カタログする名称（英半角１４文字以内）を指定
*
* RETURNS:		BOOL 成功を意味します
*
* DESCRIPTION:	与えられた名称がすでに存在しており、
*				プロセスがルートプロセスの場合で、さらにすでに存在する
*				名称が、不正なオブジェクトを示している場合
*				以上を満たすとき、存在している名称は一度削除されます。
\*****************************************************************************/

BOOL				Catalog(
	RTHANDLE			hProcess,
	RTHANDLE			hObject,
	LPSTR				lpszName)
{
	RTHANDLE		hOld;

	if (CatalogRtHandle(hProcess, hObject, lpszName))
		return TRUE;

	// よくあるエラーを検出します
	if (hProcess &&
		((hOld = LookupRtHandle(hProcess, lpszName, NO_WAIT)) != BAD_RTHANDLE) &&
		(GetRtHandleType(hOld) == INVALID_TYPE))
	{
		// 古いエントリーを削除して再度試みます
		if (UncatalogRtHandle(hProcess, lpszName))
			return (CatalogRtHandle(hProcess, hObject, lpszName));
	}
	return FALSE;
}


/*****************************************************************************
*
* FUNCTION:		UsecsToKticks
*
* PARAMETERS:	1. μ秒を意味する数値
*
* RETURNS:		低レベルティック値
*
* DESCRIPTION:	与えられた引数がWAIT_FOREVERの時、WAIT_FOREVERを返却します。
*				引数は低レベルチック値で切り上げられます。
\*****************************************************************************/

DWORD				UsecsToKticks(
	DWORD				dwUsecs)
{
	if (dwUsecs == WAIT_FOREVER)
		return WAIT_FOREVER;

	return (dwUsecs + dwKtickInUsecs - 1) / dwKtickInUsecs;
}
