source: trunk/third/glib2/tests/iochannel-test.c @ 18159

Revision 18159, 3.2 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18158, which included commits to RCS files with non-trunk default branches.
Line 
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
14gint 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    gboolean block;
25    const gchar encoding[] = "EUC-JP";
26    GIOStatus status;
27    GIOFlags flags;
28
29    if (!srcdir)
30      srcdir = ".";
31    filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
32 
33    setbuf(stdout, NULL); /* For debugging */
34
35    gio_r = g_io_channel_new_file (filename, "r", &gerr);
36    if (gerr)
37      {
38        g_warning("Unable to open file %s: %s", filename, gerr->message);
39        g_error_free(gerr);
40        return 1;
41      }
42    gio_w = g_io_channel_new_file( "iochannel-test-outfile", "w", &gerr);
43    if (gerr)
44      {
45        g_warning("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
46        g_error_free(gerr);
47        return 1;
48      }
49
50    g_io_channel_set_encoding (gio_r, encoding, &gerr);
51    if (gerr)
52      {
53        g_warning(gerr->message);
54        g_error_free(gerr);
55        return 1;
56      }
57   
58    g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
59
60    status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
61    if (status == G_IO_STATUS_ERROR)
62      {
63        g_warning(gerr->message);
64        g_error_free(gerr);
65        gerr = NULL;
66      }
67    flags = g_io_channel_get_flags (gio_r);
68    block = ! (flags & G_IO_FLAG_NONBLOCK);
69    if (block)
70        g_print (" BLOCKING TRUE \n\n");
71    else
72        g_print (" BLOCKING FALSE \n\n");
73
74    buffer = g_string_sized_new (BUFFER_SIZE);
75
76    while (TRUE)
77    {
78        do
79          status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
80        while (status == G_IO_STATUS_AGAIN);
81        if (status != G_IO_STATUS_NORMAL)
82          break;
83
84        rlength += buffer->len;
85
86        do
87          status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
88            &length_out, &gerr);
89        while (status == G_IO_STATUS_AGAIN);
90        if (status != G_IO_STATUS_NORMAL)
91          break;
92
93        wlength += length_out;
94
95        if (length_out < buffer->len)
96          g_warning ("Only wrote part of the line.");
97
98        g_print ("%s", buffer->str);
99        g_string_truncate (buffer, 0);
100    }
101
102    switch (status)
103      {
104        case G_IO_STATUS_EOF:
105          break;
106        case G_IO_STATUS_ERROR:
107          g_warning (gerr->message);
108          g_error_free (gerr);
109          gerr = NULL;
110          break;
111        default:
112          g_warning ("Abnormal exit from write loop.");
113          break;
114      }
115
116    do
117      status = g_io_channel_flush (gio_w, &gerr);
118    while (status == G_IO_STATUS_AGAIN);
119
120    if (status == G_IO_STATUS_ERROR)
121      {
122        g_warning(gerr->message);
123        g_error_free(gerr);
124        gerr = NULL;
125      }
126
127    g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
128
129    g_io_channel_unref(gio_r);
130    g_io_channel_unref(gio_w);
131   
132    return 0;
133}
Note: See TracBrowser for help on using the repository browser.