示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
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);
	}
}
示例#5
0
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);
}
示例#6
0
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;
	}
}
示例#7
0
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);
}