Accept comma and semicolon characters in text format maps.

This makes this consistent with the C++ parser and structs in general.
diff --git a/proto/text_parser.go b/proto/text_parser.go
index d1caeff..5c466d5 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -567,6 +567,9 @@
 				if err := p.readAny(key, props.mkeyprop); err != nil {
 					return err
 				}
+				if err := p.consumeOptionalSeparator(); err != nil {
+					return err
+				}
 				if err := p.consumeToken("value"); err != nil {
 					return err
 				}
@@ -576,6 +579,9 @@
 				if err := p.readAny(val, props.mvalprop); err != nil {
 					return err
 				}
+				if err := p.consumeOptionalSeparator(); err != nil {
+					return err
+				}
 				if err := p.consumeToken(terminator); err != nil {
 					return err
 				}
@@ -605,14 +611,10 @@
 			}
 		}
 
-		// For backward compatibility, permit a semicolon or comma after a field.
-		tok = p.next()
-		if tok.err != nil {
-			return tok.err
+		if err := p.consumeOptionalSeparator(); err != nil {
+			return err
 		}
-		if tok.value != ";" && tok.value != "," {
-			p.back()
-		}
+
 	}
 
 	if reqCount > 0 {
@@ -621,6 +623,19 @@
 	return reqFieldErr
 }
 
+// consumeOptionalSeparator consumes an optional semicolon or comma.
+// It is used in readStruct to provide backward compatibility.
+func (p *textParser) consumeOptionalSeparator() error {
+	tok := p.next()
+	if tok.err != nil {
+		return tok.err
+	}
+	if tok.value != ";" && tok.value != "," {
+		p.back()
+	}
+	return nil
+}
+
 func (p *textParser) readAny(v reflect.Value, props *Properties) error {
 	tok := p.next()
 	if tok.err != nil {