diff options
author | sandmann <sandmann> | 2007-01-13 23:24:07 +0000 |
---|---|---|
committer | sandmann <sandmann> | 2007-01-13 23:24:07 +0000 |
commit | 56ac8c38d5c6e4b63c97b5fcc568c300b76e1c8c (patch) | |
tree | a716988d4f62ac19aa5378656429b1a8a68d0c6d | |
parent | 7dddf7c049f8b0b5c89113d47f60e69ba9ed847a (diff) |
Some lacbytequeue API fixes
-rw-r--r-- | src/lac.h | 40 | ||||
-rw-r--r-- | src/lacaddress.c | 2 | ||||
-rw-r--r-- | src/lacbytequeue.c | 129 | ||||
-rw-r--r-- | src/lacconnection.c | 9 |
4 files changed, 105 insertions, 75 deletions
@@ -186,24 +186,28 @@ gchar * lac_gethostname (void); /* LacByteQueue */ typedef struct LacByteQueue LacByteQueue; -LacByteQueue *lac_byte_queue_new (void); -guint8 *lac_byte_queue_free (LacByteQueue *queue, - gboolean free_data); -gsize lac_byte_queue_get_length (LacByteQueue *queue); -const guint8 *lac_byte_queue_get_data (LacByteQueue *queue, - gsize *n_bytes); -void lac_byte_queue_put_back (LacByteQueue *queue, - const guint8 *bytes, - gsize n_bytes); -void lac_byte_queue_append (LacByteQueue *queue, - const guint8 *bytes, - gsize n_bytes); -guint8 *lac_byte_queue_alloc_tail (LacByteQueue *queue, - gsize size); -void lac_byte_queue_delete_tail (LacByteQueue *queue, - gsize size); -void lac_byte_queue_steal_data (LacByteQueue *dest, - LacByteQueue *src); +LacByteQueue *lac_byte_queue_new (void); +guint8 *lac_byte_queue_free (LacByteQueue *queue, + gboolean free_data); +gsize lac_byte_queue_get_length (LacByteQueue *queue); +const guint8 *lac_byte_queue_peek_data (LacByteQueue *queue, + gsize *n_bytes); +guint8 *lac_byte_queue_steal_data (LacByteQueue *queue, + gsize *n_bytes); +guint8 *lac_byte_queue_alloc_tail (LacByteQueue *queue, + gsize size); +void lac_byte_queue_append (LacByteQueue *queue, + const guint8 *bytes, + gsize n_bytes); +void lac_byte_queue_append_printf (LacByteQueue *queue, + const gchar *fmt, + ...); +void lac_byte_queue_transfer_data (LacByteQueue *dest, + LacByteQueue *src); +void lac_byte_queue_delete_head (LacByteQueue *queue, + gsize size); +void lac_byte_queue_delete_tail (LacByteQueue *queue, + gsize size); /* TLS */ diff --git a/src/lacaddress.c b/src/lacaddress.c index 0dba5ea..ca5c52b 100644 --- a/src/lacaddress.c +++ b/src/lacaddress.c @@ -514,7 +514,7 @@ lac_address_new_from_a_b_c_d (gchar a, gchar d) { LacAddress *addr = lac_address_allocate (); - gchar *addr_bytes = (guchar *)&(addr->in_address.s_addr); + guchar *addr_bytes = (guchar *)&(addr->in_address.s_addr); addr_bytes[0] = a; addr_bytes[1] = b; diff --git a/src/lacbytequeue.c b/src/lacbytequeue.c index e2cb53a..cac4d3e 100644 --- a/src/lacbytequeue.c +++ b/src/lacbytequeue.c @@ -1,4 +1,6 @@ +#include <stdarg.h> #include <string.h> +#include <glib/gprintf.h> #include "lac.h" struct LacByteQueue @@ -48,9 +50,7 @@ lac_byte_queue_free (LacByteQueue *queue, } else { - memmove (queue->segment, queue->start, queue->end - queue->start); - - result = queue->segment; + result = lac_byte_queue_steal_data (queue, NULL); } g_free (queue); @@ -59,39 +59,27 @@ lac_byte_queue_free (LacByteQueue *queue, } /* The data returned is owned by the byte queue and becomes invalid - * as soon as any method is called on the queue. It is explicitly - * allowed to push the returned data back into the queue, and indeed - * in that case the queue will avoid copying if it can. The push - * must be the first method called on the queue after the read. + * as soon as any method is called on the queue. */ const guint8 * -lac_byte_queue_get_data (LacByteQueue *queue, - gsize *n_bytes) +lac_byte_queue_peek_data (LacByteQueue *queue, + gsize *n_bytes) { - const guint8 *result; - if (n_bytes) *n_bytes = queue->end - queue->start; - - result = queue->start; - - queue->start = queue->segment; - queue->end = queue->segment; - - if (!result) - result = (guint8 *)""; /* the result of this function is guaranteed - * to be NULL terminated - */ - - return result; -} -static gboolean -in_segment (LacByteQueue *queue, - const guint8 *bytes, - gsize n_bytes) -{ - return bytes >= queue->segment && bytes + n_bytes < queue->end; + if (queue->start) + { + return queue->start; + } + else + { + /* The result of this function is guaranteed + * to be NULL terminated, so if the queue is + * empty, just return an empty string; + */ + return (guint8 *)""; + } } static gboolean @@ -183,11 +171,21 @@ lac_byte_queue_alloc_tail (LacByteQueue *queue, } void +lac_byte_queue_delete_head (LacByteQueue *queue, + gsize size) +{ + if (queue->end - queue->start < size) + queue->start = queue->end = queue->segment; + else + queue->start += size; +} + +void lac_byte_queue_delete_tail (LacByteQueue *queue, gsize size) { if (queue->end - queue->start < size) - queue->end = queue->start; + queue->start = queue->end = queue->segment; else queue->end -= size; @@ -199,27 +197,57 @@ lac_byte_queue_append (LacByteQueue *queue, const guint8 *bytes, gsize n_bytes) { - if (in_segment (queue, bytes, n_bytes) && is_empty (queue)) - { - queue->start = (guint8 *)bytes; - queue->end = (guint8 *)bytes + n_bytes; - } - else - { - guint8 *tail = lac_byte_queue_alloc_tail (queue, n_bytes); - - memcpy (tail, bytes, n_bytes); - } + guint8 *tail = lac_byte_queue_alloc_tail (queue, n_bytes); + + memcpy (tail, bytes, n_bytes); +} - null_terminate (queue); +void +lac_byte_queue_append_printf (LacByteQueue *queue, + const gchar *fmt, + ...) +{ + gint required; + va_list args; + guint8 *buffer; + + g_return_if_fail (fmt != NULL); + + va_start (args, fmt); + + required = g_vsnprintf (NULL, 0, fmt, args) + 1; + + buffer = lac_byte_queue_alloc_tail (queue, required); + + g_vsprintf ((gchar *)buffer, fmt, args); + + va_end (args); +} + +guint8 * +lac_byte_queue_steal_data (LacByteQueue *queue, + gsize *n_bytes) +{ + guint8 *result; + + if (n_bytes) + *n_bytes = queue->end - queue->start; + + memmove (queue->segment, queue->start, queue->end - queue->start); + + result = queue->segment; + + initialize (queue); + + return result; } /* Transfer data from @src to @dest, if possible without copying. * The data is appended to @dest's data if @dest is not empty */ void -lac_byte_queue_steal_data (LacByteQueue *dest, - LacByteQueue *src) +lac_byte_queue_transfer_data (LacByteQueue *dest, + LacByteQueue *src) { if (is_empty (dest)) { @@ -235,10 +263,11 @@ lac_byte_queue_steal_data (LacByteQueue *dest, } else { - const guint8 *data; - gsize size; - - data = lac_byte_queue_get_data (src, &size); - lac_byte_queue_append (dest, data, size); + lac_byte_queue_append (dest, src->start, src->end - src->start); + + if (src->segment) + g_free (src->segment); + + initialize (src); } } diff --git a/src/lacconnection.c b/src/lacconnection.c index db095c9..cc8df99 100644 --- a/src/lacconnection.c +++ b/src/lacconnection.c @@ -262,17 +262,12 @@ lac_connection_do_writes (LacConnection *connection) const guint8 *unwritten; gsize len, sent; - unwritten = lac_byte_queue_get_data (connection->unwritten, &len); + unwritten = lac_byte_queue_peek_data (connection->unwritten, &len); sent = socket_send (connection->socket, unwritten, len, &err); - lac_byte_queue_append ( - connection->unwritten, unwritten, err? len : len - sent); - if (err) { - lac_byte_queue_append (connection->unwritten, unwritten, len); - if (g_error_matches ( err, LAC_SOCKET_ERROR, LAC_SOCKET_ERROR_AGAIN)) { @@ -288,6 +283,8 @@ lac_connection_do_writes (LacConnection *connection) return; } + lac_byte_queue_delete_head (connection->unwritten, sent); + /* FIXME check that we haven't used too much time? */ } |