5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "stdafx.h" 5128eecc9f 2011-02-23 kinaba: #include "kiutil.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /////////////// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::timeSet( const char* fname, FILETIME* pft ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: HANDLE han = CreateFile( fname, 5128eecc9f 2011-02-23 kinaba: GENERIC_READ | GENERIC_WRITE, 5128eecc9f 2011-02-23 kinaba: FILE_SHARE_READ,NULL, 5128eecc9f 2011-02-23 kinaba: OPEN_EXISTING, 5128eecc9f 2011-02-23 kinaba: FILE_ATTRIBUTE_NORMAL, 5128eecc9f 2011-02-23 kinaba: NULL ); 5128eecc9f 2011-02-23 kinaba: if( han==INVALID_HANDLE_VALUE ) 5128eecc9f 2011-02-23 kinaba: return; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: SetFileTime( han,pft,NULL,pft ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: CloseHandle( han ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::timeSet( const char* fname, DWORD sec ) 5128eecc9f 2011-02-23 kinaba: { 36ad977839 2017-05-30 kinaba: struct tm* time=gmtime((time_t*)&sec); 5128eecc9f 2011-02-23 kinaba: if( time!=NULL ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: FILETIME ft; 5128eecc9f 2011-02-23 kinaba: SYSTEMTIME sys; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: sys.wYear = time->tm_year+1900; 5128eecc9f 2011-02-23 kinaba: sys.wMonth = time->tm_mon+1; 5128eecc9f 2011-02-23 kinaba: sys.wDayOfWeek = time->tm_wday; 5128eecc9f 2011-02-23 kinaba: sys.wDay = time->tm_mday; 5128eecc9f 2011-02-23 kinaba: sys.wHour = time->tm_hour; 5128eecc9f 2011-02-23 kinaba: sys.wMinute = time->tm_min; 5128eecc9f 2011-02-23 kinaba: sys.wSecond = time->tm_sec; 5128eecc9f 2011-02-23 kinaba: sys.wMilliseconds = 0; 5128eecc9f 2011-02-23 kinaba: SystemTimeToFileTime(&sys,&ft); 5128eecc9f 2011-02-23 kinaba: timeSet( fname,&ft ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::timeSet( const char* fname,WORD date,WORD time ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: FILETIME ft,lc; 5128eecc9f 2011-02-23 kinaba: if( DosDateTimeToFileTime( date, time, &lc ) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( LocalFileTimeToFileTime( &lc, &ft ) ) 5128eecc9f 2011-02-23 kinaba: timeSet( fname,&ft ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: ////////////// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::wndFront( HWND wnd ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: static DWORD Ver = GetVersion(); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( ( (Ver&0x80000000) && LOBYTE(LOWORD(Ver))>=4 && HIBYTE(LOWORD(Ver))>=10 ) || 5128eecc9f 2011-02-23 kinaba: (!(Ver&0x80000000) && LOBYTE(LOWORD(Ver))>=5 )) // 新しいWindows 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: DWORD pid; 5128eecc9f 2011-02-23 kinaba: DWORD thread1 = GetWindowThreadProcessId( GetForegroundWindow(),&pid ); 5128eecc9f 2011-02-23 kinaba: DWORD thread2 = GetCurrentThreadId(); 5128eecc9f 2011-02-23 kinaba: AttachThreadInput( thread2, thread1, TRUE ); 5128eecc9f 2011-02-23 kinaba: SetForegroundWindow( wnd ); 5128eecc9f 2011-02-23 kinaba: AttachThreadInput( thread2, thread1, FALSE ); 5128eecc9f 2011-02-23 kinaba: BringWindowToTop( wnd ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else // 古いWindows 5128eecc9f 2011-02-23 kinaba: SetForegroundWindow( wnd ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /////////////// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char kiutil::lb[256]; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::pathInit() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: lb[0] = 0; 5128eecc9f 2011-02-23 kinaba: for( int c=1; c!=256; c++ ) 5128eecc9f 2011-02-23 kinaba: lb[c] = (IsDBCSLeadByte(c) ? 2 : 1); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #define isdblb(c) (lb[(unsigned char)(c)]==2) 5128eecc9f 2011-02-23 kinaba: #define step(p) (p+=lb[(unsigned char)*(p)]) 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char* kiutil::pathMake( char* path ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* st = path; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: while( *st=='/' || *st=='\\' || *st=='?' ) 5128eecc9f 2011-02-23 kinaba: st++; 5128eecc9f 2011-02-23 kinaba: if( st[0]!='\0' && st[1]==':' ) 5128eecc9f 2011-02-23 kinaba: st+=2; 5128eecc9f 2011-02-23 kinaba: while( *st=='/' || *st=='\\' || *st=='?' ) 5128eecc9f 2011-02-23 kinaba: st++; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( unsigned char *p=(unsigned char*)st; *p!='\0'; step(p) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( isdblb(*p) ) 5128eecc9f 2011-02-23 kinaba: continue; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( *p=='\\' || *p=='/' ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: *p='\0'; 5128eecc9f 2011-02-23 kinaba: CreateDirectory( st, NULL ); 5128eecc9f 2011-02-23 kinaba: *p='\\'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else if( *p<' ' || ( *p>'~' && !( 0xa0<=*p && *p<=0xdf ) ) || strchr(":*?\"<>|",*p) ) 5128eecc9f 2011-02-23 kinaba: *p = '_'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: return st; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::pathMakeAbs( char* path ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int i=0; 5128eecc9f 2011-02-23 kinaba: for( char* p=path; *p!='\0'; step(p) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( i++ < 4 ) // 最初の4文字以内の \ はドライブを表す、ということにしておく。 5128eecc9f 2011-02-23 kinaba: continue; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( *p=='\\' ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: *p='\0'; 5128eecc9f 2011-02-23 kinaba: CreateDirectory( path, NULL ); 5128eecc9f 2011-02-23 kinaba: *p='\\'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::pathSplit( const char* path, int* y, int* d ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: *y=-1, *d=-1; 5128eecc9f 2011-02-23 kinaba: for( const char* x=path; *x!='\0'; step(x) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( *x=='\\' || *x=='/' ) *y=x-path,*d=-1; 5128eecc9f 2011-02-23 kinaba: else if( *x=='.' ) *d=x-path; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: const char* kiutil::pathExt( const char* path ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int y,d; 5128eecc9f 2011-02-23 kinaba: kiutil::pathSplit( path,&y,&d ); 5128eecc9f 2011-02-23 kinaba: return (d!=-1) ? path+d+1 : path+strlen(path); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: const char* kiutil::pathName( const char* path ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int y,d; 5128eecc9f 2011-02-23 kinaba: kiutil::pathSplit( path,&y,&d ); 5128eecc9f 2011-02-23 kinaba: return path+y+1; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #undef step 5128eecc9f 2011-02-23 kinaba: #undef isdblb 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: ////////////// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char* kiutil::getline( char* str, int size, FILE* fp ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( size>0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* p=str; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: while( --size ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int c = fgetc(fp); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( c<=0 ) // EOF || '\0' 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: else if( c=='\n' ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: else if( c=='\r' ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = fgetc(fp); 5128eecc9f 2011-02-23 kinaba: if( c!=EOF && c!='\n' ) 5128eecc9f 2011-02-23 kinaba: ungetc( c,fp ); 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: *(p++) = c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: *p='\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: return feof(fp) ? NULL : str; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiutil::getOriginalName( char* nw, const char* od, char* ext ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int y,d; 5128eecc9f 2011-02-23 kinaba: kiutil::pathSplit( od,&y,&d ); 5128eecc9f 2011-02-23 kinaba: strcpy( nw,od+y+1 ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( ext ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: strcat( nw,"." ); 5128eecc9f 2011-02-23 kinaba: strcat( nw,ext ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: nw[d-y-1]='\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: