-/* Copyright (C) 1995,1996,1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1998,1999 Free Software Foundation, Inc.
*
* 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
* If you write modifications of your own for GUILE, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice. */
+
+/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
+ gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
+
\f
#include <stdio.h>
#include "alist.h"
#include "dynwind.h"
+#include "scm_validate.h"
#include "load.h"
#include <sys/types.h>
return SCM_UNSPECIFIED;
}
-SCM_PROC(s_primitive_load, "primitive-load", 1, 0, 0, scm_primitive_load);
-SCM
-scm_primitive_load (filename)
- SCM filename;
+SCM_DEFINE(scm_primitive_load, "primitive-load", 1, 0, 0,
+ (SCM filename),
+"Load @var{file} and evaluate its contents in the top-level environment.
+The load paths are not searched; @var{file} must either be a full
+pathname or be a pathname relative to the current directory. If the
+variable @code{%load-hook} is defined, it should be bound to a procedure
+that will be called before any code is loaded. See documentation for
+@code{%load-hook} later in this section.")
+#define FUNC_NAME s_scm_primitive_load
{
SCM hook = *scm_loc_load_hook;
- SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
- SCM_ARG1, s_primitive_load);
+ SCM_VALIDATE_ROSTRING(1,filename);
SCM_ASSERT (hook == SCM_BOOL_F
|| (scm_procedure_p (hook) == SCM_BOOL_T),
hook, "value of %load-hook is neither a procedure nor #f",
- s_primitive_load);
+ FUNC_NAME);
if (hook != SCM_BOOL_F)
scm_apply (hook, scm_listify (filename, SCM_UNDEFINED), SCM_EOL);
- {
+ { /* scope */
SCM port, save_port;
port = scm_open_file (filename,
scm_makfromstr ("r", (scm_sizet) sizeof (char), 0));
}
return SCM_UNSPECIFIED;
}
+#undef FUNC_NAME
\f
/* Builtin path to scheme library files. */
#ifdef SCM_PKGDATA_DIR
-SCM_PROC (s_sys_package_data_dir, "%package-data-dir", 0, 0, 0, scm_sys_package_data_dir);
-SCM
-scm_sys_package_data_dir ()
+SCM_DEFINE (scm_sys_package_data_dir, "%package-data-dir", 0, 0, 0,
+ (),
+"Return the name of the directory where Scheme packages, modules and
+libraries are kept. On most Unix systems, this will be
+@samp{/usr/local/share/guile}.")
+#define FUNC_NAME s_scm_sys_package_data_dir
{
return scm_makfrom0str (SCM_PKGDATA_DIR);
}
+#undef FUNC_NAME
#endif /* SCM_PKGDATA_DIR */
+#ifdef SCM_LIBRARY_DIR
+SCM_DEFINE (scm_sys_library_dir, "%library-dir", 0,0,0,
+ (),
+"Return the directory where the Guile Scheme library files are installed.
+E.g., may return \"/usr/share/guile/1.3.5\".")
+#define FUNC_NAME s_scm_sys_library_dir
+{
+ return scm_makfrom0str(SCM_LIBRARY_DIR);
+}
+#undef FUNC_NAME
+#endif /* SCM_LIBRARY_DIR */
+
+#ifdef SCM_SITE_DIR
+SCM_DEFINE (scm_sys_site_dir, "%site-dir", 0,0,0,
+ (),
+"Return the directory where the Guile site files are installed.
+E.g., may return \"/usr/share/guile/site\".")
+#define FUNC_NAME s_scm_sys_site_dir
+{
+ return scm_makfrom0str(SCM_SITE_DIR);
+}
+#undef FUNC_NAME
+#endif /* SCM_SITE_DIR */
+
+
+
\f
/* Initializing the load path, and searching it. */
}
-SCM_PROC (s_parse_path, "parse-path", 1, 1, 0, scm_parse_path);
-
-SCM
-scm_parse_path (SCM path, SCM tail)
+SCM_DEFINE (scm_parse_path, "parse-path", 1, 1, 0,
+ (SCM path, SCM tail),
+"")
+#define FUNC_NAME s_scm_parse_path
{
- SCM_ASSERT (SCM_FALSEP (path) || (SCM_NIMP (path) && SCM_ROSTRINGP (path)),
+ SCM_ASSERT (SCM_FALSEP (path) || (SCM_ROSTRINGP (path)),
path,
- SCM_ARG1,
- s_parse_path);
+ SCM_ARG1, FUNC_NAME);
if (SCM_UNBNDP (tail))
tail = SCM_EOL;
return (SCM_FALSEP (path)
? tail
: scm_internal_parse_path (SCM_ROCHARS (path), tail));
}
+#undef FUNC_NAME
/* Initialize the global variable %load-path, given the value of the
If FILENAME is absolute, return it unchanged.
If given, EXTENSIONS is a list of strings; for each directory
in PATH, we search for FILENAME concatenated with each EXTENSION. */
-SCM_PROC(s_search_path, "search-path", 2, 1, 0, scm_search_path);
-SCM
-scm_search_path (path, filename, extensions)
- SCM path;
- SCM filename;
- SCM extensions;
+SCM_DEFINE(scm_search_path, "search-path", 2, 1, 0,
+ (SCM path, SCM filename, SCM extensions),
+"")
+#define FUNC_NAME s_scm_search_path
{
char *filename_chars;
int filename_len;
size_t max_path_len; /* maximum length of any PATH element */
size_t max_ext_len; /* maximum length of any EXTENSIONS element */
- SCM_ASSERT (scm_ilength (path) >= 0, path, SCM_ARG1, s_search_path);
- SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
- SCM_ARG2, s_search_path);
+ SCM_VALIDATE_LIST(1,path);
+ SCM_VALIDATE_ROSTRING(2,filename);
if (SCM_UNBNDP (extensions))
extensions = SCM_EOL;
else
- SCM_ASSERT (scm_ilength (extensions) >= 0, extensions,
- SCM_ARG3, s_search_path);
+ SCM_VALIDATE_LIST(3,extensions);
filename_chars = SCM_ROCHARS (filename);
filename_len = SCM_ROLENGTH (filename);
for (walk = path; SCM_NIMP (walk); walk = SCM_CDR (walk))
{
SCM elt = SCM_CAR (walk);
- SCM_ASSERT (SCM_NIMP (elt) && SCM_ROSTRINGP (elt), elt,
+ SCM_ASSERT (SCM_ROSTRINGP (elt), elt,
"path is not a list of strings",
- s_search_path);
+ FUNC_NAME);
if (SCM_ROLENGTH (elt) > max_path_len)
max_path_len = SCM_ROLENGTH (elt);
}
/* Find the length of the longest element of the load extensions
list. */
- {
+ { /* scope */
SCM walk;
max_ext_len = 0;
for (walk = extensions; SCM_NIMP (walk); walk = SCM_CDR (walk))
{
SCM elt = SCM_CAR (walk);
- SCM_ASSERT (SCM_NIMP (elt) && SCM_ROSTRINGP (elt), elt,
+ SCM_ASSERT (SCM_ROSTRINGP (elt), elt,
"extension list is not a list of strings",
- s_search_path);
+ FUNC_NAME);
if (SCM_ROLENGTH (elt) > max_ext_len)
max_ext_len = SCM_ROLENGTH (elt);
}
SCM_DEFER_INTS;
- {
+ { /* scope */
SCM result = SCM_BOOL_F;
int buf_size = max_path_len + 1 + filename_len + max_ext_len + 1;
- char *buf = scm_must_malloc (buf_size, s_search_path);
+ char *buf = SCM_MUST_MALLOC (buf_size);
/* This simplifies the loop below a bit. */
if (SCM_NULLP (extensions))
return result;
}
}
+#undef FUNC_NAME
/* Search %load-path for a directory containing a file named FILENAME.
The file must be readable, and not a directory.
If we find one, return its full filename; otherwise, return #f.
If FILENAME is absolute, return it unchanged. */
-SCM_PROC(s_sys_search_load_path, "%search-load-path", 1, 0, 0, scm_sys_search_load_path);
-SCM
-scm_sys_search_load_path (filename)
- SCM filename;
+SCM_DEFINE(scm_sys_search_load_path, "%search-load-path", 1, 0, 0,
+ (SCM filename),
+"Search @var{%load-path} for @var{file}, which must be readable by the
+current user. If @var{file} is found in the list of paths to search or
+is an absolute pathname, return its full pathname. Otherwise, return
+@code{#f}. Filenames may have any of the optional extensions in the
+@code{%load-extensions} list; @code{%search-load-path} will try each
+extension automatically.")
+#define FUNC_NAME s_scm_sys_search_load_path
{
SCM path = *scm_loc_load_path;
SCM exts = *scm_loc_load_extensions;
- SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
- SCM_ARG1, s_sys_search_load_path);
+ SCM_VALIDATE_ROSTRING(1,filename);
+
SCM_ASSERT (scm_ilength (path) >= 0, path, "load path is not a proper list",
- s_sys_search_load_path);
+ FUNC_NAME);
SCM_ASSERT (scm_ilength (exts) >= 0, exts,
"load extension list is not a proper list",
- s_sys_search_load_path);
- return scm_search_path (path,
- filename,
- exts);
+ FUNC_NAME);
+ return scm_search_path (path, filename, exts);
}
+#undef FUNC_NAME
-SCM_PROC(s_primitive_load_path, "primitive-load-path", 1, 0, 0, scm_primitive_load_path);
-SCM
-scm_primitive_load_path (filename)
- SCM filename;
+SCM_DEFINE(scm_primitive_load_path, "primitive-load-path", 1, 0, 0,
+ (SCM filename),
+"Search @var{%load-path} for @var{file} and load it into the top-level
+environment. If @var{file} is a relative pathname and is not found in
+the list of search paths, an error is signalled.")
+#define FUNC_NAME s_scm_primitive_load_path
{
SCM full_filename;
- SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
- SCM_ARG1, s_primitive_load_path);
+ SCM_VALIDATE_ROSTRING(1,filename);
full_filename = scm_sys_search_load_path (filename);
{
int absolute = (SCM_ROLENGTH (filename) >= 1
&& SCM_ROCHARS (filename)[0] == '/');
- scm_misc_error (s_primitive_load_path,
+ scm_misc_error (FUNC_NAME,
(absolute
? "Unable to load file %S"
: "Unable to find file %S in load path"),
return scm_primitive_load (full_filename);
}
+#undef FUNC_NAME
/* The following function seems trivial - and indeed it is. Its
* existence is motivated by its ability to evaluate expressions
SCM_SYMBOL (scm_end_of_file_key, "end-of-file");
-SCM_PROC (s_read_and_eval_x, "read-and-eval!", 0, 1, 0, scm_read_and_eval_x);
-
-SCM
-scm_read_and_eval_x (port)
- SCM port;
+SCM_DEFINE (scm_read_and_eval_x, "read-and-eval!", 0, 1, 0,
+ (SCM port),
+"Read a form from @var{port} (standard input by default), and evaluate it
+(memoizing it in the process) in the top-level environment. If no data
+is left to be read from @var{port}, an @code{end-of-file} error is
+signalled.")
+#define FUNC_NAME s_scm_read_and_eval_x
{
SCM form = scm_read (port);
if (SCM_EOF_OBJECT_P (form))
scm_ithrow (scm_end_of_file_key, SCM_EOL, 1);
return scm_eval_x (form);
}
+#undef FUNC_NAME
\f
/* Information about the build environment. */