]> granicus.if.org Git - php/commitdiff
-added memory streams
authorMarcus Boerger <helly@php.net>
Sat, 16 Mar 2002 20:11:06 +0000 (20:11 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 16 Mar 2002 20:11:06 +0000 (20:11 +0000)
@added memory streams (marcus)

main/Makefile.in
main/memory_streams.c [new file with mode: 0644]
main/php.h
main/php_memory_streams.h [new file with mode: 0644]

index b59aa1333b748d42bb58d18d0d0569757297a266..e17a14cef9b6257629edfa0a364f479dd7281a95 100644 (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
 
diff --git a/main/memory_streams.c b/main/memory_streams.c
new file mode 100644 (file)
index 0000000..8a0a21e
--- /dev/null
@@ -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
+ */
index d0804923d6dfc594ea641790bde627d62120247f..e086ee4ed5c656a13e67d59dc68c6d9f5cc54eee 100644 (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
diff --git a/main/php_memory_streams.h b/main/php_memory_streams.h
new file mode 100644 (file)
index 0000000..0041433
--- /dev/null
@@ -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
+ */