annotate gcc/ada/tempdir.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- T E M P D I R --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 2003-2015, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 with Opt; use Opt;
kono
parents:
diff changeset
29 with Output; use Output;
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 package body Tempdir is
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 Tmpdir_Needs_To_Be_Displayed : Boolean := True;
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 Tmpdir : constant String := "TMPDIR";
kono
parents:
diff changeset
36 Temp_Dir : String_Access := new String'("");
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 ----------------------
kono
parents:
diff changeset
39 -- Create_Temp_File --
kono
parents:
diff changeset
40 ----------------------
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 procedure Create_Temp_File
kono
parents:
diff changeset
43 (FD : out File_Descriptor;
kono
parents:
diff changeset
44 Name : out Path_Name_Type)
kono
parents:
diff changeset
45 is
kono
parents:
diff changeset
46 File_Name : String_Access;
kono
parents:
diff changeset
47 Current_Dir : constant String := Get_Current_Dir;
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 function Directory return String;
kono
parents:
diff changeset
50 -- Returns Temp_Dir.all if not empty, else return current directory
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 ---------------
kono
parents:
diff changeset
53 -- Directory --
kono
parents:
diff changeset
54 ---------------
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 function Directory return String is
kono
parents:
diff changeset
57 begin
kono
parents:
diff changeset
58 if Temp_Dir'Length /= 0 then
kono
parents:
diff changeset
59 return Temp_Dir.all;
kono
parents:
diff changeset
60 else
kono
parents:
diff changeset
61 return Current_Dir;
kono
parents:
diff changeset
62 end if;
kono
parents:
diff changeset
63 end Directory;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 -- Start of processing for Create_Temp_File
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 begin
kono
parents:
diff changeset
68 if Temp_Dir'Length /= 0 then
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 -- In verbose mode, display once the value of TMPDIR, so that
kono
parents:
diff changeset
71 -- if temp files cannot be created, it is easier to understand
kono
parents:
diff changeset
72 -- where temp files are supposed to be created.
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 if Verbose_Mode and then Tmpdir_Needs_To_Be_Displayed then
kono
parents:
diff changeset
75 Write_Str ("TMPDIR = """);
kono
parents:
diff changeset
76 Write_Str (Temp_Dir.all);
kono
parents:
diff changeset
77 Write_Line ("""");
kono
parents:
diff changeset
78 Tmpdir_Needs_To_Be_Displayed := False;
kono
parents:
diff changeset
79 end if;
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 -- Change directory to TMPDIR before creating the temp file,
kono
parents:
diff changeset
82 -- then change back immediately to the previous directory.
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 Change_Dir (Temp_Dir.all);
kono
parents:
diff changeset
85 Create_Temp_File (FD, File_Name);
kono
parents:
diff changeset
86 Change_Dir (Current_Dir);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 else
kono
parents:
diff changeset
89 Create_Temp_File (FD, File_Name);
kono
parents:
diff changeset
90 end if;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 if FD = Invalid_FD then
kono
parents:
diff changeset
93 Write_Line ("could not create temporary file in " & Directory);
kono
parents:
diff changeset
94 Name := No_Path;
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 else
kono
parents:
diff changeset
97 declare
kono
parents:
diff changeset
98 Path_Name : constant String :=
kono
parents:
diff changeset
99 Normalize_Pathname
kono
parents:
diff changeset
100 (Directory & Directory_Separator & File_Name.all);
kono
parents:
diff changeset
101 begin
kono
parents:
diff changeset
102 Name_Len := Path_Name'Length;
kono
parents:
diff changeset
103 Name_Buffer (1 .. Name_Len) := Path_Name;
kono
parents:
diff changeset
104 Name := Name_Find;
kono
parents:
diff changeset
105 Free (File_Name);
kono
parents:
diff changeset
106 end;
kono
parents:
diff changeset
107 end if;
kono
parents:
diff changeset
108 end Create_Temp_File;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 ------------------
kono
parents:
diff changeset
111 -- Use_Temp_Dir --
kono
parents:
diff changeset
112 ------------------
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 procedure Use_Temp_Dir (Status : Boolean) is
kono
parents:
diff changeset
115 Dir : String_Access;
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 begin
kono
parents:
diff changeset
118 if Status then
kono
parents:
diff changeset
119 Dir := Getenv (Tmpdir);
kono
parents:
diff changeset
120 end if;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 Free (Temp_Dir);
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 if Dir /= null
kono
parents:
diff changeset
125 and then Dir'Length > 0
kono
parents:
diff changeset
126 and then Is_Absolute_Path (Dir.all)
kono
parents:
diff changeset
127 and then Is_Directory (Dir.all)
kono
parents:
diff changeset
128 then
kono
parents:
diff changeset
129 Temp_Dir := new String'(Normalize_Pathname (Dir.all));
kono
parents:
diff changeset
130 else
kono
parents:
diff changeset
131 Temp_Dir := new String'("");
kono
parents:
diff changeset
132 end if;
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 Free (Dir);
kono
parents:
diff changeset
135 end Use_Temp_Dir;
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 -- Start of elaboration for package Tempdir
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 begin
kono
parents:
diff changeset
140 Use_Temp_Dir (Status => True);
kono
parents:
diff changeset
141 end Tempdir;