net_read orig_read;
gpointer orig_data;
GString *buffer;
+ GString *line;
} pop_t;
+static int
+pop_getline (pop_t *pop)
+{
+ char * end;
+ size_t len;
+ if (pop->buffer->len == 0)
+ return -1;
+ end = memchr (pop->buffer->str, '\n', pop->buffer->len);
+ if (end == NULL)
+ return -1;
+ len = end - pop->buffer->str + 1;
+ g_string_truncate (pop->line, 0);
+ g_string_append_len (pop->line, pop->buffer->str, len);
+ g_string_erase (pop->buffer, 0, len);
+ return 0;
+}
+
static void
pop_read (net_hook_t *hook, gchar *buffer, size_t len)
{
pop_t *pop = hook->data;
+ g_string_append_len (pop->buffer, buffer, len);
hook->data = pop->orig_data;
- pop->orig_read (hook, buffer, len);
+ while (pop_getline (pop) == 0)
+ pop->orig_read (hook, pop->line->str, pop->line->len);
hook->data = pop;
}
pop->orig_read = layer->read;
pop->orig_data = layer->data;
pop->buffer = g_string_sized_new (4096);
+ pop->line = g_string_sized_new (4096);
layer->read = pop_read;
layer->data = pop;
return layer;
{
pop_t *pop = hook->data;
g_string_free (pop->buffer, TRUE);
+ g_string_free (pop->line, TRUE);
hook->read = pop->orig_read;
hook->data = pop->orig_data;
g_slice_free (net_hook_t, (gpointer) pop);