14# define __has_feature(x) 0
16#ifndef __has_extension
17# define __has_extension __has_feature
21#if defined(HAVE_CPP11_SUPPORT)
22# if HAVE_CPP11_SUPPORT
23# define DISTRHO_PROPER_CPP11_SUPPORT
25#elif __cplusplus >= 201103L || (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405) || __has_extension(cxx_noexcept)
26# define DISTRHO_PROPER_CPP11_SUPPORT
27# if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407 && ! defined(__clang__)) || (defined(__clang__) && ! __has_extension(cxx_override_control))
35static inline void scat(
char *dest,
const char *src)
38 while(*src && *src!=
':') *dest++ = *src++;
58 int n =
sizeof(
idx)/
sizeof(
int);
59 for(
int i=
n-2;
i >= 0; --
i)
167Port::MetaIterator::operator bool(
void)
const
191 for(
const auto x : *
this)
192 if(!strcmp(
x.title, str))
210 for(
const auto x : *
this)
211 if(!strcmp(
x.title, str))
222 const char *arg_str = args;
226 arg_match &= (*
pattern++==*arg_str++);
229 if(arg_match && !*arg_str)
238inline bool scmp(
const char *
a,
const char *
b)
240 while(*
a && *
a == *
b)
a++,
b++;
273 arg_match &= (*
pattern++==*arg_str++);
276 if(arg_match && !*arg_str)
304 tuple.push_back(
s.length());
305 for(
const auto &
p:pos)
306 if(
p < (
int)
s.size())
307 tuple.push_back(
s[
p]);
308 tvec.push_back(std::move(tuple));
320 for(
int i=0;
i<
N; ++
i) {
323 for(
int j=
i+1;
j<
N; ++
j) {
333template<
class T,
class Z>
347 int current_dups = strs.size();
353 int pos_best_val = std::numeric_limits<int>::max();
356 for(
int i=0;
i<
N; ++
i) {
361 auto hashed =
do_hash(strs, npos);
363 if(
d < pos_best_val) {
368 if(pos_best_val >= current_dups)
370 current_dups = pos_best_val;
371 pos.push_back(pos_best);
373 auto hashed =
do_hash(strs, pos);
384 ivec.reserve(strs.size());
388 if(
p < (
int)
s.size())
398 int current_dups = strs.size();
400 std::vector<char> useful_chars;
403 if(!
has(useful_chars,
c))
404 useful_chars.push_back(
c);
406 for(
int i=0;
i<
N; ++
i)
410 int assoc_best_val = std::numeric_limits<int>::max();;
411 for(
int k=0;
k<4; ++
k)
413 for(
int i:useful_chars) {
414 assoc_best_val = std::numeric_limits<int>::max();
415 for(
int j=0;
j<100; ++
j) {
418 auto hashed =
do_hash(strs, pos, assoc);
424 if(
d < assoc_best_val) {
429 assoc[
i] = assoc_best;
431 if(assoc_best_val >= current_dups)
433 current_dups = assoc_best_val;
435 auto hashed =
do_hash(strs, pos, assoc);
444 auto hashed =
do_hash(strs, pos, assoc);
450 for(
int i=0;
i<
N; ++
i)
452 for(
int i=0;
i<(
int)hashed.size(); ++
i)
453 remap[hashed[
i]] =
i;
464 fprintf(stderr,
"rtosc: Failed to generate minimal hash\n");
477 for(
unsigned i=0;
i<
p.ports.size(); ++
i)
478 if(strchr(
p.ports[
i].name,
'#'))
482 for(
unsigned i=0;
i<
p.ports.size(); ++
i)
484 std::string
tmp =
p.ports[
i].name;
486 int idx =
tmp.find(
':');
488 arg =
p.ports[
i].name+idx;
509 delete []
impl->enump;
513#if !defined(__GNUC__)
514#define __builtin_expect(a,b) a
519 if(!strcmp(
m,
"pointer"))
539 if(!
d.loc || !
d.loc_size) {
542 d.port = &port, port.cb(
m,
d),
d.obj = obj;
550 memset(
d.loc, 0,
d.loc_size);
554 char *old_end =
d.loc;
555 while(*old_end) ++old_end;
557 if(
impl->pos.empty()) {
558 for(
unsigned i=0;
i<
elms; ++
i) {
567 if(strchr(port.name,
'#')) {
570 while(*
msg &&
msg != m_end)
574 scat(
d.loc, port.name);
579 port.cb(
m,
d),
d.obj = obj;
591 while(*
tmp && *
tmp !=
'/')
599 for(
auto p:
impl->pos)
610 int port_num =
impl->remap[
t];
619 if(
impl->enump[port_num]) {
622 while(*
msg && *
msg !=
'/')
624 if(strchr(port.name,
'/'))
628 memcpy(old_end,
impl->fixed[port_num].c_str(),
629 impl->fixed[port_num].length()+1);
634 port.cb(
m,
d),
d.obj = obj;
678 void reply(
const char *,
const char *args, ...)
override
683 size_t nargs = strlen(args);
714 char* buffer_with_port,
715 std::size_t buffersize,
718 std::size_t addr_len = strlen(buffer_with_port);
722 CapturePretty d(buffer_with_port + addr_len, buffersize - addr_len,
725 d.loc_size = loc_size;
730 assert(buffersize - addr_len >= 8);
732 memset(buffer_with_port + addr_len, 0, 8);
733 buffer_with_port[addr_len + (4-addr_len%4)] =
',';
735 d.message = buffer_with_port;
738 ports.
dispatch(buffer_with_port,
d,
false);
750 void chain(
const char *path,
const char *args, ...)
override
766 for(
const char* ptr = args; *ptr; ++ptr, ++cur_idx)
770 arg_vals[cur_idx].val = vals[cur_idx];
775 void reply(
const char *,
const char *args, ...)
override
780 nargs = strlen(args);
816 const char* portname_from_base,
817 char* buffer_with_port,
818 std::size_t buffersize,
819 std::size_t max_args,
822 strncpy(buffer_with_port, portname_from_base, buffersize);
823 std::size_t addr_len = strlen(buffer_with_port);
827 d.loc_size = loc_size;
834 assert(buffersize - addr_len >= 8);
836 memset(buffer_with_port + addr_len, 0, 8);
837 buffer_with_port[addr_len + (4-addr_len%4)] =
',';
842 d.message = buffer_with_port;
843 port.cb(buffer_with_port,
d);
854 void* runtime,
const Port* port_hint,
857 constexpr std::size_t buffersize = 1024;
858 char buffer[buffersize];
859 char loc[buffersize] =
"";
863 char default_annotation[20] =
"default";
866 const char*
const dependent_annotation =
"default depends";
867 const char* return_value =
nullptr;
870 port_hint = ports.
apropos(port_name);
878 const char* dependent = metadata[dependent_annotation];
881 char* dependent_port = buffer;
884 assert(strlen(port_name) + strlen(dependent_port) + 5 < buffersize);
885 strncat(dependent_port, port_name,
886 buffersize - strlen(dependent_port) - 1);
887 strncat(dependent_port,
"/../",
888 buffersize - strlen(dependent_port) - 1);
889 strncat(dependent_port, dependent,
890 buffersize - strlen(dependent_port) - 1);
895 if(*dependent_port ==
'/')
898 const char* dependent_value =
905 runtime,
NULL, recursive-1);
907 assert(strlen(dependent_value) < 16);
909 char* default_variant = buffer;
910 *default_variant = 0;
911 assert(strlen(default_annotation) + 1 + 16 < buffersize);
912 strncat(default_variant, default_annotation,
913 buffersize - strlen(default_variant));
914 strncat(default_variant,
" ", buffersize - strlen(default_variant));
915 strncat(default_variant, dependent_value,
916 buffersize - strlen(default_variant));
918 return_value = metadata[default_variant];
932 return_value = metadata[default_annotation];
933 assert(!dependent || return_value);
940 const char* port_args,
943 const char*
first = port_args;
944 int errors_found = 0;
949 for(
size_t i = 0;
i <
n; ++
i, ++
first, ++av)
962 if(
val == std::numeric_limits<int>::min())
977 char mapbuf[20] =
"map ";
979 for(
size_t i = 0;
i <
n; ++
i, ++av)
983 snprintf(mapbuf + 4, 16,
"%d", av->
val.
i);
984 const char*
val = meta[mapbuf];
996 void* runtime,
const Port* port_hint,
999 char* strbuf,
size_t strbufsize)
1019 fprintf(stderr,
"Could not canonicalize %s\n", pretty);
1032 constexpr std::size_t buffersize = 1024;
1033 char port_buffer[buffersize];
1034 memset(port_buffer, 0, buffersize);
1036 const size_t max_arg_vals = 256;
1038 auto on_reach_port =
1039 [](
const Port*
p,
const char* port_buffer,
1040 const char* port_from_base,
const Ports& base,
1041 void*
data,
void* runtime)
1046 if((
p->name[strlen(
p->name)-1] !=
':' && !strstr(
p->name,
"::"))
1047 || meta.
find(
"parameter") == meta.
end())
1054 char loc[buffersize] =
"";
1057 char buffer_with_port[buffersize];
1058 char cur_value_pretty[buffersize] =
" ";
1059 char strbuf[buffersize];
1061 std::string* res = (std::string*)
data;
1062 assert(strlen(port_buffer) + 1 < buffersize);
1063 strncpy(loc, port_buffer, buffersize);
1065 strncpy(buffer_with_port, port_from_base, buffersize);
1066 const char* portargs = strchr(
p->name,
':');
1068 portargs =
p->name + strlen(
p->name);
1071 if(!strncmp(port_buffer,
"/part1/Penabled", 5) &&
1072 !strncmp(port_buffer+6,
"/Penabled", 9))
1074 printf(
"runtime: %ld\n", (
long int)runtime);
1097 if(nargs_default == (
int) nargs_runtime)
1100 strchr(
p->name,
':'), meta);
1109 cur_value_pretty + 1, buffersize - 1,
1110 NULL, strlen(port_buffer) + 1);
1112 *res += port_buffer;
1113 *res += cur_value_pretty;
1119 walk_ports(&ports, port_buffer, buffersize, &res, on_reach_port,
1123 res.resize(res.length()-1);
1147 || !(dependency ^ first_round))
1153 size_t,
size_t nargs,
1162 const Ports& ports,
void* runtime,
1165 constexpr std::size_t buffersize = 1024;
1166 char portname[buffersize],
message[buffersize], strbuf[buffersize];
1167 int rd, rd_total = 0;
1181 for(
int round = 0; round < 2 && msgs_read >= 0; ++round)
1185 const char* msg_ptr = messages;
1186 while(*msg_ptr && (msgs_read >= 0))
1193 size_t maxargs = 16;
1196 arg_vals, nargs, strbuf, buffersize);
1203 ? !!port->meta()[
"default depends"]
1209 nargs =
dispatcher->on_dispatch(buffersize, portname,
1210 maxargs, nargs, arg_vals,
1214 msgs_read = -rd_total-1;
1220 char argstr[nargs+1];
1221 for(
int i = 0;
i < nargs; ++
i) {
1222 vals[
i] = arg_vals[
i].
val;
1223 argstr[
i] = arg_vals[
i].
type;
1237 else if(nargs == std::numeric_limits<int>::min())
1246 msgs_read = -rd_total-1;
1257 char rtosc_vbuf[12], app_vbuf[12];
1265 res +=
"% RT OSC v"; res += rtosc_vbuf; res +=
" savefile\n"
1266 "% "; res += appname; res +=
" v"; res += app_vbuf; res +=
"\n";
1273 const Ports& ports,
void* runtime,
1274 const char* appname,
1287 unsigned vma, vmi, vre;
1290 sscanf(file_content,
1291 "%% RT OSC v%u.%u.%u savefile%n ", &vma, &vmi, &vre, &
n);
1293 return -bytes_read-1;
1304 sscanf(file_content,
1305 "%% %128s v%u.%u.%u%n ", appbuf, &vma, &vmi, &vre, &
n);
1306 if(
n <= 0 || strcmp(appbuf, appname) || vma > 255 || vmi > 255 || vre > 255)
1307 return -bytes_read-1;
1321 return (rval < 0) ? (rval-bytes_read) : rval;
1331 const char *_needle =
name,
1332 *_haystack = port.name;
1333 while(*_needle && *_needle==*_haystack)_needle++,_haystack++;
1335 if(*_needle == 0 && (*_haystack ==
':' || *_haystack ==
'\0')) {
1344 while(*
m && *
m !=
'/') ++
m;
1350 if(path && path[0] ==
'/')
1355 return (strchr(path,
'/')[1]==0) ? &port :
1356 port.ports->apropos(
snip(path));
1360 if(*path && (strstr(port.name, path)==port.name ||
1380 bool doBreak = *
r==
'/';
1393 bool doBreak = *
r==
'/';
1405 while(*p_end) p_end++;
1411 char *write_pos = p_end;
1412 char *read_pos = p_end;
1413 while(read_pos >=
p) {
1422 }
else if(consuming) {
1435 delete []
impl->enump;
1447 std::initializer_list<ClonePort>
c)
1450 for(
auto &to_clone:
c) {
1452 for(
auto &
p:ports_.ports)
1453 if(!strcmp(
p.name, to_clone.name))
1455 if(!clone_port && strcmp(
"*", to_clone.name)) {
1456 fprintf(stderr,
"Cannot find a clone port for '%s'\n",to_clone.name);
1461 ports.push_back({clone_port->
name, clone_port->
metadata,
1462 clone_port->
ports, to_clone.cb});
1464 default_handler = to_clone.cb;
1475 for(
auto *to_clone:
c) {
1477 for(
auto &
p:to_clone->ports) {
1478 bool already_there =
false;
1480 if(!strcmp(
pp.name,
p.name))
1481 already_there =
true;
1501 const Ports& base,
void *runtime)
1505 const char* enable_port = port->meta()[
"enabled by"];
1512 const char*
n = port->name;
1513 const char*
e = enable_port;
1514 for( ; *
n && (*
n == *
e) && *
n !=
'/' && *
e !=
'/'; ++
n, ++
e) ;
1516 bool subport = (*
e ==
'/' && *
n ==
'/');
1518 const char* ask_port_str = subport
1522 const Ports& ask_ports = subport ? *base[port->name]->
ports
1525 assert(!strchr(ask_port_str,
'/'));
1526 const Port* ask_port = ask_ports[ask_port_str];
1535 strncat(loc,
"/../", loc_size - strlen(loc) - 1);
1536 strncat(loc, enable_port, loc_size - strlen(loc) - 1);
1539 loc_size -= (collapsed_loc - loc);
1547 strncpy(buf, collapsed_loc, loc_size);
1551 const char* last_slash = strrchr(collapsed_loc,
'/');
1553 last_slash ? last_slash + 1 : collapsed_loc,
1557 loc_size, collapsed_loc, ask_port_str,
1560 return rval.
val.
T ==
'T';
1577 auto walk_ports_recurse = [](
const Port&
p,
char* name_buffer,
1578 size_t buffer_size,
const Ports& base,
1580 void* runtime,
const char* old_end)
1584 bool enabled =
true;
1587 enabled = (
p.meta().find(
"no walk") ==
p.meta().end());
1596 strncpy(buf, old_end, 1024);
1597 strncat(buf,
"pointer", 1024 - strlen(buf) - 1);
1598 assert(1024 - strlen(buf) >= 8);
1599 strncpy(buf + strlen(buf) + 1,
",", 2);
1605 enabled = (bool) runtime;
1616 data, walker, runtime);
1625 if(name_buffer[0] == 0)
1626 name_buffer[0] =
'/';
1628 char *old_end = name_buffer;
1629 while(*old_end) ++old_end;
1633 for(
const Port &
p: *base) {
1636 if(strchr(
p.name,
'#')) {
1637 const char *
name =
p.name;
1638 char *pos = old_end;
1639 while(*
name !=
'#') *pos++ = *
name++;
1640 const unsigned max = atoi(
name+1);
1642 for(
unsigned i=0;
i<
max; ++
i)
1647 if(strrchr(name_buffer,
'/')[1] !=
'/')
1648 strcat(name_buffer,
"/");
1651 walk_ports_recurse(
p, name_buffer, buffer_size,
1652 *base,
data, walker, runtime, old_end);
1656 const char* old_end = name_buffer + strlen(name_buffer);
1657 scat(name_buffer,
p.name);
1660 walk_ports_recurse(
p, name_buffer, buffer_size,
1661 *base,
data, walker, runtime, old_end);
1664 if(strchr(
p.name,
'#')) {
1665 const char *
name =
p.name;
1666 char *pos = old_end;
1667 while(*
name !=
'#') *pos++ = *
name++;
1668 const unsigned max = atoi(
name+1);
1669 while(isdigit(*++
name)) ;
1671 for(
unsigned i=0;
i<
max; ++
i)
1673 char* pos_after_num = pos +
sprintf(pos,
"%d",
i);
1674 const char* name2_2 =
name;
1677 while(*name2_2 && *name2_2 !=
':')
1678 *pos_after_num++ = *name2_2++;
1681 walker(&
p, name_buffer, old_end, *base,
data, runtime);
1685 scat(name_buffer,
p.name);
1688 walker(&
p, name_buffer, old_end, *base,
data, runtime);
1693 char *
tmp = old_end;
1709 if(name_buffer[0] == 0)
1710 name_buffer[0] =
'/';
1712 char *old_end = name_buffer;
1713 while(*old_end) ++old_end;
1716 if(strchr(
p.name,
'/')) {
1717 if(strchr(
p.name,
'#')) {
1718 const char *
name =
p.name;
1719 char *pos = old_end;
1720 while(*
name !=
'#') *pos++ = *
name++;
1721 const unsigned max = atoi(
name+1);
1728 if(strrchr(name_buffer,
'/')[1] !=
'/')
1729 strcat(name_buffer,
"/");
1737 scat(name_buffer,
p.name);
1744 if(strchr(
p.name,
'#')) {
1745 const char *
name =
p.name;
1746 char *pos = old_end;
1747 while(*
name !=
'#') *pos++ = *
name++;
1748 const unsigned max = atoi(
name+1);
1755 walker(&
p, name_buffer, old_end, *base,
data,
nullptr);
1759 scat(name_buffer,
p.name);
1762 walker(&
p, name_buffer, old_end, *base,
data,
nullptr);
1767 char *
tmp = old_end;
1772static void units(std::ostream &o,
const char *
u)
1776 o <<
" units=\"" <<
u <<
"\"";
1785 if(strstr(
m.title,
"map "))
1786 min = atoi(
m.title+4);
1789 if(strstr(
m.title,
"map "))
1790 min =
min>atoi(
m.title+4) ? atoi(
m.title+4) :
min;
1799 if(strstr(
m.title,
"map "))
1800 max = atoi(
m.title+4);
1803 if(strstr(
m.title,
"map "))
1804 max =
max<atoi(
m.title+4) ? atoi(
m.title+4) :
max;
1811 int result = std::numeric_limits<int>::min();
1814 if(strstr(
m.title,
"map "))
1815 if(!strcmp(
m.value,
value))
1826 string sym_names =
"xyzabcdefghijklmnopqrstuvw";
1828 bool has_options =
false;
1830 if(strstr(
m.title,
"map "))
1833 if(strcmp(
m.title,
"documentation") &&
1834 strcmp(
m.title,
"parameter") &&
1835 strcmp(
m.title,
"max") &&
1836 strcmp(
m.title,
"min"))
1837 printf(
"m.title = <%s>\n",
m.title);
1844 if(strstr(
m.title,
"map ")) {
1845 o <<
" <point symbol=\"" << sym_names[sym_idx++] <<
"\" value=\"";
1846 o <<
m.title+4 <<
"\">" <<
m.value <<
"</point>\n";
1855 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"T\">\n";
1856 o <<
" <desc>Enable " << doc <<
"</desc>\n";
1857 o <<
" <param_T symbol=\"x\"/>\n";
1858 o <<
" </message_in>\n";
1859 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"F\">\n";
1860 o <<
" <desc>Disable " << doc <<
"</desc>\n";
1861 o <<
" <param_F symbol=\"x\"/>\n";
1862 o <<
" </message_in>\n";
1863 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"\">\n";
1864 o <<
" <desc>Get state of " << doc <<
"</desc>\n";
1865 o <<
" </message_in>\n";
1866 o <<
" <message_out pattern=\"" <<
name <<
"\" typetag=\"T\">\n";
1867 o <<
" <desc>Value of " << doc <<
"</desc>\n";
1868 o <<
" <param_T symbol=\"x\"/>";
1869 o <<
" </message_out>\n";
1870 o <<
" <message_out pattern=\"" <<
name <<
"\" typetag=\"F\">\n";
1871 o <<
" <desc>Value of " << doc <<
"</desc>\n";
1872 o <<
" <param_F symbol=\"x\"/>";
1873 o <<
" </message_out>\n";
1878 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"*\">\n";
1879 o <<
" <desc>" << doc <<
"</desc>\n";
1880 o <<
" </message_in>\n";
1886 const char *
t =
type.c_str();
1887 string arg_names =
"xyzabcdefghijklmnopqrstuvw";
1894 while(*
t && *
t !=
':')
1897 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"" << args <<
"\">\n";
1898 o <<
" <desc>" << doc <<
"</desc>\n";
1900 assert(args.length()<arg_names.length());
1901 for(
unsigned i=0;
i<args.length(); ++
i)
1902 o <<
" <param_" << args[
i] <<
" symbol=\"" << arg_names[
i] <<
"\"/>\n";
1903 o <<
" </message_in>\n";
1912 const Ports&,
void *
v,
void*)
1914 std::ostream &o = *(std::ostream*)
v;
1915 auto meta =
p->meta();
1916 const char *args = strchr(
p->name,
':');
1917 auto mparameter = meta.find(
"parameter");
1918 auto mdoc = meta.find(
"documentation");
1921 if(mdoc !=
p->meta().end())
1923 if(meta.find(
"internal") != meta.end()) {
1924 doc +=
"[INTERNAL]";
1927 if(mparameter !=
p->meta().end()) {
1930 if(strchr(args,
'f'))
1932 else if(strchr(args,
'i'))
1934 else if(strchr(args,
'c'))
1936 else if(strchr(args,
'T'))
1938 else if(strchr(args,
's'))
1943 fprintf(stderr,
"rtosc port dumper: Cannot handle '%s'\n",
name);
1944 fprintf(stderr,
" args = <%s>\n", args);
1953 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"" <<
type <<
"\">\n";
1954 o <<
" <desc>Set Value of " << doc <<
"</desc>\n";
1955 if(meta.find(
"min") != meta.end() && meta.find(
"max") != meta.end() &&
type !=
'c') {
1956 o <<
" <param_" <<
type <<
" symbol=\"x\"";
1957 units(o, meta[
"unit"]);
1959 o <<
" <range_min_max " << (
type ==
'f' ?
"lmin=\"[\" lmax=\"]\"" :
"");
1960 o <<
" min=\"" << meta[
"min"] <<
"\" max=\"" << meta[
"max"] <<
"\"/>\n";
1961 o <<
" </param_" <<
type <<
">";
1962 }
else if(meta.find(
"enumerated") != meta.end()) {
1963 o <<
" <param_" <<
type <<
" symbol=\"x\">\n";
1964 o <<
" <range_min_max min=\"" <<
enum_min(meta) <<
"\" max=\"";
1967 o <<
" </range_min_max>\n";
1968 o <<
" </param_" <<
type <<
">\n";
1970 o <<
" <param_" <<
type <<
" symbol=\"x\"";
1971 units(o, meta[
"unit"]);
1974 o <<
" </message_in>\n";
1975 o <<
" <message_in pattern=\"" <<
name <<
"\" typetag=\"\">\n";
1976 o <<
" <desc>Get Value of " << doc <<
"</desc>\n";
1977 o <<
" </message_in>\n";
1978 o <<
" <message_out pattern=\"" <<
name <<
"\" typetag=\"" <<
type <<
"\">\n";
1979 o <<
" <desc>Value of " << doc <<
"</desc>\n";
1980 if(meta.find(
"min") != meta.end() && meta.find(
"max") != meta.end() &&
type !=
'c') {
1981 o <<
" <param_" <<
type <<
" symbol=\"x\"";
1982 units(o, meta[
"unit"]);
1984 o <<
" <range_min_max " << (
type ==
'f' ?
"lmin=\"[\" lmax=\"]\"" :
"");
1985 o <<
" min=\"" << meta[
"min"] <<
"\" max=\"" << meta[
"max"] <<
"\"/>\n";
1986 o <<
" </param_" <<
type <<
">\n";
1987 }
else if(meta.find(
"enumerated") != meta.end()) {
1988 o <<
" <param_" <<
type <<
" symbol=\"x\">\n";
1989 o <<
" <range_min_max min=\"" <<
enum_min(meta) <<
"\" max=\"";
1992 o <<
" </range_min_max>\n";
1993 o <<
" </param_" <<
type <<
">\n";
1995 o <<
" <param_" <<
type <<
" symbol=\"x\"";
1996 units(o, meta[
"unit"]);
1999 o <<
" </message_out>\n";
2000 }
else if(mdoc != meta.end() && (!args || args == std::string(
""))) {
2002 }
else if(mdoc != meta.end() && args) {
2004 }
else if(mdoc != meta.end()) {
2005 fprintf(stderr,
"Skipping \"%s\"\n",
name);
2007 fprintf(stderr,
" type = %s\n", args);
2010 fprintf(stderr,
"Skipping [UNDOCUMENTED] \"%s\"\n",
name);
2015 o <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
2016 o <<
"<osc_unit format_version=\"1.0\">\n";
2018 o <<
" <name>" << formatter.
prog_name <<
"</name>\n";
2019 o <<
" <uri>" << formatter.
uri <<
"</uri>\n";
2020 o <<
" <doc_origin>" << formatter.
doc_origin <<
"</doc_origin>\n";
2022 o <<
"</firstname><lastname>" << formatter.
author_last <<
"</lastname></author>\n";
2025 memset(buffer, 0,
sizeof(buffer));
2027 o <<
"</osc_unit>\n";
void walk_ports2(const rtosc::Ports *base, char *name_buffer, size_t buffer_size, void *data, rtosc::port_walker_t walker)
Definition ports.cpp:1698
uint8_t a
Definition Spc_Cpu.h:141
float arg(const fft_t *freqs, off_t x)
Definition OscilGen.cpp:58
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
static intptr_t dispatcher(NativeHostHandle h, NativeHostDispatcherOpcode c, int32_t i, intptr_t v, void *p, float o)
Definition carla-host-plugin.c:48
RtData subclass to capture argument values from a runtime object.
Definition ports.cpp:745
rtosc_arg_val_t * arg_vals
Definition ports.cpp:747
int nargs
Definition ports.cpp:748
void chain(const char *msg) override
Bypass message to some kind of backend if the message can not be handled.
Definition ports.cpp:755
void reply(const char *, const char *args,...) override
Definition ports.cpp:775
void replyArray(const char *, const char *args, rtosc_arg_t *vals) override
Definition ports.cpp:762
void chain(const char *path, const char *args,...) override
Definition ports.cpp:750
void reply(const char *) override
Reply if information has been requested.
Definition ports.cpp:760
int size() const
Return the number of argument values stored.
Definition ports.cpp:789
Capture(std::size_t max_args, rtosc_arg_val_t *arg_vals)
Definition ports.cpp:790
size_t max_args
Definition ports.cpp:746
int cols_used
Definition ports.cpp:656
CapturePretty(char *buffer, std::size_t size, int cols_used)
Definition ports.cpp:699
std::size_t buffersize
Definition ports.cpp:655
const char * value() const
Return the argument values, pretty-printed.
Definition ports.cpp:698
void reply(const char *, const char *args,...) override
Definition ports.cpp:678
char * buffer
Definition ports.cpp:654
void reply(const char *) override
Reply if information has been requested.
Definition ports.cpp:658
bool * enump
Definition ports.cpp:255
bool rtosc_match_args(const char *pattern, const char *msg)
Definition ports.cpp:262
ivec_t assoc
Definition ports.cpp:259
ivec_t pos
Definition ports.cpp:258
bool hard_match(int i, const char *msg)
Definition ports.cpp:285
cvec_t arg_spec
Definition ports.cpp:257
ivec_t remap
Definition ports.cpp:260
svec_t fixed
Definition ports.cpp:256
static int default_response(size_t nargs, bool first_round, dependency_t dependency)
Definition ports.cpp:1137
@ abort
the message shall lead to abort the savefile loading
Definition ports.h:324
@ discard
the message shall not be dispatched
Definition ports.h:325
void operator()(const char *msg)
call this to dispatch a message
Definition ports.cpp:1127
virtual int on_dispatch(size_t portname_max, char *portname, size_t maxargs, size_t nargs, rtosc_arg_val_t *args, bool round2, dependency_t dependency)
Definition ports.cpp:1152
dependency_t
Definition ports.h:328
@ not_specified
default values do depend on others
Definition ports.h:331
const Ports * ports
Definition ports.h:318
void * runtime
Definition ports.h:319
char loc[1024]
Definition ports.h:320
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
unsigned z
Definition inflate.c:1589
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
register unsigned k
Definition inflate.c:946
register unsigned j
Definition inflate.c:1576
unsigned v[N_MAX]
Definition inflate.c:1584
unsigned d
Definition inflate.c:940
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
bool rtosc_match(const char *pattern, const char *msg, const char **path_end)
Definition dispatch.c:132
const char * rtosc_match_path(const char *pattern, const char *msg, const char **path_end)
Definition dispatch.c:70
static PuglViewHint int value
Definition pugl.h:1708
static const char * title
Definition pugl.h:1747
static const char * name
Definition pugl.h:1582
virtual ASIOError start()=0
int val
Definition jpeglib.h:956
JSAMPIMAGE data
Definition jpeglib.h:945
int int32_t
Definition mid.cpp:97
const char * msg
Definition missing_descriptor.c:20
const char * msg_t
Definition ports.h:48
static char tmp[256]
Definition undo-history.cpp:80
int enum_key(Port::MetaContainer meta, const char *value)
Definition ports.cpp:1809
void map_arg_vals(rtosc_arg_val_t *av, size_t n, Port::MetaContainer meta)
Definition ports.cpp:974
std::string get_changed_values(const Ports &ports, void *runtime)
Definition ports.cpp:1029
void(* port_walker_t)(const Port *, const char *, const char *, const Ports &, void *, void *)
Definition ports.h:452
std::ostream & operator<<(std::ostream &o, OscDocFormatter &formatter)
Definition ports.cpp:2013
int canonicalize_arg_vals(rtosc_arg_val_t *av, size_t n, const char *port_args, Port::MetaContainer meta)
Definition ports.cpp:939
osc_element< 0, rtMsg< Types... > >::type first(rtMsg< Types... > &Tuple)
Definition typed-message.h:152
int dispatch_printed_messages(const char *messages, const Ports &ports, void *runtime, savefile_dispatcher_t *dispatcher=NULL)
Definition ports.cpp:1161
std::string save_to_file(const Ports &ports, void *runtime, const char *appname, rtosc_version appver)
Definition ports.cpp:1253
int load_from_file(const char *file_content, const Ports &ports, void *runtime, const char *appname, rtosc_version appver, savefile_dispatcher_t *dispatcher=NULL)
Definition ports.cpp:1272
const char * get_default_value(const char *port_name, const Ports &ports, void *runtime, const Port *port_hint=NULL, int32_t idx=-1, int recursive=1)
Definition ports.cpp:853
void walk_ports(const Ports *base, char *name_buffer, size_t buffer_size, void *data, port_walker_t walker, void *runtime=NULL)
Definition ports.cpp:1570
#define N
Definition nseel-cfunc.c:36
#define min(x, y)
Definition os.h:74
#define max(x, y)
Definition os.h:78
png_uint_32 length
Definition png.c:2247
static const char * get_value_from_runtime(void *runtime, const Ports &ports, size_t loc_size, char *loc, char *buffer_with_port, std::size_t buffersize, int cols_used)
Returns a port's value pretty-printed from a runtime object. The port object must not be known.
Definition ports.cpp:710
static msg_t snip(msg_t m)
Definition ports.cpp:1342
static ostream & dump_any_port(ostream &o, string name, string doc)
Definition ports.cpp:1876
static ostream & dump_t_f_port(ostream &o, string name, string doc)
Definition ports.cpp:1853
static ivec_t find_remap(words_t &strs, ivec_t &pos, ivec_t &assoc)
Definition ports.cpp:441
std::vector< tuple_t > tvec_t
Definition ports.cpp:249
void metaiterator_advance(const char *&title, const char *&value)
Definition ports.cpp:123
bool port_is_enabled(const Port *port, char *loc, size_t loc_size, const Ports &base, void *runtime)
Check if the port port is enabled.
Definition ports.cpp:1500
std::vector< std::string > words_t
Definition ports.cpp:244
#define __builtin_expect(a, b)
Definition ports.cpp:514
static ostream & add_options(ostream &o, Port::MetaContainer meta)
Definition ports.cpp:1824
static ostream & dump_generic_port(ostream &o, string name, string doc, string type)
Definition ports.cpp:1884
static void generate_minimal_hash(std::vector< std::string > str, Port_Matcher &pm)
Definition ports.cpp:458
bool scmp(const char *a, const char *b)
Definition ports.cpp:238
static void scat(char *dest, const char *src)
Definition ports.cpp:35
std::vector< int > ivec_t
Definition ports.cpp:247
bool has(T &t, Z &z)
Definition ports.cpp:334
void dump_ports_cb(const rtosc::Port *p, const char *name, const char *, const Ports &, void *v, void *)
Definition ports.cpp:1911
static void move_path(char *&r, char *&w, char *start)
Definition ports.cpp:1387
static void read_path(char *&r, char *start)
Definition ports.cpp:1374
std::vector< std::string > svec_t
Definition ports.cpp:245
static ivec_t find_pos(words_t &strs)
Definition ports.cpp:344
static ivec_t find_assoc(const words_t &strs, const ivec_t &pos)
Definition ports.cpp:395
std::vector< int > tuple_t
Definition ports.cpp:248
std::vector< const char * > cvec_t
Definition ports.cpp:246
int count_dups(std::vector< T > &t)
Definition ports.cpp:314
static int int_max(int a, int b)
Definition ports.cpp:342
static int enum_min(Port::MetaContainer meta)
Definition ports.cpp:1781
bool arg_matcher(const char *pattern, const char *args)
Definition ports.cpp:216
static bool parent_path_p(char *read, char *start)
Definition ports.cpp:1367
tvec_t do_hash(const words_t &strs, const ivec_t &pos)
Definition ports.cpp:299
static void units(std::ostream &o, const char *u)
Definition ports.cpp:1772
static int enum_max(Port::MetaContainer meta)
Definition ports.cpp:1795
rtosc_version rtosc_current_version()
Return the version RT OSC has been compiled with.
void rtosc_version_print_to_12byte_str(const rtosc_version *v, char *_12bytes)
Print the version pointed to by v to the buffer _12bytes.
size_t rtosc_vmessage(char *buffer, size_t len, const char *address, const char *arguments, va_list ap)
Definition rtosc.c:497
size_t rtosc_amessage(char *buffer, size_t len, const char *address, const char *arguments, const rtosc_arg_t *args)
Definition rtosc.c:515
const char * rtosc_argument_string(const char *msg)
Definition rtosc.c:11
int rtosc_arg_vals_eq(rtosc_arg_val_t *lhs, rtosc_arg_val_t *rhs, size_t lsize, size_t rsize, const rtosc_cmp_options *opt)
Definition rtosc.c:237
void rtosc_v2argvals(rtosc_arg_val_t *args, size_t nargs, const char *arg_str, va_list ap)
Definition rtosc.c:478
ClonePorts(const Ports &p, std::initializer_list< ClonePort > c)
Definition ports.cpp:1446
MergePorts(std::initializer_list< const Ports * > c)
Definition ports.cpp:1470
MetaContainer meta(void) const
Definition ports.h:140
const char * metadata
Statically accessable data about port.
Definition ports.h:101
const char * name
Pattern for messages to match.
Definition ports.h:100
const Ports * ports
Pointer to further ports.
Definition ports.h:102
~Ports(void)
Definition ports.cpp:507
std::function< void(msg_t, RtData &)> default_handler
Definition ports.h:163
Ports(std::initializer_list< Port > l)
Definition ports.cpp:501
const Port & operator[](unsigned i) const
Definition ports.h:177
unsigned elms
Definition ports.h:236
static char * collapsePath(char *p)
Definition ports.cpp:1401
void dispatch(const char *m, RtData &d, bool base_dispatch=false) const
Definition ports.cpp:517
std::vector< Port > ports
Definition ports.h:162
class Port_Matcher * impl
Definition ports.h:235
void refreshMagic(void)
Definition ports.cpp:1432
const Port * apropos(const char *path) const
Definition ports.cpp:1348
data object for the dispatch routine
Definition ports.h:55
int matches
number of matches returned from dispatch routine
Definition ports.h:66
char * loc
Definition ports.h:63
virtual void replyArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:64
virtual void reply(const char *path, const char *args,...)
Definition ports.cpp:71
virtual void broadcast(const char *path, const char *args,...)
Transmit initialization/change of a value to all listeners.
Definition ports.cpp:99
virtual void broadcastArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:110
virtual void chainArray(const char *path, const char *args, rtosc_arg_t *vals)
Definition ports.cpp:92
virtual void forward(const char *rational=NULL)
Definition ports.cpp:118
RtData(void)
Definition ports.cpp:42
void push_index(int ind)
Definition ports.cpp:49
size_t loc_size
Definition ports.h:64
void * obj
runtime object to dispatch this object to
Definition ports.h:65
void pop_index(void)
Definition ports.cpp:56
int idx[16]
Definition ports.h:72
virtual void chain(const char *path, const char *args,...)
Definition ports.cpp:82
const char * message
Will be set to point to the full OSC message in case of a base dispatch.
Definition ports.h:70
rtosc_arg_t val
Definition rtosc.h:129
char type
Definition rtosc.h:128
struct containing an rtosc version
Definition rtosc-version.h:40
int32_t i
Definition rtosc.h:47
char T
Definition rtosc.h:48
const char * s
Definition rtosc.h:54
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
int * pattern
Definition match.c:126
int result
Definition process.c:1455
char * pp
Definition unix.c:513
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
else sprintf(d_t_str, LoadFarString(shtYMDHMTime), yr%100, monthstr, dy, hh, mm)