gcov-iov.c 2.23 KB
Newer Older
1 2
/* Generate gcov version string from version.c. See gcov-io.h for
   description of how the version string is generated.
3
   Copyright (C) 2002-2019 Free Software Foundation, Inc.
4
   Contributed by Nathan Sidwell <nathan@codesourcery.com>
5

6 7 8 9
This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11 12 13 14 15 16 17 18
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
21

22 23
#include "bconfig.h"
#include "system.h"
24

Zack Weinberg committed
25 26
/* Command line arguments are the base GCC version and the development
   phase (the latter may be an empty string).  */
27 28

int
Zack Weinberg committed
29
main (int argc, char **argv)
30
{
Zack Weinberg committed
31
  unsigned int version = 0;
32
  unsigned char v[4];
Zack Weinberg committed
33 34 35 36 37
  unsigned int ix;
  unsigned long major;
  unsigned long minor = 0;
  char phase = 0;
  char *ptr;
38

Zack Weinberg committed
39 40 41 42 43 44 45 46 47 48 49 50
  if (argc != 3)
    {
      fprintf (stderr, "usage: %s 'version' 'phase'\n", argv[0]);
      return 1;
    }

  ptr = argv[1];
  major = strtoul (ptr, &ptr, 10);

  if (*ptr == '.')
    minor = strtoul (ptr + 1, 0, 10);

51 52 53 54 55
  /* For releases the development phase is an empty string, for
     prerelease versions on a release branch it is "prerelease".
     Consider both equal as patch-level releases do not change
     the GCOV version either.
     On the trunk the development phase is "experimental".  */
Zack Weinberg committed
56
  phase = argv[2][0];
57 58
  if (phase == '\0'
      || strcmp (argv[2], "prerelease") == 0)
Zack Weinberg committed
59
    phase = '*';
60

61 62 63
  v[0] = (major / 10) + 'A';
  v[1] = (major % 10) + '0';
  v[2] = minor + '0';
Zack Weinberg committed
64
  v[3] = phase;
65

66 67 68 69
  for (ix = 0; ix != 4; ix++)
    version = (version << 8) | v[ix];

  printf ("/* Generated automatically by the program `%s'\n", argv[0]);
Zack Weinberg committed
70 71
  printf ("   from `%s (%lu %lu) and %s (%c)'.  */\n",
	  argv[1], major, minor, argv[2], phase);
72
  printf ("\n");
73
  printf ("#define GCOV_VERSION ((gcov_unsigned_t)0x%08x)  /* %.4s */\n",
74
	  version, v);
75

76 77
  return 0;
}