1 #include "include_c.h"
\r
3 /* Main function is "_tWinMain" */
\r
6 errnum_t GetTextFromClipboard(void);
\r
7 errnum_t SetTextToClipboard(void);
\r
11 /***********************************************************************
\r
12 <<< [_tWinMain] >>>
\r
13 ************************************************************************/
\r
14 int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
\r
15 LPTSTR lpCmdLine, int nCmdShow )
\r
18 TCHAR command_name[40];
\r
20 //Err2_setBreakErrID( 1 );
\r
21 Globals_init_const();
\r
22 e= Globals_init(); IF(e)goto fin;
\r
24 e= GetCommandLineUnnamed( 1, command_name, sizeof( command_name ) ); IF(e)goto fin;
\r
25 if ( _tcscmp( command_name, _T("GetTextFromClipboard") ) == 0 )
\r
26 { e= GetTextFromClipboard(); IF(e)goto fin; }
\r
27 else if ( _tcscmp( command_name, _T("SetTextToClipboard") ) == 0 )
\r
28 { e= SetTextToClipboard(); IF(e)goto fin; }
\r
30 { ASSERT_R( false, goto err ); }
\r
34 e= Globals_finish( e );
\r
36 if ( _CrtDumpMemoryLeaks() ) DebugBreak();
\r
39 err: e = E_Others; goto fin;
\r
44 /***********************************************************************
\r
45 <<< [GetTextFromClipboard] >>>
\r
46 ************************************************************************/
\r
47 errnum_t GetTextFromClipboard()
\r
51 HGLOBAL data = NULL;
\r
53 DWORD nz_size; /* without '\0' */
\r
58 TCHAR out_path[MAX_PATH*2];
\r
60 TCHAR byte_order_mark = _T('\xFEFF');
\r
63 e= GetCommandLineNamed( _T("Out"), false, out_path, sizeof(out_path) ); IF(e)goto fin;
\r
64 e= AppKey_newWritable( NULL, NULL, out_path, NULL ); IF(e)goto fin;
\r
66 b= OpenClipboard( NULL ); IF(!b)goto err;
\r
67 data = GetClipboardData( CF_UNICODETEXT ); IF(data==NULL)goto err_nf;
\r
68 size = GlobalSize( data );
\r
69 str = (TCHAR*)GlobalLock( data ); IF(str==NULL)goto err;
\r
71 // Sometimes size > _tcslen( str )
\r
72 z_str = _tcschr( str, _T('\0') );
\r
73 if ( (char*) z_str + sizeof(TCHAR) - (char*) str < (int) size ) {
\r
74 size = (char*) z_str + sizeof(TCHAR) - (char*) str;
\r
77 nz_size = size - sizeof(TCHAR);
\r
79 en = _tfopen_s( &file, out_path, _T("wb") ); IF(en) goto err_no;
\r
80 n = fwrite( &byte_order_mark, 1,sizeof(TCHAR), file ); IF(ferror(file))goto err_no;
\r
81 IF( n != sizeof(TCHAR) )goto err_no;
\r
82 n = fwrite( str, 1,nz_size, file ); IF(ferror(file))goto err_no;
\r
83 IF( n != nz_size )goto err_no;
\r
87 e= FileT_close( file, e );
\r
88 e= AppKey_finishGlobal( e );
\r
89 if ( data != NULL ) GlobalUnlock( data );
\r
93 err: e = E_Others; goto fin;
\r
94 err_no: e = E_Errno; goto fin;
\r
95 err_nf: e = E_NotFoundSymbol; goto fin;
\r
100 /***********************************************************************
\r
101 <<< [FileT_getSize] >>>
\r
102 ************************************************************************/
\r
103 errnum_t FileT_getSize( const TCHAR* Path, size_t* out_Size )
\r
108 HANDLE file = INVALID_HANDLE_VALUE;
\r
110 file = CreateFile( Path, GENERIC_READ, FILE_SHARE_READ,
\r
111 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
\r
112 IF(file == INVALID_HANDLE_VALUE) goto err;
\r
114 size = GetFileSize( file, &size_high ); IF(size==-1)goto err;
\r
115 IF( size_high != 0 )goto err_fa;
\r
120 CloseHandle( file );
\r
123 err: e = E_Others; goto fin;
\r
124 err_fa: e = E_FewArray; goto fin;
\r
129 /***********************************************************************
\r
130 <<< [SetTextToClipboard] >>>
\r
131 ************************************************************************/
\r
132 errnum_t SetTextToClipboard()
\r
136 HGLOBAL data = NULL;
\r
137 bool is_data_lock = false;
\r
138 bool is_set = false;
\r
144 TCHAR in_path[MAX_PATH*2];
\r
146 e= GetCommandLineNamed( _T("In"), false, in_path, sizeof(in_path) ); IF(e)goto fin;
\r
149 /* Allocate "str" */
\r
150 e= FileT_getSize( in_path, &max_size ); IF(e)goto fin;
\r
151 max_size *= sizeof(TCHAR) * 2; /* 2 is \n -> \r\n */
\r
153 str = (TCHAR*) malloc( max_size ); IF(str==NULL)goto err_fm;
\r
157 /* Read from "in_path" to "str" */
\r
158 e= FileT_openForRead( &file, in_path ); IF(e)goto fin;
\r
160 _fgetts( str_next, ( max_size - size ) / sizeof(TCHAR), file );
\r
161 if ( str_next[0] == _T('\0') ) break; /* EOF (because no '\n') */
\r
162 str_next = _tcschr( str_next, _T('\0') );
\r
163 if ( *( str_next - 1 ) == _T('\n') ) {
\r
164 *( str_next - 1 ) = _T('\r');
\r
165 *( str_next ) = _T('\n');
\r
166 *( str_next + 1 ) = _T('\0');
\r
169 size = (int8_t*) str_next - (int8_t*) str;
\r
170 if ( feof( file ) ) break;
\r
172 e= FileT_close( file, e ); file = NULL;
\r
173 size += sizeof(TCHAR); /* for '\0' */
\r
176 /* Set "data" from "str" */
\r
177 data = GlobalAlloc( GMEM_DDESHARE, size ); IF(data==NULL)goto err_fm;
\r
178 is_data_lock = true;
\r
179 str2 = (TCHAR*) GlobalLock( data );
\r
180 memcpy( str2, str, size );
\r
181 GlobalUnlock( data );
\r
182 is_data_lock = false;
\r
185 /* Set to clipboard */
\r
186 if ( OpenClipboard( NULL ) ) {
\r
188 SetClipboardData( CF_UNICODETEXT, data );
\r
195 if ( str != NULL ) free( str );
\r
196 if ( is_data_lock ) IF( ! GlobalUnlock( data ) &&!e) e=E_Others;
\r
197 if ( data != NULL && ! is_set ) IF( GlobalFree( data ) != NULL &&!e) e=E_Others;
\r
198 e= FileT_close( file, e );
\r
201 err_fm: e = E_FewMemory; goto fin;
\r