bool ArgList::V1WackedToV1Raw(char const *v1_input,MyString *v1_raw,MyString *errmsg) { if(!v1_input) return true; ASSERT(v1_raw); ASSERT(!IsV2QuotedString(v1_input)); while(*v1_input) { if(*v1_input == '"') { if(errmsg) { MyString msg; msg.sprintf("Found illegal unescaped double-quote: %s",v1_input); AddErrorMessage(msg.Value(),errmsg); } return false; } else if(v1_input[0] == '\\' && v1_input[1] == '"') { // Escaped double-quote. v1_input++; (*v1_raw) += *(v1_input++); } else { (*v1_raw) += *(v1_input++); } } return true; }
bool ArgList::V2QuotedToV2Raw(char const *v1_input,MyString *v2_raw,MyString *errmsg) { if(!v1_input) return true; ASSERT(v2_raw); // allow leading whitespace while(isspace(*v1_input)) { v1_input++; } ASSERT(IsV2QuotedString(v1_input)); ASSERT(*v1_input == '"'); v1_input++; const char *quote_terminated = NULL; while(*v1_input) { if(*v1_input == '"') { v1_input++; if(*v1_input == '"') { // Repeated (i.e. escaped) double-quote. (*v2_raw) += *(v1_input++); } else { quote_terminated = v1_input-1; break; } } else { (*v2_raw) += *(v1_input++); } } if(!quote_terminated) { AddErrorMessage("Unterminated double-quote.",errmsg); return false; } // allow trailing whitespace while(isspace(*v1_input)) { v1_input++; } if(*v1_input) { if(errmsg) { MyString msg; msg.sprintf( "Unexpected characters following double-quote. " "Did you forget to escape the double-quote by repeating it? " "Here is the quote and trailing characters: %s\n",quote_terminated); AddErrorMessage(msg.Value(),errmsg); } return false; } return true; }
bool ArgList::AppendArgsV2Quoted(char const *args,MyString *error_msg) { if(!IsV2QuotedString(args)) { AddErrorMessage("Expecting double-quoted input string (V2 format).",error_msg); return false; } MyString v2; if(!V2QuotedToV2Raw(args,&v2,error_msg)) { return false; } return AppendArgsV2Raw(v2.Value(),error_msg); }
bool Env::MergeFromV1RawOrV2Quoted( const char *delimitedString, MyString *error_msg ) { if(!delimitedString) return true; if(IsV2QuotedString(delimitedString)) { MyString v2; if(!V2QuotedToV2Raw(delimitedString,&v2,error_msg)) { return false; } return MergeFromV2Raw(v2.Value(),error_msg); } else { return MergeFromV1Raw(delimitedString,error_msg); } }
bool ArgList::AppendArgsV1RawOrV2Quoted(char const *args,MyString *error_msg) { if(IsV2QuotedString(args)) { // This is actually a V2Quoted string (enclosed in double-quotes). MyString v2; if(!V2QuotedToV2Raw(args,&v2,error_msg)) { return false; } return AppendArgsV2Raw(v2.Value(),error_msg); } // It is a raw V1 input string, not enclosed in double-quotes. return AppendArgsV1Raw(args,error_msg); }
bool Env::MergeFromV2Quoted( const char *delimitedString, MyString *error_msg ) { if(!delimitedString) return true; if(IsV2QuotedString(delimitedString)) { MyString v2; if(!V2QuotedToV2Raw(delimitedString,&v2,error_msg)) { return false; } return MergeFromV2Raw(v2.Value(),error_msg); } else { AddErrorMessage("Expecting a double-quoted environment string (V2 format).",error_msg); return false; } }
bool ArgList::AppendArgsV1WackedOrV2Quoted(char const *args,MyString *error_msg) { if(IsV2QuotedString(args)) { // This is actually a V2Quoted string (enclosed in double-quotes). MyString v2; if(!V2QuotedToV2Raw(args,&v2,error_msg)) { return false; } return AppendArgsV2Raw(v2.Value(),error_msg); } // It is a V1Wacked string. Literal double-quotes are // backwacked. MyString v1; if(!V1WackedToV1Raw(args,&v1,error_msg)) { return false; } return AppendArgsV1Raw(v1.Value(),error_msg); }