swig/Source/Swig/include.c
Dave Beazley 9cfba9a811 Cleanup
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@391 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2000-04-05 22:47:51 +00:00

191 lines
4.9 KiB
C

/* -----------------------------------------------------------------------------
* include.c
*
* The functions in this file are used to manage files in the SWIG library.
* General purpose functions for opening, including, and retrieving pathnames
* are provided.
*
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (C) 1999-2000. The University of Chicago
* See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */
static char cvsroot[] = "$Header$";
#include "swig.h"
/* Delimeter used in accessing files and directories */
static DOHList *directories = 0; /* List of include directories */
static DOHString *lastpath = 0; /* Last file that was included */
static int bytes_read = 0; /* Bytes read */
/* -----------------------------------------------------------------------------
* Swig_add_directory()
*
* Adds a directory to the SWIG search path.
* ----------------------------------------------------------------------------- */
void
Swig_add_directory(const DOHString_or_char *dirname) {
if (!directories) directories = NewList();
assert(directories);
if (!String_check(dirname)) {
dirname = NewString((char *) dirname);
assert(dirname);
}
Append(directories, dirname);
}
/* -----------------------------------------------------------------------------
* Swig_last_file()
*
* Returns the full pathname of the last file opened.
* ----------------------------------------------------------------------------- */
DOHString *
Swig_last_file() {
assert(lastpath);
return lastpath;
}
/* -----------------------------------------------------------------------------
* Swig_search_path()
*
* Returns a list of the current search paths.
* ----------------------------------------------------------------------------- */
DOHList *
Swig_search_path() {
DOHString *filename;
DOHString *dirname;
DOHList *slist;
int i;
slist = NewList();
assert(slist);
filename = NewString("");
assert(filename);
Printf(filename,".%s", SWIG_FILE_DELIMETER);
Append(slist,filename);
for (i = 0; i < Len(directories); i++) {
dirname = Getitem(directories,i);
filename = NewString("");
assert(filename);
Printf(filename, "%s%s", dirname, SWIG_FILE_DELIMETER);
Append(slist,filename);
}
return slist;
}
/* -----------------------------------------------------------------------------
* Swig_open()
*
* Looks for a file and open it. Returns an open FILE * on success.
* ----------------------------------------------------------------------------- */
FILE *
Swig_open(const DOHString_or_char *name) {
FILE *f;
DOHString *filename;
DOHList *spath = 0;
char *cname;
int i;
if (!directories) directories = NewList();
assert(directories);
cname = Char(name);
filename = NewString(cname);
assert(filename);
f = fopen(Char(filename),"r");
if (!f) {
spath = Swig_search_path();
for (i = 0; i < Len(spath); i++) {
Clear(filename);
Printf(filename,"%s%s", Getitem(spath,i), cname);
f = fopen(Char(filename),"r");
if (f) break;
}
Delete(spath);
}
if (f) {
Delete(lastpath);
lastpath = Copy(filename);
}
Delete(filename);
return f;
}
/* -----------------------------------------------------------------------------
* Swig_read_file()
*
* Reads data from an open FILE * and returns it as a string.
* ----------------------------------------------------------------------------- */
DOHString *
Swig_read_file(FILE *f) {
char buffer[4096];
DOHString *str = NewString("");
assert(str);
while (fgets(buffer,4095,f)) {
Append(str,buffer);
}
Append(str,"\n");
return str;
}
/* -----------------------------------------------------------------------------
* Swig_include()
*
* Opens a file and returns it as a string.
* ----------------------------------------------------------------------------- */
static int readbytes = 0;
DOHString *
Swig_include(const DOHString_or_char *name) {
FILE *f;
DOHString *str;
f = Swig_open(name);
if (!f) return 0;
str = Swig_read_file(f);
bytes_read = bytes_read + Len(str);
fclose(f);
Seek(str,0,SEEK_SET);
Setfile(str,lastpath);
Setline(str,1);
readbytes += Len(str);
return str;
}
int
Swig_bytes_read() {
return readbytes;
}
/* -----------------------------------------------------------------------------
* Swig_insert_file()
*
* Copies the contents of a file into another file
* ----------------------------------------------------------------------------- */
int
Swig_insert_file(const DOHString_or_char *filename, DOHFile *outfile) {
char buffer[4096];
int nbytes;
FILE *f = Swig_open(filename);
if (!f) return -1;
while ((nbytes = Read(f,buffer,4096)) > 0) {
Write(outfile,buffer,nbytes);
}
return 0;
}