diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index 878b0798ec8242616ef82e0660c10ec74a76c03b..516d94a67b1e6675f4d99d64ff6aa7a14638dffb 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -989,73 +989,46 @@ exports.connect = connect; // Add a 'data' event handler for the client socket // data parameter is what the server sent to this socket -// Pd can send us different types of data: -// 1) The old style tcl commands with "\n" at end (or "\\\n" for continuation) -// 2) new style commands: selector "stringarg",42,"stringarg3",etc. -// Below we separate the wheat from chaff, eval'ing the new commands and just -// printing the old ones in blue to the console - -// To facilitate this, the new style commands are always preceded with an -// alarm bell '\a', and end with a vertical tab '\v'. These should produce -// a decent stop-gap since they are rarely used in Pd patch text. +// We're not receiving FUDI (i.e., Pd) messages. Right now we're just using +// an alarm bell '\a' to signal the end of a message. This is easier than +// checking for unescaped semicolons, since it only requires a check for a +// single byte. Of course this makes it more brittle, so it can be changed +// later if needed. function init_socket_events () { var next_command = ""; // A not-quite-FUDI command: selector arg1,arg2,etc. // These are formatted on the C side to be easy // to parse here in javascript - var old_command = ""; // Old-style sys_vgui cmds (printed to console) - var cmdHeader = false; var perfect_parser = function(data) { var i, len, selector, args; len = data.length; for (i = 0; i < len; i++) { - if (cmdHeader) { - // check for end of command: - if (data[i] === 11) { // vertical tab "\v" - // decode next_command - try { - // This should work for all utf-8 content - next_command = decodeURIComponent(next_command); - } - catch(err) { - // This should work for ISO-8859-1 - next_command = unescape(next_command); - } - // Turn newlines into backslash + "n" so - // eval will do the right thing - next_command = next_command.replace(/\n/g, "\\n"); - selector = next_command.slice(0, next_command.indexOf(" ")); - args = next_command.slice(selector.length + 1); - cmdHeader = false; - next_command = ""; - // Now evaluate it - //post("Evaling: " + selector + "(" + args + ");"); - eval(selector + "(" + args + ");"); - } else { - next_command += "%" + - ("0" // leading zero (for rare case of single digit) - + data[i].toString(16)) // to hex - .slice(-2); // remove extra leading zero + // check for end of command: + if (data[i] === 7) { // alarm bell + // decode next_command + try { + // This should work for all utf-8 content + next_command = decodeURIComponent(next_command); } - } else if (data[i] === 7) { // ASCII alarm bell "\a" - // if we have an old-style message, print it out - if (old_command !== "") { - var old_command_output; - try { - old_command_output = decodeURIComponent(old_command); - } - catch(err) { - old_command_output = unescape(old_command); - } - old_command= ""; - //post("warning: old command: " + old_command_output, - // "blue"); + catch(err) { + // This should work for ISO-8859-1 + next_command = unescape(next_command); } - cmdHeader = true; + // Turn newlines into backslash + "n" so + // eval will do the right thing with them + next_command = next_command.replace(/\n/g, "\\n"); + selector = next_command.slice(0, next_command.indexOf(" ")); + args = next_command.slice(selector.length + 1); + next_command = ""; + // Now evaluate it + //post("Evaling: " + selector + "(" + args + ");"); + eval(selector + "(" + args + ");"); } else { - // this is an old-style sys_vgui - old_command += "%" + ("0" + data[i].toString(16)).slice(-2); + next_command += "%" + + ("0" // leading zero (for rare case of single digit) + + data[i].toString(16)) // to hex + .slice(-2); // remove extra leading zero } } }; @@ -1064,36 +1037,21 @@ function init_socket_events () { var i, len, selector, args; len = data.length; for (i = 0; i < len; i++) { - if (cmdHeader) { - // check for end of command: - if (data[i] === "\v") { // vertical tab - // we have the next_command... - // Turn newlines into backslash + "n" so - // eval will do the right thing - next_command = next_command.replace(/\n/g, "\\n"); - selector = next_command.slice(0, next_command.indexOf(" ")); - args = next_command.slice(selector.length + 1); - cmdHeader = false; - next_command = ""; - // Now evaluate it-- unfortunately the V8 engine can't - // optimize this eval call. - //post("Evaling: " + selector + "(" + args + ");"); - eval(selector + "(" + args + ");"); - } else { - next_command += data[i]; - } - } else if (data[i] === String.fromCharCode(7)) { - // ASCII alarm bell "\a" - // if we have an old-style message, print it out - if (old_command !== "") { - //post("warning: old command: " + old_command_output, - // "blue"); - old_command= ""; - } - cmdHeader = true; + // check for end of command: + if (data[i] === String.fromCharCode(7)) { // vertical tab + // we have the next_command... + // Turn newlines into backslash + "n" so + // eval will do the right thing + next_command = next_command.replace(/\n/g, "\\n"); + selector = next_command.slice(0, next_command.indexOf(" ")); + args = next_command.slice(selector.length + 1); + next_command = ""; + // Now evaluate it-- unfortunately the V8 engine can't + // optimize this eval call. + //post("Evaling: " + selector + "(" + args + ");"); + eval(selector + "(" + args + ");"); } else { - // this is an old-style sys_vgui - old_command += data[i]; + next_command += data[i]; } } }; diff --git a/pd/src/s_inter.c b/pd/src/s_inter.c index 8b5306ae20175c1de09906b72d609d1ac753e76f..f791ade9dbd82e391a467497c322c7c6fbc8e098 100644 --- a/pd/src/s_inter.c +++ b/pd/src/s_inter.c @@ -458,9 +458,9 @@ static int socketreceiver_doread(t_socketreceiver *x) binbuf_text(inbinbuf, messbuf, bp - messbuf); if (sys_debuglevel & DEBUG_MESSDOWN) { if (stderr_isatty) - fprintf(stderr,"<- \e[0;1;36m%.*s\e[0m\n", bp - messbuf, messbuf); + fprintf(stderr,"\n<- \e[0;1;36m%.*s\e[0m", bp - messbuf, messbuf); else - fprintf(stderr,"<- %.*s\n", bp - messbuf, messbuf); + fprintf(stderr,"\n<- %.*s", bp - messbuf, messbuf); } x->sr_inhead = inhead; x->sr_intail = intail; @@ -715,13 +715,14 @@ void sys_vvgui(const char *fmt, va_list ap) { } if (sys_debuglevel & DEBUG_MESSUP) { //blargh(); - int begin = lastend=='\n' || lastend=='\r' || lastend==-1; + //int begin = lastend=='\n' || lastend=='\r' || lastend==-1; + int begin = lastend=='\a' || lastend==-1; if (stderr_isatty) fprintf(stderr, "%s\e[0;1;35m%s\e[0m", - begin ? "-> " : "", sys_guibuf + sys_guibufhead); + begin ? "\n-> " : "", sys_guibuf + sys_guibufhead); else fprintf(stderr, "%s%s", - begin ? "-> " : "", sys_guibuf + sys_guibufhead); + begin ? "\n-> " : "", sys_guibuf + sys_guibufhead); } sys_guibufhead += msglen; sys_bytessincelastping += msglen; @@ -736,16 +737,25 @@ void sys_vgui(const char *fmt, ...) { va_start(ap, fmt); sys_vvgui(fmt,ap); } + +/* This was used by the old command interface, but is no longer used. */ void sys_vvguid(const char *file, int line, const char *fmt, va_list ap) { if ((sys_debuglevel&4) && /*line>=0 &&*/ (lastend=='\n' || lastend=='\r' || lastend==-1)) { sys_vgui("AT %s:%d; ",file,line); } sys_vvgui(fmt,ap); } + +/* Old GUI command interface... */ void sys_vguid(const char *file, int line, const char *fmt, ...) { - va_list ap; + va_list ap; + char buf[MAXPDSTRING]; va_start(ap, fmt); - sys_vvguid(file,line,fmt,ap); + vsnprintf(buf, MAXPDSTRING-1, fmt, ap); + va_end(ap); + /* For old commands, we're just posting them to the pd console */ + post("Old command at %s:%d:%s", file, line, buf); + //sys_vvguid(file,line,fmt,ap); } void sys_gui(const char *s) { @@ -773,7 +783,7 @@ char *escape_double_quotes(const char *src) { void gui_end_vmess(void) { - sys_gui("\v"); + sys_gui("\a"); } @@ -785,7 +795,7 @@ void gui_do_vmess(const char *sel, char *fmt, int end, va_list ap) int nargs = 0; char *fp = fmt; //va_start(ap, end); - sys_vgui("\a%s ", sel); /* use a bell to signal the beginning of msg + sys_vgui("%s ", sel); /* use a bell to signal the beginning of msg (this can be replaced with any other obscure ascii escape) */ while (*fp)