Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/text.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/text.h')
-rw-r--r--src/text.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/text.h b/src/text.h
new file mode 100644
index 0000000..0261848
--- /dev/null
+++ b/src/text.h
@@ -0,0 +1,107 @@
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef TEXT_H
+#define TEXT_H
+
+#include <string.h>
+
+typedef struct
+{
+ goffset offset;
+ gsize frame_len;
+ gsize len;
+ gchar *body;
+} Text;
+
+inline Text*
+string_new(const gchar *src)
+{
+ if (!src)
+ return NULL;
+
+ gsize len = strlen(src);
+
+ Text *out = (Text*)g_malloc(sizeof(Text) + len + 1);
+ gchar *body = (gchar*)out + sizeof(Text);
+
+ out->offset = 0;
+ out->frame_len = len;
+ out->len = len;
+ out->body = body;
+
+ memcpy(body, src, len + 1);
+
+ GST_DEBUG("[%p] len=%ld", out, len);
+
+ return out;
+}
+
+inline void
+string_chunk(Text *src, Text *dst, gsize len)
+{
+ memcpy(dst, src, sizeof(Text));
+
+ gsize dst_len = MIN(len, src->frame_len);
+ gchar *dst_last = dst->body + dst->offset + dst_len;
+ gchar *i;
+
+ if (dst_len < src->frame_len)
+ for (i = dst_last; dst_len; --dst_len, --i)
+ if (g_ascii_isspace(*i))
+ break;
+
+ if (dst_len)
+ dst->frame_len = dst_len;
+ else
+ {
+ dst_last = g_utf8_prev_char(dst_last + 1);
+ dst->frame_len = dst_last - (dst->body + dst->offset);
+ }
+
+ src->offset += dst->frame_len;
+ src->frame_len -= dst->frame_len;
+
+ GST_DEBUG("[%p] len=%ld dst_len=%ld dst_last=%ld", src, len, dst_len,
+ dst_last-dst->body);
+}
+
+inline gboolean
+string_nil(Text *str)
+{
+ return str->frame_len == 0;
+}
+
+inline void
+string_unref(Text *str)
+{
+ if (string_nil(str))
+ return;
+
+ gpointer data = NULL;
+
+ if (str->offset + str->frame_len >= str->len)
+ data = str->body - sizeof(Text);
+
+ memset(str, 0, sizeof(Text));
+
+ GST_DEBUG("[%p]", data);
+
+ g_free(data);
+}
+
+#endif