OSDN Git Service

Version 4.00
[vbslib/main.git] / _src / Test / tools / vbslib_helper_src / vbslib_helper.c
1 #include  "include_c.h" \r
2 \r
3 /* Main function is "_tWinMain" */\r
4 \r
5 \r
6 errnum_t  GetTextFromClipboard(void);\r
7 errnum_t  SetTextToClipboard(void);\r
8 \r
9 \r
10  \r
11 /***********************************************************************\r
12   <<< [_tWinMain] >>> \r
13 ************************************************************************/\r
14 int APIENTRY  _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,\r
15                          LPTSTR    lpCmdLine, int       nCmdShow )\r
16 {\r
17         errnum_t  e;\r
18         TCHAR     command_name[40];\r
19 \r
20 //Err2_setBreakErrID( 1 );\r
21         Globals_init_const();\r
22         e= Globals_init(); IF(e)goto fin;\r
23 \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
29         else\r
30                 { ASSERT_R( false, goto err ); }\r
31 \r
32         e=0;\r
33 fin:\r
34         e= Globals_finish( e );\r
35         IfErrThenBreak();\r
36         if ( _CrtDumpMemoryLeaks() )  DebugBreak();\r
37         return  e;\r
38 \r
39 err:  e = E_Others;  goto fin;\r
40 }\r
41 \r
42 \r
43  \r
44 /***********************************************************************\r
45   <<< [GetTextFromClipboard] >>> \r
46 ************************************************************************/\r
47 errnum_t  GetTextFromClipboard()\r
48 {\r
49         errnum_t  e;\r
50         BOOL      b;\r
51         HGLOBAL   data = NULL;\r
52         DWORD     size;\r
53         DWORD     nz_size;  /* without '\0' */\r
54         DWORD     n;\r
55         TCHAR*    str = NULL;\r
56         TCHAR*    z_str;\r
57         FILE*     file = NULL;\r
58         TCHAR     out_path[MAX_PATH*2];\r
59         errno_t   en;\r
60         TCHAR     byte_order_mark = _T('\xFEFF');\r
61 \r
62 \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
65 \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
70 \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
75         }\r
76 \r
77         nz_size = size - sizeof(TCHAR);\r
78 \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
84 \r
85         e=0;\r
86 fin:\r
87         e= FileT_close( file, e );\r
88         e= AppKey_finishGlobal( e );\r
89         if ( data != NULL )  GlobalUnlock( data );\r
90         CloseClipboard();\r
91         return  e;\r
92 \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
96 }\r
97 \r
98 \r
99  \r
100 /***********************************************************************\r
101   <<< [FileT_getSize] >>> \r
102 ************************************************************************/\r
103 errnum_t  FileT_getSize( const TCHAR* Path, size_t* out_Size )\r
104 {\r
105         errnum_t  e;\r
106         DWORD     size;\r
107         DWORD     size_high;\r
108         HANDLE    file = INVALID_HANDLE_VALUE;\r
109 \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
113 \r
114         size = GetFileSize( file, &size_high ); IF(size==-1)goto err;\r
115         IF( size_high != 0 )goto err_fa;\r
116         *out_Size = size;\r
117 \r
118         e=0;\r
119 fin:\r
120         CloseHandle( file );\r
121         return  e;\r
122 \r
123 err:     e = E_Others;    goto fin;\r
124 err_fa:  e = E_FewArray;  goto fin;\r
125 }\r
126 \r
127 \r
128  \r
129 /***********************************************************************\r
130   <<< [SetTextToClipboard] >>> \r
131 ************************************************************************/\r
132 errnum_t  SetTextToClipboard()\r
133 {\r
134         errnum_t  e;\r
135         FILE*     file = NULL;\r
136         HGLOBAL   data = NULL;\r
137         bool      is_data_lock = false;\r
138         bool      is_set = false;\r
139         size_t    size;\r
140         size_t    max_size;\r
141         TCHAR*    str = NULL;\r
142         TCHAR*    str_next;\r
143         TCHAR*    str2;\r
144         TCHAR     in_path[MAX_PATH*2];\r
145 \r
146         e= GetCommandLineNamed( _T("In"), false, in_path, sizeof(in_path) ); IF(e)goto fin;\r
147 \r
148 \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
152         size = 0;\r
153         str = (TCHAR*) malloc( max_size ); IF(str==NULL)goto err_fm;\r
154         str_next = str;\r
155 \r
156 \r
157         /* Read from "in_path" to "str" */\r
158         e= FileT_openForRead( &file, in_path ); IF(e)goto fin;\r
159         for (;;) {\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
167                         str_next += 1;\r
168                 }\r
169                 size = (int8_t*) str_next - (int8_t*) str;\r
170                 if ( feof( file ) )  break;\r
171         }\r
172         e= FileT_close( file, e );  file = NULL;\r
173         size += sizeof(TCHAR);  /* for '\0' */\r
174 \r
175 \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
183 \r
184 \r
185         /* Set to clipboard */\r
186         if ( OpenClipboard( NULL ) ) {\r
187                 EmptyClipboard();\r
188                 SetClipboardData( CF_UNICODETEXT, data );\r
189                 CloseClipboard();\r
190                 is_set = true;\r
191         }\r
192 \r
193         e=0;\r
194 fin:\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
199         return  e;\r
200 \r
201 err_fm:  e = E_FewMemory;  goto fin;\r
202 }\r
203 \r
204 \r
205  \r