This is an automated email from the git hooks/post-receive script.

plessy pushed a commit to branch debian/unstable
in repository libgtextutils.

commit 1bec9f5fa813e4ec4c9b10bf37ba8db762287e50
Author: A. Gordon <[email protected]>
Date:   Wed Mar 25 21:24:02 2009 -0400

    Added File-Descriptor-Based Output Stream class.
---
 src/gtextutils/Makefile.am |   6 +-
 src/gtextutils/outbuf3.hpp | 150 +++++++++++++++++++++++++++++++++++++++++++++
 tests/Makefile.am          |   4 +-
 tests/test_fd_outbuf.cpp   |  89 +++++++++++++++++++++++++++
 4 files changed, 246 insertions(+), 3 deletions(-)

diff --git a/src/gtextutils/Makefile.am b/src/gtextutils/Makefile.am
index c7ac53b..034ead1 100644
--- a/src/gtextutils/Makefile.am
+++ b/src/gtextutils/Makefile.am
@@ -15,7 +15,8 @@ libgtextutils_0_2_a_SOURCES = stream_wrapper.cpp 
stream_wrapper.h \
                          text_line_reader.cpp text_line_reader.h \
                          container_join.h \
                          natsort.h \
-                         strnatcmp.c strnatcmp.h
+                         strnatcmp.c strnatcmp.h \
+                         outbuf3.hpp
 
 libgtextutils_0_2_a_includedir = $(includedir)/gtextutils-0.2/gtextutils
 
@@ -23,4 +24,5 @@ libgtextutils_0_2_a_include_HEADERS = container_join.h \
                  text_line_reader.h \
                  stream_wrapper.h \
                  natsort.h \
-                 strnatcmp.h 
+                 strnatcmp.h \
+                 outbuf3.hpp
diff --git a/src/gtextutils/outbuf3.hpp b/src/gtextutils/outbuf3.hpp
new file mode 100644
index 0000000..f0eea83
--- /dev/null
+++ b/src/gtextutils/outbuf3.hpp
@@ -0,0 +1,150 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon ([email protected])
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Affero General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>
+*/
+
+#ifndef __JOSUTTIS_FD_OUTBUF_H__
+#define __JOSUTTIS_FD_OUTBUF_H__
+
+/*
+ * The following code example is taken from the book
+ * "The C++ Standard Library - A Tutorial and Reference"
+ * by Nicolai M. Josuttis, Addison-Wesley, 1999
+ *
+ * (C) Copyright Nicolai M. Josuttis 1999.
+ * Permission to copy, use, modify, sell and distribute this software
+ * is granted provided this copyright notice appears in all copies.
+ * This software is provided "as is" without express or implied
+ * warranty, and with no claim as to its suitability for any purpose.
+ *
+ * Added by A. Gordon:
+ *  The file is available as "io/outbuf3.hpp" in the examples tarball at
+ *    http://www.josuttis.com/libbook/
+ *
+ *  And in the book at Chapter 13, Page 673.
+ *
+ * Modifications:
+ *    1. Larger buffer, with vector<char> 
+ *    2. Accepts output file descriptor in c'tor
+ */
+#include <cstdio>
+#include <streambuf>
+#include <vector>
+
+// for write():
+#ifdef _MSC_VER
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+class josuttis_fd_outbuf : public std::streambuf {
+  protected:
+    static const int bufferSize = 32768;   // size of data buffer
+
+    /*
+     * Note: The vector is used simply because it will manage the memory 
+     * resource for us. The buffer is used as a regular C buffer. 
+     * see "Effective STL" By Scott Meyer, Page 77,
+     * Item 17: "Know how to pass vector and string to legacy API"
+    */
+    std::vector<char> buffer_vector ;
+    char* buffer ;
+    int output_fd ;
+
+  public:
+    /* constructor
+     * - initialize data buffer
+     * - one character less to let the bufferSizeth character
+     *    cause a call of overflow()
+     */
+    josuttis_fd_outbuf ( int _output_fd ) :
+       buffer_vector(bufferSize),
+       buffer ( &buffer_vector[0] ),
+       output_fd ( _output_fd )
+    {
+        setp (buffer, buffer+(bufferSize-1));
+    }
+
+    /* destructor
+     * - flush data buffer
+     */
+    virtual ~josuttis_fd_outbuf () {
+        sync();
+    }
+
+  protected:
+    // flush the characters in the buffer
+    int flushBuffer () {
+        int num = pptr()-pbase();
+        if (write (output_fd, buffer, num) != num) {
+            return EOF;
+        }
+        pbump (-num);    // reset put pointer accordingly
+        return num;
+    }
+
+    /* buffer full
+     * - write c and all previous characters
+     */
+    virtual int_type overflow (int_type c) {
+        if (c != EOF) {
+            // insert character into the buffer
+            *pptr() = c;
+            pbump(1);
+        }
+        // flush the buffer
+        if (flushBuffer() == EOF) {
+            // ERROR
+            return EOF;
+        }
+        return c;
+    }
+
+    /* synchronize data with file/destination
+     * - flush the data in the buffer
+     */
+    virtual int sync () {
+        if (flushBuffer() == EOF) {
+            // ERROR
+            return -1;
+        }
+        return 0;
+    }
+};
+
+
+/*
+ * An output stream that uses the above outbuf
+ *
+ * Based on code example from page 673 (class fdostream)
+ */
+
+class josuttis_fdostream : public std::ostream 
+{
+private:
+       josuttis_fd_outbuf buf ;
+public:
+       josuttis_fdostream ( int fd ) :
+               std::ostream(0),
+               buf(fd)
+       {
+               rdbuf(&buf) ;
+       }
+};
+
+
+#endif
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7e31520..dd19959 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -16,7 +16,8 @@ check_PROGRAMS = test_container_join \
                 test_natural_sort \
                 test_input_stream_wrapper \
                 test_text_reader \
-                test_text_reader_unget
+                test_text_reader_unget \
+                test_fd_outbuf
 
 TESTS = $(check_PROGRAMS)
 
@@ -28,4 +29,5 @@ test_natural_sort_SOURCES = test_natural_sort.cpp
 test_input_stream_wrapper_SOURCES = test_input_stream_wrapper.cpp
 test_text_reader_SOURCES = test_text_reader.cpp
 test_text_reader_unget_SOURCES = test_text_reader_unget.cpp
+test_fd_outbuf_SOURCES = test_fd_outbuf.cpp
 
diff --git a/tests/test_fd_outbuf.cpp b/tests/test_fd_outbuf.cpp
new file mode 100644
index 0000000..853ed55
--- /dev/null
+++ b/tests/test_fd_outbuf.cpp
@@ -0,0 +1,89 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon ([email protected])
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Affero General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>
+*/
+#include <vector>
+#include <map>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <err.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+#include <gtextutils/outbuf3.hpp>
+#include "tests_assertion.h"
+
+/*
+ * Test for File-Descriptor-based output buffer.
+ */
+
+using namespace std;
+
+const char* filename = "fdout.tmp" ;
+
+void create_file()
+{
+       //Create a File (using C API),
+       //then connect an output stream to it
+       int fd = open("fdout.tmp", O_CREAT | O_WRONLY | O_TRUNC, 
S_IRUSR|S_IWUSR ) ;
+       if ( fd == -1 )
+               perror("Failed to create file 'fdout.tmp'");
+
+       josuttis_fdostream out2(fd);
+       out2 << "first line" << endl ;
+       out2 << "second line" << endl ;
+       out2 << "third line" << endl;
+
+       close(fd);
+}
+
+void verify_file()
+{
+       //To verify - use only STL classes,
+       //no home made libgtextutils classes.
+       ifstream ifs(filename);
+       string s;
+       ifs >> s ;
+       ASSERT ( s == "first" ) ;
+       ifs >> s ;
+       ASSERT ( s == "line" ) ;
+       ifs >> s ;
+       ASSERT ( s == "second" ) ;
+       ifs >> s ;
+       ASSERT ( s == "line" ) ;
+       ifs >> s ;
+       ASSERT ( s == "third" ) ;
+       ifs >> s ;
+       ASSERT ( s == "line" ) ;
+}
+
+int main()
+{
+       //Use file-descriptor 1 = STDOUT
+       josuttis_fdostream out1(1);
+       out1 << "Hello World from File-Descriptor Output Stream 
(josuttifs_fdostream)!" << endl;
+
+       create_file();
+
+       verify_file();
+
+       unlink(filename);
+}

-- 
Alioth's /git/debian-med/git-commit-notice on 
/srv/git.debian.org/git/debian-med/libgtextutils.git

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to