decode-gcov.c revision b8a309ac940374ead27618508ab8f81665ff7d9d
13a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* -*- mode: C; c-file-style: "gnu" -*- */
23a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* decode-gcov.c gcov decoder program
33a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
43a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Copyright (C) 2003  Red Hat Inc.
53a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
63a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Partially derived from gcov,
73a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
83a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
93a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This file is NOT licensed under the Academic Free License
113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * as it is largely derived from gcov.c and gcov-io.h in the
123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * gcc source code.
133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This program is free software; you can redistribute it and/or modify
153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * it under the terms of the GNU General Public License as published by
163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * the Free Software Foundation; either version 2 of the License, or
173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * (at your option) any later version.
183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This program is distributed in the hope that it will be useful,
203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * GNU General Public License for more details.
233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * You should have received a copy of the GNU General Public License
253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * along with this program; if not, write to the Free Software
263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *
283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */
293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define DBUS_COMPILATION /* cheat */
313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-list.h>
323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-string.h>
333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-sysdeps.h>
343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-marshal.h>
350cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington#include <dbus/dbus-hash.h>
363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#undef DBUS_COMPILATION
373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <stdio.h>
383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <stdlib.h>
393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <string.h>
403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
41b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#ifndef DBUS_HAVE_INT64
42b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#error "gcov support can't be built without 64-bit integer support"
43b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#endif
44b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondie (const char *message)
473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  fprintf (stderr, "%s", message);
493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  exit (1);
503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* This bizarro function is from gcov-io.h in gcc source tree */
533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int
543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfetch_long (long        *dest,
553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            const char  *source,
563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            size_t       bytes)
573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long value = 0;
593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--)
623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 ))
633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      return 1;
643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (; i >= 0; i--)
663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255));
673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((source[bytes - 1] & 128) && (value > 0))
693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    value = - value;
703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  *dest = value;
723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return 0;
733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int
763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfetch_long64 (dbus_int64_t *dest,
773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              const char   *source,
783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              size_t        bytes)
793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t value = 0;
813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--)
843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 ))
853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      return 1;
863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (; i >= 0; i--)
883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255));
893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((source[bytes - 1] & 128) && (value > 0))
913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    value = - value;
923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  *dest = value;
943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return 0;
953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_FILENAME 	(-1)
983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_FUNCTION 	(-2)
993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_ENDOFLIST	0
1003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t
1023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_int (const DBusString *str,
1033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                int               start,
1043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                long             *val)
1053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
1063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *p;
1073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((_dbus_string_get_length (str) - start) < 4)
1093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    return FALSE;
1103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p = _dbus_string_get_const_data (str);
1123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p += start;
1143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  fetch_long (val, p, 4);
1163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return TRUE;
1183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
1193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t
1213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_int64 (const DBusString *str,
1223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  int               start,
1233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  dbus_int64_t     *val)
1243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
1253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *p;
1263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((_dbus_string_get_length (str) - start) < 8)
1283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    return FALSE;
1293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p = _dbus_string_get_const_data (str);
1313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p += start;
1333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  fetch_long64 (val, p, 8);
1353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return TRUE;
1373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
1383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t
1403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_string (const DBusString *str,
1413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   int               start,
1423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   long              terminator,
1433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   DBusString       *val,
1443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   int              *end)
1453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
1463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
1473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long n;
1483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = start;
1503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (string_get_int (str, i, &n))
1513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
152cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      unsigned char b;
153cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
1553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (n == terminator)
1573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
1583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
159cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      b = n & 0xff;
160cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (b)
161cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        {
162cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          _dbus_string_append_byte (val, b);
163cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          b = (n >> 8) & 0xff;
164cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (b)
165cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
166cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              _dbus_string_append_byte (val, b);
167cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              b = (n >> 16) & 0xff;
168cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              if (b)
169cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                {
170cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  _dbus_string_append_byte (val, b);
171cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  b = (n >> 24) & 0xff;
172cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  if (b)
173cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    _dbus_string_append_byte (val, b);
174cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                }
175cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
176cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        }
1773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
1783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  *end = i;
1803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return TRUE;
1823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
1833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
184cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV
185cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* In gcc33 .bbg files, there's a function name of the form:
186cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *   -1, length, name (padded to 4), -1, checksum
187cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */
188cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic dbus_bool_t
189cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstring_get_function (const DBusString *str,
190cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     int               start,
191cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     DBusString       *funcname,
192cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     int              *checksum,
193cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     int              *next)
194cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{
195cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int end;
196cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  long val;
197cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int i;
198cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
199cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i = start;
200cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
201cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (!string_get_int (str, i, &val))
202cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("no room for -1 before function name\n");
203cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
204cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i += 4;
205cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
206cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (val != -1)
207cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("value before function name is not -1\n");
208cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
209cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (!string_get_int (str, i, &val))
210cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("no length found for function name\n");
211cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
212cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i += 4;
213cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
214cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  end = i + val;
215cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (end > _dbus_string_get_length (str))
216cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("Function name length points past end of file\n");
217cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
218cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (!_dbus_string_append (funcname,
219cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                            _dbus_string_get_const_data (str) + i))
220cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("no memory\n");
221cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
222cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  /* skip alignment padding the length doesn't include the nul so add 1
223cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington   */
224cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i = _DBUS_ALIGN_VALUE (end + 1, 4);
225cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
226cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (!string_get_int (str, i, &val) ||
227cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      val != -1)
228cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("-1 at end of function name not found\n");
229cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
230cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i += 4;
231cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
232cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  if (!string_get_int (str, i, &val))
233cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    die ("no checksum found at end of function name\n");
234cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
235cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i += 4;
236cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
237cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  *checksum = val;
238cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
239cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  *next = i;
240cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
241cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  return TRUE;
242cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington}
243cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */
244cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
2453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
2463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_bb_file (const DBusString *contents)
2473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
2483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
2493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long val;
2503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions;
2513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_functions = 0;
2533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
2543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (string_get_int (contents, i, &val))
2553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
2563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
2573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      switch (val)
2593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
2603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_FILENAME:
2613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          {
2623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            DBusString f;
2633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (!_dbus_string_init (&f))
2653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              die ("no memory\n");
2663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (string_get_string (contents, i,
2683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   BB_FILENAME,
2693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   &f, &i))
2703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              {
2713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                printf ("File %s\n", _dbus_string_get_const_data (&f));
2723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              }
2733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            _dbus_string_free (&f);
2743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          }
2753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
2763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_FUNCTION:
2773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          {
2783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            DBusString f;
2793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (!_dbus_string_init (&f))
2803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              die ("no memory\n");
2813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (string_get_string (contents, i,
2833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   BB_FUNCTION,
2843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   &f, &i))
2853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              {
2863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                printf ("Function %s\n", _dbus_string_get_const_data (&f));
2873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              }
2883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            _dbus_string_free (&f);
2893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
2903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            n_functions += 1;
2913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          }
2923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
2933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_ENDOFLIST:
2943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("End of block\n");
2953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
2963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        default:
2973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("Line %ld\n", val);
2983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
2993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
3003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
3013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%d functions in file\n", n_functions);
3033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
3043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_ON_TREE 0x1
3063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_FAKE 0x2
3073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_FALL_THROUGH 0x4
3083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
3103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_bbg_file (const DBusString *contents)
3113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
3123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
3133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long val;
3143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions;
3153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs;
3163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks;
3173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs_off_tree;
318cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
3193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs_off_tree = 0;
3203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_blocks = 0;
3213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs = 0;
3223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_functions = 0;
3233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
324cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  while (i < _dbus_string_get_length (contents))
3253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
3263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      long n_blocks_in_func;
3273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      long n_arcs_in_func;
3283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      int j;
329cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
330cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV
331cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      /* In gcc33 .bbg files, there's a function name of the form:
332cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       *   -1, length, name (padded to 4), -1, checksum
333cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       * after that header on each function description, it's
334cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       * the same as in gcc32
335cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       */
336cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
337cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      {
338cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        DBusString funcname;
339cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        int checksum;
340cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
341cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        if (!_dbus_string_init (&funcname))
342cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          die ("no memory\n");
343cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
344cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        if (!string_get_function (contents, i,
345cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                  &funcname, &checksum, &i))
346cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          die ("could not read function name\n");
347cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
348cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        printf ("Function name is \"%s\" checksum %d\n",
349cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                _dbus_string_get_const_data (&funcname),
350cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                checksum);
351cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
352cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        _dbus_string_free (&funcname);
353cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      }
354cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */
3553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
356cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
357cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no count of blocks in func found\n");
3583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
360cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
361cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      n_blocks_in_func = val;
3623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!string_get_int (contents, i, &n_arcs_in_func))
3643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
3653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
3673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      printf ("Function has %ld blocks and %ld arcs\n",
3693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              n_blocks_in_func, n_arcs_in_func);
3703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_functions += 1;
3723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_blocks += n_blocks_in_func;
3733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_arcs += n_arcs_in_func;
3743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      j = 0;
3763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (j < n_blocks_in_func)
3773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
3783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          long n_arcs_in_block;
3793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          int k;
3803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (!string_get_int (contents, i, &n_arcs_in_block))
3823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            break;
3833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          i += 4;
3853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("  Block has %ld arcs\n", n_arcs_in_block);
3873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          k = 0;
3893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          while (k < n_arcs_in_block)
3903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
3913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              long destination_block;
3923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              long flags;
3933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (!string_get_int (contents, i, &destination_block))
3953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                break;
3963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              i += 4;
3983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
3993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (!string_get_int (contents, i, &flags))
4003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                break;
4013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              i += 4;
4033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              printf ("    Arc has destination block %ld flags 0x%lx\n",
4053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      destination_block, flags);
4063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if ((flags & FLAG_ON_TREE) == 0)
4083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                n_arcs_off_tree += 1;
4093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              ++k;
4113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
4123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (k < n_arcs_in_block)
4143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            break;
4153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++j;
4173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
4183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (j < n_blocks_in_func)
4203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
4213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!string_get_int (contents, i, &val))
4233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
4243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
4263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (val != -1)
4283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("-1 separator not found\n");
4293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
4303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%d functions %d blocks %d arcs %d off-tree arcs in file\n",
4323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          n_functions, n_blocks, n_arcs, n_arcs_off_tree);
4333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
4343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
435cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifndef DBUS_HAVE_GCC33_GCOV
436cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
437cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* gcc 3.2 version:
438cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * The da file contains first a count of arcs in the file,
4393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * then a count of executions for all "off tree" arcs
4403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * in the file.
4413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */
4423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
4433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_da_file (const DBusString *contents)
4443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
4453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
4463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t val;
4473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs;
4483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int claimed_n_arcs;
4493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
4513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!string_get_int64 (contents, i, &val))
4523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    return;
4533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i += 8;
4553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%ld arcs in file\n", (long) val);
4573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  claimed_n_arcs = val;
4583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs = 0;
4603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (string_get_int64 (contents, i, &val))
4613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
4623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 8;
4633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      printf ("%ld executions of arc %d\n",
4653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              (long) val, n_arcs);
4663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++n_arcs;
4683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
4693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
4703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (n_arcs != claimed_n_arcs)
4713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
4723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      printf ("File claimed to have %d arcs but only had %d\n",
4733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              claimed_n_arcs, n_arcs);
4743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
4753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
4763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
477cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#else /* DBUS_HAVE_GCC33_GCOV */
478cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
479cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* gcc 3.3 version:
480cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * The da file is more complex than 3.2.
481cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *
482cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * We have a magic value of "-123" only it isn't really
483cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * -123, it's -123 as encoded by the crackass gcov-io.h
484cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * routines. Anyway, 4 bytes.
485cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *
486cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * We then have:
487cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *
488cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *   - 4 byte count of how many functions in the following list
489cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *   - 4 byte length of random extra data
490cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *   - the random extra data, just skip it, info pages have some
491cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *     details on what might be in there or see __bb_exit_func in gcc
492cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *   - then for each function (number of functions given above):
493cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *     . -1, length, funcname, alignment padding, -1
494cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *     . checksum
495cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *     . 4 byte number of arcs in function
496cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *     . 8 bytes each, a count of execution for each arc
497cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *
498cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * Now, the whole thing *starting with the magic* can repeat.
499cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * This is caused by multiple runs of the profiled app appending
500cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * to the file.
501cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */
502cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic void
503cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtondump_da_file (const DBusString *contents)
504cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{
505cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int i;
506cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  dbus_int64_t v64;
507cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  long val;
508cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int n_sections;
509cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int total_functions;
510cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
511cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  total_functions = 0;
512cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  n_sections = 0;
513cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
514cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i = 0;
515cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  while (i < _dbus_string_get_length (contents))
516cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    {
517cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int claimed_n_functions;
518cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int n_functions;
519cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int total_arcs;
520cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
521cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      printf (".da file section %d\n", n_sections);
522cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
523cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
524cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no magic found in .da file\n");
525cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
526cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
527cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
528cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (val != -123)
529cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("wrong file magic in .da file\n");
530cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
531cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
532cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no function count in .da file\n");
533cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
534cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      claimed_n_functions = val;
535cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
536cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      printf ("%d functions expected in section %d of .da file\n",
537cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              claimed_n_functions, n_sections);
538cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
539cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
540cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no extra data length in .da file\n");
541cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
542cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
543cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
544cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += val;
545cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
546cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      total_arcs = 0;
547cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      n_functions = 0;
548cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      while (n_functions < claimed_n_functions)
549cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        {
550cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          DBusString funcname;
551cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int checksum;
552cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int claimed_n_arcs;
553cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int n_arcs;
554cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
555cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!_dbus_string_init (&funcname))
556cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("no memory\n");
557cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
558cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!string_get_function (contents, i,
559cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                    &funcname, &checksum, &i))
560cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("could not read function name\n");
561cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
562cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!string_get_int (contents, i, &val))
563cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("no arc count for function\n");
564cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
565cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          i += 4;
566cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          claimed_n_arcs = val;
567cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
568cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          printf ("  %d arcs in function %d %s checksum %d\n",
569cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  claimed_n_arcs, n_functions,
570cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  _dbus_string_get_const_data (&funcname),
571cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  checksum);
572cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
573cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          n_arcs = 0;
574cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          while (n_arcs < claimed_n_arcs)
575cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
576cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              if (!string_get_int64 (contents, i, &v64))
577cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                die ("did not get execution count for arc\n");
578cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
579cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              i += 8;
580cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
581cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              printf ("    %ld executions of arc %d (total arcs %d)\n",
582cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                      (long) v64, n_arcs, total_arcs + n_arcs);
583cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
584cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              ++n_arcs;
585cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
586cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
587cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          _dbus_string_free (&funcname);
588cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
589cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          total_arcs += n_arcs;
590cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          ++n_functions;
591cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        }
592cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
593cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      printf ("total of %d functions and %d arcs in section %d\n",
594cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              n_functions, total_arcs, n_sections);
595cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
596cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      total_functions += n_functions;
597cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      ++n_sections;
598cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    }
599cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
600cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  printf ("%d total function sections in %d total .da file sections\n",
601cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          total_functions, n_sections);
602cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington}
603cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
604cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */
605cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
6063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Arc Arc;
6073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Block Block;
6083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Function Function;
6093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct File File;
6103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Line Line;
6113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Arc
6133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int source;
6153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int target;
6163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t arc_count;
6173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int count_valid : 1;
6183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int on_tree : 1;
6193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int fake : 1;
6203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int fall_through : 1;
6213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *pred_next;
6223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *succ_next;
6233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
6243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Block
6263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *succ;
6283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *pred;
6293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t succ_count;
6303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t pred_count;
6313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t exec_count;
6323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *lines;
6333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int count_valid : 1;
6343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int on_tree : 1;
6353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int inside_dbus_build_tests : 1;
6363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
6373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Function
6393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  char *name;
641cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int checksum;
6423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Block *block_graph;
6433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks;
64477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  /* number of blocks in DBUS_BUILD_TESTS */
64577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  int n_test_blocks;
64677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  int n_test_blocks_executed;
64777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  /* number of blocks outside DBUS_BUILD_TESTS */
64877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  int n_nontest_blocks;
64977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  int n_nontest_blocks_executed;
65077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  /* Summary result flags */
6513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int unused : 1;
6523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int inside_dbus_build_tests : 1;
6533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int partial : 1; /* only some of the blocks were executed */
6543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
6553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Line
6573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int    number;
6593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  char  *text;
6603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *blocks;
6613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int inside_dbus_build_tests : 1;
6623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  unsigned int partial : 1; /* only some of the blocks were executed */
6633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
6643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct File
6663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  char *name;
6683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Line *lines;
6693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int   n_lines;
6703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *functions;
6713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
6723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
6743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_add_arc (Function *function,
6753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  long      source,
6763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  long      target,
6773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  long      flags)
6783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
6793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *arc;
6803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  arc = dbus_new0 (Arc, 1);
6823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (arc == NULL)
6833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
6843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  arc->target = target;
6863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  arc->source = source;
6873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  arc->succ_next = function->block_graph[source].succ;
6893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  function->block_graph[source].succ = arc;
6903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  function->block_graph[source].succ_count += 1;
6913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  arc->pred_next = function->block_graph[target].pred;
6933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  function->block_graph[target].pred = arc;
6943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  function->block_graph[target].pred_count += 1;
6953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((flags & FLAG_ON_TREE) != 0)
6973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    arc->on_tree = TRUE;
6983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
6993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((flags & FLAG_FAKE) != 0)
7003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    arc->fake = TRUE;
7013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if ((flags & FLAG_FALL_THROUGH) != 0)
7033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    arc->fall_through = TRUE;
7043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
7053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic Arc*
7083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonreverse_arcs (Arc *arc)
7093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
7103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  struct Arc *prev = 0;
7113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  struct Arc *next;
7123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for ( ; arc; arc = next)
7143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
7153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      next = arc->succ_next;
7163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      arc->succ_next = prev;
7173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      prev = arc;
7183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
7193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return prev;
7213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
7223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
7243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_reverse_succ_arcs (Function *func)
7253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
7263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* Must reverse the order of all succ arcs, to ensure that they match
7273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * the order of the data in the .da file.
7283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   */
7293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
7303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (i = 0; i < func->n_blocks; i++)
7323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    if (func->block_graph[i].succ)
7333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      func->block_graph[i].succ = reverse_arcs (func->block_graph[i].succ);
7343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
7353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
7373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonget_functions_from_bbg (const DBusString  *contents,
7383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        DBusList         **functions)
7393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
7403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
7413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long val;
7423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions;
7433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs;
7443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks;
7453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs_off_tree;
7463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
7483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Loading arcs and blocks from .bbg file\n");
7493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
7503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs_off_tree = 0;
7523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_blocks = 0;
7533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs = 0;
7543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_functions = 0;
7553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
756cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  while (i < _dbus_string_get_length (contents))
7573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
7583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func;
7593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      long n_blocks_in_func;
7603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      long n_arcs_in_func;
7613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      int j;
762cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
763cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV
764cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      DBusString funcname;
765cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int checksum;
766cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
767cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      /* In gcc33 .bbg files, there's a function name of the form:
768cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       *   -1, length, name (padded to 4), -1, checksum
769cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       * after that header on each function description, it's
770cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       * the same as in gcc32
771cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington       */
772cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!_dbus_string_init (&funcname))
773cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no memory\n");
774cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
775cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_function (contents, i,
776cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                &funcname, &checksum, &i))
777cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("could not read function name\n");
778cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */
779cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
780cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
781cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        break;
7823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_blocks_in_func = val;
7843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
7863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!string_get_int (contents, i, &n_arcs_in_func))
7883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
7893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
7913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_functions += 1;
7933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_blocks += n_blocks_in_func;
7943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_arcs += n_arcs_in_func;
7953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
7963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      func = dbus_new0 (Function, 1);
7973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (func == NULL)
7983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("no memory\n");
7993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
800cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV
801cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      func->name = _dbus_strdup (_dbus_string_get_const_data (&funcname));
802cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      func->checksum = checksum;
803cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      _dbus_string_free (&funcname);
804cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif
805cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
8063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      func->block_graph = dbus_new0 (Block, n_blocks_in_func);
8073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      func->n_blocks = n_blocks_in_func;
8083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      j = 0;
8103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (j < n_blocks_in_func)
8113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
8123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          long n_arcs_in_block;
8133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          int k;
8143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (!string_get_int (contents, i, &n_arcs_in_block))
8163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            break;
8173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          i += 4;
8193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          k = 0;
8213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          while (k < n_arcs_in_block)
8223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
8233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              long destination_block;
8243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              long flags;
8253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (!string_get_int (contents, i, &destination_block))
8273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                break;
8283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              i += 4;
8303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (!string_get_int (contents, i, &flags))
8323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                break;
8333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              i += 4;
8353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if ((flags & FLAG_ON_TREE) == 0)
8373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                n_arcs_off_tree += 1;
8383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              function_add_arc (func, j, destination_block,
8403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                flags);
8413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              ++k;
8433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
8443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (k < n_arcs_in_block)
8463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            break;
8473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++j;
8493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
8503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (j < n_blocks_in_func)
8523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
8533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      function_reverse_succ_arcs (func);
8553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_list_append (functions, func))
8573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("no memory\n");
8583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!string_get_int (contents, i, &val))
8603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        break;
8613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
8633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (val != -1)
865cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("-1 separator not found in .bbg file\n");
8663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
8673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
8693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%d functions %d blocks %d arcs %d off-tree arcs in file\n",
8703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          n_functions, n_blocks, n_arcs, n_arcs_off_tree);
8713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
8723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
8733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_assert (n_functions == _dbus_list_get_length (functions));
8743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
8753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
876cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV
877cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic void
878cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonadd_counts_from_da (const DBusString  *contents,
879cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    DBusList         **functions)
880cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{
881cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int i;
882cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  dbus_int64_t v64;
883cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  long val;
884cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int n_sections;
885cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  DBusList *link;
886cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  Function *current_func;
887cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  int current_block;
888cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  Arc *current_arc;
889cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
890cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  n_sections = 0;
891cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
892cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  i = 0;
893cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  while (i < _dbus_string_get_length (contents))
894cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    {
895cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int claimed_n_functions;
896cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int n_functions;
897cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
898cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
899cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no magic found in .da file\n");
900cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
901cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
902cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
903cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (val != -123)
904cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("wrong file magic in .da file\n");
905cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
906cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
907cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no function count in .da file\n");
908cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
909cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      claimed_n_functions = val;
910cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
911cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (!string_get_int (contents, i, &val))
912cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        die ("no extra data length in .da file\n");
913cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
914cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += 4;
915cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
916cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      i += val;
917cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
918cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      link = _dbus_list_get_first_link (functions);
919cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      if (link == NULL)
920cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        goto no_more_functions;
921cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
922cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      n_functions = 0;
923cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      while (n_functions < claimed_n_functions && link != NULL)
924cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        {
925cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          DBusString funcname;
926cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int checksum;
927cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int claimed_n_arcs;
928cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          int n_arcs;
929cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
930cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          current_func = link->data;
931cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          current_block = 0;
932cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          current_arc = current_func->block_graph[current_block].succ;
933cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
934cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!_dbus_string_init (&funcname))
935cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("no memory\n");
936cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
937cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!string_get_function (contents, i,
938cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                    &funcname, &checksum, &i))
939cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("could not read function name\n");
940cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
941cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!_dbus_string_equal_c_str (&funcname, current_func->name))
942cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
943cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              fprintf (stderr, "Expecting .da info for %s but got %s\n",
944cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                       current_func->name,
945cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                       _dbus_string_get_const_data (&funcname));
946cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              exit (1);
947cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
948cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
949cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (checksum != current_func->checksum)
950cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die (".da file checksum doesn't match checksum from .bbg file\n");
951cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
952cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (!string_get_int (contents, i, &val))
953cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("no arc count for function\n");
954cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
955cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          i += 4;
956cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          claimed_n_arcs = val;
957cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
958cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          /* For each arc in the profile, find the corresponding
959cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington           * arc in the function and increment its count
960cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington           */
961cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          n_arcs = 0;
962cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          while (n_arcs < claimed_n_arcs)
963cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
964cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              if (!string_get_int64 (contents, i, &v64))
965cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                die ("did not get execution count for arc\n");
966cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
967cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              i += 8;
968cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
969cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              /* Find the next arc in the function that isn't on tree */
970cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              while (current_arc == NULL ||
971cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     current_arc->on_tree)
972cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                {
973cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  if (current_arc == NULL)
974cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    {
975cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                      ++current_block;
976cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
977cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                      if (current_block >= current_func->n_blocks)
978cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                        die ("too many blocks in function\n");
979cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
980cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                      current_arc = current_func->block_graph[current_block].succ;
981cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    }
982cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                  else
983cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    {
984cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                      current_arc = current_arc->succ_next;
985cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                    }
986cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                }
987cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
988cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              _dbus_assert (current_arc != NULL);
989cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              _dbus_assert (!current_arc->on_tree);
990cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
991cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              current_arc->arc_count = v64;
992cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              current_arc->count_valid = TRUE;
993cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              current_func->block_graph[current_block].succ_count -= 1;
994cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              current_func->block_graph[current_arc->target].pred_count -= 1;
995cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
996cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              ++n_arcs;
997cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
998cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              current_arc = current_arc->succ_next;
999cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
1000cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1001cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          _dbus_string_free (&funcname);
1002cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1003cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          link = _dbus_list_get_next_link (functions, link);
1004cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          ++n_functions;
1005cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1006cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          if (link == NULL && n_functions < claimed_n_functions)
1007cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
1008cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              fprintf (stderr, "Ran out of functions loading .da file\n");
1009cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              goto no_more_functions;
1010cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
1011cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        }
1012cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1013cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    no_more_functions:
1014cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1015cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      ++n_sections;
1016cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    }
1017cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington}
1018cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#else /* DBUS_HAVE_GCC33_GCOV */
10193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
10203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonadd_counts_from_da (const DBusString  *contents,
10213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    DBusList         **functions)
10223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
10233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
10243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t val;
10253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_arcs;
10263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int claimed_n_arcs;
10273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
10283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Function *current_func;
10293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int current_block;
10303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *current_arc;
10313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
10333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Loading execution count for each arc from .da file\n");
10343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
10353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
10373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!string_get_int64 (contents, i, &val))
10383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    return;
10393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i += 8;
10413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  claimed_n_arcs = val;
10433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (functions);
10453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (link == NULL)
10463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    goto done;
10473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  current_func = link->data;
10493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  current_block = 0;
10503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  current_arc = current_func->block_graph[current_block].succ;
10513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_arcs = 0;
10533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (string_get_int64 (contents, i, &val))
10543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
10553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 8;
10563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (current_arc == NULL ||
10583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington             current_arc->on_tree)
10593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
10603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (current_arc == NULL)
10613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
10623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              ++current_block;
10633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (current_block == current_func->n_blocks)
10653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                {
10663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  link = _dbus_list_get_next_link (functions, link);
10673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  if (link == NULL)
10683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    {
10693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      fprintf (stderr, "Ran out of functions loading .da file\n");
10703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      goto done;
10713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    }
10723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  current_func = link->data;
10733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  current_block = 0;
10743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                }
10753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              current_arc = current_func->block_graph[current_block].succ;
10773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
10783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else
10793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
10803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              current_arc = current_arc->succ_next;
10813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
10823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
10833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      _dbus_assert (current_arc != NULL);
10853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      _dbus_assert (!current_arc->on_tree);
10863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      current_arc->arc_count = val;
10883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      current_arc->count_valid = TRUE;
10893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      current_func->block_graph[current_block].succ_count -= 1;
10903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      current_func->block_graph[current_arc->target].pred_count -= 1;
10913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++n_arcs;
10933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      current_arc = current_arc->succ_next;
10953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
10963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington done:
10983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
10993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (n_arcs != claimed_n_arcs)
11003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
11013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "File claimed to have %d arcs but only had %d\n",
11023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington               claimed_n_arcs, n_arcs);
11033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      exit (1);
11043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
11053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
11073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%d arcs in file\n", n_arcs);
11083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
11093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
1110cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif
11113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
11133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_solve_graph (Function *func)
11143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
11153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int passes, changes;
11163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t total;
11173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
11183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Arc *arc;
11193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Block *block_graph;
11203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks;
11213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
11233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Solving function graph\n");
11243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
11253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_blocks = func->n_blocks;
11273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  block_graph = func->block_graph;
11283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* For every block in the file,
11303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     - if every exit/entrance arc has a known count, then set the block count
11313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     - if the block count is known, and every exit/entrance arc but one has
11323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     a known execution count, then set the count of the remaining arc
11333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     As arc counts are set, decrement the succ/pred count, but don't delete
11353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     the arc, that way we can easily tell when all arcs are known, or only
11363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     one arc is unknown.  */
11373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* The order that the basic blocks are iterated through is important.
11393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     Since the code that finds spanning trees starts with block 0, low numbered
11403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     arcs are put on the spanning tree in preference to high numbered arcs.
11413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     Hence, most instrumented arcs are at the end.  Graph solving works much
11423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     faster if we propagate numbers from the end to the start.
11433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington     This takes an average of slightly more than 3 passes.  */
11453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  changes = 1;
11473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  passes = 0;
11483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (changes)
11493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
11503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      passes++;
11513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      changes = 0;
11523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
11533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      for (i = n_blocks - 1; i >= 0; i--)
11543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	{
11553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	  if (! block_graph[i].count_valid)
11563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	    {
11573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	      if (block_graph[i].succ_count == 0)
11583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		{
11593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = 0;
11603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].succ; arc;
11613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->succ_next)
11623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    total += arc->arc_count;
11633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].exec_count = total;
11643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].count_valid = 1;
11653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  changes = 1;
11663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		}
11673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	      else if (block_graph[i].pred_count == 0)
11683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		{
11693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = 0;
11703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].pred; arc;
11713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->pred_next)
11723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    total += arc->arc_count;
11733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].exec_count = total;
11743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].count_valid = 1;
11753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  changes = 1;
11763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		}
11773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	    }
11783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	  if (block_graph[i].count_valid)
11793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	    {
11803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	      if (block_graph[i].succ_count == 1)
11813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		{
11823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = 0;
11833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* One of the counts will be invalid, but it is zero,
11843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		     so adding it in also doesn't hurt.  */
11853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].succ; arc;
11863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->succ_next)
11873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    total += arc->arc_count;
11883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* Calculate count for remaining arc by conservation.  */
11893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = block_graph[i].exec_count - total;
11903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* Search for the invalid arc, and set its count.  */
11913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].succ; arc;
11923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->succ_next)
11933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    if (! arc->count_valid)
11943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		      break;
11953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  if (! arc)
11963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    die ("arc == NULL\n");
11973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  arc->count_valid = 1;
11983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  arc->arc_count = total;
11993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].succ_count -= 1;
12003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[arc->target].pred_count -= 1;
12023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  changes = 1;
12033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		}
12043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	      if (block_graph[i].pred_count == 1)
12053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		{
12063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = 0;
12073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* One of the counts will be invalid, but it is zero,
12083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		     so adding it in also doesn't hurt.  */
12093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].pred; arc;
12103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->pred_next)
12113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    total += arc->arc_count;
12123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* Calculate count for remaining arc by conservation.  */
12133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  total = block_graph[i].exec_count - total;
12143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  /* Search for the invalid arc, and set its count.  */
12153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  for (arc = block_graph[i].pred; arc;
12163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		       arc = arc->pred_next)
12173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		    if (! arc->count_valid)
12183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		      break;
12193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  if (! arc)
12203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    die ("arc == NULL\n");
12213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  arc->count_valid = 1;
12223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  arc->arc_count = total;
12233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[i].pred_count -= 1;
12243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  block_graph[arc->source].succ_count -= 1;
12263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		  changes = 1;
12273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington		}
12283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	    }
12293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington	}
12303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
12313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* If the graph has been correctly solved, every block will have a
12333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * succ and pred count of zero.
12343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   */
1235cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  {
1236cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    dbus_bool_t header = FALSE;
1237cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington    for (i = 0; i < n_blocks; i++)
1238cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      {
1239cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        if (block_graph[i].succ_count || block_graph[i].pred_count)
1240cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          {
1241cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            if (!header)
1242cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              {
1243cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                fprintf (stderr, "WARNING: Block graph solved incorrectly for function %s\n",
1244cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                         func->name);
1245cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                fprintf (stderr, " this error reflects a bug in decode-gcov.c or perhaps bogus data\n");
1246cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                header = TRUE;
1247cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              }
1248cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            fprintf (stderr, " block %d has succ_count = %d pred_count = %d\n",
1249cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                     i, (int) block_graph[i].succ_count, (int) block_graph[i].pred_count);
1250cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          }
1251cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      }
1252cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington  }
12533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
12543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
12563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonsolve_graphs (DBusList **functions)
12573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
12583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
12593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (functions);
12613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
12623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
12633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
12643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      function_solve_graph (func);
12663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (functions, link);
12683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
12693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
12703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
12723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_functions_for_c_file (const DBusString *filename,
12733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                           DBusList        **functions)
12743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
12753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString bbg_filename;
12763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString da_filename;
1277b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  DBusString gcno_filename;
1278b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  DBusString gcda_filename;
12793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString contents;
1280b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  DBusString *name;
12813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusError error;
12823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1283b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  /* With latest gcc it's .gcno instead of .bbg and
1284b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington   * gcda instead of .da
1285b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington   */
1286b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington
12873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_error_init (&error);
12883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
12893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_init (&bbg_filename) ||
12903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_init (&da_filename) ||
1291b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_init (&gcno_filename) ||
1292b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_init (&gcda_filename) ||
12933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_copy (filename, 0, &bbg_filename, 0) ||
12943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_copy (filename, 0, &da_filename, 0) ||
1295b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_copy (filename, 0, &gcno_filename, 0) ||
1296b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_copy (filename, 0, &gcda_filename, 0) ||
12973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_init (&contents))
12983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
12993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_shorten (&bbg_filename, 2);
13013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_shorten (&da_filename, 2);
13023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_append (&bbg_filename, ".bbg") ||
1304b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_append (&da_filename, ".da") ||
1305b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_append (&bbg_filename, ".gcno") ||
1306b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      !_dbus_string_append (&bbg_filename, ".gcda"))
13073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
1308b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington
1309b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  if (_dbus_file_exists (_dbus_string_get_const_data (&gcno_filename)))
1310b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington    name = &gcno_filename;
1311b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  else
1312b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington    name = &bbg_filename;
1313b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington
1314b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  if (!_dbus_file_get_contents (&contents, name,
13153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                &error))
13163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
13173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Could not open file: %s\n",
13183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington               error.message);
13193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      exit (1);
13203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
13213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  get_functions_from_bbg (&contents, functions);
13233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_set_length (&contents, 0);
13253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
1326b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  if (_dbus_file_exists (_dbus_string_get_const_data (&gcda_filename)))
1327b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington    name = &gcda_filename;
1328b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  else
1329b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington    name = &da_filename;
1330b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington
1331b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington  if (!_dbus_file_get_contents (&contents, name,
13323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                &error))
13333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
1334cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      /* Try .libs/file.da */
1335cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      int slash;
1336cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1337b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington      if (_dbus_string_find_byte_backward (name,
1338b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington                                           _dbus_string_get_length (name),
1339b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington                                           '/',
1340b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington                                           &slash))
1341cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        {
1342cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          DBusString libs;
1343cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          _dbus_string_init_const (&libs, "/.libs");
1344cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1345b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington          if (!_dbus_string_copy (&libs, 0, name, slash))
1346cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            die ("no memory");
1347cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1348cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          dbus_error_free (&error);
1349b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington          if (!_dbus_file_get_contents (&contents, name,
1350cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                        &error))
1351cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            {
1352cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              fprintf (stderr, "Could not open file: %s\n",
1353cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                       error.message);
1354cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington              exit (1);
1355cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington            }
1356cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        }
1357cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington      else
1358cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        {
1359cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          fprintf (stderr, "Could not open file: %s\n",
1360cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                   error.message);
1361cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington          exit (1);
1362cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington        }
13633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
13643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  add_counts_from_da (&contents, functions);
13663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  solve_graphs (functions);
13683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&contents);
13703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&da_filename);
13713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&bbg_filename);
13723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
13733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
13753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonget_lines_from_bb_file (const DBusString *contents,
13763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        File             *fl)
13773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
13783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
13793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  long val;
13803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions;
13813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_bool_t in_our_file;
13823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
13833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Function *func;
13843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int block;
13853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
13873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Getting line numbers for blocks from .bb file\n");
13883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
13893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* There's this "filename" field in the .bb file which
13913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * mysteriously comes *after* the first function in the
13923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * file in the .bb file; and every .bb file seems to
13933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * have only one filename. I don't understand
13943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * what's going on here, so just set in_our_file = TRUE
13953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * at the start categorically.
13963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   */
13973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
13983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  block = 0;
13993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  func = NULL;
14003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  in_our_file = TRUE;
14013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&fl->functions);
14023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_functions = 0;
14033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
14043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (string_get_int (contents, i, &val))
14053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
14063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i += 4;
14073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      switch (val)
14093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
14103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_FILENAME:
14113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          {
14123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            DBusString f;
14133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (!_dbus_string_init (&f))
14153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              die ("no memory\n");
14163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (string_get_string (contents, i,
14183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   BB_FILENAME,
14193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   &f, &i))
14203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              {
14213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                /* fl->name is a full path and the filename in .bb is
14223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                 * not.
14233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                 */
14243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                DBusString tmp_str;
14253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                _dbus_string_init_const (&tmp_str, fl->name);
14273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                if (_dbus_string_ends_with_c_str (&tmp_str,
14293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                                  _dbus_string_get_const_data (&f)))
14303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  in_our_file = TRUE;
14313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                else
14323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  in_our_file = FALSE;
14333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
14353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                fprintf (stderr,
14363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                         "File %s in .bb, looking for %s, in_our_file = %d\n",
14373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                         _dbus_string_get_const_data (&f),
14383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                         fl->name,
14393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                         in_our_file);
14403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
14413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              }
14423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            _dbus_string_free (&f);
14433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          }
14443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
14453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_FUNCTION:
14463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          {
14473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            DBusString f;
14483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (!_dbus_string_init (&f))
14493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              die ("no memory\n");
14503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            if (string_get_string (contents, i,
14523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   BB_FUNCTION,
14533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                   &f, &i))
14543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              {
14553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
14563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                fprintf (stderr, "Function %s\n", _dbus_string_get_const_data (&f));
14573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
14583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                block = 0;
14603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                if (in_our_file)
14623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  {
14633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    if (link == NULL)
14643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      {
14653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        fprintf (stderr, "No function object for function %s\n",
14663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                 _dbus_string_get_const_data (&f));
14673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      }
14683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    else
14693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      {
14703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        func = link->data;
14713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        link = _dbus_list_get_next_link (&fl->functions, link);
1472cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
14733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        if (func->name == NULL)
14743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                          {
14753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                            if (!_dbus_string_copy_data (&f, &func->name))
14763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                              die ("no memory\n");
14773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                          }
14783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                        else
14793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                          {
1480cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                            if (!_dbus_string_equal_c_str (&f, func->name))
1481cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                              {
1482cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                fprintf (stderr, "got function name \"%s\" (%d) from .bbg file, but \"%s\" (%d) from .bb file\n",
1483cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                         func->name, strlen (func->name),
1484cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                         _dbus_string_get_const_data (&f),
1485cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                                         _dbus_string_get_length (&f));
1486cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington
1487cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington                              }
14883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                          }
14893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      }
14903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  }
14913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              }
14923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            _dbus_string_free (&f);
14933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
14943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            n_functions += 1;
14953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          }
14963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
14973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        case BB_ENDOFLIST:
14983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          block += 1;
14993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
15003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        default:
15013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
15023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          fprintf (stderr, "Line %ld\n", val);
15033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
15043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (val >= fl->n_lines)
15063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
15073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              fprintf (stderr, "Line %ld but file only has %d lines\n",
15083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                       val, fl->n_lines);
15093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
15103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else if (func != NULL)
15113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
15123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              val -= 1; /* To convert the 1-based line number to 0-based */
15133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              _dbus_assert (val >= 0);
15143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (block < func->n_blocks)
15163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                {
15173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  if (!_dbus_list_append (&func->block_graph[block].lines,
15183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                          &fl->lines[val]))
15193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    die ("no memory\n");
15203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  if (!_dbus_list_append (&fl->lines[val].blocks,
15233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                          &func->block_graph[block]))
15243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    die ("no memory\n");
15253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                }
15263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              else
15273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                {
15283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  fprintf (stderr, "Line number for block %d but function only has %d blocks\n",
15293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                           block, func->n_blocks);
15303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                }
15313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
15323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else
15333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
15343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              fprintf (stderr, "Line %ld given outside of any function\n",
15353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                       val);
15363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
15373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          break;
15393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
15403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
15413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
15433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("%d functions in file\n", n_functions);
15443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
15453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
15463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
15493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_block_line_associations (const DBusString *filename,
15503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                              File             *f)
15513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
15523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString bb_filename;
15533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString contents;
15543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusError error;
15553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_error_init (&error);
15573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_init (&bb_filename) ||
15593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_copy (filename, 0, &bb_filename, 0) ||
15603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      !_dbus_string_init (&contents))
15613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
15623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_shorten (&bb_filename, 2);
15643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_append (&bb_filename, ".bb"))
15663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
15673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_file_get_contents (&contents, &bb_filename,
15693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                &error))
15703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
15713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Could not open file: %s\n",
15723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington               error.message);
15733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      exit (1);
15743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
15753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  get_lines_from_bb_file (&contents, f);
15773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&contents);
15793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&bb_filename);
15803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
15813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int
15833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtoncount_lines_in_string (const DBusString *str)
15843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
15853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines;
15863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *p;
15873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *prev;
15883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *end;
15893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *last_line_end;
15903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
15923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Counting lines in source file\n");
15933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
15943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
15953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_lines = 0;
15963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  prev = NULL;
15973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p = _dbus_string_get_const_data (str);
15983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  end = p + _dbus_string_get_length (str);
15993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  last_line_end = p;
16003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (p != end)
16013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
16023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      /* too lazy to handle \r\n as one linebreak */
16033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (*p == '\n' || *p == '\r')
16043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
16053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++n_lines;
16063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          last_line_end = p + 1;
16073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
16083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      prev = p;
16103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++p;
16113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
16123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (last_line_end != p)
16143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    ++n_lines;
16153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return n_lines;
16173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
16183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
16203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfill_line_content (const DBusString *str,
16213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   Line             *lines)
16223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
16233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines;
16243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *p;
16253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *prev;
16263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *end;
16273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  const char *last_line_end;
16283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0
16303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Saving contents of each line in source file\n");
16313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif
16323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  n_lines = 0;
16343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  prev = NULL;
16353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  p = _dbus_string_get_const_data (str);
16363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  end = p + _dbus_string_get_length (str);
16373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  last_line_end = p;
16383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (p != end)
16393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
16403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (*p == '\n' || *p == '\r')
16413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
16423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          lines[n_lines].text = dbus_malloc0 (p - last_line_end + 1);
16433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (lines[n_lines].text == NULL)
16443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            die ("no memory\n");
16453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          memcpy (lines[n_lines].text, last_line_end, p - last_line_end);
16473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          lines[n_lines].number = n_lines + 1;
16483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++n_lines;
16503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          last_line_end = p + 1;
16523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
16533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      prev = p;
16553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++p;
16563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
16573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (p != last_line_end)
16593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
16603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      memcpy (lines[n_lines].text, last_line_end, p - last_line_end);
16613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++n_lines;
16623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
16633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
16643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
16663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmark_inside_dbus_build_tests (File  *f)
16673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
16683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
16693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
16703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int inside_depth;
16713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  inside_depth = 0;
16733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
16743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (i < f->n_lines)
16753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
16763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Line *l = &f->lines[i];
167727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      dbus_bool_t is_verbose;
167827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
167927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      is_verbose = strstr (l->text, "_dbus_verbose") != NULL;
16803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
16813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (inside_depth == 0)
16823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
16833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          const char *a, *b;
16843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
168527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          a = strstr (l->text, "#if");
16863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          b = strstr (l->text, "DBUS_BUILD_TESTS");
168727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          if (a && b && (a < b))
16883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            inside_depth += 1;
16893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
16903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      else
16913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
16923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (strstr (l->text, "#if") != NULL)
16933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            inside_depth += 1;
16943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else if (strstr (l->text, "#endif") != NULL)
16953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            inside_depth -= 1;
16963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
16973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
169827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      if (inside_depth > 0 || is_verbose)
16993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
17003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          /* Mark the line and its blocks */
17013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          DBusList *blink;
17023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          l->inside_dbus_build_tests = TRUE;
17043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          blink = _dbus_list_get_first_link (&l->blocks);
17063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          while (blink != NULL)
17073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
17083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              Block *b = blink->data;
17093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              b->inside_dbus_build_tests = TRUE;
17113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              blink = _dbus_list_get_next_link (&l->blocks, blink);
17133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
17143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
17153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
17173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
17183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  /* Now mark functions where for all blocks that are associated
17203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   * with a source line, the block is inside_dbus_build_tests.
17213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington   */
17223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
17233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
17243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
17253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
172627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
172727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      /* The issue is that some blocks aren't associated with a source line.
172827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington       * Assume they are inside/outside tests according to the source
172927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington       * line of the preceding block. For the first block, make it
173027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington       * match the first following block with a line associated.
173127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington       */
173227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      if (func->block_graph[0].lines == NULL)
173327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        {
173427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          /* find first following line */
173527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          i = 1;
173627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          while (i < func->n_blocks)
173727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington            {
173827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              if (func->block_graph[i].lines != NULL)
173927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                {
174027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                  func->block_graph[0].inside_dbus_build_tests =
174127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                    func->block_graph[i].inside_dbus_build_tests;
174227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                  break;
174327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                }
174427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
174527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              ++i;
174627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington            }
174727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        }
174827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
174927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      /* Now mark all blocks but the first */
175027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      i = 1;
175127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      while (i < func->n_blocks)
175227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        {
175327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          if (func->block_graph[i].lines == NULL)
175427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington            {
175527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              func->block_graph[i].inside_dbus_build_tests =
175627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                func->block_graph[i-1].inside_dbus_build_tests;
175727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington            }
175827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
175927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          ++i;
176027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        }
17613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i = 0;
17633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < func->n_blocks)
17643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
17653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          /* Break as soon as any block is not a test block */
17663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (func->block_graph[i].lines != NULL &&
17673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              !func->block_graph[i].inside_dbus_build_tests)
17683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            break;
17693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
17713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
17723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (i == func->n_blocks)
17743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        func->inside_dbus_build_tests = TRUE;
17753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
17773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
17783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
17793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
178177eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonmark_coverage (File  *f)
17823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
17833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
17843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
17853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
17873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (i < f->n_lines)
17883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
17893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Line *l = &f->lines[i];
17903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusList *blink;
17913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      int n_blocks;
17923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      int n_blocks_executed;
17933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
17943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_blocks = 0;
17953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      n_blocks_executed = 0;
17963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      blink = _dbus_list_get_first_link (&l->blocks);
17973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (blink != NULL)
17983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
17993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          Block *b = blink->data;
18003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (b->exec_count > 0)
18023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            n_blocks_executed += 1;
18033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          n_blocks += 1;
18053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          blink = _dbus_list_get_next_link (&l->blocks, blink);
18073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
18083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (n_blocks_executed > 0 &&
18103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          n_blocks_executed < n_blocks)
18113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        l->partial = TRUE;
18123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
18143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
18153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
18173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
18183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
18193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
18203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      int i;
182177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      int n_test_blocks;
182277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      int n_test_blocks_executed;
182377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      int n_nontest_blocks;
182477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      int n_nontest_blocks_executed;
182577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
182677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      n_test_blocks = 0;
182777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      n_test_blocks_executed = 0;
182877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      n_nontest_blocks = 0;
182977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      n_nontest_blocks_executed = 0;
18303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i = 0;
18323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < func->n_blocks)
18333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
183477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          if (!func->block_graph[i].inside_dbus_build_tests)
183577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington            {
183677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington              n_nontest_blocks += 1;
183777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
183877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington              if (func->block_graph[i].exec_count > 0)
183977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                n_nontest_blocks_executed += 1;
184077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington            }
184177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          else
184277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington            {
184377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington              n_test_blocks += 1;
184477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
184577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington              if (func->block_graph[i].exec_count > 0)
184677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                n_test_blocks_executed += 1;
184777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington            }
18483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
18503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
185177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
185277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      if (n_nontest_blocks_executed > 0 &&
185377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          n_nontest_blocks_executed < n_nontest_blocks)
18543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        func->partial = TRUE;
185577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
185677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      if (n_nontest_blocks_executed == 0 &&
185777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          n_nontest_blocks > 0)
185877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        func->unused = TRUE;
185977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
186077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      func->n_test_blocks = n_test_blocks;
186177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      func->n_test_blocks_executed = n_test_blocks_executed;
186277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      func->n_nontest_blocks = n_nontest_blocks;
186377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      func->n_nontest_blocks_executed = n_nontest_blocks_executed;
18643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
18663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
18673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
18683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic File*
18703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_c_file (const DBusString *filename)
18713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
18723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString contents;
18733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusError error;
18743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  File *f;
18753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  f = dbus_new0 (File, 1);
18773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (f == NULL)
18783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
18793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_copy_data (filename, &f->name))
18813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
18823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_string_init (&contents))
18843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
18853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_error_init (&error);
18873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!_dbus_file_get_contents (&contents, filename,
18893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                &error))
18903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
18913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Could not open file: %s\n",
18923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington               error.message);
18933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dbus_error_free (&error);
18943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      exit (1);
18953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
18963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  load_functions_for_c_file (filename, &f->functions);
18983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
18993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  f->n_lines = count_lines_in_string (&contents);
19003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  f->lines = dbus_new0 (Line, f->n_lines);
19013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (f->lines == NULL)
19023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    die ("no memory\n");
19033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  fill_line_content (&contents, f->lines);
19053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  _dbus_string_free (&contents);
19073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  load_block_line_associations (filename, f);
19093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  mark_inside_dbus_build_tests (f);
191177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  mark_coverage (f);
19123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return f;
19143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
19153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Stats Stats;
19173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Stats
19193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
19203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks;
19213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks_executed;
19223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_blocks_inside_dbus_build_tests;
19233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines; /* lines that have blocks on them */
19253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines_executed;
19263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines_partial;
19273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_lines_inside_dbus_build_tests;
19283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions;
19303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions_executed;
19313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions_partial;
19323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int n_functions_inside_dbus_build_tests;
19333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington};
19343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t
19363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonline_was_executed (Line *l)
19373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
19383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
19393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&l->blocks);
19413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
19423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
19433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Block *b = link->data;
19443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (b->exec_count > 0)
19463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        return TRUE;
19473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&l->blocks, link);
19493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
19503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return FALSE;
19523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
19533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int
19563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonline_exec_count (Line *l)
19573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
19583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
19593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_int64_t total;
19603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  total = 0;
19623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&l->blocks);
19633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
19643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
19653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Block *b = link->data;
19663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      total += b->exec_count;
19683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&l->blocks, link);
19703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
19713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return total;
19733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
19743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
19763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmerge_stats_for_file (Stats *stats,
19773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                      File  *f)
19783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
19793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
19803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
19813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  for (i = 0; i < f->n_lines; ++i)
19833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
19843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Line *l = &f->lines[i];
19853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->inside_dbus_build_tests)
19873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
19883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          stats->n_lines_inside_dbus_build_tests += 1;
19893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          continue;
19903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
19913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (line_was_executed (l))
19933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        stats->n_lines_executed += 1;
19943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->blocks != NULL)
19963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        stats->n_lines += 1;
19973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
19983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->partial)
19993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        stats->n_lines_partial += 1;
20003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
20013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
20033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
20043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
20053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
20063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (func->inside_dbus_build_tests)
20083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        stats->n_functions_inside_dbus_build_tests += 1;
20093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      else
20103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
20113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          stats->n_functions += 1;
20123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (!func->unused)
20143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            stats->n_functions_executed += 1;
20153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (func->partial)
20173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            stats->n_functions_partial += 1;
20183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
20193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
202077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      stats->n_blocks_inside_dbus_build_tests +=
202177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        func->n_test_blocks;
202277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
202377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      stats->n_blocks_executed +=
202477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        func->n_nontest_blocks_executed;
202577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
202677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      stats->n_blocks +=
202777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        func->n_nontest_blocks;
20283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
20303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
20313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
20323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* The output of this matches gcov exactly ("diff" shows no difference) */
20343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
20353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_annotated_source_gcov_format (File *f)
20363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
20373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
20383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
20403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (i < f->n_lines)
20413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
20423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Line *l = &f->lines[i];
20433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->blocks != NULL)
20453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
20463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          int exec_count;
20473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          exec_count = line_exec_count (l);
20493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (exec_count > 0)
20513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            printf ("%12d    %s\n",
20523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    exec_count, l->text);
20533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else
20543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            printf ("      ######    %s\n", l->text);
20553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
20563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      else
20573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
20583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("\t\t%s\n", l->text);
20593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
20603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
20623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
20633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
20643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
20663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_annotated_source (File *f)
20673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
20683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
20693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 0;
20713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (i < f->n_lines)
20723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
20733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Line *l = &f->lines[i];
20743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->inside_dbus_build_tests)
20763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        printf ("*");
20773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      else
20783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        printf (" ");
20793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (l->blocks != NULL)
20813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
20823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          int exec_count;
20833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          exec_count = line_exec_count (l);
20853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (exec_count > 0)
20873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            printf ("%12d    %s\n",
20883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                    exec_count, l->text);
20893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else
20903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            printf ("      ######    %s\n", l->text);
20913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
20923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      else
20933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
20943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("\t\t%s\n", l->text);
20953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
20963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
20973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
20983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
20993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
21003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
21023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_block_superdetails (File *f)
21033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
21043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
21053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
21063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
21083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
21093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
21103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
21113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      printf ("=== %s():\n", func->name);
21133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      i = 0;
21153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < func->n_blocks)
21163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
21173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          Block *b = &func->block_graph[i];
21183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          DBusList *l;
21193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          printf ("  %5d executed %d times%s\n", i,
21213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  (int) b->exec_count,
21223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  b->inside_dbus_build_tests ?
21233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                  " [inside DBUS_BUILD_TESTS]" : "");
21243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          l = _dbus_list_get_first_link (&b->lines);
21263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          while (l != NULL)
21273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
21283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              Line *line = l->data;
21293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              printf ("4%d\t%s\n", line->number, line->text);
21313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              l = _dbus_list_get_next_link (&b->lines, l);
21333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
21343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
21363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
21373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
21393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
21403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
21413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
21433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_one_file (const DBusString *filename)
21443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
21453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (_dbus_string_ends_with_c_str (filename, ".bb"))
21463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
21473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusString contents;
21483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusError error;
21493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_string_init (&contents))
21513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("no memory\n");
21523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dbus_error_init (&error);
21543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_file_get_contents (&contents, filename,
21563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                    &error))
21573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
21583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          fprintf (stderr, "Could not open file: %s\n",
21593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   error.message);
21603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          dbus_error_free (&error);
21613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          exit (1);
21623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
21633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dump_bb_file (&contents);
21653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      _dbus_string_free (&contents);
21673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
21683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (_dbus_string_ends_with_c_str (filename, ".bbg"))
21693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
21703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusString contents;
21713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusError error;
21723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_string_init (&contents))
21743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("no memory\n");
21753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dbus_error_init (&error);
21773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_file_get_contents (&contents, filename,
21793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                    &error))
21803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
21813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          fprintf (stderr, "Could not open file: %s\n",
21823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   error.message);
21833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          dbus_error_free (&error);
21843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          exit (1);
21853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
21863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dump_bbg_file (&contents);
21883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      _dbus_string_free (&contents);
21903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
21913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (_dbus_string_ends_with_c_str (filename, ".da"))
21923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
21933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusString contents;
21943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusError error;
21953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_string_init (&contents))
21973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        die ("no memory\n");
21983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
21993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dbus_error_init (&error);
22003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (!_dbus_file_get_contents (&contents, filename,
22023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                                    &error))
22033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
22043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          fprintf (stderr, "Could not open file: %s\n",
22053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                   error.message);
22063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          dbus_error_free (&error);
22073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          exit (1);
22083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
22093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      dump_da_file (&contents);
22113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      _dbus_string_free (&contents);
22133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
22143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (_dbus_string_ends_with_c_str (filename, ".c"))
22153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
22163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      File *f;
22173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      f = load_c_file (filename);
22193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      print_annotated_source (f);
22213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
22223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else
22233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
22243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Unknown file type %s\n",
22253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington               _dbus_string_get_const_data (filename));
22263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      exit (1);
22273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
22283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
22293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void
22313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_untested_functions (File *f)
22323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
22333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusList *link;
22343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  dbus_bool_t found;
22353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  found = FALSE;
22373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
22383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
22393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
22403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
22413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (func->unused &&
22433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          !func->inside_dbus_build_tests)
22443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        found = TRUE;
22453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
22473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
22483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (!found)
22503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    return;
225127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
22523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("Untested functions in %s\n", f->name);
22533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("=======\n");
22543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  link = _dbus_list_get_first_link (&f->functions);
22563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  while (link != NULL)
22573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
22583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Function *func = link->data;
22593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      if (func->unused &&
22613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          !func->inside_dbus_build_tests)
22623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        printf ("  %s\n", func->name);
22633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
22653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
22663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  printf ("\n");
22683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
22693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
22700cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Penningtonstatic void
227177eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonprint_poorly_tested_functions (File  *f,
227277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                               Stats *stats)
227377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington{
227477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  DBusList *link;
227577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  dbus_bool_t found;
227677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
227777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define TEST_FRACTION(function) ((function)->n_nontest_blocks_executed / (double) (function)->n_nontest_blocks)
227877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
227977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define AVERAGE_COVERAGE ((stats)->n_blocks_executed / (double) (stats)->n_blocks)
228077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
228177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define POORLY_TESTED(function) (!(function)->unused &&                 \
228277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                                 (function)->n_nontest_blocks > 0 &&    \
228377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                                 TEST_FRACTION (function) < AVERAGE_COVERAGE)
228477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
228577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  found = FALSE;
228677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  link = _dbus_list_get_first_link (&f->functions);
228777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  while (link != NULL)
228877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington    {
228977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      Function *func = link->data;
229077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
229177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      if (POORLY_TESTED (func))
229277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        found = TRUE;
229377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
229477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
229577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington    }
229677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
229777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  if (!found)
229877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington    return;
229977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
230077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  printf ("Below average functions in %s\n", f->name);
230177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  printf ("=======\n");
230277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
230377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  link = _dbus_list_get_first_link (&f->functions);
230477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  while (link != NULL)
230577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington    {
230677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      Function *func = link->data;
230777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
230877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      if (POORLY_TESTED (func))
230977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        printf ("  %s (%d%%)\n", func->name,
231077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                (int) (TEST_FRACTION (func) * 100));
231177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
231277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
231377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington    }
231477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
231577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington  printf ("\n");
231677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington}
231777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
231827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonstatic int
231927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonfunc_cmp (const void *a,
232027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          const void *b)
232127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington{
232227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  Function *af = *(Function**) a;
232327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  Function *bf = *(Function**) b;
232427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  int a_untested = af->n_nontest_blocks - af->n_nontest_blocks_executed;
232527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  int b_untested = bf->n_nontest_blocks - bf->n_nontest_blocks_executed;
232627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
232727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  /* Sort by number of untested blocks */
232827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  return b_untested - a_untested;
232927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington}
233027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
233127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonstatic void
233227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonprint_n_untested_blocks_by_function (File  *f,
233327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington                                     Stats *stats)
233427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington{
233527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  DBusList *link;
233627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  Function **funcs;
233727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  int n_found;
233827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  int i;
233927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
234027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  n_found = 0;
234127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  link = _dbus_list_get_first_link (&f->functions);
234227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  while (link != NULL)
234327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    {
234427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      Function *func = link->data;
234527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
234627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      if (func->n_nontest_blocks_executed <
234727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          func->n_nontest_blocks)
234827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        n_found += 1;
234927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
235027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
235127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    }
235227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
235327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  if (n_found == 0)
235427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    return;
235527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
235627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  /* make an array so we can use qsort */
235727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
235827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  funcs = dbus_new (Function*, n_found);
235927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  if (funcs == NULL)
236027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    return;
236127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
236227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  i = 0;
236327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  link = _dbus_list_get_first_link (&f->functions);
236427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  while (link != NULL)
236527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    {
236627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      Function *func = link->data;
236727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
236827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      if (func->n_nontest_blocks_executed <
236927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          func->n_nontest_blocks)
237027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        {
237127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          funcs[i] = func;
237227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          ++i;
237327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        }
237427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
237527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      link = _dbus_list_get_next_link (&f->functions, link);
237627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    }
237727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
237827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  _dbus_assert (i == n_found);
237927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
238027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  qsort (funcs, n_found, sizeof (Function*),
238127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington         func_cmp);
238227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
238327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("Incomplete functions in %s\n", f->name);
238427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("=======\n");
238527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
238627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  i = 0;
238727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  while (i < n_found)
238827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    {
238927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      Function *func = funcs[i];
239027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
239127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      printf ("  %s (%d/%d untested blocks)\n",
239227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              func->name,
239327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              func->n_nontest_blocks - func->n_nontest_blocks_executed,
239427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington              func->n_nontest_blocks);
239527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
239627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      ++i;
239727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington    }
239827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
239927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  dbus_free (funcs);
240027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
240127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("\n");
240227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington}
240327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
240477eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonstatic void
24050cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Penningtonprint_stats (Stats      *stats,
24060cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington             const char *of_what)
24070cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington{
24080cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  int completely;
24090cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24100cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("Summary (%s)\n", of_what);
24110cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("=======\n");
24120cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("  %g%% blocks executed (%d of %d)\n",
24130cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          (stats->n_blocks_executed / (double) stats->n_blocks) * 100.0,
24140cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_blocks_executed,
24150cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_blocks);
24160cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
241727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("     (ignored %d blocks of test-only/debug-only code)\n",
24180cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_blocks_inside_dbus_build_tests);
24190cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24200cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("  %g%% functions executed (%d of %d)\n",
24210cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          (stats->n_functions_executed / (double) stats->n_functions) * 100.0,
24220cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_functions_executed,
24230cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_functions);
24240cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24250cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  completely = stats->n_functions_executed - stats->n_functions_partial;
24260cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("  %g%% functions completely executed (%d of %d)\n",
24270cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          (completely / (double) stats->n_functions) * 100.0,
24280cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          completely,
24290cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_functions);
24300cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
243127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("     (ignored %d functions of test-only/debug-only code)\n",
24320cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_functions_inside_dbus_build_tests);
24330cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24340cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("  %g%% lines executed (%d of %d)\n",
24350cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          (stats->n_lines_executed / (double) stats->n_lines) * 100.0,
24360cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_lines_executed,
24370cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_lines);
24380cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24390cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  completely = stats->n_lines_executed - stats->n_lines_partial;
24400cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("  %g%% lines completely executed (%d of %d)\n",
24410cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          (completely / (double) stats->n_lines) * 100.0,
24420cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          completely,
24430cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_lines);
24440cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
244527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington  printf ("     (ignored %d lines of test-only/debug-only code)\n",
24460cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          stats->n_lines_inside_dbus_build_tests);
24470cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24480cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington  printf ("\n");
24490cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington}
24500cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
24513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef enum
24523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
24533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  MODE_PRINT,
24543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  MODE_REPORT,
24553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  MODE_BLOCKS,
24563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  MODE_GCOV
24573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} Mode;
24583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonint
24603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmain (int argc, char **argv)
24613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{
24623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  DBusString filename;
24633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  int i;
24643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  Mode m;
24653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (argc < 2)
24673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
24683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Must specify files on command line\n");
24693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      return 1;
24703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
24713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  m = MODE_PRINT;
24733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  i = 1;
24743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (strcmp (argv[i], "--report") == 0)
24763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
24773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      m = MODE_REPORT;
24783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
24793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
24803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (strcmp (argv[i], "--blocks") == 0)
24813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
24823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      m = MODE_BLOCKS;
24833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
24843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
24853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (strcmp (argv[i], "--gcov") == 0)
24863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
24873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      m = MODE_GCOV;
24883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      ++i;
24893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
24903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (i == argc)
24933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
24943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      fprintf (stderr, "Must specify files on command line\n");
24953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      return 1;
24963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
24973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
24983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  if (m == MODE_PRINT)
24993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
25003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < argc)
25013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
25023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          _dbus_string_init_const (&filename, argv[i]);
25033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          print_one_file (&filename);
25053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
25073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
25083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
25093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (m == MODE_BLOCKS || m == MODE_GCOV)
25103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
25113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < argc)
25123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
25133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          File *f;
25143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          _dbus_string_init_const (&filename, argv[i]);
25163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          f = load_c_file (&filename);
25183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (m == MODE_BLOCKS)
25203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            print_block_superdetails (f);
25213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else if (m == MODE_GCOV)
25223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            print_annotated_source_gcov_format (f);
25233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
25253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
25263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
25273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  else if (m == MODE_REPORT)
25283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    {
25293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      Stats stats = { 0, };
25303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusList *files;
25313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      DBusList *link;
25320cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      DBusHashTable *stats_by_dir;
25330cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      DBusHashIter iter;
25343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      files = NULL;
25363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (i < argc)
25373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
25383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          _dbus_string_init_const (&filename, argv[i]);
25393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          if (_dbus_string_ends_with_c_str (&filename, ".c"))
25413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
25423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              File *f;
25433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              f = load_c_file (&filename);
25453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              if (!_dbus_list_append (&files, f))
25473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                die ("no memory\n");
25483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
25493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          else
25503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            {
25513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              fprintf (stderr, "Unknown file type %s\n",
25523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington                       _dbus_string_get_const_data (&filename));
25533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington              exit (1);
25543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington            }
25553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          ++i;
25573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
25583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_first_link (&files);
25603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (link != NULL)
25613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
25623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          File *f = link->data;
25633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          merge_stats_for_file (&stats, f);
25653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          link = _dbus_list_get_next_link (&files, link);
25673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        }
25683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25690cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      print_stats (&stats, "all files");
25703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25710cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      stats_by_dir = _dbus_hash_table_new (DBUS_HASH_STRING,
25720cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington                                           dbus_free, dbus_free);
25733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25740cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      link = _dbus_list_get_first_link (&files);
25750cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      while (link != NULL)
25760cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington        {
25770cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          File *f = link->data;
25780cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          DBusString dirname;
25790cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          char *dirname_c;
25800cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          Stats *dir_stats;
25810cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
25820cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          _dbus_string_init_const (&filename, f->name);
25830cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
25840cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          if (!_dbus_string_init (&dirname))
25850cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington            die ("no memory\n");
25863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25870cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          if (!_dbus_string_get_dirname (&filename, &dirname) ||
25880cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington              !_dbus_string_copy_data (&dirname, &dirname_c))
25890cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington            die ("no memory\n");
25903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
25910cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          dir_stats = _dbus_hash_table_lookup_string (stats_by_dir,
25920cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington                                                      dirname_c);
25930cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
25940cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          if (dir_stats == NULL)
25950cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington            {
25960cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington              dir_stats = dbus_new0 (Stats, 1);
25970cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington              if (!_dbus_hash_table_insert_string (stats_by_dir, dirname_c,
25980cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington                                                   dir_stats))
25990cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington                die ("no memory\n");
26000cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington            }
26010cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          else
26020cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington            dbus_free (dirname_c);
26030cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
26040cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          merge_stats_for_file (dir_stats, f);
26050cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
26060cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          link = _dbus_list_get_next_link (&files, link);
26070cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington        }
26080cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
26090cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      _dbus_hash_iter_init (stats_by_dir, &iter);
26100cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      while (_dbus_hash_iter_next (&iter))
26110cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington        {
26120cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          const char *dirname = _dbus_hash_iter_get_string_key (&iter);
26130cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          Stats *dir_stats = _dbus_hash_iter_get_value (&iter);
26140cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
26150cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington          print_stats (dir_stats, dirname);
26160cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington        }
26170cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington
26180cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington      _dbus_hash_table_unref (stats_by_dir);
26193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
26203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      link = _dbus_list_get_first_link (&files);
26213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington      while (link != NULL)
26223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington        {
26233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          File *f = link->data;
26243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
26253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          print_untested_functions (f);
26263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
26273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington          link = _dbus_list_get_next_link (&files, link);
26280cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington        }
262977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
263077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      link = _dbus_list_get_first_link (&files);
263177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      while (link != NULL)
263277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        {
263377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          File *f = link->data;
263477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
263577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          print_poorly_tested_functions (f, &stats);
263677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington
263777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington          link = _dbus_list_get_next_link (&files, link);
263877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington        }
263927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
264027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      link = _dbus_list_get_first_link (&files);
264127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington      while (link != NULL)
264227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        {
264327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          File *f = link->data;
264427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
264527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          print_n_untested_blocks_by_function (f, &stats);
264627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington
264727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington          link = _dbus_list_get_next_link (&files, link);
264827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington        }
26493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington    }
26503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington
26513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington  return 0;
26523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}
2653