about summary refs log tree commit diff
path: root/lr.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-10-26 15:57:59 +0100
committerChristian Neukirchen <chneukirchen@gmail.com>2015-10-26 15:57:59 +0100
commitfbaac08df997df37f4ef4e13240ba5e9eabe74af (patch)
treebbe72e05c5cceec54a1c1363f4bb8918246dbe46 /lr.c
parent2033efcc95c9bdb73a7db1fb6932f691bf6098ed (diff)
downloadlr-fbaac08df997df37f4ef4e13240ba5e9eabe74af.tar.gz
lr-fbaac08df997df37f4ef4e13240ba5e9eabe74af.tar.xz
lr-fbaac08df997df37f4ef4e13240ba5e9eabe74af.zip
parse "" as " inside strings
Diffstat (limited to 'lr.c')
-rw-r--r--lr.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/lr.c b/lr.c
index 82832de..16d7661 100644
--- a/lr.c
+++ b/lr.c
@@ -322,12 +322,28 @@ parse_type()
 static int
 parse_string(char **s)
 {
+	char *buf = 0;
+	size_t bufsiz = 0;
+	size_t len = 0;
+
 	if (*pos == '"') {
 		pos++;
-		char *e = strchr(pos, '"');
-		*s = strndup(pos, e - pos);
-		pos += e - pos + 1;
+		while (*pos != '"' || (*pos == '"' && *(pos+1) == '"')) {
+			if (len >= bufsiz) {
+				bufsiz = 2*bufsiz + 16;
+				buf = realloc(buf, bufsiz);
+				if (!buf)
+					parse_error("string too long");
+			}
+			if (*pos == '"')
+				pos++;
+			buf[len++] = *pos++;
+		}
+		if (buf)
+			buf[len] = 0;
+		pos++;
 		ws();
+		*s = buf ? buf : (char *) "";
 		return 1;
 	}