1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* dbus-message-builder.c Build messages from text files for testing (internal to D-BUS implementation)
4 * Copyright (C) 2003 Red Hat, Inc.
6 * Licensed under the Academic Free License version 1.2
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #ifdef DBUS_BUILD_TESTS
27 #include "dbus-message-builder.h"
28 #include "dbus-hash.h"
29 #include "dbus-internals.h"
30 #include "dbus-marshal.h"
33 * @defgroup DBusMessageBuilder code for loading test message data
34 * @ingroup DBusInternals
35 * @brief code for loading up test data for unit tests
37 * The code in here is used for unit testing, it loads
38 * up message data from a description in a file.
46 int start; /**< Calculate length since here */
47 int length; /**< length to write */
48 int offset; /**< where to write it into the data */
49 int endian; /**< endianness to write with */
53 free_saved_length (void *data)
55 SavedLength *sl = data;
58 return; /* all hash free functions have to accept NULL */
60 _dbus_string_free (&sl->name);
65 ensure_saved_length (DBusHashTable *hash,
66 const DBusString *name)
71 s = _dbus_string_get_const_data (name);
73 sl = _dbus_hash_table_lookup_string (hash, s);
77 sl = dbus_new0 (SavedLength, 1);
79 if (!_dbus_string_init (&sl->name))
85 if (!_dbus_string_copy (name, 0, &sl->name, 0))
88 s = _dbus_string_get_const_data (&sl->name);
90 if (!_dbus_hash_table_insert_string (hash, (char*)s, sl))
101 free_saved_length (sl);
106 save_start (DBusHashTable *hash,
107 const DBusString *name,
112 sl = ensure_saved_length (hash, name);
116 else if (sl->start >= 0)
118 _dbus_warn ("Same START_LENGTH given twice\n");
128 save_length (DBusHashTable *hash,
129 const DBusString *name,
134 sl = ensure_saved_length (hash, name);
138 else if (sl->length >= 0)
140 _dbus_warn ("Same END_LENGTH given twice\n");
150 save_offset (DBusHashTable *hash,
151 const DBusString *name,
157 sl = ensure_saved_length (hash, name);
161 else if (sl->offset >= 0)
163 _dbus_warn ("Same LENGTH given twice\n");
175 /** Saves the segment to delete in order to unalign the next item */
176 #define SAVE_FOR_UNALIGN(str, boundary) \
177 int align_pad_start = _dbus_string_get_length (str); \
178 int align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, (boundary))
180 /** Deletes the alignment padding */
181 #define PERFORM_UNALIGN(str) \
184 _dbus_string_delete ((str), align_pad_start, \
185 align_pad_end - align_pad_start); \
191 append_quoted_string (DBusString *dest,
192 const DBusString *quoted,
196 dbus_bool_t in_quotes = FALSE;
199 /* FIXME: We might want to add escaping in case we want to put '
200 * characters in our strings.
204 while (i < _dbus_string_get_length (quoted))
208 b = _dbus_string_get_byte (quoted, i);
216 if (!_dbus_string_append_byte (dest, b))
224 else if (b == ' ' || b == '\n' || b == '\t')
225 break; /* end on whitespace if not quoted */
228 if (!_dbus_string_append_byte (dest, b))
239 if (!_dbus_string_append_byte (dest, '\0'))
245 append_saved_length (DBusString *dest,
246 DBusHashTable *length_hash,
247 const DBusString *name,
251 if (!save_offset (length_hash, name,
254 _dbus_warn ("failed to save offset to LENGTH\n");
258 if (!_dbus_marshal_uint32 (dest, endian,
261 _dbus_warn ("failed to append a length\n");
269 * Reads the given filename, which should be in "message description
270 * language" (look at some examples), and builds up the message data
271 * from it. The message data may be invalid, or valid.
273 * The parser isn't very strict, it's just a hack for test programs.
275 * The file format is:
277 * VALID_HEADER normal header; byte order, padding, header len, body len, serial
278 * BIG_ENDIAN switch to big endian
279 * LITTLE_ENDIAN switch to little endian
280 * OPPOSITE_ENDIAN switch to opposite endian
281 * ALIGN <N> aligns to the given value
282 * UNALIGN skips alignment for the next marshal
283 * BYTE <N> inserts the given integer in [0,255] or char in 'a' format
284 * START_LENGTH <name> marks the start of a length to measure
285 * END_LENGTH <name> records the length since START_LENGTH under the given name
286 * (or if no START_LENGTH, absolute length)
287 * LENGTH <name> inserts the saved length of the same name
288 * CHOP <N> chops last N bytes off the data
289 * FIELD_NAME <abcd> inserts 4-byte field name
290 * TYPE <typename> inserts a typecode byte
293 * Following commands insert aligned data unless
294 * preceded by "UNALIGN":
296 * INT32 <N> marshals an INT32
297 * UINT32 <N> marshals a UINT32
298 * DOUBLE <N> marshals a double
299 * STRING 'Foo' marshals a string
300 * BYTE_ARRAY { 'a', 3, 4, 5, 6} marshals a BYTE array
301 * BOOLEAN_ARRAY { false, true, false} marshals a BOOLEAN array
302 * INT32_ARRAY { 3, 4, 5, 6} marshals an INT32 array
303 * UINT32_ARRAY { 3, 4, 5, 6} marshals an UINT32 array
304 * DOUBLE_ARRAY { 1.0, 2.0, 3.0, 4.0} marshals a DOUBLE array
305 * STRING_ARRAY { "foo", "bar", "gazonk"} marshals a STRING array
308 * @todo add support for array types INT32_ARRAY { 3, 4, 5, 6 }
311 * @param dest the string to append the message data to
312 * @param filename the filename to load
313 * @returns #TRUE on success
316 _dbus_message_data_load (DBusString *dest,
317 const DBusString *filename)
325 DBusHashTable *length_hash;
332 if (!_dbus_string_init (&file))
335 if (!_dbus_string_init (&line))
337 _dbus_string_free (&file);
341 _dbus_verbose ("Loading %s\n", _dbus_string_get_const_data (filename));
343 dbus_error_init (&error);
344 if (!_dbus_file_get_contents (&file, filename, &error))
346 _dbus_warn ("Getting contents of %s failed: %s\n",
347 _dbus_string_get_const_data (filename), error.message);
348 dbus_error_free (&error);
352 length_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
355 if (length_hash == NULL)
358 endian = DBUS_COMPILER_BYTE_ORDER;
362 while (_dbus_string_pop_line (&file, &line))
364 dbus_bool_t just_set_unalign;
366 just_set_unalign = FALSE;
369 _dbus_string_delete_leading_blanks (&line);
371 if (_dbus_string_get_length (&line) == 0)
376 else if (_dbus_string_starts_with_c_str (&line,
379 /* Ignore this comment */
382 else if (_dbus_string_starts_with_c_str (&line,
388 if (!_dbus_string_append_byte (dest, endian))
390 _dbus_warn ("could not append endianness\n");
397 if (!_dbus_string_append_byte (dest, '\0'))
399 _dbus_warn ("could not append nul pad\n");
405 _dbus_string_init_const (&name, "Header");
406 if (!append_saved_length (dest, length_hash,
407 &name, _dbus_string_get_length (dest),
411 _dbus_string_init_const (&name, "Body");
412 if (!append_saved_length (dest, length_hash,
413 &name, _dbus_string_get_length (dest),
418 if (!_dbus_marshal_int32 (dest, endian, 1))
420 _dbus_warn ("couldn't append client serial\n");
424 else if (_dbus_string_starts_with_c_str (&line,
427 endian = DBUS_BIG_ENDIAN;
429 else if (_dbus_string_starts_with_c_str (&line,
432 endian = DBUS_LITTLE_ENDIAN;
434 else if (_dbus_string_starts_with_c_str (&line,
437 if (endian == DBUS_BIG_ENDIAN)
438 endian = DBUS_LITTLE_ENDIAN;
440 endian = DBUS_BIG_ENDIAN;
442 else if (_dbus_string_starts_with_c_str (&line,
449 _dbus_string_delete_first_word (&line);
451 if (!_dbus_string_parse_int (&line, 0, &val, &end))
453 _dbus_warn ("Failed to parse integer\n");
459 _dbus_warn ("Aligning to %ld boundary is crack\n",
464 orig_len = _dbus_string_get_length (dest);
466 if (!_dbus_string_align_length (dest, val))
469 if (_dbus_string_parse_int (&line, end, &val, NULL))
471 /* If there's an optional second int argument,
472 * fill in align padding with that value
474 if (val < 0 || val > 255)
476 _dbus_warn ("can't fill align padding with %ld, must be a byte value\n", val);
481 while (end < _dbus_string_get_length (dest))
483 _dbus_string_set_byte (dest, end, val);
488 else if (_dbus_string_starts_with_c_str (&line, "UNALIGN"))
491 just_set_unalign = TRUE;
493 else if (_dbus_string_starts_with_c_str (&line, "CHOP"))
497 /* FIXME if you CHOP the offset for a LENGTH
498 * command, we segfault.
501 _dbus_string_delete_first_word (&line);
503 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
505 _dbus_warn ("Failed to parse integer to chop\n");
509 if (val > _dbus_string_get_length (dest))
511 _dbus_warn ("Trying to chop %ld bytes but we only have %d\n",
513 _dbus_string_get_length (dest));
517 _dbus_string_shorten (dest, val);
519 else if (_dbus_string_starts_with_c_str (&line,
522 _dbus_string_delete_first_word (&line);
524 if (!save_start (length_hash, &line,
525 _dbus_string_get_length (dest)))
527 _dbus_warn ("failed to save length start\n");
531 else if (_dbus_string_starts_with_c_str (&line,
534 _dbus_string_delete_first_word (&line);
536 if (!save_length (length_hash, &line,
537 _dbus_string_get_length (dest)))
539 _dbus_warn ("failed to save length end\n");
543 else if (_dbus_string_starts_with_c_str (&line,
546 SAVE_FOR_UNALIGN (dest, 4);
548 _dbus_string_delete_first_word (&line);
550 if (!append_saved_length (dest, length_hash,
552 unalign ? align_pad_start : align_pad_end,
555 _dbus_warn ("failed to add LENGTH\n");
559 PERFORM_UNALIGN (dest);
561 else if (_dbus_string_starts_with_c_str (&line,
564 _dbus_string_delete_first_word (&line);
566 if (_dbus_string_get_length (&line) != 4)
568 _dbus_warn ("Field name must be four characters not \"%s\"\n",
569 _dbus_string_get_const_data (&line));
576 _dbus_string_align_length (dest, 4);
578 if (!_dbus_string_copy (&line, 0, dest,
579 _dbus_string_get_length (dest)))
582 else if (_dbus_string_starts_with_c_str (&line,
587 _dbus_string_delete_first_word (&line);
589 if (_dbus_string_starts_with_c_str (&line, "INVALID"))
590 code = DBUS_TYPE_INVALID;
591 else if (_dbus_string_starts_with_c_str (&line, "NIL"))
592 code = DBUS_TYPE_NIL;
593 else if (_dbus_string_starts_with_c_str (&line, "BYTE"))
594 code = DBUS_TYPE_BYTE;
595 else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN"))
596 code = DBUS_TYPE_BOOLEAN;
597 else if (_dbus_string_starts_with_c_str (&line, "INT32"))
598 code = DBUS_TYPE_INT32;
599 else if (_dbus_string_starts_with_c_str (&line, "UINT32"))
600 code = DBUS_TYPE_UINT32;
601 else if (_dbus_string_starts_with_c_str (&line, "DOUBLE"))
602 code = DBUS_TYPE_DOUBLE;
603 else if (_dbus_string_starts_with_c_str (&line, "STRING"))
604 code = DBUS_TYPE_STRING;
605 else if (_dbus_string_starts_with_c_str (&line, "NAMED"))
606 code = DBUS_TYPE_NAMED;
607 else if (_dbus_string_starts_with_c_str (&line, "ARRAY"))
608 code = DBUS_TYPE_ARRAY;
609 else if (_dbus_string_starts_with_c_str (&line, "DICT"))
610 code = DBUS_TYPE_DICT;
613 _dbus_warn ("%s is not a valid type name\n", _dbus_string_get_const_data (&line));
617 if (!_dbus_string_append_byte (dest, code))
619 _dbus_warn ("could not append typecode byte\n");
623 else if (_dbus_string_starts_with_c_str (&line,
626 SAVE_FOR_UNALIGN (dest, 4);
627 int i, len, allocated;
628 unsigned char *values;
633 values = dbus_new (unsigned char, allocated);
636 _dbus_warn ("could not allocate memory for BYTE_ARRAY\n");
642 _dbus_string_delete_first_word (&line);
643 _dbus_string_skip_blank (&line, 0, &i);
644 b = _dbus_string_get_byte (&line, i++);
649 while (i < _dbus_string_get_length (&line))
651 _dbus_string_skip_blank (&line, i, &i);
653 if (_dbus_string_get_byte (&line, i) == '\'' &&
654 _dbus_string_get_length (&line) >= i + 4 &&
655 _dbus_string_get_byte (&line, i + 1) == '\\' &&
656 _dbus_string_get_byte (&line, i + 2) == '\'' &&
657 _dbus_string_get_byte (&line, i + 3) == '\'')
662 else if (_dbus_string_get_byte (&line, i) == '\'' &&
663 _dbus_string_get_length (&line) >= i + 3 &&
664 _dbus_string_get_byte (&line, i + 2) == '\'')
666 val = _dbus_string_get_byte (&line, i + 1);
671 if (!_dbus_string_parse_int (&line, i, &val, &i))
673 _dbus_warn ("Failed to parse integer for BYTE_ARRAY\n");
677 if (val < 0 || val > 255)
679 _dbus_warn ("A byte must be in range 0-255 not %ld\n",
686 if (len == allocated)
689 values = dbus_realloc (values, allocated * sizeof (unsigned char));
692 _dbus_warn ("could not allocate memory for BYTE_ARRAY\n");
697 _dbus_string_skip_blank (&line, i, &i);
699 b = _dbus_string_get_byte (&line, i++);
707 if (!_dbus_marshal_int32 (dest, endian, len) ||
708 !_dbus_string_append_len (dest, values, len))
710 _dbus_warn ("failed to append BYTE_ARRAY\n");
715 PERFORM_UNALIGN (dest);
717 else if (_dbus_string_starts_with_c_str (&line,
720 SAVE_FOR_UNALIGN (dest, 4);
721 int i, len, allocated;
722 unsigned char *values;
723 unsigned char b, val;
726 values = dbus_new (unsigned char, allocated);
729 _dbus_warn ("could not allocate memory for BOOLEAN_ARRAY\n");
735 _dbus_string_delete_first_word (&line);
736 _dbus_string_skip_blank (&line, 0, &i);
737 b = _dbus_string_get_byte (&line, i++);
742 while (i < _dbus_string_get_length (&line))
744 _dbus_string_skip_blank (&line, i, &i);
746 if (_dbus_string_find_to (&line, i, i + 5,
752 else if (_dbus_string_find_to (&line, i, i + 4,
760 _dbus_warn ("could not parse BOOLEAN_ARRAY\n");
765 if (len == allocated)
768 values = dbus_realloc (values, allocated * sizeof (unsigned char));
771 _dbus_warn ("could not allocate memory for BOOLEAN_ARRAY\n");
776 _dbus_string_skip_blank (&line, i, &i);
778 b = _dbus_string_get_byte (&line, i++);
786 if (!_dbus_marshal_int32 (dest, endian, len) ||
787 !_dbus_string_append_len (dest, values, len))
789 _dbus_warn ("failed to append BOOLEAN_ARRAY\n");
794 PERFORM_UNALIGN (dest);
796 else if (_dbus_string_starts_with_c_str (&line,
799 SAVE_FOR_UNALIGN (dest, 4);
800 int i, len, allocated;
801 dbus_int32_t *values;
806 values = dbus_new (dbus_int32_t, allocated);
809 _dbus_warn ("could not allocate memory for INT32_ARRAY\n");
815 _dbus_string_delete_first_word (&line);
816 _dbus_string_skip_blank (&line, 0, &i);
817 b = _dbus_string_get_byte (&line, i++);
822 while (i < _dbus_string_get_length (&line))
824 _dbus_string_skip_blank (&line, i, &i);
826 if (!_dbus_string_parse_int (&line, i, &val, &i))
828 _dbus_warn ("could not parse integer for INT32_ARRAY\n");
833 if (len == allocated)
836 values = dbus_realloc (values, allocated * sizeof (dbus_int32_t));
839 _dbus_warn ("could not allocate memory for INT32_ARRAY\n");
844 _dbus_string_skip_blank (&line, i, &i);
846 b = _dbus_string_get_byte (&line, i++);
854 if (!_dbus_marshal_int32_array (dest, endian, values, len))
856 _dbus_warn ("failed to append INT32_ARRAY\n");
861 PERFORM_UNALIGN (dest);
863 else if (_dbus_string_starts_with_c_str (&line,
866 SAVE_FOR_UNALIGN (dest, 4);
867 int i, len, allocated;
868 dbus_uint32_t *values;
873 values = dbus_new (dbus_uint32_t, allocated);
876 _dbus_warn ("could not allocate memory for UINT32_ARRAY\n");
882 _dbus_string_delete_first_word (&line);
883 _dbus_string_skip_blank (&line, 0, &i);
884 b = _dbus_string_get_byte (&line, i++);
889 while (i < _dbus_string_get_length (&line))
891 _dbus_string_skip_blank (&line, i, &i);
893 if (!_dbus_string_parse_int (&line, i, &val, &i))
895 _dbus_warn ("could not parse integer for UINT32_ARRAY\n");
900 if (len == allocated)
903 values = dbus_realloc (values, allocated * sizeof (dbus_uint32_t));
906 _dbus_warn ("could not allocate memory for UINT32_ARRAY\n");
911 _dbus_string_skip_blank (&line, i, &i);
913 b = _dbus_string_get_byte (&line, i++);
921 if (!_dbus_marshal_uint32_array (dest, endian, values, len))
923 _dbus_warn ("failed to append UINT32_ARRAY\n");
928 PERFORM_UNALIGN (dest);
930 else if (_dbus_string_starts_with_c_str (&line,
933 SAVE_FOR_UNALIGN (dest, 8);
934 int i, len, allocated;
940 values = dbus_new (double, allocated);
943 _dbus_warn ("could not allocate memory for DOUBLE_ARRAY\n");
949 _dbus_string_delete_first_word (&line);
950 _dbus_string_skip_blank (&line, 0, &i);
951 b = _dbus_string_get_byte (&line, i++);
956 while (i < _dbus_string_get_length (&line))
958 _dbus_string_skip_blank (&line, i, &i);
960 if (!_dbus_string_parse_double (&line, i, &val, &i))
962 _dbus_warn ("could not parse double for DOUBLE_ARRAY\n");
967 if (len == allocated)
970 values = dbus_realloc (values, allocated * sizeof (double));
973 _dbus_warn ("could not allocate memory for DOUBLE_ARRAY\n");
978 _dbus_string_skip_blank (&line, i, &i);
980 b = _dbus_string_get_byte (&line, i++);
988 if (!_dbus_marshal_double_array (dest, endian, values, len))
990 _dbus_warn ("failed to append DOUBLE_ARRAY\n");
995 PERFORM_UNALIGN (dest);
997 else if (_dbus_string_starts_with_c_str (&line,
1000 SAVE_FOR_UNALIGN (dest, 4);
1001 int i, len, allocated;
1008 values = dbus_new (char *, allocated);
1011 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
1017 _dbus_string_delete_first_word (&line);
1018 _dbus_string_skip_blank (&line, 0, &i);
1019 b = _dbus_string_get_byte (&line, i++);
1024 _dbus_string_init (&val_str);
1025 while (i < _dbus_string_get_length (&line))
1027 _dbus_string_skip_blank (&line, i, &i);
1029 if (!append_quoted_string (&val_str, &line, i, &i))
1031 _dbus_warn ("could not parse quoted string for STRING_ARRAY\n");
1036 if (!_dbus_string_steal_data (&val_str, &val))
1038 _dbus_warn ("could not allocate memory for STRING_ARRAY string\n");
1042 values[len++] = val;
1043 if (len == allocated)
1046 values = dbus_realloc (values, allocated * sizeof (char *));
1049 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
1054 _dbus_string_skip_blank (&line, i, &i);
1056 b = _dbus_string_get_byte (&line, i++);
1062 _dbus_warn ("missing comma when parsing STRING_ARRAY\n");
1066 _dbus_string_free (&val_str);
1068 if (!_dbus_marshal_string_array (dest, endian, (const char **)values, len))
1070 _dbus_warn ("failed to append STRING_ARRAY\n");
1075 dbus_free_string_array (values);
1077 PERFORM_UNALIGN (dest);
1079 else if (_dbus_string_starts_with_c_str (&line, "BYTE"))
1081 unsigned char the_byte;
1083 _dbus_string_delete_first_word (&line);
1085 if (_dbus_string_equal_c_str (&line, "'\\''"))
1087 else if (_dbus_string_get_byte (&line, 0) == '\'' &&
1088 _dbus_string_get_length (&line) >= 3 &&
1089 _dbus_string_get_byte (&line, 2) == '\'')
1090 the_byte = _dbus_string_get_byte (&line, 1);
1094 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
1096 _dbus_warn ("Failed to parse integer for BYTE\n");
1102 _dbus_warn ("A byte must be in range 0-255 not %ld\n",
1106 the_byte = (unsigned char) val;
1109 _dbus_string_append_byte (dest, the_byte);
1111 else if (_dbus_string_starts_with_c_str (&line,
1116 _dbus_string_delete_first_word (&line);
1118 if (_dbus_string_starts_with_c_str (&line, "true"))
1120 else if (_dbus_string_starts_with_c_str (&line, "false"))
1124 _dbus_warn ("could not parse BOOLEAN\n");
1127 if (!_dbus_string_append_byte (dest, val))
1129 _dbus_warn ("failed to append BOOLEAN\n");
1134 else if (_dbus_string_starts_with_c_str (&line,
1137 SAVE_FOR_UNALIGN (dest, 4);
1140 _dbus_string_delete_first_word (&line);
1142 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
1144 _dbus_warn ("could not parse integer for INT32\n");
1148 if (!_dbus_marshal_int32 (dest, endian,
1151 _dbus_warn ("failed to append INT32\n");
1155 PERFORM_UNALIGN (dest);
1157 else if (_dbus_string_starts_with_c_str (&line,
1160 SAVE_FOR_UNALIGN (dest, 4);
1163 _dbus_string_delete_first_word (&line);
1165 /* FIXME should have _dbus_string_parse_uint32 */
1166 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
1169 if (!_dbus_marshal_uint32 (dest, endian,
1172 _dbus_warn ("failed to append UINT32\n");
1176 PERFORM_UNALIGN (dest);
1178 else if (_dbus_string_starts_with_c_str (&line,
1181 SAVE_FOR_UNALIGN (dest, 8);
1184 _dbus_string_delete_first_word (&line);
1186 if (!_dbus_string_parse_double (&line, 0, &val, NULL))
1189 if (!_dbus_marshal_double (dest, endian,
1192 _dbus_warn ("failed to append DOUBLE\n");
1196 PERFORM_UNALIGN (dest);
1198 else if (_dbus_string_starts_with_c_str (&line,
1201 SAVE_FOR_UNALIGN (dest, 4);
1205 _dbus_string_delete_first_word (&line);
1207 size_offset = _dbus_string_get_length (dest);
1208 size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
1209 if (!_dbus_marshal_uint32 (dest, endian, 0))
1211 _dbus_warn ("Failed to append string size\n");
1215 old_len = _dbus_string_get_length (dest);
1216 if (!append_quoted_string (dest, &line, 0, NULL))
1218 _dbus_warn ("Failed to append quoted string\n");
1222 _dbus_marshal_set_uint32 (dest, endian, size_offset,
1223 /* subtract 1 for nul */
1224 _dbus_string_get_length (dest) - old_len - 1);
1226 PERFORM_UNALIGN (dest);
1231 if (!just_set_unalign && unalign)
1233 _dbus_warn ("UNALIGN prior to something that isn't aligned\n");
1237 goto next_iteration; /* skip parse_failed */
1241 _dbus_warn ("couldn't process line %d \"%s\"\n",
1242 line_no, _dbus_string_get_const_data (&line));
1247 _dbus_hash_iter_init (length_hash, &iter);
1248 while (_dbus_hash_iter_next (&iter))
1250 SavedLength *sl = _dbus_hash_iter_get_value (&iter);
1253 s = _dbus_string_get_const_data (&sl->name);
1257 _dbus_warn ("Used LENGTH %s but never did END_LENGTH\n",
1261 else if (sl->offset < 0)
1263 _dbus_warn ("Did END_LENGTH %s but never used LENGTH\n",
1272 _dbus_verbose ("Filling in length %s endian = %d offset = %d start = %d length = %d\n",
1273 s, sl->endian, sl->offset, sl->start, sl->length);
1274 _dbus_marshal_set_int32 (dest,
1277 sl->length - sl->start);
1280 _dbus_hash_iter_remove_entry (&iter);
1286 if (length_hash != NULL)
1287 _dbus_hash_table_unref (length_hash);
1289 _dbus_string_free (&file);
1290 _dbus_string_free (&line);
1295 #endif /* DBUS_BUILD_TESTS */