home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
mitsch75.zip
/
scheme-7_5_17-src.zip
/
scheme-7.5.17
/
src
/
microcode
/
prosenv.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-12-05
|
8KB
|
228 lines
/* -*-C-*-
$Id: prosenv.c,v 1.17 2000/12/05 21:23:47 cph Exp $
Copyright (c) 1987-1999 Massachusetts Institute of Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* Process-environment primitives. */
#include "scheme.h"
#include "prims.h"
#include "osenv.h"
#include "ostop.h"
#include "limits.h"
DEFINE_PRIMITIVE ("ENCODED-TIME", Prim_encoded_time, 0, 0,
"Return the current time as an integer.")
{
PRIMITIVE_RETURN (ulong_to_integer ((unsigned long) (OS_encoded_time ())));
}
#define DECODE_TIME_BODY(proc) \
{ \
PRIMITIVE_HEADER (2); \
{ \
SCHEME_OBJECT vec = (VECTOR_ARG (1)); \
unsigned int len = (VECTOR_LENGTH (vec)); \
struct time_structure ts; \
if (! (len >= 10)) \
error_bad_range_arg (1); \
proc (((time_t) (arg_ulong_integer (2))), &ts); \
FAST_VECTOR_SET (vec, 1, (ulong_to_integer (ts . second))); \
FAST_VECTOR_SET (vec, 2, (ulong_to_integer (ts . minute))); \
FAST_VECTOR_SET (vec, 3, (ulong_to_integer (ts . hour))); \
FAST_VECTOR_SET (vec, 4, (ulong_to_integer (ts . day))); \
FAST_VECTOR_SET (vec, 5, (ulong_to_integer (ts . month))); \
FAST_VECTOR_SET (vec, 6, (ulong_to_integer (ts . year))); \
FAST_VECTOR_SET (vec, 7, (ulong_to_integer (ts . day_of_week))); \
FAST_VECTOR_SET \
(vec, 8, \
(((ts . daylight_savings_time) < 0) \
? SHARP_F \
: (long_to_integer (ts . daylight_savings_time)))); \
FAST_VECTOR_SET \
(vec, 9, \
(((ts . time_zone) == INT_MAX) \
? SHARP_F \
: (long_to_integer (ts . time_zone)))); \
} \
PRIMITIVE_RETURN (UNSPECIFIC); \
}
DEFINE_PRIMITIVE ("DECODE-TIME", Prim_decode_time, 2, 2,
"Fill a vector with the second argument decoded.\n\
The vector's elements are:\n\
#(TAG second minute hour day month year day-of-week dst zone)")
DECODE_TIME_BODY (OS_decode_time)
DEFINE_PRIMITIVE ("DECODE-UTC", Prim_decode_utc, 2, 2,
"Fill a vector with the second argument decoded.\n\
The vector's elements are:\n\
#(TAG second minute hour day month year day-of-week dst zone)")
DECODE_TIME_BODY (OS_decode_utc)
DEFINE_PRIMITIVE ("ENCODE-TIME", Prim_encode_time, 1, 1,
"Return the file time corresponding to the time structure given.")
{
SCHEME_OBJECT vec;
unsigned int len;
struct time_structure ts;
PRIMITIVE_HEADER (1);
vec = (VECTOR_ARG (1));
len = (VECTOR_LENGTH (vec));
if (! (len >= 8))
error_bad_range_arg (1);
(ts . second) = (integer_to_ulong (FAST_VECTOR_REF (vec, 1)));
(ts . minute) = (integer_to_ulong (FAST_VECTOR_REF (vec, 2)));
(ts . hour) = (integer_to_ulong (FAST_VECTOR_REF (vec, 3)));
(ts . day) = (integer_to_ulong (FAST_VECTOR_REF (vec, 4)));
(ts . month) = (integer_to_ulong (FAST_VECTOR_REF (vec, 5)));
(ts . year) = (integer_to_ulong (FAST_VECTOR_REF (vec, 6)));
(ts . day_of_week) = (integer_to_ulong (FAST_VECTOR_REF (vec, 7)));
(ts . daylight_savings_time)
= (((len > 8) && (INTEGER_P (FAST_VECTOR_REF (vec, 8))))
? (integer_to_long (FAST_VECTOR_REF (vec, 8)))
: (-1));
(ts . time_zone)
= (((len > 9)
&& (INTEGER_P (FAST_VECTOR_REF (vec, 9)))
&& (integer_to_ulong_p (FAST_VECTOR_REF (vec, 9))))
? (integer_to_ulong (FAST_VECTOR_REF (vec, 9)))
: INT_MAX);
PRIMITIVE_RETURN (ulong_to_integer ((unsigned long) (OS_encode_time (&ts))));
}
DEFINE_PRIMITIVE ("SYSTEM-CLOCK", Prim_system_clock, 0, 0,
"Return the current process time in units of milliseconds.")
{
PRIMITIVE_HEADER (0);
PRIMITIVE_RETURN (double_to_integer (OS_process_clock ()));
}
DEFINE_PRIMITIVE ("REAL-TIME-CLOCK", Prim_real_time_clock, 0, 0,
"Return the current real time in units of milliseconds.")
{
PRIMITIVE_HEADER (0);
PRIMITIVE_RETURN (double_to_integer (OS_real_time_clock ()));
}
DEFINE_PRIMITIVE ("PROCESS-TIMER-CLEAR", Prim_process_timer_clear, 0, 0,
"Turn off the process timer.")
{
PRIMITIVE_HEADER (0);
OS_process_timer_clear ();
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("PROCESS-TIMER-SET", Prim_process_timer_set, 2, 2,
"Set the process timer.\n\
First arg FIRST says how long to wait until the first interrupt;\n\
second arg INTERVAL says how long to wait between interrupts after that.\n\
Both arguments are in units of milliseconds.")
{
PRIMITIVE_HEADER (2);
OS_process_timer_set ((arg_nonnegative_integer (1)),
(arg_nonnegative_integer (2)));
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("REAL-TIMER-CLEAR", Prim_real_timer_clear, 0, 0,
"Turn off the real timer.")
{
PRIMITIVE_HEADER (0);
OS_real_timer_clear ();
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("REAL-TIMER-SET", Prim_real_timer_set, 2, 2,
"Set the real timer.\n\
First arg FIRST says how long to wait until the first interrupt;\n\
second arg INTERVAL says how long to wait between interrupts after that.\n\
Both arguments are in units of milliseconds.")
{
PRIMITIVE_HEADER (2);
OS_real_timer_set ((arg_nonnegative_integer (1)),
(arg_nonnegative_integer (2)));
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("PROFILE-TIMER-CLEAR", Prim_profile_timer_clear, 0, 0,
"Turn off the profile timer.")
{
PRIMITIVE_HEADER (0);
OS_profile_timer_clear ();
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("PROFILE-TIMER-SET", Prim_profile_timer_set, 2, 2,
"Set the profile timer.\n\
First arg FIRST says how long to wait until the first interrupt;\n\
second arg INTERVAL says how long to wait between interrupts after that.\n\
Both arguments are in units of milliseconds.")
{
PRIMITIVE_HEADER (2);
OS_profile_timer_set ((arg_nonnegative_integer (1)),
(arg_nonnegative_integer (2)));
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("SETUP-TIMER-INTERRUPT", Prim_setup_timer_interrupt, 2, 2,
"This is an obsolete primitive; use `process-timer-set' instead.")
{
PRIMITIVE_HEADER (2);
if (((ARG_REF (1)) == SHARP_F) && ((ARG_REF (2)) == SHARP_F))
OS_process_timer_clear ();
else
{
unsigned long days = (arg_nonnegative_integer (1));
unsigned long centisec = (arg_nonnegative_integer (2));
OS_process_timer_set
((((days * 24 * 60 * 60 * 100) + centisec) * 10), 0);
}
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("WORKING-DIRECTORY-PATHNAME", Prim_working_dir_pathname, 0, 0,
"Return the current working directory as a string.")
{
PRIMITIVE_HEADER (0);
PRIMITIVE_RETURN (char_pointer_to_string
((unsigned char *) OS_working_dir_pathname ()));
}
DEFINE_PRIMITIVE ("SET-WORKING-DIRECTORY-PATHNAME!", Prim_set_working_dir_pathname, 1, 1,
"Change the current working directory to NAME.")
{
PRIMITIVE_HEADER (1);
OS_set_working_dir_pathname (STRING_ARG (1));
PRIMITIVE_RETURN (UNSPECIFIC);
}
DEFINE_PRIMITIVE ("SYSTEM-CALL-ERROR-MESSAGE", Prim_system_call_error_message, 1, 1, 0)
{
PRIMITIVE_HEADER (1);
{
CONST char * message =
(OS_error_code_to_message (arg_nonnegative_integer (1)));
PRIMITIVE_RETURN
((message == 0) ? SHARP_F
: (char_pointer_to_string ((unsigned char *) message)));
}
}