From 3d9b6f31eec150b5a6000e0814e81e36d9eb069a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 21 Feb 2015 13:27:12 -0500
Subject: [PATCH] Minor code beautification in conninfo_uri_parse_params().

Reading this made me itch, so clean the logic a bit.
---
 src/interfaces/libpq/fe-connect.c | 55 +++++++++++--------------------
 1 file changed, 19 insertions(+), 36 deletions(-)

diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 17f34cf8b5d..e2a06b3d929 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -4934,36 +4934,30 @@ conninfo_uri_parse_params(char *params,
 				{
 					printfPQExpBuffer(errorMessage,
 									  libpq_gettext("extra key/value separator \"=\" in URI query parameter: \"%s\"\n"),
-									  params);
+									  keyword);
 					return false;
 				}
 				/* Cut off keyword, advance to value */
-				*p = '\0';
-				value = ++p;
+				*p++ = '\0';
+				value = p;
 			}
 			else if (*p == '&' || *p == '\0')
 			{
-				char		prevchar;
-
-				/* Cut off value, remember old value */
-				prevchar = *p;
-				*p = '\0';
-
+				/*
+				 * If not at the end, cut off value and advance; leave p
+				 * pointing to start of the next parameter, if any.
+				 */
+				if (*p != '\0')
+					*p++ = '\0';
 				/* Was there '=' at all? */
 				if (value == NULL)
 				{
 					printfPQExpBuffer(errorMessage,
 									  libpq_gettext("missing key/value separator \"=\" in URI query parameter: \"%s\"\n"),
-									  params);
+									  keyword);
 					return false;
 				}
-
-				/*
-				 * If not at the end, advance; now pointing to start of the
-				 * next parameter, if any.
-				 */
-				if (prevchar != '\0')
-					++p;
+				/* Got keyword and value, go process them. */
 				break;
 			}
 			else
@@ -5007,24 +5001,12 @@ conninfo_uri_parse_params(char *params,
 		if (!conninfo_storeval(connOptions, keyword, value,
 							   errorMessage, true, false))
 		{
-			/*
-			 * Check if there was a hard error when decoding or storing the
-			 * option.
-			 */
-			if (errorMessage->len != 0)
-			{
-				if (malloced)
-				{
-					free(keyword);
-					free(value);
-				}
-				return false;
-			}
-
-			printfPQExpBuffer(errorMessage,
-							  libpq_gettext(
-									"invalid URI query parameter: \"%s\"\n"),
-							  keyword);
+			/* Insert generic message if conninfo_storeval didn't give one. */
+			if (errorMessage->len == 0)
+				printfPQExpBuffer(errorMessage,
+								  libpq_gettext("invalid URI query parameter: \"%s\"\n"),
+								  keyword);
+			/* And fail. */
 			if (malloced)
 			{
 				free(keyword);
@@ -5032,13 +5014,14 @@ conninfo_uri_parse_params(char *params,
 			}
 			return false;
 		}
+
 		if (malloced)
 		{
 			free(keyword);
 			free(value);
 		}
 
-		/* Proceed to next key=value pair */
+		/* Proceed to next key=value pair, if any */
 		params = p;
 	}