diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2013-07-14 20:40:58 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2013-07-18 00:16:43 +0200 |
commit | 15f62b7054c12bff2899ac6bd73147b6bfc818fe (patch) | |
tree | 9316baf417aa91c5973f30c86897570defbc571f /src/utils.c | |
parent | c2e870937298a8a58b5a94ab24e419c3230a6ba6 (diff) | |
download | tdv-15f62b7054c12bff2899ac6bd73147b6bfc818fe.tar.gz tdv-15f62b7054c12bff2899ac6bd73147b6bfc818fe.tar.xz tdv-15f62b7054c12bff2899ac6bd73147b6bfc818fe.zip |
Add a class to handle dictzip files
Provides pseudo-random access to dictionary files compressed using dictzip.
It doesn't implement a cache, it just loads missing chunks until it has the
whole file. I'm not sure if discarding not recently used chunks is really
a useful feature. If there _was_ a way to get noticed when system memory
is low, I think the best way to handle that event would be to simply release
it all.
All in all, this is pretty useless. But it was interesting to write.
This has yet to be integrated into the application proper.
Diffstat (limited to 'src/utils.c')
-rw-r--r-- | src/utils.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..8636778 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,63 @@ +/* + * utils.c: miscellaneous utilities + * + * Copyright (c) 2013, Přemysl Janouch <p.janouch@gmail.com> + * All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include <glib.h> +#include <gio/gio.h> + +#include "utils.h" + + +/** Read the whole stream into a byte array. */ +gboolean +stream_read_all (GByteArray *ba, GInputStream *is, GError **error) +{ + guint8 buffer[1024 * 64]; + gsize bytes_read; + + while (g_input_stream_read_all (is, buffer, sizeof buffer, + &bytes_read, NULL, error)) + { + g_byte_array_append (ba, buffer, bytes_read); + if (bytes_read < sizeof buffer) + return TRUE; + } + return FALSE; +} + +/** Read a null-terminated string from a data input stream. */ +gchar * +stream_read_string (GDataInputStream *dis, GError **error) +{ + gsize length; + gchar *s = g_data_input_stream_read_upto (dis, "", 1, &length, NULL, error); + if (!s) + return NULL; + + GError *err = NULL; + g_data_input_stream_read_byte (dis, NULL, &err); + if (err) + { + g_free (s); + g_propagate_error (error, err); + return NULL; + } + + return s; +} |