slice-color test: don't use non-existent macro
[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 static void
15 test_small_writes (void)
16 {
17   GIOChannel *io;
18   GIOStatus status;
19   guint cnt; 
20   gchar tmp;
21   GError *error = NULL;
22
23   io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
24   if (error)
25     {
26       g_warning ("Unable to open file %s: %s", 
27                  "iochannel-test-outfile", 
28                  error->message);
29       g_error_free (error);
30       
31       exit (1);
32     }
33
34   g_io_channel_set_encoding (io, NULL, NULL);
35   g_io_channel_set_buffer_size (io, 1022);
36
37   cnt = 2 * g_io_channel_get_buffer_size (io);
38   tmp = 0;
39  
40   while (cnt)
41     {
42       status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
43       if (status == G_IO_STATUS_ERROR)
44         break;
45       if (status == G_IO_STATUS_NORMAL)
46         cnt--;
47     }
48
49   g_assert (status == G_IO_STATUS_NORMAL);
50
51   g_io_channel_unref (io);
52 }
53
54
55 gint main (gint argc, gchar * argv[])
56 {
57     GIOChannel *gio_r, *gio_w ;
58     GError *gerr = NULL;
59     GString *buffer;
60     char *filename;
61     char *srcdir = getenv ("srcdir");
62     gint rlength = 0;
63     glong wlength = 0;
64     gsize length_out;
65     const gchar encoding[] = "EUC-JP";
66     GIOStatus status;
67
68     if (!srcdir)
69       srcdir = ".";
70     filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
71   
72     setbuf (stdout, NULL); /* For debugging */
73
74     gio_r = g_io_channel_new_file (filename, "r", &gerr);
75     if (gerr)
76       {
77         g_warning ("Unable to open file %s: %s", filename, gerr->message);
78         g_error_free (gerr);
79         return 1;
80       }
81     gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr);
82     if (gerr)
83       {
84         g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
85         g_error_free (gerr);
86         return 1;
87       }
88
89     g_io_channel_set_encoding (gio_r, encoding, &gerr);
90     if (gerr)
91       {
92         g_warning ("%s", gerr->message);
93         /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */
94         if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION)
95           return 1;
96         g_error_free (gerr);
97         gerr = NULL;
98       }
99     
100     g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
101
102     status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
103     if (status == G_IO_STATUS_ERROR)
104       {
105         g_warning ("%s", gerr->message);
106         g_error_free (gerr);
107         gerr = NULL;
108       }
109     buffer = g_string_sized_new (BUFFER_SIZE);
110
111     while (TRUE)
112     {
113         do
114           status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
115         while (status == G_IO_STATUS_AGAIN);
116         if (status != G_IO_STATUS_NORMAL)
117           break;
118
119         rlength += buffer->len;
120
121         do
122           status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
123             &length_out, &gerr);
124         while (status == G_IO_STATUS_AGAIN);
125         if (status != G_IO_STATUS_NORMAL)
126           break;
127
128         wlength += length_out;
129
130         if (length_out < buffer->len)
131           g_warning ("Only wrote part of the line.");
132
133 #ifdef VERBOSE
134         g_print ("%s", buffer->str);
135 #endif
136         g_string_truncate (buffer, 0);
137     }
138
139     switch (status)
140       {
141         case G_IO_STATUS_EOF:
142           break;
143         case G_IO_STATUS_ERROR:
144           g_warning ("%s", gerr->message);
145           g_error_free (gerr);
146           gerr = NULL;
147           break;
148         default:
149           g_warning ("Abnormal exit from write loop.");
150           break;
151       }
152
153     do
154       status = g_io_channel_flush (gio_w, &gerr);
155     while (status == G_IO_STATUS_AGAIN);
156
157     if (status == G_IO_STATUS_ERROR)
158       {
159         g_warning ("%s", gerr->message);
160         g_error_free (gerr);
161         gerr = NULL;
162       }
163
164 #ifdef VERBOSE
165     g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
166 #endif
167
168     g_io_channel_unref(gio_r);
169     g_io_channel_unref(gio_w);
170
171     test_small_writes ();
172     
173     return 0;
174 }