+++ /dev/null
-/***********************************************************************\r
- <<< \81iWin32\83R\83\93\83\\81[\83\8b\82Å\93®\82\81j\82Ì\83v\83\8d\83O\83\89\83\80 >>> \r
-************************************************************************/\r
-\r
-#define _WIN32_WINNT 0x0400\r
-#include <windows.h>\r
-#include <stdio.h>\r
-#include <stdarg.h>\r
-#include <string.h>\r
-#include <io.h>\r
-#include <locale.h>\r
-\r
-\r
-void help(void);\r
-\r
-#define error() my_error_imp( __FILE__, __LINE__, -1, "" )\r
-#define ASSERT( x ) ( (x) ? 0 : my_error_imp( __FILE__, __LINE__, -2, #x ) )\r
-#define error2_0( id, fmt ) my_error_imp( __FILE__, __LINE__, id, fmt )\r
-#define error2_1( id, fmt, a ) my_error_imp( __FILE__, __LINE__, id, fmt, a )\r
-#define error2_2( id, fmt, a,b ) my_error_imp( __FILE__, __LINE__, id, fmt, a,b )\r
-#define error2_3( id, fmt, a,b,c ) my_error_imp( __FILE__, __LINE__, id, fmt, a,b,c )\r
-#define error2_4( id, fmt, a,b,c,d ) my_error_imp( __FILE__, __LINE__, id, fmt, a,b,c,d )\r
-#define error2_5( id, fmt, a,b,c,d,e ) my_error_imp( __FILE__, __LINE__, id, fmt, a,b,c,d,e )\r
-void my_error_imp( char* file, int line, int id, const char* fmt, ... )\r
- { if ( fmt[0]!='\0' ) { va_list va; va_start( va, fmt ); vprintf( fmt, va ); va_end( va ); }\r
- printf( "ERROR %d in (%d) %s\n", id, line, file );\r
- exit(4); }\r
-\r
-\r
-typedef int (*FileX_NestFindF)( void* obj, const wchar_t* abs_path,\r
- const wchar_t* step_path, const wchar_t* fname );\r
-void FileX_callByNestFind( const char* path, void* obj, FileX_NestFindF callback );\r
-int FileX_isDir( const char* path );\r
-int FileX_isDiff( const char* path1, const char* path2 );\r
-int FileX_isDiffW( const wchar_t* path1, const wchar_t* path2 );\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< \83\89\83C\83u\83\89\83\8a >>> \r
-************************************************************************/\r
-void FileX_callByNestFind( const char* path, void* obj, FileX_NestFindF callback );\r
-void FileX_callByNestFindW( const wchar_t* path, void* obj, FileX_NestFindF callback );\r
-\r
-\r
-void StrX_W_cpy( wchar_t* dst, const wchar_t* src, int dst_size );\r
-#define StrX_Err_BufOver 21\r
-void StrX_W_printf( wchar_t* s, size_t s_size, const wchar_t* fmt, ... );\r
-void StrX_W_printf_v( wchar_t* s, size_t s_size, const wchar_t* fmt, va_list va );\r
-wchar_t* StrX_W_cpyFolder( wchar_t* folder, const wchar_t* path, int folder_size );\r
-wchar_t* StrX_W_cutFName( wchar_t* path );\r
-int FileX_isExist( const char* path );\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder] \94ä\8ar\82·\82é\83t\83H\83\8b\83_\81i\95Ð\95û\81j >>> \r
-************************************************************************/\r
-typedef struct {\r
- wchar_t* base;\r
- wchar_t** path; /* \83t\83@\83C\83\8b\83p\83X\82Ì\94z\97ñ\81i\91\8a\91Î\81j*/\r
- int nFile;\r
- char* stat; /* path \82É\91Î\89\9e\82·\82é\83f\81[\83^\81i\94z\97ñ\81j */\r
- int stat2; /* \82à\82¤\95Ð\95û\82Ì\83t\83H\83\8b\83_\82É\8aÖ\82·\82é\83f\81[\83^ */\r
- wchar_t** folder; /* \83t\83H\83\8b\83_\83p\83X\82Ì\94z\97ñ\81i\92Z\82¢\8f\87\81j\81A"." \82Í\93ü\82ê\82È\82¢ */\r
- int nFolder;\r
-} CmpFolder;\r
-\r
-\r
-void CmpFolder_init( CmpFolder* m, const wchar_t* path );\r
-void CmpFolder_finish( CmpFolder* m );\r
-\r
-void CmpFolder_scan( CmpFolder* m );\r
-void CmpFolder_resetStat( CmpFolder* m );\r
-char* CmpFolder_refStat( CmpFolder* m, const wchar_t* step_path );\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< \81\9f[main] \83t\83@\83C\83\8b\82Ü\82½\82Í\83t\83H\83\8b\83_\82ð\94ä\8ar\82µ\82Ü\82· >>> \r
-\81y\88ø\90\94\81z\r
- \81Eargv[1]; \83t\83@\83C\83\8b\82Ü\82½\82Í\83t\83H\83\8b\83_\82Ì\83p\83X\r
- \81Eargv[2]; \83t\83@\83C\83\8b\82Ü\82½\82Í\83t\83H\83\8b\83_\82Ì\83p\83X\r
- \81Eerrorlevel; 0=\93¯\82¶ 1=\88á\82¤\r
-************************************************************************/\r
-int chkSameFileByFo2( void* obj, const wchar_t* abs_path, const wchar_t* step_path, const wchar_t* fname );\r
-\r
-\r
-\r
-int main( int argc, char* argv[] )\r
-{\r
- int ret;\r
-\r
- setlocale(LC_ALL, "Japanese");\r
-\r
- if ( argc != 3 ) { help(); return 1; }\r
-\r
- if ( FileX_isDir( argv[1] ) && FileX_isDir( argv[2] ) ) {\r
- CmpFolder fo1;\r
- int r, i;\r
- wchar_t path[4096];\r
- wchar_t path2[4096];\r
- wchar_t base2[4096];\r
-\r
- /* \83t\83@\83C\83\8b\82Ì\97L\96³\82ð\83`\83F\83b\83N\82µ\82Ü\82· */\r
- r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, argv[1], -1,\r
- path, sizeof(path) / 2 );\r
- if ( r == 0 ) error();\r
- CmpFolder_init( &fo1, path );\r
- CmpFolder_scan( &fo1 );\r
- CmpFolder_resetStat( &fo1 );\r
- fo1.stat2 = 0;\r
- FileX_callByNestFind( argv[2], &fo1, chkSameFileByFo2 );\r
- for ( i = 0; i < fo1.nFile; i++ ) {\r
- if ( fo1.stat[i] != 1 ) break;\r
- }\r
- if ( i == fo1.nFile && fo1.stat2 == 0 ) {\r
-\r
- r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, argv[2], -1,\r
- base2, sizeof(base2) / 2 );\r
- if ( r == 0 ) error();\r
-\r
- /* \83t\83@\83C\83\8b\82Ì\93à\97e\82ð\83`\83F\83b\83N\82µ\82Ü\82· */\r
- for ( i = 0; i < fo1.nFile; i++ ) {\r
- StrX_W_printf( path, sizeof(path), L"%s\\%s", fo1.base, fo1.path[i] );\r
- StrX_W_printf( path2, sizeof(path2), L"%s\\%s", base2, fo1.path[i] );\r
-\r
- if ( FileX_isDiffW( path, path2 ) != 0 ) break;\r
- }\r
- ret = ( i == fo1.nFile ) ? 0 : 1;\r
- }\r
- else\r
- ret = 1;\r
- }\r
- else if ( FileX_isExist( argv[1] ) && FileX_isExist( argv[2] ) )\r
- ret = ( FileX_isDiff( argv[1], argv[2] ) == 0 ? 0 : 1 );\r
- else {\r
- if ( ! FileX_isExist( argv[1] ) ) printf( "Not found %s\n", argv[1] );\r
- if ( ! FileX_isExist( argv[2] ) ) printf( "Not found %s\n", argv[2] );\r
- ret = 2;\r
- }\r
-\r
- if ( ret == 0 ) printf( "same.\n" );\r
- else if ( ret == 1 ) printf( "different.\n" );\r
-\r
- return ret;\r
-}\r
-\r
-\r
-int chkSameFileByFo2( void* obj, const wchar_t* abs_path, const wchar_t* step_path, const wchar_t* fname )\r
-{\r
- CmpFolder* fo1 = (CmpFolder*) obj;\r
- char* p;\r
-\r
- p = CmpFolder_refStat( fo1, step_path );\r
- if ( p != NULL ) *p = 1;\r
- else fo1->stat2 = 1;\r
-\r
- return 0;\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [help] >>> \r
-************************************************************************/\r
-void help()\r
-{\r
- printf( "feq (path1) (path2)\n" );\r
- printf( " compare binary files or folders (sub folders)\n" );\r
-}\r
-\r
-\r
- \r
-/*-------------------------------------------------------------------------*/\r
-/* \81\9f<<<< \83\89\83C\83u\83\89\83\8a >>>> */ \r
-/*-------------------------------------------------------------------------*/\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [FileX_callByNestFind] \83T\83u\83t\83H\83\8b\83_\82à\8aÜ\82ß\82Ä\8ae\83t\83@\83C\83\8b\82Ì\83p\83X\82ð\93n\82· >>> \r
-\81y\88ø\90\94\81z\r
- \81Echar* path; \83t\83@\83C\83\8b\82ð\97ñ\8b\93\82·\82é\83t\83H\83\8b\83_\82Ì\83p\83X\r
- \81Evoid* obj; \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\91æ1\88ø\90\94\82É\93n\82·\92l\r
- \81EFileX_NestFindF callback; \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\81i\83t\83@\83C\83\8b\82Ì\83p\83X\82ð\88ø\90\94\82É\8e\9d\82Â\81j\r
-************************************************************************/\r
-typedef struct {\r
- void* obj;\r
- FileX_NestFindF callback;\r
- wchar_t* step_path;\r
- wchar_t* fname;\r
- wchar_t abs_path[4096];\r
-} FileX_CallByNestFindData;\r
-\r
-void FileX_callByNestFind_sub( FileX_CallByNestFindData* m );\r
-\r
-\r
-void FileX_callByNestFind( const char* path, void* obj, FileX_NestFindF callback )\r
-{\r
- FileX_CallByNestFindData data;\r
-\r
- {\r
- int r;\r
- wchar_t* p;\r
-\r
- r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, path, -1,\r
- data.abs_path, sizeof(data.abs_path) / 2 );\r
- if ( r == 0 ) error();\r
-\r
-\r
- /* abs_path \82Ì\8dÅ\8cã\82É \ \82ª\96³\82¢\82È\82ç\92Ç\89Á\82·\82é */\r
- p = wcschr( data.abs_path, L'\0' );\r
- p--;\r
- if ( *p != L'\\' ) {\r
- p++;\r
- if ( p >= data.abs_path + (sizeof(data.abs_path) / 2) - 1 ) error();\r
- *p = L'\\';\r
- }\r
-\r
-\r
- /* data \82ð\8f\89\8aú\89»\82·\82é */\r
- data.obj = obj;\r
- data.callback = callback;\r
- data.step_path = p + 1;\r
- data.fname = p + 1;\r
- }\r
-\r
- /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ\8aÖ\90\94\82Ö */\r
- FileX_callByNestFind_sub( &data );\r
-}\r
-\r
-\r
-void FileX_callByNestFindW( const wchar_t* path, void* obj, FileX_NestFindF callback )\r
-{\r
- FileX_CallByNestFindData data;\r
-\r
- {\r
- wchar_t* p;\r
-\r
- StrX_W_cpy( data.abs_path, path, sizeof(data.abs_path) );\r
-\r
-\r
- /* abs_path \82Ì\8dÅ\8cã\82É \ \82ª\96³\82¢\82È\82ç\92Ç\89Á\82·\82é */\r
- p = wcschr( data.abs_path, L'\0' );\r
- p--;\r
- if ( *p != L'\\' ) {\r
- p++;\r
- if ( p >= data.abs_path + (sizeof(data.abs_path) / 2) - 1 ) error();\r
- *p = L'\\';\r
- }\r
-\r
-\r
- /* data \82ð\8f\89\8aú\89»\82·\82é */\r
- data.obj = obj;\r
- data.callback = callback;\r
- data.step_path = p + 1;\r
- data.fname = p + 1;\r
- }\r
-\r
- /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ\8aÖ\90\94\82Ö */\r
- FileX_callByNestFind_sub( &data );\r
-}\r
-\r
-\r
-void FileX_callByNestFind_sub( FileX_CallByNestFindData* m )\r
-{\r
- HANDLE find;\r
- WIN32_FIND_DATAW data;\r
- wchar_t* p;\r
- int done;\r
-\r
-\r
- /* * \82ð\92Ç\89Á */\r
- p = m->fname;\r
- if ( p >= m->abs_path + (sizeof(m->abs_path) / 2) - 2 ) error();\r
- *p = L'*'; *(p+1) = L'\0';\r
-\r
-\r
- /* \83t\83@\83C\83\8b\82©\83t\83H\83\8b\83_\82ð\97ñ\8b\93\82µ\82Ü\82· */\r
- find = FindFirstFileExW( m->abs_path, FindExInfoStandard, &data,\r
- FindExSearchNameMatch, NULL, 0 );\r
- done = ( find == INVALID_HANDLE_VALUE );\r
-\r
- while (!done)\r
- {\r
- if ( wcscmp( data.cFileName, L"." ) == 0 ||\r
- wcscmp( data.cFileName, L".." ) == 0 ) {\r
- done = ! FindNextFileW( find, &data );\r
- continue;\r
- }\r
-\r
- StrX_W_cpy( m->fname, data.cFileName,\r
- sizeof(m->abs_path) - ( (char*)m->fname - (char*)m->abs_path ) );\r
-\r
- if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
- p = wcschr( m->fname, L'\0' );\r
- if ( p >= m->abs_path + (sizeof(m->abs_path) / 2) - 2 ) error();\r
- *p = L'\\'; *(p+1) = L'\0';\r
- { wchar_t* w = m->fname; m->fname = p + 1; p = w; }\r
-\r
- FileX_callByNestFind_sub( m ); /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ */\r
-\r
- m->fname = p;\r
- }\r
- else {\r
- m->callback( m->obj, m->abs_path, m->step_path, m->fname );\r
- }\r
-\r
- done = ! FindNextFileW( find, &data );\r
- }\r
- FindClose( find );\r
-}\r
-\r
-\r
-\r
- \r
-/************************************************************************\r
- <<< [FileX_isExist] \83t\83@\83C\83\8b\89»\83t\83H\83\8b\83_\82Ì\91¶\8dÝ\82ð\8am\82©\82ß\82é >>> \r
-*************************************************************************/\r
-int FileX_isExist( const char* path )\r
-{\r
- return ( GetFileAttributes( path ) != -1 );\r
-}\r
-\r
-\r
- \r
-/************************************************************************\r
- <<< [FileX_isDir] \83t\83H\83\8b\83_\82Ì\91¶\8dÝ\82ð\8am\82©\82ß\82é >>> \r
-\81y\88ø\90\94\81z\r
- \81Econst char* fname; \83t\83H\83\8b\83_\82Ö\82Ì\83p\83X\96¼\r
- \81Ebool \95Ô\82è\92l; \83t\83H\83\8b\83_\82Ì\91¶\8dÝ\r
-\81y\95â\91«\81z\r
-\81E\91\8a\91Î\83p\83X\82É\82æ\82Á\82Ä\8ew\92è\82·\82é\8fê\8d\87\81A\8c»\8dÝ\8eÀ\8ds\92\86\82Ì\83t\83H\83\8b\83_\82©\82ç\82Ì\91\8a\91Î\83p\83X\82É\r
- \82È\82è\82Ü\82·\81B\r
-\81E\8ew\92è\82µ\82½\83p\83X\82ª\83t\83@\83C\83\8b\82É\88ê\92v\82·\82é\8fê\8d\87\81Afalse \82ð\95Ô\82µ\82Ü\82·\81B\r
-*************************************************************************/\r
-int FileX_isDir( const char* path )\r
-{\r
- DWORD a;\r
-\r
- a = GetFileAttributes( path );\r
- if ( a == -1 ) return 0;\r
- return ( a & FILE_ATTRIBUTE_DIRECTORY ) != 0;\r
-}\r
-\r
-\r
- \r
-/*************************************************************************\r
- <<< [FileX_isDiff] \82Q\82Â\82Ì\83t\83@\83C\83\8b\82Ì\93à\97e\82ª\93¯\88ê\82©\82Ç\82¤\82©\92²\82×\82é >>> \r
-\81y\88ø\90\94\81z\r
- \81Echar* path1, path2; \94ä\8ar\82·\82é\83t\83@\83C\83\8b\82Ì\83p\83X\r
- \81Eint \95Ô\82è\92l; 0=\93¯\88ê\81A 1=\88Ù\82È\82é\81A-1=fname1 \82ª\8aJ\82¯\82È\82¢\81A\r
- -2=fname2 \82ª\8aJ\82¯\82È\82¢\81A-3=fname1,fname2 \82Æ\82à\8aJ\82¯\82È\82¢\r
-\81y\95â\91«\81z\r
-\81E\97¼\95û\82Ì\83t\83@\83C\83\8b\82ª\91¶\8dÝ\82µ\82Ä\81A\93à\97e\82ª\93¯\88ê\82©\82Ç\82¤\82©\82ð\94»\92è\82·\82é\82È\82ç\82Î\81A\r
- \95Ô\82è\92l\82Í bool \92l\81i\82O\82©\82O\88È\8aO\82©\81j\82Æ\82µ\82Ä\94»\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r
-**************************************************************************/\r
-int FileX_isDiff_imp( FILE* file1, FILE* file2 );\r
-\r
-int FileX_isDiff( const char* path1, const char* path2 )\r
-{\r
- return FileX_isDiff_imp( fopen( path1, "rb" ), fopen( path2, "rb" ) );\r
-}\r
-\r
-\r
-int FileX_isDiffW( const wchar_t* path1, const wchar_t* path2 )\r
-{\r
- return FileX_isDiff_imp( _wfopen( path1, L"rb" ), _wfopen( path2, L"rb" ) );\r
-}\r
-\r
-\r
-int FileX_isDiff_imp( FILE* file1, FILE* file2 )\r
-{\r
- int ret;\r
- int size1, size2;\r
- char buf1[256], buf2[256];\r
-\r
- if ( file1 == NULL ) {\r
- if ( file2 == NULL ) { ret = -3; goto ret; }\r
- else {\r
- fclose( file2 );\r
- { ret = -1; goto ret; }\r
- }\r
- }\r
- if ( file2 == NULL ) {\r
- fclose( file1 );\r
- { ret = -2; goto ret; }\r
- }\r
-\r
- ret = 1;\r
- for (;;) {\r
- size1 = fread( buf1, 1, 256, file1 );\r
- size2 = fread( buf2, 1, 256, file2 );\r
-\r
- if ( size1 != size2 ) break;\r
- if ( memcmp( buf1, buf2, size1 ) != 0 ) break;\r
-\r
- if ( size1 != 256 ) { ret = 0; break; }\r
- }\r
-\r
- fclose( file1 );\r
- fclose( file2 );\r
-\r
-ret:\r
- return ret;\r
-}\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [StrX_W_printf] \83\8f\83C\83h\95¶\8e\9a\97ñ\82É\8fo\97Í\82·\82é printf >>> \r
-************************************************************************/\r
-void StrX_W_printf( wchar_t* s, size_t s_size, const wchar_t* fmt, ... )\r
-{\r
- va_list va;\r
-\r
- va_start( va, fmt );\r
- StrX_W_printf_v( s, s_size, fmt, va );\r
- va_end( va );\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [StrX_W_printf_v] \95¶\8e\9a\97ñ\82É\8fo\97Í\82·\82é printf >>> \r
-************************************************************************/\r
-void StrX_W_printf_v( wchar_t* s, size_t s_size, const wchar_t* fmt, va_list va )\r
-{\r
- s_size = s_size / 2;\r
- s[s_size - 1] = '\0';\r
-\r
- _vsnwprintf( s, s_size, fmt, va );\r
-\r
- if ( s[s_size - 1] != '\0' ) {\r
- s[s_size - 1] = L'\0';\r
- error2_0( StrX_Err_BufOver, "" );\r
- }\r
-}\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [StrX_W_cpyFolder] \83p\83X\92\86\82Ì\83t\83@\83C\83\8b\96¼\88È\8aO\82ð\83R\83s\81[\82·\82é >>> \r
-\81y\88ø\90\94\81z\r
- \81Ewchar_t* folder; \83t\83H\83\8b\83_\83p\83X\82ð\8ai\94[\82·\82é\83A\83h\83\8c\83X\r
- \81Ewchar_t* path; \83R\83s\81[\8c³\82Ì\83p\83X\r
- \81Eint folder_size; folder \82Ì\83\81\83\82\83\8a\83T\83C\83Y\r
- \81Ewchar_t* \95Ô\82è\92l; folder \82Æ\93¯\82¶\r
-\81y\95â\91«\81z\r
-\81Efolder \82Æ path \82ª\93¯\82¶\83A\83h\83\8c\83X\82Å\82à\8d\\82¢\82Ü\82¹\82ñ\81B\r
-************************************************************************/\r
-wchar_t* StrX_W_cpyFolder( wchar_t* folder, const wchar_t* path, int folder_size )\r
-{\r
- if ( folder != path ) StrX_W_cpy( folder, path, folder_size );\r
- StrX_W_cutFName( folder );\r
- return folder;\r
-}\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [StrX_W_cutFName] \83p\83X\92\86\82Ì\83t\83@\83C\83\8b\96¼\82ð\8dí\8f\9c\82·\82é >>> \r
-\81y\88ø\90\94\81z\r
- \81Echar* \95Ô\82è\92l; path \82Æ\93¯\82¶\r
-\81y\95â\91«\81z\r
-\81E\83t\83H\83\8b\83_\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í '\' \82Å\82à '/' \82Å\82à\8d\\82¢\82Ü\82¹\82ñ\r
-\81y\97á\81z\r
-\81Epath="b:\dir\fname.txt" \82È\82ç "b:\dir"\r
-\81Epath="b:\dir\subdir\" \82È\82ç "b:\dir"\r
-\81Epath="step\" \82È\82ç ""\r
-\81Epath="step" \82È\82ç ""\r
-************************************************************************/\r
-wchar_t* StrX_W_cutFName( wchar_t* path )\r
-{\r
- wchar_t* p;\r
- wchar_t* p_last;\r
-\r
- /* \90â\91Î\83p\83X\82È\82ç\83\8b\81[\83g\82Ì\88Ê\92u\82ð\92T\82· */\r
- p = path;\r
- while ( *p != L':' && *p != L'/' && *p != L'\\' && *p != L'\0' ) p++;\r
- if ( *p == L':' ) {\r
- while ( *p != L'/' && *p != L'\\' ) {\r
- if ( *p == L'\0' ) return path;\r
- p++;\r
- }\r
- }\r
- else\r
- p = NULL;\r
-\r
-\r
- /* \96\96\94ö\82Ì\83f\83B\83\8c\83N\83g\83\8a\8bæ\90Ø\82è\8bL\8d\86\82ð\8eæ\82è\8f\9c\82 */\r
- p_last = wcsrchr( path, L'\0' ) - 1;\r
- if ( *p_last == L'\\' || *p_last == L'/' ) {\r
- *p_last = '\0'; p_last --;\r
- }\r
-\r
- /* \83t\83@\83C\83\8b\96¼\82Ì\91O\82Ì\83f\83B\83\8c\83N\83g\83\8a\8bæ\90Ø\82è\8bL\8d\86\82ð\92T\82· */\r
- while ( *p_last != L'/' && *p_last != L'\\' && p_last > path ) p_last --;\r
-\r
-\r
- /* \83\8b\81[\83g\82Å\82È\82¢\8cÀ\82è\81A\82¢\82¿\82Î\82ñ\8cã\82ë\82Ì\83f\83B\83\8c\83N\83g\83\8a\8bæ\90Ø\82è\8bL\8d\86\82ð '\0'\82É\82·\82é */\r
- if ( p == NULL || p < p_last ) {\r
- *p_last = L'\0';\r
- }\r
-\r
- return path;\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [StrX_W_cpy] \83\8f\83C\83h\95¶\8e\9a\97ñ\82ð\83R\83s\81[\82·\82é >>> \r
-\81y\88ø\90\94\81z\r
- \81Ewchar_t* dst; \83R\83s\81[\90æ\r
- \81Ewchar_t* src; \83R\83s\81[\8c³\r
- \81Eint dst_size; dst \82Ì\83\81\83\82\83\8a\83T\83C\83Y\81i\83o\83C\83g\81j\r
-\81y\95â\91«\81z\r
-\81Edst \82Ì\97e\97Ê\82ð\92´\82¦\82é\82Æ\81AStrX_Err_BufOver \83G\83\89\81[\82É\82È\82è\82Ü\82·\81B\r
-************************************************************************/\r
-void StrX_W_cpy( wchar_t* dst, const wchar_t* src, int dst_size )\r
-{\r
- int src_len = wcslen( src ) * 2;\r
-\r
- if ( src_len >= dst_size - 1 ) { /* \97á src="a" \81¨ src_len = 2, dst_size = 3 \82Å\83G\83\89\81[ */\r
- if ( dst_size > 0 ) {\r
- memcpy( dst, src, (dst_size - 2) & ~1 );\r
- *(wchar_t*)( (char*) dst + dst_size - 2 ) = L'\0';\r
- }\r
- error2_1( StrX_Err_BufOver, "BufOver:%p", dst );\r
- }\r
- else\r
- wcscpy( dst, src );\r
-}\r
-\r
-\r
-\r
- \r
-/*-------------------------------------------------------------------------*/\r
-/* \81\9f<<<< (CmpFolder) \94ä\8ar\82·\82é\83t\83H\83\8b\83_\81i\95Ð\95û\81j >>>> */ \r
-/*-------------------------------------------------------------------------*/\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder_init] >>> \r
-************************************************************************/\r
-void CmpFolder_init( CmpFolder* m, const wchar_t* path )\r
-{\r
- if ( _waccess( path, 0 ) != 0 ) error();\r
-\r
- m->base = malloc( ( wcslen( path ) + 1 ) * 2 );\r
- wcscpy( m->base, path );\r
- m->path = NULL;\r
- m->nFile = 0;\r
- m->stat = NULL;\r
- m->folder = NULL;\r
- m->nFolder = 0;\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder_finish] >>> \r
-************************************************************************/\r
-void CmpFolder_finish( CmpFolder* m )\r
-{\r
- int i;\r
-\r
- free( m->base );\r
- if ( m->stat != NULL ) free( m->stat );\r
-\r
- for ( i = 0; i < m->nFile; i++ )\r
- free( m->path[i] );\r
-\r
- for ( i = 0; i < m->nFolder; i++ )\r
- free( m->folder[i] );\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder_scan] >>> \r
-\81y\95â\91«\81z\r
-\81E\83J\83\8c\83\93\83g\83t\83H\83\8b\83_\82Ì m->name \83T\83u\83t\83H\83\8b\83_\82ð\83X\83L\83\83\83\93\82µ\82Ü\82·\81B\r
-************************************************************************/\r
-int CmpFolder_scan_sub( void* obj, const wchar_t* abs_path, const wchar_t* step_path, const wchar_t* fname );\r
-\r
-\r
-void CmpFolder_scan( CmpFolder* m )\r
-{\r
- int i;\r
-\r
- for ( i = 0; i < m->nFile; i++ )\r
- free( m->path[i] );\r
-\r
- for ( i = 0; i < m->nFolder; i++ )\r
- free( m->folder[i] );\r
-\r
- m->nFile = 0;\r
- m->nFolder = 0;\r
- FileX_callByNestFindW( m->base, m, CmpFolder_scan_sub );\r
-}\r
-\r
-\r
-\r
-int CmpFolder_scan_sub( void* obj, const wchar_t* abs_path, const wchar_t* step_path, const wchar_t* fname )\r
-{\r
- CmpFolder* m = (CmpFolder*) obj;\r
- wchar_t** p;\r
-\r
-\r
- /* \83t\83@\83C\83\8b\83p\83X\82ð\93o\98^\82·\82é */\r
- m->nFile ++;\r
- m->path = (wchar_t**) realloc( m->path, m->nFile * sizeof(wchar_t*) );\r
-\r
- p = &m->path[ m->nFile - 1 ];\r
- *p = malloc( ( wcslen( step_path ) + 1 ) * 2 );\r
- wcscpy( *p, step_path );\r
-\r
-\r
- /* \83t\83H\83\8b\83_\83p\83X\82ð\93o\98^\82·\82é */\r
- {\r
- int i;\r
- wchar_t path[4096];\r
-\r
- StrX_W_cpyFolder( path, step_path, sizeof(path) );\r
- for ( i = 0; i < m->nFolder; i++ )\r
- if ( wcscmp( path, m->folder[i] ) == 0 ) break;\r
-\r
- if ( i == m->nFolder && path[0] != L'\0' ) {\r
- m->nFolder ++;\r
- m->folder = (wchar_t**) realloc( m->folder, m->nFolder * sizeof(wchar_t*) );\r
-\r
- p = &m->folder[ m->nFolder - 1 ];\r
- *p = malloc( ( wcslen( path ) + 1 ) * 2 );\r
- wcscpy( *p, path );\r
-\r
- for ( p; p > m->folder; p-- ) {\r
- if ( wcslen( *p ) >= wcslen( *(p - 1) ) ) break;\r
- { wchar_t* w = *p; *p = *(p - 1); *(p - 1) = w; }\r
- }\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder_resetStat] m->stat \94z\97ñ\82ð\8am\95Û\82µ 0 \82Å\8f\89\8aú\89»\82µ\82Ü\82· >>> \r
-************************************************************************/\r
-void CmpFolder_resetStat( CmpFolder* m )\r
-{\r
- m->stat = realloc( m->stat, m->nFile * sizeof(*m->stat) );\r
-\r
- memset( m->stat, 0, m->nFile * sizeof(*m->stat) );\r
-}\r
-\r
- \r
-/***********************************************************************\r
- <<< [CmpFolder_refStat] \83t\83@\83C\83\8b\82É\91Î\89\9e\82µ\82½ m->stat \82ð\8eQ\8fÆ\82µ\82Ü\82· >>> \r
-\81y\88ø\90\94\81z\r
- \81Ewchat_t* step_path; \83t\83@\83C\83\8b\83p\83X\81i\83x\81[\83X\82©\82ç\82Ì\91\8a\91Î\81j\r
- \81Echar* \95Ô\82è\92l; step_path \82É\91Î\89\9e\82µ\82½\94C\88Ó\82Ì1\83o\83C\83g\97Ì\88æ(stat\93à)\82Ì\83A\83h\83\8c\83X\r
-************************************************************************/\r
-char* CmpFolder_refStat( CmpFolder* m, const wchar_t* step_path )\r
-{\r
- int i;\r
-\r
- if ( m->stat == NULL ) error();\r
-\r
- for ( i = 0; i < m->nFile; i++ ) {\r
- if ( wcscmp( m->path[i], step_path ) == 0 ) break;\r
- }\r
- if ( i == m->nFile ) return NULL;\r
- else return m->stat + i;\r
-}\r
-\r
-\r
-\r
- \r