Find test case for srcdir != builddir, miscellaneous cleanups.
[platform/upstream/glib.git] / tests / iochannel-test.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <glib.h>
5 #include <string.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #define BUFFER_SIZE 1024
10
11 gint main (gint argc, gchar * argv[])
12 {
13     GIOChannel *gio_r, *gio_w ;
14     GError *gerr = NULL;
15     GString *buffer;
16     char *filename;
17     char *srcdir = getenv ("srcdir");
18     gint rlength = 0, wlength = 0, length_out, line_term_len;
19     gboolean block;
20     const gchar encoding[] = "EUC-JP", line_term[] = "\n";
21     GIOStatus status;
22     GIOFlags flags;
23
24     if (!srcdir)
25       srcdir = ".";
26     filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
27   
28     setbuf(stdout, NULL); /* For debugging */
29
30     gio_r = g_io_channel_new_file (filename, "r", &gerr);
31     if (gerr)
32       {
33         g_warning("Unable to open file %s: %s", filename, gerr->message);
34         g_error_free(gerr);
35         return 1;
36       }
37     gio_w = g_io_channel_new_file( "iochannel-test-outfile", "w", &gerr);
38     if (gerr)
39       {
40         g_warning("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
41         g_error_free(gerr);
42         return 1;
43       }
44
45     g_io_channel_set_encoding (gio_r, encoding, &gerr);
46     if (gerr)
47       {
48         g_warning(gerr->message);
49         g_error_free(gerr);
50         return 1;
51       }
52     
53     g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
54
55     status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
56     if (status == G_IO_STATUS_ERROR)
57       {
58         g_warning(gerr->message);
59         g_error_free(gerr);
60         gerr = NULL;
61       }
62     flags = g_io_channel_get_flags (gio_r);
63     block = ! (flags & G_IO_FLAG_NONBLOCK);
64     if (block)
65         g_print (" BLOCKING TRUE \n\n");
66     else
67         g_print (" BLOCKING FALSE \n\n");
68
69     line_term_len = strlen (line_term);
70     buffer = g_string_sized_new (BUFFER_SIZE);
71
72     while (TRUE)
73     {
74         do
75           status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
76         while (status == G_IO_STATUS_AGAIN);
77         if (status != G_IO_STATUS_NORMAL)
78           break;
79
80         rlength += buffer->len;
81
82         do
83           status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
84             &length_out, &gerr);
85         while (status == G_IO_STATUS_AGAIN);
86         if (status != G_IO_STATUS_NORMAL)
87           break;
88
89         wlength += length_out;
90
91         if (length_out < buffer->len)
92           g_warning ("Only wrote part of the line.");
93
94         g_print ("%s", buffer->str);
95         g_string_truncate (buffer, 0);
96     }
97
98     switch (status)
99       {
100         case G_IO_STATUS_EOF:
101           break;
102         case G_IO_STATUS_ERROR:
103           g_warning (gerr->message);
104           g_error_free (gerr);
105           gerr = NULL;
106           break;
107         default:
108           g_warning ("Abnormal exit from write loop.");
109           break;
110       }
111
112     do
113       status = g_io_channel_flush (gio_w, &gerr);
114     while (status == G_IO_STATUS_AGAIN);
115
116     if (status == G_IO_STATUS_ERROR)
117       {
118         g_warning(gerr->message);
119         g_error_free(gerr);
120         gerr = NULL;
121       }
122
123     g_print ("read %d bytes, wrote %d bytes\n", rlength, wlength);
124
125     g_io_channel_unref(gio_r);
126     g_io_channel_unref(gio_w);
127     
128     return 0;
129 }