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