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