Blame view

tools/perf/util/units.c 1.03 KB
58db1d6e7   Arnaldo Carvalho de Melo   perf tools: Move ...
1
2
  #include "units.h"
  #include <inttypes.h>
3caeafce5   Arnaldo Carvalho de Melo   perf units: Move ...
3
4
5
  #include <limits.h>
  #include <stdlib.h>
  #include <string.h>
58db1d6e7   Arnaldo Carvalho de Melo   perf tools: Move ...
6
7
  #include <linux/kernel.h>
  #include <linux/time64.h>
3caeafce5   Arnaldo Carvalho de Melo   perf units: Move ...
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  unsigned long parse_tag_value(const char *str, struct parse_tag *tags)
  {
  	struct parse_tag *i = tags;
  
  	while (i->tag) {
  		char *s = strchr(str, i->tag);
  
  		if (s) {
  			unsigned long int value;
  			char *endptr;
  
  			value = strtoul(str, &endptr, 10);
  			if (s != endptr)
  				break;
  
  			if (value > ULONG_MAX / i->mult)
  				break;
  			value *= i->mult;
  			return value;
  		}
  		i++;
  	}
  
  	return (unsigned long) -1;
  }
58db1d6e7   Arnaldo Carvalho de Melo   perf tools: Move ...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  unsigned long convert_unit(unsigned long value, char *unit)
  {
  	*unit = ' ';
  
  	if (value > 1000) {
  		value /= 1000;
  		*unit = 'K';
  	}
  
  	if (value > 1000) {
  		value /= 1000;
  		*unit = 'M';
  	}
  
  	if (value > 1000) {
  		value /= 1000;
  		*unit = 'G';
  	}
  
  	return value;
  }
  
  int unit_number__scnprintf(char *buf, size_t size, u64 n)
  {
  	char unit[4] = "BKMG";
  	int i = 0;
  
  	while (((n / 1024) > 1) && (i < 3)) {
  		n /= 1024;
  		i++;
  	}
  
  	return scnprintf(buf, size, "%" PRIu64 "%c", n, unit[i]);
  }