OSDN Git Service

Bug fix of support for FTP over Explicit SSL/TLS (OpenSSL is required).
[ffftp/ffftp.git] / misc.c
1 /*=============================================================================\r
2 *\r
3 *                                                       \82»\82Ì\91¼\82Ì\94Ä\97p\83T\83u\83\8b\81[\83`\83\93\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define STRICT\r
31 #include <stdio.h>\r
32 #include <stdlib.h>\r
33 #include <stdarg.h>\r
34 #include <string.h>\r
35 #include <mbstring.h>\r
36 #include <winsock.h>\r
37 #include <windowsx.h>\r
38 #include <commctrl.h>\r
39 #include <shlobj.h>\r
40 #include <locale.h>\r
41 \r
42 #include "common.h"\r
43 #include "resource.h"\r
44 \r
45 #include <htmlhelp.h>\r
46 #include "helpid.h"\r
47 \r
48 \r
49 \r
50 /*===== \93ü\97Í\83_\83C\83A\83\8d\83O\83f\81[\83^\82Ì\83X\83g\83\89\83N\83`\83\83 =====*/\r
51 \r
52 typedef struct {\r
53         char Title[80];                 /* \83_\83C\83A\83\8d\83O\82Ì\83^\83C\83g\83\8b */\r
54         char Str[FMAX_PATH+1];  /* \83f\83t\83H\83\8b\83g\95\8e\9a\97ñ\81^\93ü\97Í\82³\82ê\82½\95\8e\9a\97ñ(Output) */\r
55         int MaxLen;                             /* \95\8e\9a\97ñ\82Ì\8dÅ\92· */\r
56         int Anonymous;                  /* Anonymous\83t\83\89\83O(Output) */\r
57 } DIALOGDATA;\r
58 \r
59 /*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
60 \r
61 static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
62 \r
63 /*===== \8aO\95\94\8eQ\8fÆ =====*/\r
64 \r
65 extern HWND hHelpWin;\r
66 \r
67 /*===== \83\8d\81[\83J\83\8b\82È\83\8f\81[\83N =====*/\r
68 \r
69 static DIALOGDATA *DialogData;          /* \93ü\97Í\83_\83C\83A\83\8d\83O\83f\81[\83^ */\r
70 static int HelpPage;\r
71 \r
72 \r
73 \r
74 /*----- \93ü\97Í\83_\83C\83A\83\8d\83O\82ð\95\\8e¦ --------------------------------------------------\r
75 *\r
76 *       Parameter\r
77 *               int Res : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82ÌID\r
78 *               HWND hWnd : \90e\83E\83C\83\93\83h\83E\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
79 *               char *Title : \83E\83C\83\93\83h\83E\83^\83C\83g\83\8b (NULL=\90Ý\92è\82µ\82È\82¢)\r
80 *               char *Buf : \83G\83f\83B\83b\83g\83{\83b\83N\83X\82Ì\8f\89\8aú\95\8e\9a\97ñ\81^\93ü\97Í\95\8e\9a\97ñ\82ð\95Ô\82·\83o\83b\83t\83@\r
81 *               int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y (FMAX_PATH+1\88È\89º\82Å\82 \82é\82±\82Æ)\r
82 *               int *Flg : \83t\83\89\83O\82Ì\8f\89\8aú\92l\81^\83t\83\89\83O\82ð\95Ô\82·\83\8f\81[\83N\r
83 *               int Help : \83w\83\8b\83v\82Ì\83R\83\93\83e\83L\83X\83g\94Ô\8d\86\r
84 *\r
85 *       Return Value\r
86 *               int \83X\83e\81[\83^\83X (YES/NO=\8eæ\82è\8fÁ\82µ)\r
87 *\r
88 *       Note\r
89 *               \83_\83C\83A\83\8d\83O\82Í\82P\8cÂ\82ÌEditBox\82Æ\82P\8cÂ\82ÌButton\82ð\8e\9d\82Â\82à\82Ì\82ð\8eg\82¤\r
90 *----------------------------------------------------------------------------*/\r
91 \r
92 int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg, int Help)\r
93 {\r
94         int Ret;\r
95         DIALOGDATA dData;\r
96 \r
97         dData.MaxLen = Max;\r
98         memset(dData.Str, NUL, FMAX_PATH+1);\r
99         strncpy(dData.Str, Buf, FMAX_PATH);\r
100         strcpy(dData.Title, "");\r
101         if(Title != NULL)\r
102                 strcpy(dData.Title, Title);\r
103         dData.Anonymous = *Flg;\r
104         DialogData = &dData;\r
105         HelpPage = Help;\r
106 \r
107         Ret = DialogBox(GetFtpInst(), MAKEINTRESOURCE(Res), hWnd, InputDialogCallBack);\r
108 \r
109         if(Ret == YES)\r
110         {\r
111                 memset(Buf, NUL, Max);\r
112                 strncpy(Buf, dData.Str, Max-1);\r
113                 *Flg = dData.Anonymous;\r
114         }\r
115         return(Ret);\r
116 }\r
117 \r
118 \r
119 /*----- \93ü\97Í\83_\83C\83A\83\8d\83O\82Ì\83R\81[\83\8b\83o\83b\83N ------------------------------------------\r
120 *\r
121 *       Parameter\r
122 *               HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
123 *               UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
124 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
125 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
126 *\r
127 *       Return Value\r
128 *               BOOL TRUE/FALSE\r
129 *----------------------------------------------------------------------------*/\r
130 \r
131 static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
132 {\r
133         char Tmp[FMAX_PATH+1];\r
134 \r
135         switch (iMessage)\r
136         {\r
137                 case WM_INITDIALOG :\r
138                         if(strlen(DialogData->Title) != 0)\r
139                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)DialogData->Title);\r
140                         SendDlgItemMessage(hDlg, INP_INPSTR, EM_LIMITTEXT, DialogData->MaxLen-1, 0);\r
141                         SendDlgItemMessage(hDlg, INP_INPSTR, WM_SETTEXT, 0, (LPARAM)DialogData->Str);\r
142                         SendDlgItemMessage(hDlg, INP_ANONYMOUS, BM_SETCHECK, DialogData->Anonymous, 0);\r
143                         return(TRUE);\r
144 \r
145                 case WM_COMMAND :\r
146                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
147                         {\r
148                                 case IDOK :\r
149                                         SendDlgItemMessage(hDlg, INP_INPSTR, WM_GETTEXT, DialogData->MaxLen, (LPARAM)DialogData->Str);\r
150                                         DialogData->Anonymous = SendDlgItemMessage(hDlg, INP_ANONYMOUS, BM_GETCHECK, 0, 0);\r
151                                         EndDialog(hDlg, YES);\r
152                                         break;\r
153 \r
154                                 case IDCANCEL :\r
155                                         EndDialog(hDlg, NO);\r
156                                         break;\r
157 \r
158                                 case IDHELP :\r
159                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, HelpPage);\r
160                                         break;\r
161 \r
162                                 case INP_BROWSE :\r
163                                         if(SelectDir(hDlg, Tmp, FMAX_PATH) == TRUE)\r
164                                                 SendDlgItemMessage(hDlg, INP_INPSTR, WM_SETTEXT, 0, (LPARAM)Tmp);\r
165                                         break;\r
166                         }\r
167             return(TRUE);\r
168         }\r
169         return(FALSE);\r
170 }\r
171 \r
172 \r
173 /*----- \81m\8eÀ\8ds\81n\82Æ\81m\8eæ\8fÁ\81n\82¾\82¯\82Ì\83_\83C\83A\83\8d\83O\82Ì\8b¤\92Ê\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94 --------------\r
174 *\r
175 *       Parameter\r
176 *               HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
177 *               UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
178 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
179 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
180 *\r
181 *       Return Value\r
182 *               BOOL TRUE/FALSE\r
183 *----------------------------------------------------------------------------*/\r
184 \r
185 BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
186 {\r
187         switch (message)\r
188         {\r
189                 case WM_INITDIALOG :\r
190                         return(TRUE);\r
191 \r
192                 case WM_COMMAND :\r
193                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
194                         {\r
195                                 case IDOK :\r
196                                         EndDialog(hDlg, YES);\r
197                                         break;\r
198 \r
199                                 case IDCANCEL :\r
200                                         EndDialog(hDlg, NO);\r
201                                         break;\r
202                         }\r
203                         return(TRUE);\r
204         }\r
205     return(FALSE);\r
206 }\r
207 \r
208 \r
209 /*----- \81m\8eÀ\8ds\81n\82Æ\81m\8eæ\8fÁ\81n\82¾\82¯\82Ì\83_\83C\83A\83\8d\83O\82Ì\8b¤\92Ê\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94(\83e\83L\83X\83g\95\\8e¦\82Â\82«)\r
210 *\r
211 *       Parameter\r
212 *               HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
213 *               UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
214 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
215 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
216 *\r
217 *       Return Value\r
218 *               BOOL TRUE/FALSE\r
219 *----------------------------------------------------------------------------*/\r
220 \r
221 BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
222 {\r
223         switch (message)\r
224         {\r
225                 case WM_INITDIALOG :\r
226                         SendDlgItemMessage(hDlg, COMMON_TEXT, WM_SETTEXT, 0, lParam);\r
227                         return(TRUE);\r
228 \r
229                 case WM_COMMAND :\r
230                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
231                         {\r
232                                 case IDOK :\r
233                                         EndDialog(hDlg, YES);\r
234                                         break;\r
235 \r
236                                 case IDCANCEL :\r
237                                         EndDialog(hDlg, NO);\r
238                                         break;\r
239                         }\r
240                         return(TRUE);\r
241         }\r
242     return(FALSE);\r
243 }\r
244 \r
245 \r
246 /*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É "\" \82ð\95t\82¯\82é -------------------------------------------\r
247 *\r
248 *       Parameter\r
249 *               char *Str : \95\8e\9a\97ñ\r
250 *\r
251 *       Return Value\r
252 *               \82È\82µ\r
253 *\r
254 *       Note\r
255 *               \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
256 *----------------------------------------------------------------------------*/\r
257 \r
258 void SetYenTail(char *Str)\r
259 {\r
260         if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "\\") != 0)\r
261                 strcat(Str, "\\");\r
262 \r
263         return;;\r
264 }\r
265 \r
266 \r
267 /*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82Ì "\" \82ð\8eæ\82è\8f\9c\82­ -----------------------------------------\r
268 *\r
269 *       Parameter\r
270 *               char *Str : \95\8e\9a\97ñ\r
271 *\r
272 *       Return Value\r
273 *               \82È\82µ\r
274 *\r
275 *       Note\r
276 *               \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
277 *----------------------------------------------------------------------------*/\r
278 \r
279 void RemoveYenTail(char *Str)\r
280 {\r
281         char *Pos;\r
282 \r
283         if(strlen(Str) > 0)\r
284         {\r
285                 Pos = _mbsninc(Str, _mbslen(Str) - 1);\r
286                 if(_mbscmp(Pos, "\\") == 0)\r
287                         *Pos = NUL;\r
288         }\r
289         return;;\r
290 }\r
291 \r
292 \r
293 /*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É "/" \82ð\95t\82¯\82é -------------------------------------------\r
294 *\r
295 *       Parameter\r
296 *               char *Str : \95\8e\9a\97ñ\r
297 *\r
298 *       Return Value\r
299 *               \82È\82µ\r
300 *\r
301 *       Note\r
302 *               \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
303 *----------------------------------------------------------------------------*/\r
304 \r
305 void SetSlashTail(char *Str)\r
306 {\r
307         if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0)\r
308                 strcat(Str, "/");\r
309 \r
310         return;\r
311 }\r
312 \r
313 \r
314 /*----- \95\8e\9a\97ñ\82©\82ç\89ü\8ds\83R\81[\83h\82ð\8eæ\82è\8f\9c\82­ ----------------------------------------\r
315 *\r
316 *       Parameter\r
317 *               char *Str : \95\8e\9a\97ñ\r
318 *\r
319 *       Return Value\r
320 *               \82È\82µ\r
321 *\r
322 *       Note\r
323 *               \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
324 *----------------------------------------------------------------------------*/\r
325 \r
326 void RemoveReturnCode(char *Str)\r
327 {\r
328         char *Pos;\r
329 \r
330         if((Pos = strchr(Str, 0x0D)) != NULL)\r
331                 *Pos = NUL;\r
332         if((Pos = strchr(Str, 0x0A)) != NULL)\r
333                 *Pos = NUL;\r
334         return;\r
335 }\r
336 \r
337 \r
338 /*----- \95\8e\9a\97ñ\93à\82Ì\93Á\92è\82Ì\95\8e\9a\82ð\91S\82Ä\92u\82«\8a·\82¦\82é ----------------------------------\r
339 *\r
340 *       Parameter\r
341 *               char *Str : \95\8e\9a\97ñ\r
342 *               char Src : \8c\9f\8dõ\95\8e\9a\r
343 *               char Dst : \92u\8a·\95\8e\9a\r
344 *\r
345 *       Return Value\r
346 *               \82È\82µ\r
347 *----------------------------------------------------------------------------*/\r
348 \r
349 void ReplaceAll(char *Str, char Src, char Dst)\r
350 {\r
351         char *Pos;\r
352 \r
353         while((Pos = _mbschr(Str, Src)) != NULL)\r
354                 *Pos = Dst;\r
355         return;\r
356 }\r
357 \r
358 \r
359 /*----- \90\94\8e\9a\82à\82µ\82­\82Í\93Á\92è\82Ì\82P\95\8e\9a\82©\83`\83F\83b\83N ------------------------------------\r
360 *\r
361 *       Parameter\r
362 *               int Ch : \83`\83F\83b\83N\82·\82é\95\8e\9a\r
363 *               int Sym : \8bL\8d\86\r
364 *\r
365 *       Return Value\r
366 *               int \83X\83e\81[\83^\83X\r
367 *                       0=\90\94\8e\9a\82Å\82à\93Á\92è\82Ì\8bL\8d\86\82Å\82à\82È\82¢\r
368 *----------------------------------------------------------------------------*/\r
369 \r
370 int IsDigitSym(int Ch, int Sym)\r
371 {\r
372         int Ret;\r
373 \r
374         if((Ret = IsDigit(Ch)) == 0)\r
375         {\r
376                 if((Sym != NUL) && (Sym == Ch))\r
377                         Ret = 1;\r
378         }\r
379         return(Ret);\r
380 }\r
381 \r
382 \r
383 /*----- \95\8e\9a\97ñ\82ª\91S\82Ä\93¯\82\95\8e\9a\82©\83`\83F\83b\83N ----------------------------------------\r
384 *\r
385 *       Parameter\r
386 *               char *Str : \95\8e\9a\97ñ\r
387 *               int Ch : \95\8e\9a\r
388 *\r
389 *       Return Value\r
390 *               int \83X\83e\81[\83^\83X\r
391 *                       YES/NO\r
392 *----------------------------------------------------------------------------*/\r
393 \r
394 int StrAllSameChar(char *Str, char Ch)\r
395 {\r
396         int Ret;\r
397 \r
398         Ret = YES;\r
399         while(*Str != NUL)\r
400         {\r
401                 if(*Str != Ch)\r
402                 {\r
403                         Ret = NO;\r
404                         break;\r
405                 }\r
406                 Str++;\r
407         }\r
408         return(Ret);\r
409 }\r
410 \r
411 \r
412 /*----- \95\8e\9a\97ñ\82Ì\96\96\94ö\82Ì\83X\83y\81[\83X\82ð\8dí\8f\9c ------------------------------------------\r
413 *\r
414 *       Parameter\r
415 *               char *Str : \95\8e\9a\97ñ\r
416 *\r
417 *       Return Value\r
418 *               \82È\82µ\r
419 *----------------------------------------------------------------------------*/\r
420 \r
421 void RemoveTailingSpaces(char *Str)\r
422 {\r
423         char *Pos;\r
424 \r
425         Pos = Str + strlen(Str);\r
426         while(--Pos > Str)\r
427         {\r
428                 if(*Pos != ' ')\r
429                         break;\r
430                 *Pos = NUL;\r
431         }\r
432         return;\r
433 }\r
434 \r
435 \r
436 /*----- \91å\95\8e\9a\81^\8f¬\95\8e\9a\82ð\8bæ\95Ê\82µ\82È\82¢strstr --------------------------------------\r
437 *\r
438 *       Parameter\r
439 *               char *s1 : \95\8e\9a\97ñ\82P\r
440 *               char *s2 : \95\8e\9a\97ñ\82Q\r
441 *\r
442 *       Return Value\r
443 *               char *\95\8e\9a\97ñ\82P\92\86\82Å\95\8e\9a\97ñ\82Q\82ª\8c©\82Â\82©\82Á\82½\88Ê\92u\r
444 *                       NULL=\8c©\82Â\82©\82ç\82È\82©\82Á\82½\r
445 *----------------------------------------------------------------------------*/\r
446 \r
447 char *stristr(char *s1, char *s2)\r
448 {\r
449         char *Ret;\r
450 \r
451         Ret = NULL;\r
452         while(*s1 != NUL)\r
453         {\r
454                 if((tolower(*s1) == tolower(*s2)) &&\r
455                    (_strnicmp(s1, s2, strlen(s2)) == 0))\r
456                 {\r
457                         Ret = s1;\r
458                         break;\r
459                 }\r
460                 s1++;\r
461         }\r
462         return(Ret);\r
463 }\r
464 \r
465 \r
466 /*----- \95\8e\9a\97ñ\92\86\82Ì\83X\83y\81[\83X\82Å\8bæ\90Ø\82ç\82ê\82½\8e\9f\82Ì\83t\83B\81[\83\8b\83h\82ð\95Ô\82· --------------------\r
467 *\r
468 *       Parameter\r
469 *               char *Str : \95\8e\9a\97ñ\r
470 *\r
471 *       Return Value\r
472 *               char *\8e\9f\82Ì\83t\83B\81[\83\8b\83h\r
473 *                       NULL=\8c©\82Â\82©\82ç\82È\82©\82Á\82½\r
474 *----------------------------------------------------------------------------*/\r
475 \r
476 char *GetNextField(char *Str)\r
477 {\r
478         if((Str = strchr(Str, ' ')) != NULL)\r
479         {\r
480                 while(*Str == ' ')\r
481                 {\r
482                         if(*Str == NUL)\r
483                         {\r
484                                 Str = NULL;\r
485                                 break;\r
486                         }\r
487                         Str++;\r
488                 }\r
489         }\r
490         return(Str);\r
491 }\r
492 \r
493 \r
494 /*----- \8c»\8dÝ\82Ì\83t\83B\81[\83\8b\83h\82Ì\95\8e\9a\97ñ\82ð\83R\83s\81[\82·\82é ----------------------------------\r
495 *\r
496 *       Parameter\r
497 *               char *Str : \95\8e\9a\97ñ\r
498 *               char *Buf : \83R\83s\81[\90æ\r
499 *               int Max : \8dÅ\91å\95\8e\9a\90\94\r
500 *\r
501 *       Return Value\r
502 *               int \83X\83e\81[\83^\83X\r
503 *                       SUCCESS/FAIL=\92·\82³\82ª\92·\82·\82¬\82é\r
504 *----------------------------------------------------------------------------*/\r
505 \r
506 int GetOneField(char *Str, char *Buf, int Max)\r
507 {\r
508         int Sts;\r
509         char *Pos;\r
510 \r
511         Sts = FAIL;\r
512         if((Pos = strchr(Str, ' ')) == NULL)\r
513         {\r
514                 if((int)strlen(Str) <= Max)\r
515                 {\r
516                         strcpy(Buf, Str);\r
517                         Sts = SUCCESS;\r
518                 }\r
519         }\r
520         else\r
521         {\r
522                 if(Pos - Str <= Max)\r
523                 {\r
524                         strncpy(Buf, Str, Pos - Str);\r
525                         *(Buf + (Pos - Str)) = NUL;\r
526                         Sts = SUCCESS;\r
527                 }\r
528         }\r
529         return(Sts);\r
530 }\r
531 \r
532 \r
533 /*----- \83J\83\93\83}\82ð\8eæ\82è\8f\9c\82­ ------------------------------------------------------\r
534 *\r
535 *       Parameter\r
536 *               char *Str : \95\8e\9a\97ñ\r
537 *\r
538 *       Return Value\r
539 *               \82È\82µ\r
540 *----------------------------------------------------------------------------*/\r
541 \r
542 void RemoveComma(char *Str)\r
543 {\r
544         char *Put;\r
545 \r
546         Put = Str;\r
547         while(*Str != NUL)\r
548         {\r
549                 if(*Str != ',')\r
550                 {\r
551                         *Put = *Str;\r
552                         Put++;\r
553                 }\r
554                 Str++;\r
555         }\r
556         *Put = NUL;\r
557         return;\r
558 }\r
559 \r
560 \r
561 /*----- \83p\83X\96¼\82Ì\92\86\82Ì\83t\83@\83C\83\8b\96¼\82Ì\90æ\93ª\82ð\95Ô\82· ------------------------------------\r
562 *\r
563 *       Parameter\r
564 *               char *Path : \83p\83X\96¼\r
565 *\r
566 *       Return Value\r
567 *               char *\83t\83@\83C\83\8b\96¼\82Ì\90æ\93ª\r
568 *\r
569 *       Note\r
570 *               \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
571 *----------------------------------------------------------------------------*/\r
572 \r
573 char *GetFileName(char *Path)\r
574 {\r
575         char *Pos;\r
576 \r
577         if((Pos = _mbschr(Path, ':')) != NULL)\r
578                 Path = Pos + 1;\r
579 \r
580         if((Pos = _mbsrchr(Path, '\\')) != NULL)\r
581                 Path = Pos + 1;\r
582 \r
583         if((Pos = _mbsrchr(Path, '/')) != NULL)\r
584                 Path = Pos + 1;\r
585 \r
586         return(Path);\r
587 }\r
588 \r
589 \r
590 /*----- \83c\81[\83\8b\82Ì\95\\8e¦\96¼\82ð\95Ô\82· --------------------------------------------------\r
591 *\r
592 *       Parameter\r
593 *               char *Path : \83p\83X\96¼\r
594 *\r
595 *       Return Value\r
596 *               char * : \95\\8e¦\96¼\r
597 *----------------------------------------------------------------------------*/\r
598 \r
599 char *GetToolName(char *Path)\r
600 {\r
601         char *Pos;\r
602 \r
603         if((Pos = _mbschr(Path, ':')) != NULL)\r
604                 Path = Pos + 1;\r
605 \r
606         if((Pos = _mbsrchr(Path, '\\')) != NULL)\r
607                 Path = Pos + 1;\r
608 \r
609         return(Path);\r
610 }\r
611 \r
612 \r
613 /*----- \83p\83X\96¼\82Ì\92\86\82Ì\8ag\92£\8eq\82Ì\90æ\93ª\82ð\95Ô\82· ----------------------------------------\r
614 *\r
615 *       Parameter\r
616 *               char *Path : \83p\83X\96¼\r
617 *\r
618 *       Return Value\r
619 *               char *\8ag\92£\8eq\82Ì\90æ\93ª\r
620 *----------------------------------------------------------------------------*/\r
621 \r
622 char *GetFileExt(char *Path)\r
623 {\r
624         char *Ret;\r
625 \r
626         Ret = _mbschr(Path, NUL);\r
627         if((_mbscmp(Path, ".") != 0) &&\r
628            (_mbscmp(Path, "..") != 0))\r
629         {\r
630                 while((Path = _mbschr(Path, '.')) != NULL)\r
631                 {\r
632                         Path++;\r
633                         Ret = Path;\r
634                 }\r
635         }\r
636         return(Ret);\r
637 }\r
638 \r
639 \r
640 /*----- \83p\83X\96¼\82©\82ç\83t\83@\83C\83\8b\96¼\82ð\8eæ\82è\8f\9c\82­ ----------------------------------------\r
641 *\r
642 *       Parameter\r
643 *               char *Path : \83p\83X\96¼\r
644 *               char *Buf : \83t\83@\83C\83\8b\96¼\82ð\8f\9c\82¢\82½\83p\83X\96¼\82Ì\83R\83s\81[\90æ\r
645 *\r
646 *       Return Value\r
647 *               \82È\82µ\r
648 *\r
649 *       Note\r
650 *               \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
651 *----------------------------------------------------------------------------*/\r
652 \r
653 void RemoveFileName(char *Path, char *Buf)\r
654 {\r
655         char *Pos;\r
656 \r
657         strcpy(Buf, Path);\r
658 \r
659         if((Pos = _mbsrchr(Buf, '/')) != NULL)\r
660                 *Pos = NUL;\r
661         else if((Pos = _mbsrchr(Buf, '\\')) != NULL)\r
662         {\r
663                 if((Pos == Buf) || \r
664                    ((Pos != Buf) && (*(Pos - 1) != ':')))\r
665                         *Pos = NUL;\r
666         }\r
667         return;\r
668 }\r
669 \r
670 \r
671 /*----- \8fã\88Ê\83f\83B\83\8c\83N\83g\83\8a\82Ì\83p\83X\96¼\82ð\8eæ\93¾ ----------------------------------------\r
672 *\r
673 *       Parameter\r
674 *               char *Path : \83p\83X\96¼\r
675 *\r
676 *       Return Value\r
677 *               \82È\82µ\r
678 *\r
679 *       Note\r
680 *               \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
681 *               \8dÅ\8f\89\82Ì "\"\82â"/"\82Í\8ec\82·\r
682 *                       \97á\81j "/pub"   --> "/"\r
683 *                       \97á\81j "C:\DOS" --> "C:\"\r
684 *----------------------------------------------------------------------------*/\r
685 \r
686 void GetUpperDir(char *Path)\r
687 {\r
688         char *Top;\r
689         char *Pos;\r
690 \r
691         if(((Top = _mbschr(Path, '/')) != NULL) ||\r
692            ((Top = _mbschr(Path, '\\')) != NULL))\r
693         {\r
694                 Top++;\r
695                 if(((Pos = _mbsrchr(Top, '/')) != NULL) ||\r
696                    ((Pos = _mbsrchr(Top, '\\')) != NULL))\r
697                         *Pos = NUL;\r
698                 else\r
699                         *Top = NUL;\r
700         }\r
701         return;\r
702 }\r
703 \r
704 \r
705 /*----- \8fã\88Ê\83f\83B\83\8c\83N\83g\83\8a\82Ì\83p\83X\96¼\82ð\8eæ\93¾ ----------------------------------------\r
706 *\r
707 *       Parameter\r
708 *               char *Path : \83p\83X\96¼\r
709 *\r
710 *       Return Value\r
711 *               \82È\82µ\r
712 *\r
713 *       Note\r
714 *               \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
715 *               \8dÅ\8f\89\82Ì "\"\82â"/"\82à\8fÁ\82·\r
716 *                       \97á\81j "/pub"   --> ""\r
717 *                       \97á\81j "C:\DOS" --> "C:"\r
718 *----------------------------------------------------------------------------*/\r
719 \r
720 void GetUpperDirEraseTopSlash(char *Path)\r
721 {\r
722         char *Pos;\r
723 \r
724         if(((Pos = _mbsrchr(Path, '/')) != NULL) ||\r
725            ((Pos = _mbsrchr(Path, '\\')) != NULL))\r
726                 *Pos = NUL;\r
727         else\r
728                 *Path = NUL;\r
729 \r
730         return;\r
731 }\r
732 \r
733 \r
734 /*----- \83f\83B\83\8c\83N\83g\83\8a\82Ì\8aK\91w\90\94\82ð\95Ô\82· --------------------------------------------\r
735 *\r
736 *       Parameter\r
737 *               char *Path : \83p\83X\96¼\r
738 *\r
739 *       Return Value\r
740 *               \82È\82µ\r
741 *\r
742 *       Note\r
743 *               \92P\82É '\' \82Æ '/'\82Ì\90\94\82ð\95Ô\82·\82¾\82¯\r
744 *----------------------------------------------------------------------------*/\r
745 \r
746 int AskDirLevel(char *Path)\r
747 {\r
748         char *Pos;\r
749         int Level;\r
750 \r
751         Level = 0;\r
752         while(((Pos = _mbschr(Path, '/')) != NULL) ||\r
753                   ((Pos = _mbschr(Path, '\\')) != NULL))\r
754         {\r
755                 Path = Pos + 1;\r
756                 Level++;\r
757         }\r
758         return(Level);\r
759 }\r
760 \r
761 \r
762 /*----- \83t\83@\83C\83\8b\83T\83C\83Y\82ð\95\8e\9a\97ñ\82É\95Ï\8a·\82·\82é --------------------------------------\r
763 *\r
764 *       Parameter\r
765 *               double Size : \83t\83@\83C\83\8b\83T\83C\83Y\r
766 *               char *Buf : \95\8e\9a\97ñ\82ð\95Ô\82·\83o\83b\83t\83@\r
767 *\r
768 *       Return Value\r
769 *               \82È\82µ\r
770 *----------------------------------------------------------------------------*/\r
771 \r
772 void MakeSizeString(double Size, char *Buf)\r
773 {\r
774         if(Size >= (1024*1024))\r
775         {\r
776                 Size /= (1024*1024);\r
777                 sprintf(Buf, "%.2fM Bytes", Size);\r
778         }\r
779         else if (Size >= 1024)\r
780         {\r
781                 Size /= 1024;\r
782                 sprintf(Buf, "%.2fK Bytes", Size);\r
783         }\r
784         else\r
785                 sprintf(Buf, "%.0f Bytes", Size);\r
786 \r
787         return;\r
788 }\r
789 \r
790 \r
791 /*----- StaticText\82Ì\97Ì\88æ\82É\8eû\82Ü\82é\82æ\82¤\82É\83p\83X\96¼\82ð\90®\8c`\82µ\82Ä\95\\8e¦ --------------------\r
792 *\r
793 *       Parameter\r
794 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
795 *               char *Str : \95\8e\9a\97ñ (\92·\82³\82ÍFMAX_PATH\88È\89º)\r
796 *\r
797 *       Return Value\r
798 *               \82È\82µ\r
799 *----------------------------------------------------------------------------*/\r
800 \r
801 void DispStaticText(HWND hWnd, char *Str)\r
802 {\r
803         char Buf[FMAX_PATH+1];\r
804         char *Pos;\r
805         char *Tmp;\r
806         RECT Rect;\r
807         SIZE fSize;\r
808         HDC hDC;\r
809         int Force;\r
810 \r
811         GetClientRect(hWnd, &Rect);\r
812         Rect.right -= Rect.left;\r
813 \r
814         hDC = GetDC(hWnd);\r
815         strcpy(Buf, Str);\r
816         Pos = Buf;\r
817         Force = NO;\r
818         while(Force == NO)\r
819         {\r
820                 GetTextExtentPoint32(hDC, Pos, strlen(Pos), &fSize);\r
821 \r
822                 if(fSize.cx <= Rect.right)\r
823                         break;\r
824 \r
825                 if(_mbslen(Pos) <= 4)\r
826                         Force = YES;\r
827                 else\r
828                 {\r
829                         Pos = _mbsninc(Pos, 4);\r
830                         if((Tmp = _mbschr(Pos, '\\')) == NULL)\r
831                                 Tmp = _mbschr(Pos, '/');\r
832 \r
833                         if(Tmp == NULL)\r
834                                 Tmp = _mbsninc(Pos, 4);\r
835 \r
836                         Pos = Tmp - 3;\r
837                         memset(Pos, '.', 3);\r
838                 }\r
839         }\r
840         ReleaseDC(hWnd, hDC);\r
841 \r
842         SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)Pos);\r
843         return;\r
844 }\r
845 \r
846 \r
847 /*----- \95\8e\9a\97ñ\83A\83\8c\83C\82Ì\92·\82³\82ð\8b\81\82ß\82é --------------------------------------------\r
848 *\r
849 *       Parameter\r
850 *               char *Str : \95\8e\9a\97ñ\83A\83\8c\83C (\96\96\94ö\82ÍNUL\82Q\82Â)\r
851 *\r
852 *       Return Value\r
853 *               int \92·\82³\r
854 *\r
855 *       Note\r
856 *               \8fI\92[\82Ì2\82Â\82ÌNUL\82Ì\82¤\82¿\82Ì\8dÅ\8cã\82Ì\95¨\82Í\90\94\82¦\82È\82¢\r
857 *                       StrMultiLen("") = 0\r
858 *                       StrMultiLen("abc\0xyz\0") = 8\r
859 *                       StrMultiLen("abc") = \8fI\92[\82ª\82Q\82Â\82ÌNUL\82Å\82È\82¢\82Ì\82Å\8b\81\82ß\82ç\82ê\82È\82¢\r
860 *----------------------------------------------------------------------------*/\r
861 \r
862 int StrMultiLen(char *Str)\r
863 {\r
864         int Len;\r
865         int Tmp;\r
866 \r
867         Len = 0;\r
868         while(*Str != NUL)\r
869         {\r
870                 Tmp = strlen(Str) + 1;\r
871                 Str += Tmp;\r
872                 Len += Tmp;\r
873         }\r
874         return(Len);\r
875 }\r
876 \r
877 \r
878 /*----- RECT\82ð\83N\83\89\83C\83A\83\93\83g\8dÀ\95W\82©\82ç\83X\83N\83\8a\81[\83\93\8dÀ\95W\82É\95Ï\8a· ------------------------\r
879 *\r
880 *       Parameter\r
881 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
882 *               RECT *Rect : RECT\r
883 *\r
884 *       Return Value\r
885 *               \82È\82µ\r
886 *----------------------------------------------------------------------------*/\r
887 \r
888 void RectClientToScreen(HWND hWnd, RECT *Rect)\r
889 {\r
890         POINT Tmp;\r
891 \r
892         Tmp.x = Rect->left;\r
893         Tmp.y = Rect->top;\r
894         ClientToScreen(hWnd, &Tmp);\r
895         Rect->left = Tmp.x;\r
896         Rect->top = Tmp.y;\r
897 \r
898         Tmp.x = Rect->right;\r
899         Tmp.y = Rect->bottom;\r
900         ClientToScreen(hWnd, &Tmp);\r
901         Rect->right = Tmp.x;\r
902         Rect->bottom = Tmp.y;\r
903 \r
904         return;\r
905 }\r
906 \r
907 \r
908 /*----- 16\90i\95\8e\9a\82ð\83o\83C\83i\83\8a\82É\95Ï\8a· ----------------------------------------------\r
909 *\r
910 *       Parameter\r
911 *               char Ch : 16\90i\95\8e\9a\r
912 *\r
913 *       Return Value\r
914 *               int \83o\83C\83i\83\8a\92l\r
915 *----------------------------------------------------------------------------*/\r
916 \r
917 int hex2bin(char Ch)\r
918 {\r
919         int Ret;\r
920 \r
921         if((Ch >= '0') && (Ch <= '9'))\r
922                 Ret = Ch - '0';\r
923         else if((Ch >= 'A') && (Ch <= 'F'))\r
924                 Ret = Ch - 'A' + 10;\r
925         else if((Ch >= 'a') && (Ch <= 'f'))\r
926                 Ret = Ch - 'a' + 10;\r
927 \r
928         return(Ret);\r
929 }\r
930 \r
931 \r
932 /*----- \82t\82m\82b\95\8e\9a\97ñ\82ð\95ª\89ð\82·\82é ------------------------------------------------\r
933 *\r
934 *       Parameter\r
935 *               char *unc : UNC\95\8e\9a\97ñ\r
936 *               char *Host : \83z\83X\83g\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í HOST_ADRS_LEN+1)\r
937 *               char *Path : \83p\83X\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í FMAX_PATH+1)\r
938 *               char *File : \83t\83@\83C\83\8b\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í FMAX_PATH+1)\r
939 *               char *User : \83\86\81[\83U\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í USER_NAME_LEN+1)\r
940 *               char *Pass : \83p\83X\83\8f\81[\83h\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í PASSWORD_LEN+1)\r
941 *               int *Port : \83|\81[\83g\94Ô\8d\86\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@\r
942 *\r
943 *       Return Value\r
944 *               int \83X\83e\81[\83^\83X\r
945 *                       SUCCESS/FAIL\r
946 *\r
947 *       "\"\82Í\91S\82Ä"/"\82É\92u\82«\8a·\82¦\82é\r
948 *----------------------------------------------------------------------------*/\r
949 \r
950 int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char *Pass, int *Port)\r
951 {\r
952         int Sts;\r
953         char *Pos1;\r
954         char *Pos2;\r
955         char Tmp[FMAX_PATH+1];\r
956 \r
957         memset(Host, NUL, HOST_ADRS_LEN+1);\r
958         memset(Path, NUL, FMAX_PATH+1);\r
959         memset(File, NUL, FMAX_PATH+1);\r
960         memset(User, NUL, USER_NAME_LEN+1);\r
961         memset(Pass, NUL, PASSWORD_LEN+1);\r
962         *Port = PORT_NOR;\r
963 \r
964         ReplaceAll(unc, '\\', '/');\r
965 \r
966         if((Pos1 = _mbsstr(unc, "//")) != NULL)\r
967                 Pos1 += 2;\r
968         else\r
969                 Pos1 = unc;\r
970 \r
971         if((Pos2 = _mbschr(Pos1, '@')) != NULL)\r
972         {\r
973                 memset(Tmp, NUL, FMAX_PATH+1);\r
974                 memcpy(Tmp, Pos1, Pos2-Pos1);\r
975                 Pos1 = Pos2 + 1;\r
976 \r
977                 if((Pos2 = _mbschr(Tmp, ':')) != NULL)\r
978                 {\r
979                         memcpy(User, Tmp, min1(Pos2-Tmp, USER_NAME_LEN));\r
980                         strncpy(Pass, Pos2+1, PASSWORD_LEN);\r
981                 }\r
982                 else\r
983                         strncpy(User, Tmp, USER_NAME_LEN);\r
984         }\r
985 \r
986         if((Pos2 = _mbschr(Pos1, ':')) != NULL)\r
987         {\r
988                 memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
989                 Pos2++;\r
990                 if(IsDigit(*Pos2))\r
991                 {\r
992                         *Port = atoi(Pos2);\r
993                         while(*Pos2 != NUL)\r
994                         {\r
995                                 if(IsDigit(*Pos2) == 0)\r
996                                         break;\r
997                                 Pos2++;\r
998                         }\r
999                 }\r
1000                 RemoveFileName(Pos2, Path);\r
1001                 strncpy(File, GetFileName(Pos2), FMAX_PATH);\r
1002         }\r
1003         else if((Pos2 = _mbschr(Pos1, '/')) != NULL)\r
1004         {\r
1005                 memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
1006                 RemoveFileName(Pos2, Path);\r
1007                 strncpy(File, GetFileName(Pos2), FMAX_PATH);\r
1008         }\r
1009         else\r
1010         {\r
1011                 strncpy(Host, Pos1, HOST_ADRS_LEN);\r
1012         }\r
1013 \r
1014         Sts = FAIL;\r
1015         if(strlen(Host) > 0)\r
1016                 Sts = SUCCESS;\r
1017 \r
1018         return(Sts);\r
1019 }\r
1020 \r
1021 \r
1022 /*----- \93ú\95t\95\8e\9a\97ñ(JST)\82ðFILETIME(UTC)\82É\95Ï\8a· ----------------------------------\r
1023 *\r
1024 *       Parameter\r
1025 *               char *Time : \93ú\95t\95\8e\9a\97ñ ("yyyy/mm/dd hh:mm")\r
1026 *               FILETIME *Buf : \83t\83@\83C\83\8b\83^\83C\83\80\82ð\95Ô\82·\83\8f\81[\83N\r
1027 *\r
1028 *       Return Value\r
1029 *               int \83X\83e\81[\83^\83X\r
1030 *                       YES/NO=\93ú\95t\8fî\95ñ\82ª\82È\82©\82Á\82½\r
1031 *----------------------------------------------------------------------------*/\r
1032 \r
1033 int TimeString2FileTime(char *Time, FILETIME *Buf)\r
1034 {\r
1035         SYSTEMTIME sTime;\r
1036         FILETIME fTime;\r
1037         int Ret;\r
1038 \r
1039         Ret = NO;\r
1040     Buf->dwLowDateTime = 0;\r
1041     Buf->dwHighDateTime = 0;\r
1042 \r
1043         if(strlen(Time) >= 16)\r
1044         {\r
1045                 if(IsDigit(Time[0]) && IsDigit(Time[5]) && IsDigit(Time[8]) && \r
1046                    IsDigit(Time[12]) && IsDigit(Time[14]))\r
1047                 {\r
1048                         Ret = YES;\r
1049                 }\r
1050 \r
1051                 sTime.wYear = atoi(Time);\r
1052                 sTime.wMonth = atoi(Time + 5);\r
1053                 sTime.wDay = atoi(Time + 8);\r
1054                 if(Time[11] != ' ')\r
1055                         sTime.wHour = atoi(Time + 11);\r
1056                 else\r
1057                         sTime.wHour = atoi(Time + 12);\r
1058                 sTime.wMinute = atoi(Time + 14);\r
1059                 sTime.wSecond = 0;\r
1060                 sTime.wMilliseconds = 0;\r
1061 \r
1062                 SystemTimeToFileTime(&sTime, &fTime);\r
1063                 LocalFileTimeToFileTime(&fTime, Buf);\r
1064         }\r
1065         return(Ret);\r
1066 }\r
1067 \r
1068 \r
1069 /*----- FILETIME(UTC)\82ð\93ú\95t\95\8e\9a\97ñ(JST)\82É\95Ï\8a· ----------------------------------\r
1070 *\r
1071 *       Parameter\r
1072 *               FILETIME *Time : \83t\83@\83C\83\8b\83^\83C\83\80\r
1073 *               char *Buf : \93ú\95t\95\8e\9a\97ñ\82ð\95Ô\82·\83\8f\81[\83N\r
1074 *               int Mode : \83\82\81[\83h (DISPFORM_xxx)\r
1075 *               int InfoExist : \8fî\95ñ\82ª\82 \82é\82©\82Ç\82¤\82© (FINFO_xxx)\r
1076 *\r
1077 *       Return Value\r
1078 *               \82È\82µ\r
1079 *----------------------------------------------------------------------------*/\r
1080 \r
1081 void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)\r
1082 {\r
1083         SYSTEMTIME sTime;\r
1084         FILETIME fTime;\r
1085 \r
1086         if(Mode == DISPFORM_LEGACY)\r
1087         {\r
1088                 if((Time->dwLowDateTime == 0) && (Time->dwHighDateTime == 0))\r
1089                         InfoExist = 0;\r
1090 \r
1091                 /* "yyyy/mm/dd hh:mm" */\r
1092                 FileTimeToLocalFileTime(Time, &fTime);\r
1093                 FileTimeToSystemTime(&fTime, &sTime);\r
1094 \r
1095                 if(InfoExist & FINFO_DATE)\r
1096                         sprintf(Buf, "%04d/%02d/%02d ", sTime.wYear, sTime.wMonth, sTime.wDay);\r
1097                 else\r
1098                         sprintf(Buf, "           ");\r
1099 \r
1100                 if(InfoExist & FINFO_TIME)\r
1101                         sprintf(Buf+11, "%2d:%02d", sTime.wHour, sTime.wMinute);\r
1102                 else\r
1103                         sprintf(Buf+11, "     ");\r
1104         }\r
1105         else\r
1106         {\r
1107 //              if (!strftime((char *)str, 100, "%c",  (const struct tm *)thetime))\r
1108 //                      SetTaskMsg("strftime \82ª\8e¸\94s\82µ\82Ü\82µ\82½!\n");\r
1109         }\r
1110         return;\r
1111 }\r
1112 \r
1113 \r
1114 /*----- \83t\83@\83C\83\8b\83^\83C\83\80\82ð\8ew\92è\83^\83C\83\80\83]\81[\83\93\82Ì\83\8d\81[\83J\83\8b\83^\83C\83\80\82©\82çGMT\82É\95Ï\8a· ---------\r
1115 *\r
1116 *       Parameter\r
1117 *               FILETIME *Time : \83t\83@\83C\83\8b\83^\83C\83\80\r
1118 *               int TimeZone : \83^\83C\83\80\83]\81[\83\93\r
1119 *\r
1120 *       Return Value\r
1121 *               \82È\82µ\r
1122 *----------------------------------------------------------------------------*/\r
1123 \r
1124 void SpecificLocalFileTime2FileTime(FILETIME *Time, int TimeZone)\r
1125 {\r
1126         unsigned __int64 Tmp64;\r
1127 \r
1128         Tmp64 = (unsigned __int64)Time->dwLowDateTime +\r
1129                         ((unsigned __int64)Time->dwHighDateTime << 32);\r
1130 \r
1131         Tmp64 -= (__int64)TimeZone * (__int64)36000000000;\r
1132 \r
1133         Time->dwHighDateTime = (DWORD)(Tmp64 >> 32);\r
1134         Time->dwLowDateTime = (DWORD)(Tmp64 & 0xFFFFFFFF);\r
1135 \r
1136         return;\r
1137 }\r
1138 \r
1139 \r
1140 /*----- \91®\90«\95\8e\9a\97ñ\82ð\92l\82É\95Ï\8a· --------------------------------------------------\r
1141 *\r
1142 *       Parameter\r
1143 *               char *Str : \91®\90«\95\8e\9a\97ñ ("rwxrwxrwx")\r
1144 *\r
1145 *       Return Value\r
1146 *               int \92l\r
1147 *----------------------------------------------------------------------------*/\r
1148 \r
1149 int AttrString2Value(char *Str)\r
1150 {\r
1151         int Ret;\r
1152         char Tmp[10];\r
1153 \r
1154         Ret = 0;\r
1155         memset(Tmp, 0, 10);\r
1156         strncpy(Tmp, Str, 9);\r
1157 \r
1158         if(Tmp[0] != '-')\r
1159                 Ret |= 0x400;\r
1160         if(Tmp[1] != '-')\r
1161                 Ret |= 0x200;\r
1162         if(Tmp[2] != '-')\r
1163                 Ret |= 0x100;\r
1164 \r
1165         if(Tmp[3] != '-')\r
1166                 Ret |= 0x40;\r
1167         if(Tmp[4] != '-')\r
1168                 Ret |= 0x20;\r
1169         if(Tmp[5] != '-')\r
1170                 Ret |= 0x10;\r
1171 \r
1172         if(Tmp[6] != '-')\r
1173                 Ret |= 0x4;\r
1174         if(Tmp[7] != '-')\r
1175                 Ret |= 0x2;\r
1176         if(Tmp[8] != '-')\r
1177                 Ret |= 0x1;\r
1178 \r
1179         return(Ret);\r
1180 }\r
1181 \r
1182 \r
1183 /*----- \91®\90«\82Ì\92l\82ð\95\8e\9a\97ñ\82É\95Ï\8a· ------------------------------------------------\r
1184 *\r
1185 *       Parameter\r
1186 *               int Attr : \91®\90«\82Ì\92l\r
1187 *               char *Buf : \91®\90«\95\8e\9a\97ñ\82ð\83Z\83b\83g\82·\82é\83o\83b\83t\83@ ("rwxrwxrwx")\r
1188 *\r
1189 *       Return Value\r
1190 *               int \92l\r
1191 *----------------------------------------------------------------------------*/\r
1192 \r
1193 void AttrValue2String(int Attr, char *Buf)\r
1194 {\r
1195         strcpy(Buf, "---------");\r
1196 \r
1197         if(Attr & 0x400)\r
1198                 Buf[0] = 'r';\r
1199         if(Attr & 0x200)\r
1200                 Buf[1] = 'w';\r
1201         if(Attr & 0x100)\r
1202                 Buf[2] = 'x';\r
1203 \r
1204         if(Attr & 0x40)\r
1205                 Buf[3] = 'r';\r
1206         if(Attr & 0x20)\r
1207                 Buf[4] = 'w';\r
1208         if(Attr & 0x10)\r
1209                 Buf[5] = 'x';\r
1210 \r
1211         if(Attr & 0x4)\r
1212                 Buf[6] = 'r';\r
1213         if(Attr & 0x2)\r
1214                 Buf[7] = 'w';\r
1215         if(Attr & 0x1)\r
1216                 Buf[8] = 'x';\r
1217 \r
1218         return;\r
1219 }\r
1220 \r
1221 \r
1222 /*----- INI\83t\83@\83C\83\8b\95\8e\9a\97ñ\82ð\90®\8c` -----------------------------------------------\r
1223 *\r
1224 *       Parameter\r
1225 *               char *Str : \95\8e\9a\97ñ\r
1226 *\r
1227 *       Return Value\r
1228 *               \82È\82µ\r
1229 *----------------------------------------------------------------------------*/\r
1230 \r
1231 void FormatIniString(char *Str)\r
1232 {\r
1233         char *Put;\r
1234 \r
1235         Put = Str;\r
1236         while(*Str != NUL)\r
1237         {\r
1238                 if((*Str != ' ') && (*Str != '\t') && (*Str != '\n'))\r
1239                         *Put++ = *Str;\r
1240                 if(*Str++ == '=')\r
1241                         break;\r
1242         }\r
1243 \r
1244         while(*Str != NUL)\r
1245         {\r
1246                 if((*Str != 0x22) && (*Str != '\n'))\r
1247                         *Put++ = *Str;\r
1248                 Str++;\r
1249         }\r
1250         *Put = NUL;\r
1251 \r
1252         return;\r
1253 }\r
1254 \r
1255 \r
1256 /*----- \83t\83@\83C\83\8b\91I\91ð ----------------------------------------------------------\r
1257 *\r
1258 *       Parameter\r
1259 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1260 *               char *Fname : \83t\83@\83C\83\8b\96¼\82ð\95Ô\82·\83o\83b\83t\83@\r
1261 *               char *Title : \83^\83C\83g\83\8b\r
1262 *               char *Filters : \83t\83B\83\8b\83^\81[\95\8e\9a\97ñ\r
1263 *               char *Ext : \83f\83t\83H\83\8b\83g\8ag\92£\8eq\r
1264 *               int Flags : \92Ç\89Á\82·\82é\83t\83\89\83O\r
1265 *               int Save : \81u\8aJ\82­\81v\82©\81u\95Û\91\81v\82© (0=\8aJ\82­, 1=\95Û\91¶)\r
1266 *\r
1267 *       Return Value\r
1268 *               int \83X\83e\81[\83^\83X\r
1269 *                       TRUE/FALSE=\8eæ\8fÁ\r
1270 *----------------------------------------------------------------------------*/\r
1271 \r
1272 int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, int Flags, int Save)\r
1273 {\r
1274         OPENFILENAME OpenFile;\r
1275         char Tmp[FMAX_PATH+1];\r
1276         char Cur[FMAX_PATH+1];\r
1277         int Sts;\r
1278 \r
1279         GetCurrentDirectory(FMAX_PATH, Cur);\r
1280 \r
1281         strcpy(Tmp, Fname);\r
1282         OpenFile.lStructSize = sizeof(OPENFILENAME);\r
1283         OpenFile.hwndOwner = hWnd;\r
1284         OpenFile.hInstance = 0;\r
1285         OpenFile.lpstrFilter = Filters;\r
1286         OpenFile.lpstrCustomFilter = NULL;\r
1287         OpenFile.nFilterIndex = 1;\r
1288         OpenFile.lpstrFile = Tmp;\r
1289         OpenFile.nMaxFile = FMAX_PATH;\r
1290         OpenFile.lpstrFileTitle = NULL;\r
1291         OpenFile.nMaxFileTitle = 0;\r
1292         OpenFile.lpstrInitialDir = NULL;\r
1293         OpenFile.lpstrTitle = Title;\r
1294         OpenFile.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | Flags;\r
1295         OpenFile.nFileOffset = 0;\r
1296         OpenFile.nFileExtension = 0;\r
1297         OpenFile.lpstrDefExt = Ext;\r
1298         OpenFile.lCustData = 0;\r
1299         OpenFile.lpfnHook = NULL;\r
1300         OpenFile.lpTemplateName = NULL;\r
1301 \r
1302         if(Save == 0)\r
1303         {\r
1304                 if((Sts = GetOpenFileName(&OpenFile)) == TRUE)\r
1305                         strcpy(Fname,Tmp);\r
1306         }\r
1307         else\r
1308         {\r
1309                 if((Sts = GetSaveFileName(&OpenFile)) == TRUE)\r
1310                         strcpy(Fname,Tmp);\r
1311         }\r
1312         SetCurrentDirectory(Cur);\r
1313         return(Sts);\r
1314 }\r
1315 \r
1316 \r
1317 /*----- \83f\83B\83\8c\83N\83g\83\8a\82ð\91I\91ð ----------------------------------------------------\r
1318 *\r
1319 *       Parameter\r
1320 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1321 *               char *Buf : \83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95Ô\82·\83o\83b\83t\83@\81i\8f\89\8aú\83f\83B\83\8c\83N\83g\83\8a\96¼\81j\r
1322 *               int MaxLen : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
1323 *\r
1324 *       Return Value\r
1325 *               int \83X\83e\81[\83^\83X\r
1326 *                       TRUE/FALSE=\8eæ\8fÁ\r
1327 *----------------------------------------------------------------------------*/\r
1328 \r
1329 int SelectDir(HWND hWnd, char *Buf, int MaxLen)\r
1330 {\r
1331         char Tmp[FMAX_PATH+1];\r
1332         char Cur[FMAX_PATH+1];\r
1333         BROWSEINFO  Binfo;\r
1334         LPITEMIDLIST lpIdll;\r
1335         int Sts;\r
1336         LPMALLOC lpMalloc;\r
1337 \r
1338         Sts = FALSE;\r
1339         GetCurrentDirectory(FMAX_PATH, Cur);\r
1340 \r
1341         if(SHGetMalloc(&lpMalloc) == NOERROR)\r
1342         {\r
1343                 Binfo.hwndOwner = hWnd;\r
1344                 Binfo.pidlRoot = NULL;\r
1345                 Binfo.pszDisplayName = Tmp;\r
1346                 Binfo.lpszTitle = MSGJPN185;\r
1347                 Binfo.ulFlags = BIF_RETURNONLYFSDIRS;\r
1348                 Binfo.lpfn = NULL;\r
1349                 Binfo.lParam = 0;\r
1350                 Binfo.iImage = 0;\r
1351                 if((lpIdll = SHBrowseForFolder(&Binfo)) != NULL)\r
1352                 {\r
1353                         SHGetPathFromIDList(lpIdll, Tmp);\r
1354                         memset(Buf, NUL, MaxLen);\r
1355                         strncpy(Buf, Tmp, MaxLen-1);\r
1356                         Sts = TRUE;\r
1357                         lpMalloc->lpVtbl->Free(lpMalloc, lpIdll);\r
1358             }\r
1359             lpMalloc->lpVtbl->Release(lpMalloc);\r
1360                 SetCurrentDirectory(Cur);\r
1361         }\r
1362         return(Sts);\r
1363 }\r
1364 \r
1365 \r
1366 /*----- \92l\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\83\89\83W\83I\83{\83^\83\93\82ð\83`\83F\83b\83N\82·\82é --------------------------\r
1367 *\r
1368 *       Parameter\r
1369 *               HWND hDlg : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1370 *               int Value : \92l\r
1371 *               const RADIOBUTTON *Buttons : \83\89\83W\83I\83{\83^\83\93\82Æ\92l\82Ì\8aÖ\98A\95t\82¯\83e\81[\83u\83\8b\r
1372 *               int Num : \83{\83^\83\93\82Ì\90\94\r
1373 *\r
1374 *       Return Value\r
1375 *               \82È\82µ\r
1376 *\r
1377 *       Note\r
1378 *               \92l\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\83{\83^\83\93\82ª\96³\82¢\8e\9e\82Í\81A\83e\81[\83u\83\8b\82Ì\8dÅ\8f\89\82É\93o\98^\82³\82ê\82Ä\82¢\82é\83{\83^\r
1379 *               \83\93\82ð\83`\83F\83b\83N\82·\82é\r
1380 *----------------------------------------------------------------------------*/\r
1381 \r
1382 void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int Num)\r
1383 {\r
1384         int i;\r
1385         int Def;\r
1386 \r
1387         Def = Buttons->ButID;\r
1388         for(i = 0; i < Num; i++)\r
1389         {\r
1390                 if(Value == Buttons->Value)\r
1391                 {\r
1392                         SendDlgItemMessage(hDlg, Buttons->ButID, BM_SETCHECK, 1, 0);\r
1393                         /* \83\89\83W\83I\83{\83^\83\93\82ð\95Ï\8dX\82µ\82½\8e\9e\82É\91¼\82Ì\8d\80\96Ú\82Ì\83n\83C\83h\82È\82Ç\82ð\8ds\82È\82¤\8e\96\82ª   */\r
1394                         /* \82 \82é\82Ì\82Å\81A\82»\82Ì\82½\82ß\82É WM_COMMAND \82ð\91\97\82é                                               */\r
1395                         SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(Buttons->ButID, 0), 0);\r
1396                         break;\r
1397                 }\r
1398                 Buttons++;\r
1399         }\r
1400         if(i == Num)\r
1401         {\r
1402                 SendDlgItemMessage(hDlg, Def, BM_SETCHECK, 1, 0);\r
1403                 SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(Def, 0), 0);\r
1404         }\r
1405         return;\r
1406 }\r
1407 \r
1408 \r
1409 /*----- \83`\83F\83b\83N\82³\82ê\82Ä\82¢\82é\83{\83^\83\93\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\92l\82ð\95Ô\82· ----------------------\r
1410 *\r
1411 *       Parameter\r
1412 *               HWND hDlg : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1413 *               const RADIOBUTTON *Buttons : \83\89\83W\83I\83{\83^\83\93\82Æ\92l\82Ì\8aÖ\98A\95t\82¯\83e\81[\83u\83\8b\r
1414 *               int Num : \83{\83^\83\93\82Ì\90\94\r
1415 *\r
1416 *       Return Value\r
1417 *               int \92l\r
1418 *\r
1419 *       Note\r
1420 *               \82Ç\82Ì\83{\83^\83\93\82à\83`\83F\83b\83N\82³\82ê\82Ä\82¢\82È\82¢\8e\9e\82Í\81A\83e\81[\83u\83\8b\82Ì\8dÅ\8f\89\82É\93o\98^\82³\82ê\82Ä\82¢\82é\83{\r
1421 *               \83^\83\93\82Ì\92l\82ð\95Ô\82·\r
1422 *----------------------------------------------------------------------------*/\r
1423 \r
1424 int AskRadioButtonValue(HWND hDlg, const RADIOBUTTON *Buttons, int Num)\r
1425 {\r
1426         int i;\r
1427         int Ret;\r
1428 \r
1429         Ret = Buttons->Value;\r
1430         for(i = 0; i < Num; i++)\r
1431         {\r
1432                 if(SendDlgItemMessage(hDlg, Buttons->ButID, BM_GETCHECK, 0, 0) == 1)\r
1433                 {\r
1434                         Ret = Buttons->Value;\r
1435                         break;\r
1436                 }\r
1437                 Buttons++;\r
1438         }\r
1439         return(Ret);\r
1440 }\r
1441 \r
1442 \r
1443 /*----- \82P\82U\90i\95\8e\9a\97ñ\82ð\90\94\92l\82É\95Ï\8a· ----------------------------------------------\r
1444 *\r
1445 *       Parameter\r
1446 *               char *Str : \95\8e\9a\97ñ\r
1447 *\r
1448 *       Return Value\r
1449 *               int \92l\r
1450 *----------------------------------------------------------------------------*/\r
1451 \r
1452 int xtoi(char *Str)\r
1453 {\r
1454         int Ret;\r
1455 \r
1456         Ret = 0;\r
1457         while(*Str != NUL)\r
1458         {\r
1459                 Ret *= 0x10;\r
1460                 if((*Str >= '0') && (*Str <= '9'))\r
1461                         Ret += *Str - '0';\r
1462                 else if((*Str >= 'A') && (*Str <= 'F'))\r
1463                         Ret += *Str - 'A' + 10;\r
1464                 else if((*Str >= 'a') && (*Str <= 'f'))\r
1465                         Ret += *Str - 'a' + 10;\r
1466                 else\r
1467                         break;\r
1468 \r
1469                 Str++;\r
1470         }\r
1471         return(Ret);\r
1472 }\r
1473 \r
1474 \r
1475 /*----- \83t\83@\83C\83\8b\82ª\93Ç\82Ý\8eæ\82è\89Â\94\\82©\82Ç\82¤\82©\82ð\95Ô\82· ----------------------------------\r
1476 *\r
1477 *       Parameter\r
1478 *               char *Fname : \83t\83@\83C\83\8b\96¼\r
1479 *\r
1480 *       Return Value\r
1481 *               int \83X\83e\81[\83^\83X\r
1482 *                       SUCCESS/FAIL\r
1483 *----------------------------------------------------------------------------*/\r
1484 \r
1485 int CheckFileReadable(char *Fname)\r
1486 {\r
1487         int Sts;\r
1488         HANDLE iFileHandle;\r
1489         SECURITY_ATTRIBUTES Sec;\r
1490 \r
1491         Sts = FAIL;\r
1492 \r
1493         Sec.nLength = sizeof(SECURITY_ATTRIBUTES);\r
1494         Sec.lpSecurityDescriptor = NULL;\r
1495         Sec.bInheritHandle = FALSE;\r
1496 \r
1497         if((iFileHandle = CreateFile(Fname, GENERIC_READ,\r
1498                 FILE_SHARE_READ|FILE_SHARE_WRITE, &Sec, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)\r
1499         {\r
1500                 Sts = SUCCESS;\r
1501                 CloseHandle(iFileHandle);\r
1502         }\r
1503         return(Sts);\r
1504 }\r
1505 \r
1506 \r
1507 \r
1508 \r
1509 \r
1510 int max1(int n, int m)\r
1511 {\r
1512         if(n > m)\r
1513                 return(n);\r
1514         else\r
1515                 return(m);\r
1516 }\r
1517 \r
1518 \r
1519 \r
1520 int min1(int n, int m)\r
1521 {\r
1522         if(n < m)\r
1523                 return(n);\r
1524         else\r
1525                 return(m);\r
1526 }\r
1527 \r
1528 \r
1529 void ExcEndianDWORD(DWORD *x)\r
1530 {\r
1531         BYTE *Pos;\r
1532         BYTE Tmp;\r
1533 \r
1534         Pos = (BYTE *)x;\r
1535         Tmp = *(Pos + 0);\r
1536         *(Pos + 0) = *(Pos + 3);\r
1537         *(Pos + 3) = Tmp;\r
1538         Tmp = *(Pos + 1);\r
1539         *(Pos + 1) = *(Pos + 2);\r
1540         *(Pos + 2) = Tmp;\r
1541         return;\r
1542 }\r
1543 \r
1544 \r
1545 \r
1546 \r
1547 /*----- int\92l\82Ì\93ü\82ê\91Ö\82¦ -------------------------------------------------------\r
1548 *\r
1549 *       Parameter\r
1550 *               int *Num1 : \90\94\92l\82P\r
1551 *               int *Num2 : \90\94\92l\82Q\r
1552 *\r
1553 *       Return Value\r
1554 *               \82È\82µ\r
1555 *----------------------------------------------------------------------------*/\r
1556 \r
1557 void SwapInt(int *Num1, int *Num2)\r
1558 {\r
1559         int Tmp;\r
1560 \r
1561         Tmp = *Num1;\r
1562         *Num1 = *Num2;\r
1563         *Num2 = Tmp;\r
1564         return;\r
1565 }\r
1566 \r
1567 \r
1568 /*----- \8ew\92è\82³\82ê\82½\83t\83H\83\8b\83_\82ª\82 \82é\82©\82Ç\82¤\82©\83`\83F\83b\83N -------------------------------\r
1569 *\r
1570 *       Parameter\r
1571 *               char *Path : \83p\83X\r
1572 *\r
1573 *       Return Value\r
1574 *               int \83X\83e\81[\83^\83X (YES/NO)\r
1575 *----------------------------------------------------------------------------*/\r
1576 \r
1577 int IsFolderExist(char *Path)\r
1578 {\r
1579         int Sts;\r
1580         char Tmp[FMAX_PATH+1];\r
1581         DWORD Attr;\r
1582 \r
1583         Sts = YES;\r
1584         if(strlen(Path) > 0)\r
1585         {\r
1586                 strcpy(Tmp, Path);\r
1587                 if(_mbscmp(Tmp+1, ":\\") != 0)\r
1588                         RemoveYenTail(Tmp);\r
1589 \r
1590                 Attr = GetFileAttributes(Tmp);\r
1591                 if((Attr == 0xFFFFFFFF) || ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0))\r
1592                         Sts = NO;\r
1593         }\r
1594         return(Sts);\r
1595 }\r
1596 \r
1597 \r
1598 /*----- \83e\81[\83u\83\8b\82É\82µ\82½\82ª\82Á\82Ä\90\94\92l\82ð\93o\98^ -----------------------------------------\r
1599 *\r
1600 *       Parameter\r
1601 *               int x : \90\94\92l\r
1602 *               int Dir : \95Ï\8a·\95û\8cü\r
1603 *               INTCONVTBL *Tbl : \83e\81[\83u\83\8b\r
1604 *               int Num : \83e\81[\83u\83\8b\82Ì\90\94\92l\82Ì\90\94\r
1605 *\r
1606 *       Return Value\r
1607 *               int \90\94\92l\r
1608 *----------------------------------------------------------------------------*/\r
1609 \r
1610 int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num)\r
1611 {\r
1612         int i;\r
1613         int Ret;\r
1614 \r
1615         Ret = x;\r
1616         for(i = 0; i < Num; i++)\r
1617         {\r
1618                 if((Dir == 0) && (Tbl->Num1 == x))\r
1619                 {\r
1620                         Ret = Tbl->Num2;\r
1621                         break;\r
1622                 }\r
1623                 else if((Dir == 1) && (Tbl->Num2 == x))\r
1624                 {\r
1625                         Ret = Tbl->Num1;\r
1626                         break;\r
1627                 }\r
1628                 Tbl++;\r
1629         }\r
1630         return(Ret);\r
1631 }\r
1632 \r
1633 \r
1634 \r
1635 \r
1636 \r
1637 \r
1638 /*----- \83t\83@\83C\83\8b\82ð\83S\83~\94 \82É\8dí\8f\9c ------------------------------------------------\r
1639 *\r
1640 *       Parameter\r
1641 *               char *Path : \83t\83@\83C\83\8b\96¼\r
1642 *\r
1643 *       Return Value\r
1644 *               int \83X\83e\81[\83^\83X (0=\90³\8fí\8fI\97¹)\r
1645 *----------------------------------------------------------------------------*/\r
1646 \r
1647 int MoveFileToTrashCan(char *Path)\r
1648 {\r
1649         SHFILEOPSTRUCT FileOp;\r
1650         char Tmp[FMAX_PATH+2];\r
1651 \r
1652         memset(Tmp, 0, FMAX_PATH+2);\r
1653         strcpy(Tmp, Path);\r
1654         FileOp.hwnd = NULL;\r
1655         FileOp.wFunc = FO_DELETE;\r
1656         FileOp.pFrom = Tmp;\r
1657         FileOp.pTo = "";\r
1658         FileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_ALLOWUNDO;\r
1659         FileOp.lpszProgressTitle = "";\r
1660         return(SHFileOperation(&FileOp));\r
1661 }\r
1662 \r
1663 \r
1664 \r
1665 \r
1666 LONGLONG MakeLongLong(DWORD High, DWORD Low)\r
1667 {\r
1668         LONGLONG z;\r
1669         LONGLONG x1, y1;\r
1670 \r
1671         x1 = (LONGLONG)Low;\r
1672         y1 = (LONGLONG)High;\r
1673         z = x1 | (y1 << 32);\r
1674         return(z);\r
1675 }\r
1676 \r
1677 \r
1678 char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma)\r
1679 {\r
1680         int i;\r
1681         char *Pos;\r
1682 \r
1683         Pos = Buf;\r
1684         *Pos = '\0';\r
1685 \r
1686         i = 1;\r
1687         do\r
1688         {\r
1689                 *Pos++ = (char)(Num % 10) + '0';\r
1690                 Num /= 10;\r
1691                 if((Comma == TRUE) && ((i % 3) == 0) && (Num != 0))\r
1692                         *Pos++ = ',';\r
1693                 i++;\r
1694         }\r
1695         while(Num != 0);\r
1696         *Pos = NUL;\r
1697         _strrev(Buf);\r
1698 \r
1699         return(Buf);\r
1700 }\r
1701 \r
1702 \r