-
Notifications
You must be signed in to change notification settings - Fork 0
/
os.adb
139 lines (99 loc) · 3.42 KB
/
os.adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
-- -*- Mode: Ada -*-
-- Filename : os.adb
-- Description : Funciones para hacer llamadas al sistema operativo de
-- modo portable.
-- Author : Gneuromante
-- Created On : Mon Aug 28 00:32:14 2006
-- Last Modified By: .
-- Last Modified On: .
-- Update Count : 0
-- Status : Unknown, Use with caution!
with Gnat.Os_Lib; use Gnat.Os_Lib;
with Gnat.Directory_Operations;
with Ada.Text_Io; use Ada.Text_Io;
with Ada.Exceptions;
package body Os is
--------------------------
-- Que_Sistema_Operativo --
--------------------------
-- Creditos a Martin Dowie de comp.lang.ada
--
function Que_Sistema_Operativo return T_Os is
begin
if Existe_Env ("OS")
and then Valor_Env ("OS") = "Windows_NT" then
return Windows;
elsif Existe_Env ("OSTYPE")
and then Valor_Env ("OSTYPE") = "linux-gnu" then
return Gnu_Linux;
else
return Desconocido;
end if;
end Que_Sistema_Operativo;
function Existe_Env (Nombre : String) return Boolean
is
Valor : String_Access := Getenv (Nombre);
Resultado : Boolean;
begin
Resultado := Valor.all /= "";
Free (Valor);
return Resultado;
end Existe_Env;
function Valor_Env (Nombre : String) return String
is
Valor : String_Access := Getenv (Nombre);
Resultado : constant String := Valor.all;
begin
Free (Valor);
return Resultado;
end Valor_Env;
procedure Imprimir (Texto : String) is
Fichero : File_Type;
Exito : Boolean;
Print_Arg : Gnat.Os_Lib.String_Access;
Nombre_Fichero : Gnat.Os_Lib.String_Access :=
new String'(Directorio_Temporales & Gnat.Directory_Operations.
Dir_Separator & "imprimir.tmp");
begin
Create (Fichero, Out_File, Nombre_Fichero.all);
Put_Line (Fichero, Texto);
Close (Fichero);
case Que_Sistema_Operativo is
when Windows =>
Print_Arg := new String'("/p");
-- Esto se podria hacer tambien importando "system", pero
-- me gusta como suena spawn ;)
Gnat.Os_Lib.Spawn (Program_Name => "notepad.exe",
Args => (1 => Print_Arg,
2 => Nombre_Fichero),
Success => Exito);
when Gnu_Linux | Desconocido =>
Gnat.Os_Lib.Spawn (Program_Name => "/usr/bin/lpr",
Args => (1 => Nombre_Fichero),
Success => Exito);
end case;
if not Exito then
Put_Line (Current_Error, "Error al intentar hacer ñapa para imprimir");
end if;
Gnat.Os_Lib.Free (Print_Arg);
Gnat.Os_Lib.Free (Nombre_Fichero);
exception
when Ex : others =>
Put_Line (Current_Error, "Excepcion en Imprimir: " &
Ada.Exceptions.Exception_Information (Ex));
Gnat.Os_Lib.Free (Print_Arg);
Gnat.Os_Lib.Free (Nombre_Fichero);
raise;
end Imprimir;
function Directorio_Temporales return String
is
begin
if Existe_Env ("TEMP") then
return Valor_Env ("TEMP");
elsif Existe_Env ("TMP") then
return Valor_Env ("TMP");
else
return "/tmp";
end if;
end Directorio_Temporales;
end Os;