From 1da7189dba49532f6ec735cf92745913aa9a9b33 Mon Sep 17 00:00:00 2001 From: Dave Beazley Date: Tue, 27 Mar 2001 03:49:37 +0000 Subject: [PATCH] Update for SWILL git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@1068 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Source/DOH/Doh/Makefile.in | 4 +- Source/DOH/Doh/file.c | 110 ++++++++++++++++++++++++++++++++++--- Source/DOH/Include/doh.h | 2 + Source/DOH/Makefile.in | 4 +- 4 files changed, 109 insertions(+), 11 deletions(-) diff --git a/Source/DOH/Doh/Makefile.in b/Source/DOH/Doh/Makefile.in index accde3955..fadad36e2 100644 --- a/Source/DOH/Doh/Makefile.in +++ b/Source/DOH/Doh/Makefile.in @@ -18,6 +18,8 @@ prefix = @prefix@ RANLIB = @RANLIB@ AR = @AR@ +DOHOPT = + ######################################################################## # Normally, you shouldn't have to change anything below this point # ######################################################################## @@ -36,7 +38,7 @@ SHELL = /bin/sh # Rules for creation of a .o file from .c .SUFFIXES: .c .c.o: - $(CC) $(INCLUDE) $(CFLAGS) -c -o $*.o $< + $(CC) $(DOHOPT) $(INCLUDE) $(CFLAGS) -c -o $*.o $< all: $(LIB) diff --git a/Source/DOH/Doh/file.c b/Source/DOH/Doh/file.c index 99e5900f4..bf31e60ca 100644 --- a/Source/DOH/Doh/file.c +++ b/Source/DOH/Doh/file.c @@ -14,8 +14,13 @@ static char cvsroot[] = "$Header$"; #include "dohint.h" +#ifdef DOH_INTFILE +#include +#endif + typedef struct { FILE *filep; + int fd; int closeondel; } DohFile; @@ -26,8 +31,16 @@ typedef struct { static void DelFile(DOH *fo) { DohFile *f = (DohFile *) ObjData(fo); - if (f->closeondel) - fclose(f->filep); + if (f->closeondel) { + if (f->filep) { + fclose(f->filep); + } +#ifdef DOH_INTFILE + if (f->fd) { + close(f->fd); + } +#endif + } } /* ----------------------------------------------------------------------------- @@ -37,7 +50,15 @@ DelFile(DOH *fo) { static int File_read(DOH *fo, void *buffer, int len) { DohFile *f = (DohFile *) ObjData(fo); - return fread(buffer,1,len,f->filep); + + if (f->filep) { + return fread(buffer,1,len,f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + return read(f->fd,buffer,len); +#endif + } + return -1; } /* ----------------------------------------------------------------------------- @@ -47,7 +68,14 @@ File_read(DOH *fo, void *buffer, int len) { static int File_write(DOH *fo, void *buffer, int len) { DohFile *f = (DohFile *) ObjData(fo); - return fwrite(buffer,1,len,f->filep); + if (f->filep) { + return fwrite(buffer,1,len,f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + return write(f->fd,buffer,len); +#endif + } + return -1; } /* ----------------------------------------------------------------------------- @@ -57,7 +85,14 @@ File_write(DOH *fo, void *buffer, int len) { static int File_seek(DOH *fo, long offset, int whence) { DohFile *f = (DohFile *) ObjData(fo); - return fseek(f->filep,offset,whence); + if (f->filep) { + return fseek(f->filep,offset,whence); + } else if (f->fd) { +#ifdef DOH_INTFILE + return lseek(f->fd, offset, whence); +#endif + } + return -1; } /* ----------------------------------------------------------------------------- @@ -67,7 +102,14 @@ File_seek(DOH *fo, long offset, int whence) { static long File_tell(DOH *fo) { DohFile *f = (DohFile *) ObjData(fo); - return ftell(f->filep); + if (f->filep) { + return ftell(f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + return tell(f->fd); +#endif + } + return -1; } /* ----------------------------------------------------------------------------- @@ -76,8 +118,17 @@ File_tell(DOH *fo) { static int File_putc(DOH *fo, int ch) { + char c; DohFile *f = (DohFile *) ObjData(fo); - return fputc(ch,f->filep); + if (f->filep) { + return fputc(ch,f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + c = (char) ch; + return write(f->fd,&c,1); +#endif + } + return -1; } /* ----------------------------------------------------------------------------- @@ -86,8 +137,17 @@ File_putc(DOH *fo, int ch) { static int File_getc(DOH *fo) { + char c; DohFile *f = (DohFile *) ObjData(fo); - return fgetc(f->filep); + if (f->filep) { + return fgetc(f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + if (read(f->fd,&c,1) < 0) return EOF; + return c; +#endif + } + return EOF; } /* ----------------------------------------------------------------------------- @@ -99,7 +159,14 @@ File_getc(DOH *fo) { static int File_ungetc(DOH *fo, int ch) { DohFile *f = (DohFile *) ObjData(fo); - return ungetc(ch, f->filep); + if (f->filep) { + return ungetc(ch, f->filep); + } else if (f->fd) { +#ifdef DOH_INTFILE + /* Not implemented yet */ +#endif + } + return -1; } static DohFileMethods FileFileMethods = { @@ -165,6 +232,7 @@ NewFile(DOH *fn, char *mode) return 0; } f->filep = file; + f->fd = 0; f->closeondel = 1; return DohObjMalloc(DOHTYPE_FILE,f); } @@ -187,6 +255,30 @@ NewFileFromFile(FILE *file) f = (DohFile *) DohMalloc(sizeof(DohFile)); if (!f) return 0; f->filep = file; + f->fd = 0; + f->closeondel = 0; + return DohObjMalloc(DOHTYPE_FILE,f); +} + +/* ----------------------------------------------------------------------------- + * NewFileFromFd() + * + * Create a file object from an already open FILE *. + * ----------------------------------------------------------------------------- */ + +DOH * +NewFileFromFd(int fd) +{ + DohFile *f; + static int init = 0; + if (!init) { + DohRegisterType(DOHTYPE_FILE, &DohFileType); + init = 1; + } + f = (DohFile *) DohMalloc(sizeof(DohFile)); + if (!f) return 0; + f->filep = 0; + f->fd = fd; f->closeondel = 0; return DohObjMalloc(DOHTYPE_FILE,f); } diff --git a/Source/DOH/Include/doh.h b/Source/DOH/Include/doh.h index c7ce11132..e40ced2f3 100644 --- a/Source/DOH/Include/doh.h +++ b/Source/DOH/Include/doh.h @@ -204,6 +204,8 @@ extern DOHString *NewStringf(const DOH *fmt, ...); extern DOHFile *NewFile(DOH *file, char *mode); extern DOHFile *NewFileFromFile(FILE *f); +extern DOHFile *NewFileFromFd(int fd); + extern int DohCopyto(DOHFile *input, DOHFile *output); #define Copyto DohCopyto diff --git a/Source/DOH/Makefile.in b/Source/DOH/Makefile.in index bfa253c43..f5d9b775c 100644 --- a/Source/DOH/Makefile.in +++ b/Source/DOH/Makefile.in @@ -10,6 +10,8 @@ exec_prefix= @exec_prefix@ INCLUDE_DIR = $(prefix)/include LIB_DIR = $(exec_prefix)/lib +DOHOPT = + # Installer INSTALL = ./install-sh -c @@ -17,7 +19,7 @@ INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM= ${INSTALL} -m 755 all: - cd Doh; $(MAKE) + cd Doh; $(MAKE) DOHOPT='$(DOHOPT)' install: @echo "Installing $(LIB_DIR)/libdoh.a..."