[PR]

水無瀬の部屋 > Programming > sample > tools > misc > pathargv.cpp
最終更新日: 2007/03/11

   1: //*********************************************************
   2: // プロジェクト: TOOLS
   3: //   ファイル名: pathargv.cpp
   4: //*********************************************************
   5: #include <misc/pathargv.h>
   6: #include <header/tooldbg.h>    //
   7: #include <header/toolbase.h>   // 
   8: #include <header/toolsys.h>    // 
   9: 
  10: 
  11: //---------------------------------------------------------
  12: // テスト関数 の 宣言
  13: //---------------------------------------------------------
  14: DECLARE_TESTPROC( test_pathargv );
  15: 
  16: 
  17: //---------------------------------------------------------
  18: // 定数型マクロ の 定義
  19: //---------------------------------------------------------
  20: #define DBG_ALLOCNAME  "GetPathArgcArgv"
  21: 
  22: 
  23: //*********************************************************
  24: // GetPathArgcArgv
  25: //*********************************************************
  26: char **
  27: GetPathArgcArgv
  28: 	(
  29: 		int   *count,
  30: 		int    argc,
  31: 		char **argv
  32: 	)
  33: {
  34: 	CALLONCE_TESTPROC( test_pathargv ); // [テスト]
  35: 
  36: 	// パラメタの仮定
  37: 	ASSERT( IsValidPtr( count, sizeof( *count ) ) );
  38: 	ASSERT( IsValidArgcArgv( argc, argv ) );
  39: 
  40: 	//
  41: 	char **paths = (char **)malloc( (1 + argc) * sizeof( *paths ) );
  42: 	if ( !paths )
  43: 		return null;
  44: 
  45: 	//
  46: 	*count = 0;
  47: 	{for( int i = 0; i < argc; ++i )
  48: 	{
  49: 		ASSERT( IsValidStringPtr( argv[ i ] ) );
  50: 
  51: 		if ( IsPathExist( argv[ i ] ) )
  52: 		{
  53: 			char longpath[ MAX_PATH_BUF ];
  54: 			if ( GetLongFileName( argv[ i ], longpath, numof( longpath ) ) )
  55: 			{
  56: 				ASSERT( IsPathExist( longpath ) );
  57: 				ASSERT( 0 < strlen( longpath ) );
  58: 
  59: 				// パスを追加
  60: 				paths[ *count ] = strdup( longpath );
  61: 				if ( !paths[ *count ] )
  62: 				{
  63: 					ReleasePathArgcArgv( *count, paths );
  64: 					return null;
  65: 				}
  66: 				DBG_LOCK_ALLOCED_MEMORY( paths[ *count ], DBG_ALLOCNAME ); // [DBG]
  67: 
  68: 				++(*count);
  69: 			}
  70: 		}
  71: 	}}
  72: 
  73: 	ASSERT( *count <= argc );
  74: 	paths[ *count ] = null;
  75: 	ASSERT( IsValidArgcArgv( *count, paths ) );
  76: 
  77: 	DBG_LOCK_ALLOCED_MEMORY( paths, DBG_ALLOCNAME ); // [DBG]
  78: 	return paths;
  79: }//GetPathArgcArgv
  80: 
  81: //*********************************************************
  82: // ReleasePathArgcArgv
  83: //*********************************************************
  84: bool
  85: ReleasePathArgcArgv
  86: 	(
  87: 		int    argc,
  88: 		char **argv
  89: 	)
  90: {
  91: 	CALLONCE_TESTPROC( test_pathargv ); // [テスト]
  92: 
  93: 	// パラメタの仮定
  94: 	ASSERT( IsValidArgcArgv( argc, argv ) );
  95: 
  96: 	{for( int i = 0; i < argc; ++i )
  97: 	{
  98: 		ASSERT( IsValidLocalPathString( argv[ i ] ) );
  99: 
 100: 		DBG_UNLOCK_ALLOCED_MEMORY( argv[ i ], DBG_ALLOCNAME ); // [DBG]
 101: 		free( argv[ i ] );
 102: 	}}
 103: 
 104: 	DBG_UNLOCK_ALLOCED_MEMORY( argv, DBG_ALLOCNAME ); // [DBG]
 105: 	free( argv );
 106: 
 107: 	return true;
 108: }//ReleasePathArgcArgv
 109: 
 110: 
 111: //******************************************************************************************************************
 112: // TEST
 113: //******************************************************************************************************************
 114: 
 115: 
 116: #ifdef _DEBUG // デバッグ時のみ
 117: 
 118: 
 119: //*********************************************************
 120: // test_pathargv()
 121: //*********************************************************
 122: DEFINE_TESTPROC( test_pathargv )
 123: {
 124: 	//---------------------------------------------------------
 125: 	// 定数 の テスト
 126: 	//---------------------------------------------------------
 127: 
 128: 	// __argv[ 0 ] …… テストの大前提
 129: 	{
 130: 		ASSERT( IsPathFile( __argv[ 0 ] ) );
 131: 	}
 132: 
 133: 
 134: 	//---------------------------------------------------------
 135: 	// ファイルスコープ関数 の テスト
 136: 	//---------------------------------------------------------
 137: 
 138: 	//---------------------------------------------------------
 139: 	// 公開関数 の テスト
 140: 	//---------------------------------------------------------
 141: 
 142: 	// GetPathArgcArgv(), ReleasePathArgcArgv()
 143: 	{
 144: 		char *argv[] = { "", "", "", null };
 145: 		argv[ 0 ] = __argv[ 0 ];
 146: 		argv[ 2 ] = __argv[ 0 ];
 147: 
 148: 		int count;
 149: 		char **paths = GetPathArgcArgv( &count, numof(argv)-1, argv );
 150: 		if ( paths )
 151: 		{
 152: 			ASSERT( 2 == count );
 153: 			VERIFY( IsValidArgcArgv( count, paths ) );
 154: 			ReleasePathArgcArgv( count, paths );
 155: 		}
 156: 	}
 157: 
 158: }//test_pathargv
 159: 
 160: 
 161: #endif // #ifdef _DEBUG
 162: 
 163: 
 164: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > misc > pathargv.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/misc/pathargv_cpp.shtml
『新妻LOVELY×CATION』を応援しています!