What steps will reproduce the problem?
1. AbcExport to an Alembic file with white space
AbcExport -j "-frameRange 1 24 -file \"C:/white space/test.abc\"";
2. callbacks have white space or single/double quote marks
AbcExport -j "-frameRange 1 24 -melPerFrameCallback \"print (\\\"#FRAME\\\")\"
-file C:/test.abc";
What is the expected output? What do you see instead?
AbcExport should parse -j argument correctly, just like normal MEL commands.
Maya reports an error if there are white space, single/double quote marks in
arguments within -j.
What version of the product are you using? On what operating system?
1.0 on all platforms.
Please provide any additional information below.
Here is the approach we use:
AbcExport.cpp, replace jobArgsStr.split(' ', jobArgsArray); with
{
// parse the job arguments
// e.g. -perFrameCallbackMel "print \"something\"" will be splitted to
// [0] -perFrameCallbackMel
// [1] print "something"
enum State {
kArgument, // parsing an argument (not quoted)
kDoubleQuotedString, // parsing a double quoted string
kSingleQuotedString, // parsing a single quoted string
};
State state = kArgument;
MString stringBuffer;
for (unsigned int charIdx = 0; charIdx < jobArgsStr.numChars(); charIdx++) {
MString ch = jobArgsStr.substringW(charIdx, charIdx);
switch (state) {
case kArgument:
if (ch == " ") {
// space terminates the current argument
if (stringBuffer.length() > 0) {
jobArgsArray.append(stringBuffer);
stringBuffer.clear();
}
// goto another argument
state = kArgument;
}
else if (ch == "\"") {
if (stringBuffer.length() > 0) {
// double quote is part of the argument
stringBuffer += ch;
}
else {
// goto double quoted string
state = kDoubleQuotedString;
}
}
else if (ch == "'") {
if (stringBuffer.length() > 0) {
// single quote is part of the argument
stringBuffer += ch;
}
else {
// goto single quoted string
state = kSingleQuotedString;
}
}
else {
stringBuffer += ch;
}
break;
case kDoubleQuotedString:
// double quote terminates the current string
if (ch == "\"") {
jobArgsArray.append(stringBuffer);
stringBuffer.clear();
state = kArgument;
}
else if (ch == "\\") {
// escaped character
MString nextCh = (++charIdx < jobArgsStr.numChars())
? jobArgsStr.substringW(charIdx, charIdx) : "\\";
if (nextCh == "n") stringBuffer += "\n";
else if (nextCh == "t") stringBuffer += "\t";
else if (nextCh == "r") stringBuffer += "\r";
else if (nextCh == "\\") stringBuffer += "\\";
else if (nextCh == "'") stringBuffer += "'";
else if (nextCh == "\"") stringBuffer += "\"";
else stringBuffer += nextCh;
}
else {
stringBuffer += ch;
}
break;
case kSingleQuotedString:
// single quote terminates the current string
if (ch == "'") {
jobArgsArray.append(stringBuffer);
stringBuffer.clear();
state = kArgument;
}
else if (ch == "\\") {
// escaped character
MString nextCh = (++charIdx < jobArgsStr.numChars())
? jobArgsStr.substringW(charIdx, charIdx) : "\\";
if (nextCh == "n") stringBuffer += "\n";
else if (nextCh == "t") stringBuffer += "\t";
else if (nextCh == "r") stringBuffer += "\r";
else if (nextCh == "\\") stringBuffer += "\\";
else if (nextCh == "'") stringBuffer += "'";
else if (nextCh == "\"") stringBuffer += "\"";
else stringBuffer += nextCh;
}
else {
stringBuffer += ch;
}
break;
}
}
// the rest of the argument
if (stringBuffer.length() > 0) {
jobArgsArray.append(stringBuffer);
}
}
Thanks!
Original issue reported on code.google.com by shinc...@gmail.com on 1 Sep 2011 at 7:01
Original issue reported on code.google.com by
shinc...@gmail.com
on 1 Sep 2011 at 7:01