1
2
3
4
5
6
7
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
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
$NetBSD: patch-src_readConfig-fixclang.cpp,v 1.1 2019/08/11 15:38:22 ng0 Exp $
This patch has been imported from FreeBSD ports, written by adridg.
The later chunks (using i2b) are compile fixes on aarch64 (presumably with
clang6 as well). Typical error message reads
readConfig.cpp:407:54: error: non-constant-expression cannot be narrowed
from type 'int' to 'unsigned char' in initializer list [-Wc++11-narrowing]
unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
^~~~~~~~
readConfig.cpp:407:54: note: insert an explicit cast to silence this issue
unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
^~~~~~~~
static_cast<unsigned char>( )
Since it happens in a half-dozen places, introduce a trivial helper function.
--- src/readConfig.cpp.orig 2018-01-21 16:58:09 UTC
+++ src/readConfig.cpp
@@ -4,6 +4,7 @@
#include <fstream>
#include <sstream>
#include <string>
+#include <clocale>
using namespace std;
#include "body.h"
@@ -20,6 +21,8 @@ using namespace std;
static PlanetProperties *defaultProperties;
static PlanetProperties *currentProperties;
+static inline unsigned char i2b( int x ) { return static_cast<unsigned int>(x) & 0xffU; }
+
static void
readConfig(const char *line, PlanetProperties *planetProperties[])
{
@@ -49,7 +52,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->ArcColor(color);
}
else
@@ -179,7 +182,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->Color(color);
}
else
@@ -244,7 +247,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->GridColor(color);
}
else
@@ -296,7 +299,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->MarkerColor(color);
}
else
@@ -403,7 +406,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->OrbitColor(color);
}
else
@@ -473,7 +476,7 @@ readConfig(const char *line, PlanetPrope
int r, g, b;
if (sscanf(returnString, "%d,%d,%d", &r, &g, &b) == 3)
{
- unsigned char color[3] = { r & 0xff, g & 0xff, b & 0xff };
+ unsigned char color[3] = { i2b(r), i2b(g), i2b(b) };
currentProperties->TextColor(color);
}
else
|