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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
From f17a6562174ccf658eb35ba7a425d3ac340c1607 Mon Sep 17 00:00:00 2001
From: Robin Gareus <robin@gareus.org>
Date: Mon, 4 Nov 2024 18:46:21 +0100
Subject: [PATCH] use modern C++ for snprintf (#9841)
This replaces vector<char>::operator[] (which now
a constexpr since C++20). We could use &vector::data(),
but a unique_ptr seems more appropriate for the case at hand.
--- a/libs/ardour/broadcast_info.cc
+++ b/libs/ardour/broadcast_info.cc
@@ -39,15 +39,15 @@ namespace ARDOUR
static void
snprintf_bounded_null_filled (char* target, size_t target_size, char const * fmt, ...)
{
- std::vector<char> buf(target_size+1);
+ std::unique_ptr<char[]> buf (new char [target_size + 1]);
va_list ap;
va_start (ap, fmt);
- vsnprintf (&buf[0], target_size+1, fmt, ap);
+ vsnprintf (buf.get (), target_size+1, fmt, ap);
va_end (ap);
memset (target, 0, target_size);
- memcpy (target, &buf[0], target_size);
+ memcpy (target, buf.get (), target_size);
}
--- a/libs/ardour/export_graph_builder.cc
+++ b/libs/ardour/export_graph_builder.cc
@@ -796,9 +796,9 @@ ExportGraphBuilder::Intermediate::Intermediate (ExportGraphBuilder & parent, Fil
int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
if (parent._realtime) {
- tmp_file.reset (new TmpFileRt<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+ tmp_file.reset (new TmpFileRt<float> (tmpfile_path_buf.data (), format, channels, config.format->sample_rate()));
} else {
- tmp_file.reset (new TmpFileSync<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+ tmp_file.reset (new TmpFileSync<float> (tmpfile_path_buf.data (), format, channels, config.format->sample_rate()));
}
tmp_file->FileWritten.connect_same_thread (post_processing_connection,
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -1338,7 +1338,6 @@ IO::bundle_changed (Bundle::Change /*c*/)
string
IO::build_legal_port_name (std::shared_ptr<PortSet const> ports, DataType type)
{
- const int name_size = AudioEngine::instance()->port_name_size();
int limit;
string suffix;
@@ -1372,21 +1371,24 @@ IO::build_legal_port_name (std::shared_ptr<PortSet const> ports, DataType type)
// allow up to 4 digits for the output port number, plus the slash, suffix and extra space
+ uint32_t name_size = AudioEngine::instance()->port_name_size();
limit = name_size - AudioEngine::instance()->my_name().length() - (suffix.length() + 5);
- std::vector<char> buf1(name_size+1);
- std::vector<char> buf2(name_size+1);
+ ++name_size; // allow for \0
+
+ std::unique_ptr<char[]> buf1 (new char[name_size]);
+ std::unique_ptr<char[]> buf2 (new char[name_size]);
/* colons are illegal in port names, so fix that */
string nom = legalize_io_name (_name.val());
- snprintf (&buf1[0], name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str());
+ std::snprintf (buf1.get(), name_size, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str());
- int port_number = find_port_hole (ports, &buf1[0]);
- snprintf (&buf2[0], name_size+1, "%s %d", &buf1[0], port_number);
+ int port_number = find_port_hole (ports, buf1.get ());
+ std::snprintf (buf2.get(), name_size, "%s %d", buf1.get (), port_number);
- return string (&buf2[0]);
+ return string (buf2.get ());
}
int32_t
@@ -1400,17 +1402,17 @@ IO::find_port_hole (std::shared_ptr<PortSet const> ports, const char* base)
return 1;
}
- /* we only allow up to 4 characters for the port number
- */
+ uint32_t const name_size = AudioEngine::instance()->port_name_size() + 1;
+ /* we only allow up to 4 characters for the port number */
for (n = 1; n < 9999; ++n) {
- std::vector<char> buf (AudioEngine::instance()->port_name_size());
PortSet::const_iterator i = ports->begin ();
- snprintf (&buf[0], buf.size()+1, _("%s %u"), base, n);
+ std::unique_ptr<char[]> buf (new char[name_size]);
+ std::snprintf (buf.get (), name_size, "%s %u", base, n);
for ( ; i != ports->end (); ++i) {
- if (string (i->name()) == string (&buf[0])) {
+ if (string (i->name()) == string (buf.get ())) {
break;
}
}
@@ -1526,13 +1528,13 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
case 2:
return c == 0 ? _("L") : _("R");
default:
- snprintf (buf, sizeof(buf), "%d", (c + 1));
+ std::snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
} else {
- snprintf (buf, sizeof(buf), "%d", (c + 1));
+ std::snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
|