[med-svn] [libgtextutils] 36/83: Preparing for release 0.3 (mainly configure fixes)

Charles Plessy plessy at moszumanska.debian.org
Wed Jan 8 13:37:27 UTC 2014


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

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

commit 98a9cdf1314413b266d003627c4667d5f913bfae
Author: A. Gordon <gordon at cshl.edu>
Date:   Sun May 3 03:04:32 2009 -0400

    Preparing for release 0.3 (mainly configure fixes)
---
 Makefile.am                                  |   2 +-
 configure.ac                                 |  16 ++-
 gtextutils-0.2.pc.in => gtextutils-0.3.pc.in |   0
 src/gtextutils/Makefile.am                   |   8 +-
 src/gtextutils/inbuf1.hpp                    | 145 +++++++++++++++++++++++++++
 src/gtextutils/pipe_fitter.c                 | 122 ++++++++++++++++++++++
 src/gtextutils/pipe_fitter.h                 |  37 +++++++
 tests/Makefile.am                            |  32 +++---
 tests/test.txt                               |   4 +
 tests/test_fd_inbuf.cpp                      |  72 +++++++++++++
 tests/test_in_out_buf.cpp                    |  92 +++++++++++++++++
 tests/test_pipe_fitter.c                     |  74 ++++++++++++++
 tests/test_tuple_parser_file.cpp             | 100 ++++++++++++++++++
 tests/tests_assertion.h                      |  13 +++
 14 files changed, 698 insertions(+), 19 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 6e40be1..6b05503 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,4 +12,4 @@ EXTRA_DIST = reconf configure
 SUBDIRS = m4 src doc tests
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = gtextutils-0.2.pc
+pkgconfig_DATA = gtextutils-0.3.pc
diff --git a/configure.ac b/configure.ac
index d0ad004..67803bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,7 +9,7 @@
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 AC_INIT([Gordon-Text_utils-Library],
-        [0.2],
+        [0.3],
         [A. Gordon gordon at cshl.edu],
         [libgtextutils])
 AC_CONFIG_AUX_DIR(config)
@@ -60,6 +60,18 @@ else
 fi
 
 
+dnl --enable-tuple-parser-check
+AC_ARG_ENABLE(tuple-parser-check,
+[  --enable-tuple-parser-check	Enable Tuple Parser Check (default disabled, requires g++ > 4.3.2)],
+[case "${enableval}" in
+  yes) tuple_parser_check=true ;;
+  no)  tuple_parser_check=false ;;
+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-tuple-parser-check) ;;
+esac],[tuple_parser_check=false])
+AM_CONDITIONAL([TUPLE_PARSER_CHECK], [test x$tuple_parser_check = xtrue])
+
+
+
 AC_CONFIG_FILES([
    Makefile
    README
@@ -67,7 +79,7 @@ AC_CONFIG_FILES([
    m4/Makefile
    src/Makefile
    src/gtextutils/Makefile
-   gtextutils-0.2.pc
+   gtextutils-0.3.pc
    tests/Makefile
 ])
 
diff --git a/gtextutils-0.2.pc.in b/gtextutils-0.3.pc.in
similarity index 100%
rename from gtextutils-0.2.pc.in
rename to gtextutils-0.3.pc.in
diff --git a/src/gtextutils/Makefile.am b/src/gtextutils/Makefile.am
index 049d88d..f2e674d 100644
--- a/src/gtextutils/Makefile.am
+++ b/src/gtextutils/Makefile.am
@@ -9,9 +9,9 @@
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
-lib_LIBRARIES = libgtextutils-0.2.a
+lib_LIBRARIES = libgtextutils-0.3.a
 
-libgtextutils_0_2_a_SOURCES = stream_wrapper.cpp stream_wrapper.h \
+libgtextutils_0_3_a_SOURCES = stream_wrapper.cpp stream_wrapper.h \
 		          text_line_reader.cpp text_line_reader.h \
 			  container_join.h \
 			  natsort.h \
@@ -21,9 +21,9 @@ libgtextutils_0_2_a_SOURCES = stream_wrapper.cpp stream_wrapper.h \
 			  inbuf1.hpp \
 			  pipe_fitter.c pipe_fitter.h
 
-libgtextutils_0_2_a_includedir = $(includedir)/gtextutils-0.2/gtextutils
+libgtextutils_0_3_a_includedir = $(includedir)/gtextutils-$(VERSION)/gtextutils
 
-libgtextutils_0_2_a_include_HEADERS = container_join.h \
+libgtextutils_0_3_a_include_HEADERS = container_join.h \
 		  text_line_reader.h \
 		  stream_wrapper.h \
 		  natsort.h \
diff --git a/src/gtextutils/inbuf1.hpp b/src/gtextutils/inbuf1.hpp
new file mode 100644
index 0000000..5122b95
--- /dev/null
+++ b/src/gtextutils/inbuf1.hpp
@@ -0,0 +1,145 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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_INBUF_H__
+#define __JOSUTTIS_FD_INBUF_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/inbuf1.hpp" in the examples tarball at
+ *    http://www.josuttis.com/libbook/
+ *
+ *  And in the book at Chapter 13, Page 678.
+ *
+ * Modifications:
+ *    1. Larger buffer, with vector<char> 
+ *    2. Accepts input file descriptor in c'tor
+ */
+
+#include <cstdio>
+#include <cstring>
+#include <streambuf>
+#include <vector>
+
+// for read():
+#ifdef _MSC_VER
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+class josuttis_fd_inbuf : public std::streambuf {
+  protected:
+    /* data buffer:
+     * - at most, four characters in putback area plus
+     * - at most, six characters in ordinary read buffer
+     */
+    static const int putBackSize = 4 ;
+    static const int bufferSize = putBackSize + 32768;    // size of the data buffer
+    std::vector<char> buffer_vector ;
+    char* buffer;
+    int input_fd;
+
+  public:
+    /* constructor
+     * - initialize empty data buffer
+     * - no putback area
+     * => force underflow()
+     */
+    josuttis_fd_inbuf( int _input_fd ) :
+	buffer_vector(bufferSize),
+	buffer(&buffer_vector[0]),
+	input_fd(_input_fd)
+    {
+        setg (buffer+putBackSize,     // beginning of putback area
+              buffer+putBackSize,     // read position
+              buffer+putBackSize);    // end position
+    }
+  protected:
+    // insert new characters into the buffer
+    virtual int_type underflow () {
+
+        // is read position before end of buffer?
+        if (gptr() < egptr()) {
+            return traits_type::to_int_type(*gptr());
+        }
+
+        /* process size of putback area
+         * - use number of characters read
+         * - but at most four
+         */
+        int numPutback;
+        numPutback = gptr() - eback();
+        if (numPutback > putBackSize) {
+            numPutback = putBackSize;
+        }
+
+        /* copy up to four characters previously read into
+         * the putback buffer (area of first four characters)
+         */
+        std::memmove (buffer+(putBackSize-numPutback), gptr()-numPutback,
+                      numPutback);
+
+        // read new characters
+        int num;
+        num = read (input_fd, buffer+putBackSize, bufferSize-putBackSize);
+        if (num <= 0) {
+            // ERROR or EOF
+            return EOF;
+        }
+
+        // reset buffer pointers
+        setg (buffer+(putBackSize-numPutback),   // beginning of putback area
+              buffer+putBackSize,                // read position
+              buffer+putBackSize+num);           // end of buffer
+
+        // return next character
+        return traits_type::to_int_type(*gptr());
+    }
+};
+
+/*
+ * An output stream that uses the above inbuf 
+ *
+ * Based on code example from page 673 (class fdostream)
+ */
+
+class josuttis_fdistream : public std::istream 
+{
+private:
+	josuttis_fd_inbuf buf ;
+public:
+	josuttis_fdistream ( int fd ) :
+		std::istream(0),
+		buf(fd)
+	{
+		rdbuf(&buf) ;
+	}
+};
+
+
+#endif
diff --git a/src/gtextutils/pipe_fitter.c b/src/gtextutils/pipe_fitter.c
new file mode 100644
index 0000000..2696e2e
--- /dev/null
+++ b/src/gtextutils/pipe_fitter.c
@@ -0,0 +1,122 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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 <unistd.h>
+#include <err.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+#include "pipe_fitter.h"
+
+int pipe_close ( int fd, pid_t pid ) 
+{
+	int i, status ;
+	pid_t p;
+	int exit_code;
+
+	i = close(fd);
+	if ( fd == -1 ) 
+		err(1,"close(in pipe_close) failed");
+
+	p = waitpid(pid, &status, 0);
+	if (p==-1)
+		err(1,"waitpid(in pipe_close) failed");
+
+	if (!WIFEXITED(status))
+		errx(1,"child process terminated abnormally (in pipe_close), status=%08x", status);
+
+	exit_code = WEXITSTATUS(status);
+	if (exit_code != 0)
+		errx(1,"child process terminated with error code %d (in pipe_close)", exit_code);
+
+	return 0;
+}
+
+static int pipe_open (
+	const char* executable,
+	const char* filename, 
+	int pipe_input,
+	pid_t* /*OUTPUT*/ child_pid )
+{
+	int file_fd=-1;
+	pid_t pid;
+	int parent_pipe[2];
+
+	//Create the pipe descriptoers
+	if (pipe(parent_pipe)!=0)
+		err(1,"pipe (for '%s') failed", executable);
+
+	if (filename != NULL) {
+		file_fd = open(filename, 
+			pipe_input?(O_RDONLY):(O_CREAT|O_WRONLY),
+			0666 ) ;
+
+		//create the file descriptor (input or output, based on function argument)
+		if ( file_fd == -1 )
+			err(1,"failed to %s file '%s'", 
+				pipe_input?"open":"create",
+				filename ) ;
+	}
+		
+	pid = fork();
+
+	if (pid == -1)
+		err(1,"Fork failed for '%s'", executable);
+
+
+	if (pid>0) {
+		/* The parent process */
+		*child_pid = pid;
+		close(file_fd); //the parent process doesn't need the file handle.
+		close(parent_pipe[ pipe_input?1:0 ]); 
+		return (parent_pipe[ pipe_input?0:1 ]); 
+	}
+
+	/* The child process */
+
+	if (pipe_input) {
+		dup2(parent_pipe[1], STDOUT_FILENO);
+		close(parent_pipe[0]); 
+
+		if (file_fd != -1)
+			dup2(file_fd, STDIN_FILENO);
+	} else {
+		dup2(parent_pipe[0], STDIN_FILENO);
+		close(parent_pipe[1]); 
+
+		if (file_fd!=-1)
+			dup2(file_fd, STDOUT_FILENO);
+	}
+
+	execlp(executable,executable,NULL);
+
+	//Should never get here...
+	err(1,"execlp(%s) failed",executable);
+}
+
+int pipe_output_command ( const char* command, const char* output_filename, pid_t* /*OUTPUT*/ child_pid )
+{
+	return pipe_open ( command, output_filename, 0, child_pid ) ;
+}
+
+int pipe_input_command ( const char* command, const char* input_filename, pid_t* /*OUTPUT*/ child_pid )
+{
+	return pipe_open ( command, input_filename, 1, child_pid ) ;
+}
diff --git a/src/gtextutils/pipe_fitter.h b/src/gtextutils/pipe_fitter.h
new file mode 100644
index 0000000..de6575e
--- /dev/null
+++ b/src/gtextutils/pipe_fitter.h
@@ -0,0 +1,37 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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 __PIPE_FITTER_H__
+#define __PIPE_FITTER_H__
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif 
+
+int pipe_output_command ( const char* command, const char* output_filename, pid_t* /*OUTPUT*/ child_pid );
+int pipe_input_command ( const char* command, const char* input_filename, pid_t* /*OUTPUT*/ child_pid );
+
+int pipe_close ( int fd, pid_t pid ) ;
+
+#ifdef __cplusplus
+}
+#endif 
+
+#endif
diff --git a/tests/Makefile.am b/tests/Makefile.am
index efeb0e3..b2dddfd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -9,8 +9,15 @@
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
+EXTRA_DIST = test.txt
 noinst_DATA = test.txt
 
+if TUPLE_PARSER_CHECK
+TUPLE_PROG = test_tuple_parser \
+	     test_tuple_parser_file
+else
+TUPLE_PROG = 
+endif
 
 check_PROGRAMS = test_container_join \
 		 test_natural_sort \
@@ -20,21 +27,22 @@ check_PROGRAMS = test_container_join \
 		 test_fd_outbuf \
 		 test_fd_inbuf \
 		 test_in_out_buf \
-		 test_tuple_parser \
-		 test_pipe_fitter
+		 test_pipe_fitter \
+		 $(TUPLE_PROG)
 
 TESTS = $(check_PROGRAMS)
 
 LDADD = $(top_srcdir)/src/gtextutils/libgtextutils-$(VERSION).a
 INCLUDES = -I$(top_srcdir)/src
 
-test_container_join_SOURCES = test_container_join.cpp
-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
-test_fd_inbuf_SOURCES = test_fd_inbuf.cpp
-test_in_out_buf_SOURCES = test_in_out_buf.cpp
-test_pipe_fitter_SOURCES = test_pipe_fitter.c
-test_tuple_parser_SOURCES = test_tuple_parser.cpp
+test_container_join_SOURCES = test_container_join.cpp tests_assertion.h
+test_natural_sort_SOURCES = test_natural_sort.cpp tests_assertion.h
+test_input_stream_wrapper_SOURCES = test_input_stream_wrapper.cpp tests_assertion.h
+test_text_reader_SOURCES = test_text_reader.cpp tests_assertion.h
+test_text_reader_unget_SOURCES = test_text_reader_unget.cpp tests_assertion.h
+test_fd_outbuf_SOURCES = test_fd_outbuf.cpp tests_assertion.h
+test_fd_inbuf_SOURCES = test_fd_inbuf.cpp tests_assertion.h
+test_in_out_buf_SOURCES = test_in_out_buf.cpp tests_assertion.h
+test_pipe_fitter_SOURCES = test_pipe_fitter.c tests_assertion.h
+test_tuple_parser_SOURCES = test_tuple_parser.cpp tests_assertion.h
+test_tuple_parser_file_SOURCES = test_tuple_parser_file.cpp tests_assertion.h
diff --git a/tests/test.txt b/tests/test.txt
new file mode 100644
index 0000000..7a4a73a
--- /dev/null
+++ b/tests/test.txt
@@ -0,0 +1,4 @@
+first line
+second line
+third line
+fourth line
diff --git a/tests/test_fd_inbuf.cpp b/tests/test_fd_inbuf.cpp
new file mode 100644
index 0000000..e319acc
--- /dev/null
+++ b/tests/test_fd_inbuf.cpp
@@ -0,0 +1,72 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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/inbuf1.hpp>
+#include "tests_assertion.h"
+
+/*
+ * Test for File-Descriptor-based input buffer.
+ */
+
+using namespace std;
+
+const char* filename = "test.txt" ;
+
+int main()
+{
+	//Open a file using C API
+	int fd = open(filename, O_RDONLY);
+	if (fd == -1)
+		perror ("Failed to open test file 'test.txt'");
+
+	//Connect the file-descriptor to an input stream
+	josuttis_fdistream in1(fd);
+	string s;
+
+	//Read and verify the file content
+	in1 >> s ;
+	ASSERT ( s == "first" ) ;
+	in1 >> s ;
+	ASSERT ( s == "line" ) ;
+	in1 >> s ;
+	ASSERT ( s == "second" ) ;
+	in1 >> s ;
+	ASSERT ( s == "line" ) ;
+	in1 >> s ;
+	ASSERT ( s == "third" ) ;
+	in1 >> s ;
+	ASSERT ( s == "line" ) ;
+	in1 >> s ;
+	ASSERT ( s == "fourth" ) ;
+	in1 >> s ;
+	ASSERT ( s == "line" ) ;
+
+	close(fd);
+}
diff --git a/tests/test_in_out_buf.cpp b/tests/test_in_out_buf.cpp
new file mode 100644
index 0000000..37efbb0
--- /dev/null
+++ b/tests/test_in_out_buf.cpp
@@ -0,0 +1,92 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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/inbuf1.hpp>
+#include <gtextutils/outbuf3.hpp>
+#include "tests_assertion.h"
+
+/*
+ * Test for File-Descriptor-based input and output buffers, through a system pipe.
+ */
+
+using namespace std;
+
+int fork_pipe_command ( const char* program, const char* output_filename)
+{
+	int fd;
+	pid_t child_pid;
+	int parent_pipe[2];
+	if (pipe(parent_pipe)!=0)
+		err(1,"pipe (for gzip) failed");
+		
+	child_pid = fork();
+	if (child_pid>0) {
+		/* The parent process */
+		fd = parent_pipe[1];
+		close(parent_pipe[0]);
+		return fd;
+	}
+
+	/* The child process */
+
+	//the compressor's STDIN is the pipe from the parent
+	dup2(parent_pipe[0], STDIN_FILENO);
+	close(parent_pipe[1]);
+
+	//the compressor's STDOUT is the output file
+	//(which can be the parent's STDOUT, too)
+	fd = open(output_filename, O_WRONLY | O_CREAT, 0666 );
+	if (fd==-1)
+		err(1,"Failed to open output '%s'", output_filename);
+	dup2(fd, STDOUT_FILENO);
+	
+	//Run GZIP
+	execlp(program,program,"-f",NULL);
+
+	//Should never get here...
+	err(1,"execlp(%s) failed",program);
+}
+
+void test_compress_output()
+{
+	int pipe_out_fd = fork_pipe_command ( "gzip", "fdout.txt.gz" ) ;
+	josuttis_fdostream out(pipe_out_fd);
+
+	out << "first line" << endl;
+	out << "second line" << endl;
+	out << "third line" << endl;
+
+	close(pipe_out_fd);
+}
+
+int main()
+{
+	test_compress_output();
+}
diff --git a/tests/test_pipe_fitter.c b/tests/test_pipe_fitter.c
new file mode 100644
index 0000000..8076543
--- /dev/null
+++ b/tests/test_pipe_fitter.c
@@ -0,0 +1,74 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   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 <unistd.h>
+#include <err.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gtextutils/pipe_fitter.h>
+#include "tests_assertion.h"
+
+const char* text = "Hello World\n";
+
+int main()
+{
+	int fd;
+	int pid;
+	char temp[1000];
+	char str[1000];
+	int n ;
+
+	//Pipe output through a GZIP program
+	fd = pipe_output_command ( "gzip", "pipe_out.txt.gz", &pid ) ;
+	write ( fd, text, strlen(text))  ;
+	pipe_close(fd, pid);
+
+
+	//Read input through a GUNZIP program
+	fd = pipe_input_command ( "gunzip", "pipe_out.txt.gz", &pid );
+
+	//Read entire input from the pipe.
+	//Note:
+	//   'read' doesn't have to return the entire input in one read - so
+	//   we loop until the end of the file and concatnate the input.
+	strcat(str,"");
+	while (1) {
+		n = read ( fd, temp, sizeof(temp)-1) ;
+		if (n==-1)
+			err(1,"Read from GZIP input pipe failed");
+
+		if (n==0)
+			break; //End-Of-File
+
+		//Ensure proper NULL termination
+		temp[n] = 0 ;
+
+		strncpy ( str, temp, sizeof(str)-1);
+	}
+	pipe_close(fd,pid);
+
+
+	//Validate the input
+	ASSERT ( strcmp(str, text)==0 ) ;
+
+	return 0 ;
+}
diff --git a/tests/test_tuple_parser_file.cpp b/tests/test_tuple_parser_file.cpp
new file mode 100644
index 0000000..9d928ac
--- /dev/null
+++ b/tests/test_tuple_parser_file.cpp
@@ -0,0 +1,100 @@
+#include <err.h>
+#include <getopt.h>
+
+#include <cstdlib>
+#include <cmath>
+#include <limits>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <utility>
+
+#include <tr1/tuple>
+#include <tr1/type_traits>
+
+#include <gtextutils/stream_wrapper.h>
+#include <gtextutils/text_line_reader.h>
+#include <gtextutils/tuple_parser.h>
+#include "tests_assertion.h"
+
+using namespace std;
+using namespace std::tr1;
+
+std::string input_filename = "test.bed";
+size_t	chrom_column = 1 ;
+size_t	start_column = 2 ;
+size_t	end_column = 3 ;
+bool verbose = false ;
+
+void read_and_parse_file()
+{
+	InputStreamWrapper input(input_filename);
+
+	TextLineReader reader ( input.stream() );
+
+	Tuple_Parser<std::string,size_t,size_t> parser( chrom_column,
+		      					start_column,
+							end_column);
+	while ( reader.next_line() ) {
+		reader.line_stream() >> parser ;
+	}
+}
+
+void usage()
+{
+	exit(0);
+}
+
+void parse_command_line(int argc, char* argv[])
+{
+	int opt;
+
+	while ((opt=getopt(argc, argv,"hi:c:s:ev")) != -1) {
+		switch(opt)
+		{
+		case 'h':
+			usage();
+
+		case 'i':
+			input_filename = optarg ;
+			break;
+
+		case 'c':
+			if ( sscanf(optarg, "%zu", &chrom_column ) != 1  )
+				errx(1,"Error: invalid chromosome column (%s)", optarg ) ;
+			if ( chrom_column <= 0 ) 
+				errx(1,"Error: invalid chromosome column (%s)", optarg ) ;
+			break;
+
+		case 's':
+			if ( sscanf(optarg, "%zu", &start_column ) != 1 )
+				errx(1,"Error: invalid start column (%s)", optarg ) ;
+			if ( start_column <= 0 )
+				errx(1,"Error: invalid start column (%s)", optarg ) ;
+			break;
+
+		case 'e':
+			if ( sscanf(optarg, "%zu", &end_column ) != 1 )
+				errx(1,"Error: invalid end column (%s)", optarg ) ;
+			if ( end_column <= 0 )
+				errx(1,"Error: invalid end column (%s)", optarg ) ;
+			break;
+
+		case 'v':
+			verbose=true;
+			break ;
+
+		default:
+			exit(1);
+		}
+	}
+}
+
+int main(int argc, char* argv[])
+{
+	parse_command_line(argc, argv) ;
+
+	read_and_parse_file();
+
+	return 0;
+}
diff --git a/tests/tests_assertion.h b/tests/tests_assertion.h
new file mode 100644
index 0000000..03d4956
--- /dev/null
+++ b/tests/tests_assertion.h
@@ -0,0 +1,13 @@
+#ifndef __UNIT_TESTS_ASSERTION_H__
+#define __UNIT_TESTS_ASSERTION_H__
+
+#define ASSERT(x) \
+	do { \
+		if (!(x)) { \
+			errx(1,"ASSERTION FAILED (%s:%d): "#x, \
+					__FILE__, __LINE__ ) ; \
+		} \
+	} while (0)
+
+
+#endif

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



More information about the debian-med-commit mailing list