pollita         Mon Jan  6 00:22:06 2003 EDT

  Modified files:              
    /php4/ext/standard  filters.c 
  Log:
  Added string.toupper and string.tolower filters and generalized non-op filter methods
  
  
Index: php4/ext/standard/filters.c
diff -u php4/ext/standard/filters.c:1.3 php4/ext/standard/filters.c:1.4
--- php4/ext/standard/filters.c:1.3     Wed Jan  1 07:36:06 2003
+++ php4/ext/standard/filters.c Mon Jan  6 00:22:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: filters.c,v 1.3 2003/01/01 12:36:06 sebastian Exp $ */
+/* $Id: filters.c,v 1.4 2003/01/06 05:22:06 pollita Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -25,6 +25,18 @@
 #include "ext/standard/file.h"
 #include "ext/standard/php_string.h"
 
+/* {{{ common "no-opperation" methods */
+static int commonfilter_nop_flush(php_stream *stream, php_stream_filter *thisfilter, 
+int closing TSRMLS_DC)
+{
+       return php_stream_filter_flush_next(stream, thisfilter, closing);
+}
+
+static int commonfilter_nop_eof(php_stream *stream, php_stream_filter *thisfilter 
+TSRMLS_DC)
+{
+       return php_stream_filter_eof_next(stream, thisfilter);
+}
+/* }}} */
+
 /* {{{ rot13 stream filter implementation */
 static char rot13_from[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
 static char rot13_to[] = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM";
@@ -63,21 +75,11 @@
        return read;
 }
 
-static int strfilter_rot13_flush(php_stream *stream, php_stream_filter *thisfilter, 
int closing TSRMLS_DC)
-{
-       return php_stream_filter_flush_next(stream, thisfilter, closing);
-}
-
-static int strfilter_rot13_eof(php_stream *stream, php_stream_filter *thisfilter 
TSRMLS_DC)
-{
-       return php_stream_filter_eof_next(stream, thisfilter);
-}
-
 static php_stream_filter_ops strfilter_rot13_ops = {
        strfilter_rot13_write,
        strfilter_rot13_read,
-       strfilter_rot13_flush,
-       strfilter_rot13_eof,
+       commonfilter_nop_flush,
+       commonfilter_nop_eof,
        NULL,
        "string.rot13"
 };
@@ -93,11 +95,124 @@
 };
 /* }}} */
 
+/* {{{ string.toupper / string.tolower stream filter implementation */
+static char lowercase[] = "abcdefghijklmnopqrstuvwxyz";
+static char uppercase[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+static size_t strfilter_toupper_write(php_stream *stream, php_stream_filter 
+*thisfilter,
+                       const char *buf, size_t count TSRMLS_DC)
+{
+       char tmpbuf[1024];
+       size_t chunk;
+       size_t wrote = 0;
+
+       while (count > 0) {
+               chunk = count;
+               if (chunk > sizeof(tmpbuf))
+                       chunk = sizeof(tmpbuf);
+
+               PHP_STRLCPY(tmpbuf, buf, sizeof(tmpbuf), chunk);
+               buf += chunk;
+               count -= chunk;
+
+               php_strtr(tmpbuf, chunk, lowercase, uppercase, 26);
+               wrote += php_stream_filter_write_next(stream, thisfilter, tmpbuf, 
+chunk);
+       }
+
+       return wrote;
+}
+
+static size_t strfilter_tolower_write(php_stream *stream, php_stream_filter 
+*thisfilter,
+                       const char *buf, size_t count TSRMLS_DC)
+{
+       char tmpbuf[1024];
+       size_t chunk;
+       size_t wrote = 0;
+
+       while (count > 0) {
+               chunk = count;
+               if (chunk > sizeof(tmpbuf))
+                       chunk = sizeof(tmpbuf);
+
+               PHP_STRLCPY(tmpbuf, buf, sizeof(tmpbuf), chunk);
+               buf += chunk;
+               count -= chunk;
+
+               php_strtr(tmpbuf, chunk, uppercase, lowercase, 26);
+               wrote += php_stream_filter_write_next(stream, thisfilter, tmpbuf, 
+chunk);
+       }
+
+       return wrote;
+}
+
+static size_t strfilter_toupper_read(php_stream *stream, php_stream_filter 
+*thisfilter,
+                       char *buf, size_t count TSRMLS_DC)
+{
+       size_t read;
+
+       read = php_stream_filter_read_next(stream, thisfilter, buf, count);
+       php_strtr(buf, read, lowercase, uppercase, 26);
+
+       return read;
+}
+
+static size_t strfilter_tolower_read(php_stream *stream, php_stream_filter 
+*thisfilter,
+                       char *buf, size_t count TSRMLS_DC)
+{
+       size_t read;
+
+       read = php_stream_filter_read_next(stream, thisfilter, buf, count);
+       php_strtr(buf, read, uppercase, lowercase, 26);
+
+       return read;
+}
+
+static php_stream_filter_ops strfilter_toupper_ops = {
+       strfilter_toupper_write,
+       strfilter_toupper_read,
+       commonfilter_nop_flush,
+       commonfilter_nop_eof,
+       NULL,
+       "string.toupper"
+};
+
+static php_stream_filter_ops strfilter_tolower_ops = {
+       strfilter_tolower_write,
+       strfilter_tolower_read,
+       commonfilter_nop_flush,
+       commonfilter_nop_eof,
+       NULL,
+       "string.tolower"
+};
+
+static php_stream_filter *strfilter_toupper_create(const char *filtername, const char 
+*filterparams,
+               int filterparamslen, int persistent TSRMLS_DC)
+{
+       return php_stream_filter_alloc(&strfilter_toupper_ops, NULL, persistent);
+}
+
+static php_stream_filter *strfilter_tolower_create(const char *filtername, const char 
+*filterparams,
+               int filterparamslen, int persistent TSRMLS_DC)
+{
+       return php_stream_filter_alloc(&strfilter_tolower_ops, NULL, persistent);
+}
+
+static php_stream_filter_factory strfilter_toupper_factory = {
+       strfilter_toupper_create
+};
+
+static php_stream_filter_factory strfilter_tolower_factory = {
+       strfilter_tolower_create
+};
+/* }}} */
+
 static const struct {
        php_stream_filter_ops *ops;
        php_stream_filter_factory *factory;
 } standard_filters[] = {
        { &strfilter_rot13_ops, &strfilter_rot13_factory },
+       { &strfilter_toupper_ops, &strfilter_toupper_factory },
+       { &strfilter_tolower_ops, &strfilter_tolower_factory },
        /* additional filters to go here */
        { NULL, NULL }
 };



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to