aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Beazley <dave-swig@dabeaz.com>2006-12-19 03:49:17 +0000
committerDave Beazley <dave-swig@dabeaz.com>2006-12-19 03:49:17 +0000
commit79451aa1a708b0bd3bf4ec0f11ea7a1052a5f0a1 (patch)
treeae6bec25fabda132bce1bb2e9e5b2764aff8ddeb
parent4b31a3ee50f2fa9dead26ba00a58fa73e12f576f (diff)
downloadswig-79451aa1a708b0bd3bf4ec0f11ea7a1052a5f0a1.tar.gz
File management cleanup. Split API into separate header. Removed unused functions. Added documentation
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9622 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r--Doc/Devel/file.html185
-rw-r--r--Source/Swig/include.c137
-rw-r--r--Source/Swig/swig.h32
-rw-r--r--Source/Swig/swigfile.h37
4 files changed, 264 insertions, 127 deletions
diff --git a/Doc/Devel/file.html b/Doc/Devel/file.html
new file mode 100644
index 000000000..86dcbb52a
--- /dev/null
+++ b/Doc/Devel/file.html
@@ -0,0 +1,185 @@
+<html>
+<head>
+<title>SWIG File Handling</title>
+</head>
+
+<body>
+<center>
+<h1>SWIG File Handling</h1>
+
+<p>
+David M. Beazley <br>
+dave-swig@dabeaz.com<br>
+
+</b>
+</center>
+
+<h2>Introduction</h2>
+
+This document describes the functions related to file and filename handling in the SWIG core. These functions are
+defined in the header file <tt>Source/Swig/swigfile.h</tt>. This API is considered to be stable.
+
+<h2>File Search Path</h2>
+
+These functions manipulate the search path for locating files.
+
+<p>
+<b><tt>List *Swig_add_directory(const String_or_char *dirname)</tt></b>
+
+<blockquote>
+Adds a new directory to the system search path. The directory is appended to
+the end of the search path. Returns a list containing the current
+system search path.
+</blockquote>
+
+<p>
+<b><tt>void Swig_push_directory(const String_or_char *dirname)</tt></b>
+<blockquote>
+Pushs a temporary directory onto the search path. This directory is searched before
+directories added with <tt>Swig_add_directory()</tt> except when including a system
+file explicitly (either using #include &lt;file&gt; or calling <tt>Swig_include_sys()</tt>).
+This function is normally used by the preprocessor to add temporary directories when
+processing #include statements.
+</blockquote>
+
+<p>
+<b><tt>void Swig_pop_directory()</tt></b>
+<blockquote>
+Pops off the last pushed directory with <tt>Swig_push_directory()</tt>
+</blockquote>
+
+<p>
+<b><tt>int Swig_get_push_dir()</tt></b>
+
+<blockquote>
+Returns a flag that indicates whether directory pushing is enabled or not.
+</blockquote>
+
+<p>
+<b><tt>void Swig_set_push_dir(int dopush)</tt></b>
+<blockquote>
+Enables or disables directory pushing. By default, it is turned on. However, the <tt>-I-</tt> command line
+option to SWIG disables it.
+</blockquote>
+
+<p>
+<b><tt>List *Swig_search_path()</tt></b>
+<blockquote>
+Returns the current search path.
+</blockquote>
+
+
+<h2>File access functions</h2>
+
+<p>
+<b><tt>FILE *Swig_open(const String_or_char *name)</tt></b>
+
+<blockquote>
+Opens a file, using the applicable search paths, and returns an open <tt>FILE *</tt> object if found. Returns NULL if the file is not found.
+</blockquote>
+
+<p>
+<b><tt>String *Swig_read_file(FILE *f)</tt></b>
+
+<blockquote>
+Reads all of the data from an open file into a string which is returned.
+</blockquote>
+
+<p>
+<b><tt>String *Swig_include(const String_or_char *name)</tt></b>
+
+<blockquote>
+Searches for an include file <tt>name</tt> and returns its contents as
+a string if found. Returns NULL if not found. All of the applicable
+search paths are searched when trying to locate the file.
+</blockquote>
+
+<p>
+<b><tt>String *Swig_include_sys(const String_or_char *name)</tt></b>
+
+<blockquote>
+Searches for an include file <tt>name</tt> and returns its contents as
+a string if found. Returns NULL if not found. All of the applicable
+search paths are searched when trying to locate the file, but
+preference is given to system paths first. This mimics the behavior
+of <tt>#include &lt;file&gt;</tt> in the preprocessor.
+</blockquote>
+
+<p>
+<b><tt>int Swig_insert_file(const String_or_char *name, File *outfile)</tt></b>
+
+<blockquote>
+Searches for a file <tt>name</tt> and dumps its contents to <tt>outfile</tt> if found.
+Returns 0 on sucesss, -1 if the file couldn't be found.
+</blockquote>
+
+<h2>Query functions</h2>
+
+<p>
+<b><tt>String *Swig_last_file()</tt></b>
+
+<blockquote>
+Returns the full pathname of the file last opened or included.
+</blockquote>
+
+<h2>Named files</h2>
+
+<p>
+<b><tt>void *Swig_register_filebyname(const String_or_char *filename, File *outfile)</tt></b>
+
+<blockquote>
+Registers a file object <tt>outfile</tt> with a specific name <tt>filename</tt>. This function is
+used to implement the SWIG %insert directive and to manage different sections of the output
+file such as "runtime","header","wrapper","init", etc. Different language modules may add their own
+sections for generating Python code, Perl code, etc.
+</blockquote>
+
+<p>
+<b><tt>File *Swig_filebyname(const String_or_char *filename)</tt></b>
+<blockquote>
+This looks up a file object previously registered using <tt>Swig_register_filebyname()</tt>. This
+is used to implement the %insert directive.
+</blockquote>
+
+<h2>Filename utilities</h2>
+
+<p>
+<b><tt>char *Swig_file_suffix(const String_or_char *filename)</tt></b>
+<blockquote>
+Returns the suffix of a filename. For instance, if the filename is "foo.txt", it returns ".txt".
+</blockquote>
+
+<p>
+<b><tt>char *Swig_file_basename(const String_or_char *filename)</tt></b>
+<blockquote>
+Returns the filename without the suffix attached to it. For instance, if the filename is "foo.txt", it returns
+"foo". The result is stored in a static variable. If you need to save it, make your own copy.
+</blockquote>
+
+<p>
+<b><tt>char *Swig_file_filename(const String_or_char *filename)</tt></b>
+<blockquote>
+Returns the filename without any leading directories. For instance, if the filename is "/bar/spam/foo.txt", it
+returns "foo.txt". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.
+</blockquote>
+
+<p>
+<b><tt>char *Swig_file_dirname(const String_or_char *filename)</tt></b>
+<blockquote>
+Returns the directory name (if any). For instance, if the filename is "/bar/spam/foo.txt", it
+returns "/bar/spam/". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.
+</blockquote>
+
+<p>
+<b><tt>SWIG_FILE_DELIMETER</tt></b>
+<blockquote>
+This macro contains the file delimeter string for the local machine. On unix it is "/", on Windows it is "\\".
+</blockquote>
+
+</body>
+</html>
+
+
+
+
+
diff --git a/Source/Swig/include.c b/Source/Swig/include.c
index 76878e3c4..9d522ab8b 100644
--- a/Source/Swig/include.c
+++ b/Source/Swig/include.c
@@ -12,15 +12,13 @@
char cvsroot_include_c[] = "$Id$";
#include "swig.h"
-#include "swigkeys.h"
/* Delimeter used in accessing files and directories */
-static List *directories = 0; /* List of include directories */
-static String *lastpath = 0; /* Last file that was included */
-static String *swiglib = 0; /* Location of SWIG library */
-static String *lang_config = 0; /* Language configuration file */
-static int dopush = 1; /* Whether to push directories */
+static List *directories = 0; /* List of include directories */
+static String *lastpath = 0; /* Last file that was included */
+static List *pdirectories = 0; /* List of pushed directories */
+static int dopush = 1; /* Whether to push directories */
/* This functions determine whether to push/pop dirs in the preprocessor */
void Swig_set_push_dir(int push) {
@@ -31,34 +29,6 @@ int Swig_get_push_dir(void) {
return dopush;
}
-
-/* This function sets the name of the configuration file */
-
-void Swig_set_config_file(const String_or_char *filename) {
- lang_config = NewString(filename);
-}
-
-String *Swig_get_config_file() {
- return lang_config;
-}
-
-
-/* -----------------------------------------------------------------------------
- * Swig_swiglib_set()
- * Swig_swiglib_get()
- *
- * Set the location of the SWIG library. This isn't really used, by the
- * include mechanism, but rather as a query interface for language modules.
- * ----------------------------------------------------------------------------- */
-
-void Swig_swiglib_set(const String_or_char *sl) {
- swiglib = NewString(sl);
-}
-
-String *Swig_swiglib_get() {
- return swiglib;
-}
-
/* -----------------------------------------------------------------------------
* Swig_add_directory()
*
@@ -66,24 +36,18 @@ String *Swig_swiglib_get() {
* ----------------------------------------------------------------------------- */
List *Swig_add_directory(const String_or_char *dirname) {
+ String *adirname;
if (!directories)
directories = NewList();
assert(directories);
if (dirname) {
- String *sdir = NewString(dirname);
- Hash *dir = NewHash();
- assert(dir);
- SetFlag(dir, k_sysdir);
- Setattr(dir, k_name, sdir);
- Append(directories, dir);
- Delete(dir);
- Delete(sdir);
+ adirname = NewString(dirname);
+ Append(directories,adirname);
+ Delete(adirname);
}
return directories;
}
-
-
/* -----------------------------------------------------------------------------
* Swig_push_directory()
*
@@ -92,23 +56,16 @@ List *Swig_add_directory(const String_or_char *dirname) {
* ----------------------------------------------------------------------------- */
void Swig_push_directory(const String_or_char *dirname) {
- String *tmp = 0;
+ String *pdirname;
if (!Swig_get_push_dir())
return;
- if (!directories)
- directories = NewList();
- assert(directories);
- if (!DohIsString(dirname)) {
- dirname = tmp = NewString(dirname);
- assert(dirname);
- }
- if (dirname) {
- Hash *dir = NewHash();
- Setattr(dir, k_name, dirname);
- Insert(directories, 0, dir);
- if (tmp)
- Delete(tmp);
- }
+ if (!pdirectories)
+ pdirectories = NewList();
+ assert(pdirectories);
+ pdirname = NewString(dirname);
+ assert(pdirname);
+ Insert(pdirectories,0,pdirname);
+ Delete(pdirname);
}
/* -----------------------------------------------------------------------------
@@ -121,9 +78,9 @@ void Swig_push_directory(const String_or_char *dirname) {
void Swig_pop_directory() {
if (!Swig_get_push_dir())
return;
- if (!directories)
+ if (!pdirectories)
return;
- Delitem(directories, 0);
+ Delitem(pdirectories, 0);
}
/* -----------------------------------------------------------------------------
@@ -145,11 +102,9 @@ String *Swig_last_file() {
static List *Swig_search_path_any(int syspath) {
String *filename;
- String *dirname;
- List *slist, *llist;
- int i, ilen;
+ List *slist;
+ int i, ilen;
- llist = 0;
slist = NewList();
assert(slist);
filename = NewStringEmpty();
@@ -159,43 +114,33 @@ static List *Swig_search_path_any(int syspath) {
#else
Printf(filename, ".%s", SWIG_FILE_DELIMETER);
#endif
- if (syspath) {
- llist = NewList();
- assert(llist);
- Append(llist, filename);
- } else {
- Append(slist, filename);
+ Append(slist, filename);
+ Delete(filename);
+
+ /* If there are any pushed directories. Add them first */
+ if (pdirectories) {
+ ilen = Len(pdirectories);
+ for (i = 0; i < ilen; i++) {
+ filename = NewString(Getitem(pdirectories,i));
+ StringAppend(filename,SWIG_FILE_DELIMETER);
+ Append(slist,filename);
+ Delete(filename);
+ }
}
+ /* Add system directories next */
ilen = Len(directories);
for (i = 0; i < ilen; i++) {
- int issimple = 0;
- dirname = Getitem(directories, i);
- filename = NewStringEmpty();
- assert(filename);
- if (DohIsString(dirname)) {
- filename = Copy(dirname);
- issimple = 1;
+ filename = NewString(Getitem(directories,i));
+ StringAppend(filename,SWIG_FILE_DELIMETER);
+ if (syspath) {
+ /* If doing a system include, put the system directories first */
+ Insert(slist,i,filename);
} else {
- filename = Copy(Getattr(dirname, k_name));
- }
- StringAppend(filename, SWIG_FILE_DELIMETER);
-
- if (syspath && (issimple || !GetFlag(dirname, k_sysdir))) {
- Append(llist, filename);
- } else {
- Append(slist, filename);
- /* Insert(slist,0,filename); */
+ /* Otherwise, just put the system directories after the pushed directories (if any) */
+ Append(slist,filename);
}
Delete(filename);
}
- if (syspath) {
- int ilen = Len(llist);
- for (i = 0; i < ilen; i++) {
- Append(slist, Getitem(llist, i));
- }
- Delete(llist);
- }
-
return slist;
}
@@ -278,7 +223,6 @@ String *Swig_read_file(FILE *f) {
StringAppend(str, "\n");
}
}
-
return str;
}
@@ -314,7 +258,6 @@ String *Swig_include_sys(const String_or_char *name) {
return Swig_include_any(name, 1);
}
-
/* -----------------------------------------------------------------------------
* Swig_insert_file()
*
diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h
index babf9a5f5..9cd6b7335 100644
--- a/Source/Swig/swig.h
+++ b/Source/Swig/swig.h
@@ -92,38 +92,10 @@ extern "C" {
#define T_SYMBOL 98
#define T_ERROR 99
+
/* --- File interface --- */
- extern List *Swig_add_directory(const String_or_char *dirname);
- extern void Swig_push_directory(const String_or_char *dirname);
- extern void Swig_pop_directory();
- extern String *Swig_last_file();
- extern List *Swig_search_path();
- extern FILE *Swig_open(const String_or_char *name);
- extern String *Swig_read_file(FILE *f);
- extern String *Swig_include(const String_or_char *name);
- extern String *Swig_include_sys(const String_or_char *name);
- extern int Swig_insert_file(const String_or_char *name, File *outfile);
- extern void Swig_set_config_file(const String_or_char *filename);
- extern String *Swig_get_config_file(void);
- extern void Swig_set_push_dir(int dopush);
- extern int Swig_get_push_dir(void);
- extern void Swig_swiglib_set(const String_or_char *);
- extern String *Swig_swiglib_get();
- extern void Swig_register_filebyname(const String_or_char *filename, File *outfile);
- extern File *Swig_filebyname(const String_or_char *filename);
- extern char *Swig_file_suffix(const String_or_char *filename);
- extern char *Swig_file_basename(const String_or_char *filename);
- extern char *Swig_file_filename(const String_or_char *filename);
- extern char *Swig_file_dirname(const String_or_char *filename);
-
-#if defined(MACSWIG)
-# define SWIG_FILE_DELIMETER ":"
-#elif defined(_WIN32)
-# define SWIG_FILE_DELIMETER "\\"
-#else
-# define SWIG_FILE_DELIMETER "/"
-#endif
+#include "swigfile.h"
/* --- Command line parsing --- */
diff --git a/Source/Swig/swigfile.h b/Source/Swig/swigfile.h
new file mode 100644
index 000000000..5bfd81615
--- /dev/null
+++ b/Source/Swig/swigfile.h
@@ -0,0 +1,37 @@
+/* -----------------------------------------------------------------------------
+ * See the LICENSE file for information on copyright, usage and redistribution
+ * of SWIG, and the README file for authors - http://www.swig.org/release.html.
+ *
+ * swigfile.h
+ *
+ * File handling functions in the SWIG core
+ * ----------------------------------------------------------------------------- */
+
+/* $Id: swig.h 9603 2006-12-05 21:47:01Z beazley $ */
+
+extern List *Swig_add_directory(const String_or_char *dirname);
+extern void Swig_push_directory(const String_or_char *dirname);
+extern void Swig_pop_directory();
+extern String *Swig_last_file();
+extern List *Swig_search_path();
+extern FILE *Swig_open(const String_or_char *name);
+extern String *Swig_read_file(FILE *f);
+extern String *Swig_include(const String_or_char *name);
+extern String *Swig_include_sys(const String_or_char *name);
+extern int Swig_insert_file(const String_or_char *name, File *outfile);
+extern void Swig_set_push_dir(int dopush);
+extern int Swig_get_push_dir(void);
+extern void Swig_register_filebyname(const String_or_char *filename, File *outfile);
+extern File *Swig_filebyname(const String_or_char *filename);
+extern char *Swig_file_suffix(const String_or_char *filename);
+extern char *Swig_file_basename(const String_or_char *filename);
+extern char *Swig_file_filename(const String_or_char *filename);
+extern char *Swig_file_dirname(const String_or_char *filename);
+
+#if defined(MACSWIG)
+# define SWIG_FILE_DELIMETER ":"
+#elif defined(_WIN32)
+# define SWIG_FILE_DELIMETER "\\"
+#else
+# define SWIG_FILE_DELIMETER "/"
+#endif