1*85f87cf4SRuslan Bukin /*
2*85f87cf4SRuslan Bukin * Copyright (c) 2018-2019, Intel Corporation
3*85f87cf4SRuslan Bukin *
4*85f87cf4SRuslan Bukin * Redistribution and use in source and binary forms, with or without
5*85f87cf4SRuslan Bukin * modification, are permitted provided that the following conditions are met:
6*85f87cf4SRuslan Bukin *
7*85f87cf4SRuslan Bukin * * Redistributions of source code must retain the above copyright notice,
8*85f87cf4SRuslan Bukin * this list of conditions and the following disclaimer.
9*85f87cf4SRuslan Bukin * * Redistributions in binary form must reproduce the above copyright notice,
10*85f87cf4SRuslan Bukin * this list of conditions and the following disclaimer in the documentation
11*85f87cf4SRuslan Bukin * and/or other materials provided with the distribution.
12*85f87cf4SRuslan Bukin * * Neither the name of Intel Corporation nor the names of its contributors
13*85f87cf4SRuslan Bukin * may be used to endorse or promote products derived from this software
14*85f87cf4SRuslan Bukin * without specific prior written permission.
15*85f87cf4SRuslan Bukin *
16*85f87cf4SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*85f87cf4SRuslan Bukin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*85f87cf4SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*85f87cf4SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*85f87cf4SRuslan Bukin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*85f87cf4SRuslan Bukin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*85f87cf4SRuslan Bukin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*85f87cf4SRuslan Bukin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*85f87cf4SRuslan Bukin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*85f87cf4SRuslan Bukin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*85f87cf4SRuslan Bukin * POSSIBILITY OF SUCH DAMAGE.
27*85f87cf4SRuslan Bukin */
28*85f87cf4SRuslan Bukin
29*85f87cf4SRuslan Bukin #ifndef PT_VERSION_H
30*85f87cf4SRuslan Bukin #define PT_VERSION_H
31*85f87cf4SRuslan Bukin
32*85f87cf4SRuslan Bukin #include "intel-pt.h"
33*85f87cf4SRuslan Bukin
34*85f87cf4SRuslan Bukin #include <stdio.h>
35*85f87cf4SRuslan Bukin #include <inttypes.h>
36*85f87cf4SRuslan Bukin
37*85f87cf4SRuslan Bukin
pt_fprint_version(FILE * file,struct pt_version version)38*85f87cf4SRuslan Bukin static inline int pt_fprint_version(FILE *file, struct pt_version version)
39*85f87cf4SRuslan Bukin {
40*85f87cf4SRuslan Bukin if (version.build) {
41*85f87cf4SRuslan Bukin if (version.ext && version.ext[0])
42*85f87cf4SRuslan Bukin return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
43*85f87cf4SRuslan Bukin "-%" PRIu32 "-%s", version.major,
44*85f87cf4SRuslan Bukin version.minor, version.patch,
45*85f87cf4SRuslan Bukin version.build, version.ext);
46*85f87cf4SRuslan Bukin else
47*85f87cf4SRuslan Bukin return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
48*85f87cf4SRuslan Bukin "-%" PRIu32 "", version.major,
49*85f87cf4SRuslan Bukin version.minor, version.patch,
50*85f87cf4SRuslan Bukin version.build);
51*85f87cf4SRuslan Bukin } else {
52*85f87cf4SRuslan Bukin if (version.ext && version.ext[0])
53*85f87cf4SRuslan Bukin return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
54*85f87cf4SRuslan Bukin "-%s", version.major, version.minor,
55*85f87cf4SRuslan Bukin version.patch, version.ext);
56*85f87cf4SRuslan Bukin else
57*85f87cf4SRuslan Bukin return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16,
58*85f87cf4SRuslan Bukin version.major, version.minor,
59*85f87cf4SRuslan Bukin version.patch);
60*85f87cf4SRuslan Bukin }
61*85f87cf4SRuslan Bukin }
62*85f87cf4SRuslan Bukin
pt_print_version(struct pt_version version)63*85f87cf4SRuslan Bukin static inline int pt_print_version(struct pt_version version)
64*85f87cf4SRuslan Bukin {
65*85f87cf4SRuslan Bukin return pt_fprint_version(stdout, version);
66*85f87cf4SRuslan Bukin }
67*85f87cf4SRuslan Bukin
pt_print_tool_version(const char * name)68*85f87cf4SRuslan Bukin static inline void pt_print_tool_version(const char *name)
69*85f87cf4SRuslan Bukin {
70*85f87cf4SRuslan Bukin struct pt_version v = {
71*85f87cf4SRuslan Bukin /* .major = */ PT_VERSION_MAJOR,
72*85f87cf4SRuslan Bukin /* .minor = */ PT_VERSION_MINOR,
73*85f87cf4SRuslan Bukin /* .patch = */ PT_VERSION_PATCH,
74*85f87cf4SRuslan Bukin /* .build = */ PT_VERSION_BUILD,
75*85f87cf4SRuslan Bukin /* .ext = */ PT_VERSION_EXT
76*85f87cf4SRuslan Bukin };
77*85f87cf4SRuslan Bukin
78*85f87cf4SRuslan Bukin if (!name)
79*85f87cf4SRuslan Bukin name = "<unknown>";
80*85f87cf4SRuslan Bukin
81*85f87cf4SRuslan Bukin printf("%s-", name);
82*85f87cf4SRuslan Bukin pt_print_version(v);
83*85f87cf4SRuslan Bukin printf(" / libipt-");
84*85f87cf4SRuslan Bukin pt_print_version(pt_library_version());
85*85f87cf4SRuslan Bukin printf("\n");
86*85f87cf4SRuslan Bukin }
87*85f87cf4SRuslan Bukin
88*85f87cf4SRuslan Bukin #endif /* PT_VERSION_H */
89