-added memory streams

@added memory streams (marcus)
This commit is contained in:
Marcus Boerger 2002-03-16 20:11:06 +00:00
parent bfe7a9acaf
commit 8c3535e15a
4 changed files with 227 additions and 2 deletions

View file

@ -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

189
main/memory_streams.c Normal file
View file

@ -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
*/

View file

@ -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

35
main/php_memory_streams.h Normal file
View file

@ -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
*/