tempname function added (it will be used to fix bug 9614)
[scilab.git] / scilab / modules / fileio / src / c / createtempfilename.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - DIGITEO - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 /*--------------------------------------------------------------------------*/
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stdio.h>
16 #include "createtempfilename.h"
17 #include "tmpdir.h"
18 #include "splitpath.h"
19 #include "machine.h"
20 #include "PATH_MAX.h"
21 #include "getshortpathname.h"
22 #include "FileExist.h"
23 /*--------------------------------------------------------------------------*/
24 char *createtempfilename(const char *prefix, BOOL bShortFormat)
25 {
26     char *tempfilename = NULL;
27 #ifdef _MSC_VER
28     wchar_t *wcprefix = to_wide_string(prefix);
29     wchar_t *wcresult = createtempfilenameW(wcprefix, bShortFormat);
30
31     tempfilename = wide_string_to_UTF8(wcresult);
32
33     if (wcresult) {FREE(wcresult); wcresult = NULL;}
34     if (wcresult) {FREE(wcresult); wcresult = NULL;}
35 #else
36      char *TmpDir = getTMPDIR();
37      if (TmpDir)
38      {
39         char TempFileName[PATH_MAX];
40         sprintf(TempFileName, "%s/%sXXXXXX",TmpDir, prefix);
41         int fd = mkstemp(TempFileName);
42         if (fd != -1) close(fd);
43         tempfilename = strdup(TempFileName);
44      }
45 #endif
46     return tempfilename;
47 }
48 /*--------------------------------------------------------------------------*/
49 wchar_t *createtempfilenameW(const wchar_t *wcprefix, BOOL bShortFormat)
50 {
51     wchar_t *wcReturnedTempFilename = NULL;
52
53 #ifdef _MSC_VER
54     wchar_t *wcTmpDir = getTMPDIRW();
55     if (wcTmpDir)
56     {
57         unsigned int uRetVal = 0;
58         wchar_t wcTempFileName[MAX_PATH];
59         uRetVal = GetTempFileNameW(wcTmpDir, wcprefix, 0, wcTempFileName);
60         if (uRetVal != 0)
61         {
62             int len = wcslen(wcTempFileName) + 1;
63             wchar_t* shortTempFilename = (wchar_t *)MALLOC(len * sizeof(wchar_t));
64             if (shortTempFilename)
65             {
66                 if (bShortFormat)
67                 {
68                     GetShortPathNameW(wcTempFileName, shortTempFilename, len);
69                 }
70                 wcReturnedTempFilename = shortTempFilename;
71             }
72         }
73     }
74 #else
75     char *prefix = wide_string_to_UTF8(wcprefix);
76     char *result = createtempfilename(prefix, bShortFormat);
77
78     wcReturnedTempFilename = to_wide_string(result);
79
80     if (result) {FREE(result); result = NULL;}
81     if (prefix) {FREE(prefix); prefix = NULL;}
82     if (result) {FREE(result); result = NULL;}
83 #endif
84     return wcReturnedTempFilename;
85 }
86 /*--------------------------------------------------------------------------*/