diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/Makefile.in | 2 | ||||
-rw-r--r-- | main/memory_streams.c | 189 | ||||
-rw-r--r-- | main/php.h | 3 | ||||
-rw-r--r-- | main/php_memory_streams.h | 35 |
4 files changed, 227 insertions, 2 deletions
diff --git a/main/Makefile.in b/main/Makefile.in index b59aa1333b..e17a14cef9 100644 --- a/main/Makefile.in +++ b/main/Makefile.in @@ -6,7 +6,7 @@ LTLIBRARY_SOURCES_COMMON = \ php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c \ streams.c network.c php_open_temporary_file.c php_logos.c \ - output.c + output.c memory_stream.c LTLIBRARY_SOURCES = $(LTLIBRARY_SOURCES_COMMON) internal_functions.c diff --git a/main/memory_streams.c b/main/memory_streams.c new file mode 100644 index 0000000000..8a0a21e3a6 --- /dev/null +++ b/main/memory_streams.c @@ -0,0 +1,189 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2002 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: | + | Marcus Boerger <helly@php.net> | + +----------------------------------------------------------------------+ + */ + +#define _GNU_SOURCE +#include "php.h" +#include "php_streams.h" + +/* {{{ ------- MEMORY stream implementation -------*/ + +typedef struct { + char *data; + size_t fpos; + size_t fsize; +} php_memory_stream_data; + +static size_t php_memory_stream_write(php_stream *stream, const char *buf, size_t count) {/* {{{ */ + php_memory_stream_data *ms; + + assert(stream != NULL); + ms = stream->abstract; + assert(ms != NULL); + if ( ms->fpos + count > ms->fsize) { + char *tmp; + + if ( !ms->data) { + tmp = emalloc( ms->fpos + count); + } else { + tmp = erealloc( ms->data, ms->fpos + count); + } + if ( !tmp) { + count = ms->fsize - ms->fpos + 1; + } else { + ms->data = tmp; + ms->fsize = ms->fpos + count; + } + } + if ( !ms->data) + count = 0; + if ( count) { + assert(buf!= NULL); + memcpy( ms->data+ms->fpos, (char*)buf, count); + ms->fpos += count; + } + return count; +} /* }}} */ + +static size_t php_memory_stream_read(php_stream *stream, char *buf, size_t count) {/* {{{ */ + php_memory_stream_data *ms; + + assert(stream != NULL); + ms = stream->abstract; + assert(ms != NULL); + + if (buf == NULL && count == 0) { + /* check for EOF condition */ + if (ms->fpos >= ms->fsize) { + return EOF; + } + return 0; + } + + if ( ms->fpos + count > ms->fsize) { + count = ms->fsize - ms->fpos; + } + if ( count) { + assert(buf!= NULL); + memcpy( buf, ms->data+ms->fpos, count); + ms->fpos += count; + } + return count; +} /* }}} */ + + +static int php_memory_stream_close(php_stream *stream, int close_handle) {/* {{{ */ + php_memory_stream_data *ms; + + assert(stream != NULL); + ms = stream->abstract; + assert(ms != NULL); + if (ms->data) { + efree(ms->data); + } + ms->data = NULL; + ms->fsize = 0; + ms->fpos = 0; +} /* }}} */ + + +static int php_memory_stream_flush(php_stream *stream) {/* {{{ */ + // nothing to do here + return 0; +} /* }}} */ + + +static int php_memory_stream_seek(php_stream *stream, off_t offset, int whence) {/* {{{ */ + php_memory_stream_data *ms; + + assert(stream != NULL); + ms = stream->abstract; + assert(ms != NULL); + if (offset == 0 && whence == SEEK_CUR) + return ms->fpos; + switch( whence) { + case SEEK_CUR: + if ( offset < 0) { + if ( ms->fpos < -offset) { + ms->fpos = 0; + /*return EINVAL;*/ + } else { + ms->fpos = ms->fpos + offset; + } + } else { + if ( ms->fpos < offset) { + ms->fpos = ms->fsize; + /*return EINVAL;*/ + } else { + ms->fpos = ms->fpos + offset; + } + } + return 0; + case SEEK_SET: + if ( offset > ms->fsize) { + ms->fpos = ms->fsize; + /*return EINVAL;*/ + } else { + ms->fpos = offset; + } + return 0; + case SEEK_END: + if ( offset > 0) { + ms->fpos = ms->fsize; + /*return EINVAL;*/ + } else if ( ms->fpos < -offset) { + ms->fpos = 0; + /*return EINVAL;*/ + } else { + ms->fpos = ms->fsize + offset; + } + return 0; + default: + return 0; + return /*EINVAL*/; + } +} /* }}} */ + +php_stream_ops php_stream_memory_ops = { + php_memory_stream_write, php_memory_stream_read, + php_memory_stream_close, php_memory_stream_flush, + php_memory_stream_seek, + NULL, + NULL, + "MEMORY" +}; + +PHPAPI php_stream *php_memory_stream_create() {/* {{{ */ + php_memory_stream_data *self; + + self = emalloc(sizeof(*self)); + assert( self != NULL); + self->data = NULL; + self->fpos = 0; + self->fsize = 0; + return php_stream_alloc(&php_stream_memory_ops, self, 0, "rwb"); +} /* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/main/php.h b/main/php.h index d0804923d6..e086ee4ed5 100644 --- a/main/php.h +++ b/main/php.h @@ -172,6 +172,7 @@ char *strerror(int); #endif #include "php_streams.h" +#include "php_memory_streams.h" #include "fopen_wrappers.h" #if (REGEX == 1 || REGEX == 0) && !defined(NO_REGEX_EXTRA_H) @@ -357,7 +358,7 @@ PHPAPI int cfg_get_string(char *varname, char **result); #define XtOffsetOf(s_type, field) XtOffset(s_type*, field) #endif #endif /* !XtOffsetOf */ - + PHPAPI PHP_FUNCTION(warn_not_available); #endif diff --git a/main/php_memory_streams.h b/main/php_memory_streams.h new file mode 100644 index 0000000000..0041433acf --- /dev/null +++ b/main/php_memory_streams.h @@ -0,0 +1,35 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2002 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Marcus Boerger <helly@php.net> | + +----------------------------------------------------------------------+ + */ + +#ifndef PHP_MEMORY_STREAM_H +#define PHP_MEMORY_STREAM_H + +#include "php_streams.h" + +PHPAPI php_stream *php_memory_stream_create(); + +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 fdm=marker + * vim<600: sw=4 ts=4 + */ |