feisty meow concerns codebase 2.140
environment.cpp
Go to the documentation of this file.
1
2// Name : environment
3// Author : Chris Koeritz
5// Copyright (c) 1994-$now By Author. This program is free software; you can
6// redistribute it and/or modify it under the terms of the GNU General Public
7// License as published by the Free Software Foundation:
8// http://www.gnu.org/licenses/gpl.html
9// or under the terms of the GNU Library license:
10// http://www.gnu.org/licenses/lgpl.html
11// at your preference. Those licenses describe your legal rights to this
12// software, and no other rights or warranties apply.
13// Please send updates for this code to: fred@gruntose.com -- Thanks, fred.
15
16#include "environment.h"
17
18#include <stdlib.h>
19#include <sys/types.h>
20//#ifndef _MSC_VER
21 #include <unistd.h>
22 #include <sys/times.h>
23//#endif
24/*
25#ifdef _MSC_VER
26 #define _WINSOCKAPI_ // make windows.h happy about winsock.
27 // winsock support...
28// #undef FD_SETSIZE
29// #define FD_SETSIZE 1000
30 // if you don't set this, you can only select on a default of 64 sockets.
31 #include <winsock2.h>
32 #include <windows.h>
33 #include <mmsystem.h>
34#endif
35*/
36
37namespace basis {
38
40{
41 const static astring TMP_VARIABLE_NAME("TMP");
42 astring to_return = get(TMP_VARIABLE_NAME);
43 if (!to_return) {
44 // they did not see fit to set this in the environment. let's make something up.
45#ifdef __WIN32__
46 // windows default does not necessarily exist.
47 to_return = "c:/tmp";
48#else
49 // most reasonable OSes have a /tmp directory.
50 to_return = "/tmp";
51#endif
52 if (!!to_return) set("TMP", to_return);
53 }
54 return to_return;
55}
56
57astring environment::get(const astring &variable_name)
58{
59//#ifdef _MSC_VER
60// char *value = getenv(variable_name.upper().observe());
61// // dos & os/2 require upper case for the name, so we just do it that way.
62//#else
63 char *value = getenv(variable_name.observe());
64 // reasonable OSes support mixed-case environment variables.
65//#endif
66 astring to_return;
67 if (value)
68 to_return = astring(value);
69 return to_return;
70}
71
72bool environment::set(const astring &variable_name, const astring &value)
73{
74 int ret = 0;
75//#ifdef _MSC_VER
76// astring assignment = variable_name + "=" + value;
77// ret = _putenv(assignment.s());
78//#else
79 ret = setenv(variable_name.s(), value.s(), true);
80//#endif
81 return !ret;
82}
83
85{
86//#ifdef _MSC_VER
87// return timeGetTime();
88//#else
89 static clock_t __ctps = sysconf(_SC_CLK_TCK); // clock ticks per second.
90 static const double __multiplier = 1000.0 / double(__ctps);
91 // the multiplier gives us our full range for the tick counter.
92
93 // read uptime info from the OS.
94 tms uptime;
95 basis::un_int real_ticks = times(&uptime);
96
97 // now turn this into the number of milliseconds.
98 double ticks_up = (double)real_ticks;
99 ticks_up = ticks_up * __multiplier; // convert to time here.
100
101 // we use the previous version of this calculation, which expected a basis::u_int
102 // to double conversion to provide a modulo operation rather than just leaving
103 // the basis::un_int at its maximum value (2^32-1). however, that expectation is not
104 // guaranteed on some platforms (e.g., ARM processor with floating point
105 // emulation) and thus it becomes a bug around 49 days and 17 hours into
106 // OS uptime because the value gets stuck at 2^32-1 and never rolls over.
107 return basis::un_int(ticks_up);
108//#endif
109}
110
111} //namespace.
112
Provides a dynamically resizable ASCII character string.
Definition astring.h:35
const char * s() const
synonym for observe. the 's' stands for "string", if that helps.
Definition astring.h:113
virtual const char * observe() const
observes the underlying pointer to the zero-terminated string.
Definition astring.cpp:140
static astring TMP()
provides a single place to get the temporary directory.
static astring get(const astring &variable_name)
looks up the "variable_name" in the current environment variables.
static bool set(const astring &variable_name, const astring &value)
adds or creates "variable_name" in the environment.
static basis::un_int system_uptime()
gives the operating system's uptime in a small form that rolls over.
The guards collection helps in testing preconditions and reporting errors.
Definition array.h:30
unsigned int un_int
Abbreviated name for unsigned integers.
Definition definitions.h:62