Change -EOF for EOF (it is worth -1), fix assertion
[babeltrace.git] / formats / ctf / types / string.c
index 578388d15936065a242d3a4e0b30e6be09072c2d..197a7e135f276825ae9e29f85a70b20636755c13 100644 (file)
@@ -3,33 +3,84 @@
  *
  * Strings read/write functions.
  *
- * Copyright (c) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
  *
- * 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  */
 
-#include <ctf/ctf-types.h>
+#include <babeltrace/babeltrace.h>
+#include <babeltrace/ctf/types.h>
+#include <limits.h>            /* C99 limits */
 #include <string.h>
 
-size_t string_copy(char *dest, const char *src)
+int ctf_string_read(struct stream_pos *ppos, struct definition *definition)
 {
-       size_t len = strlen(src) + 1;
+       struct definition_string *string_definition =
+               container_of(definition, struct definition_string, p);
+       const struct declaration_string *string_declaration =
+               string_definition->declaration;
+       struct ctf_stream_pos *pos = ctf_pos(ppos);
+       size_t len;
+       ssize_t max_len;
+       char *srcaddr;
+
+       ctf_align_pos(pos, string_declaration->p.alignment);
+
+       srcaddr = ctf_get_pos_addr(pos);
+       if (pos->offset == EOF)
+               return -EFAULT;
+       /* Not counting \0 */
+       max_len = pos->packet_size - pos->offset - 1;
+       if (max_len < 0)
+               return -EFAULT;
+       len = strnlen(srcaddr, max_len) + 1;    /* Add \0 */
+       /* Truncated string, unexpected. Trace probably corrupted. */
+       if (srcaddr[len - 1] != '\0')
+               return -EFAULT;
+
+       if (string_definition->alloc_len < len) {
+               string_definition->value =
+                       g_realloc(string_definition->value, len);
+               string_definition->alloc_len = len;
+       }
+       printf_debug("CTF string read %s\n", srcaddr);
+       memcpy(string_definition->value, srcaddr, len);
+       string_definition->len = len;
+       ctf_move_pos(pos, len * CHAR_BIT);
+       return 0;
+}
+
+int ctf_string_write(struct stream_pos *ppos,
+                     struct definition *definition)
+{
+       struct definition_string *string_definition =
+               container_of(definition, struct definition_string, p);
+       const struct declaration_string *string_declaration =
+               string_definition->declaration;
+       struct ctf_stream_pos *pos = ctf_pos(ppos);
+       size_t len;
+       char *destaddr;
+
+       ctf_align_pos(pos, string_declaration->p.alignment);
+       assert(string_definition->value != NULL);
+       len = string_definition->len;
+
+       if (!ctf_pos_access_ok(pos, len))
+               return -EFAULT;
 
-       if (!dest)
+       if (pos->dummy)
                goto end;
-       strcpy(dest, src);
+       destaddr = ctf_get_pos_addr(pos);
+       memcpy(destaddr, string_definition->value, len);
 end:
-       return len * 8;
+       ctf_move_pos(pos, len * CHAR_BIT);
+       return 0;
 }
This page took 0.025458 seconds and 4 git commands to generate.