From 58babf8b1945f1a2db0180a4a3ed7b0d52872bef Mon Sep 17 00:00:00 2001
From: Rogier <rogier777@gmail.com>
Date: Thu, 7 Jan 2016 12:33:26 +0100
Subject: [PATCH] Improve parsing of setting types from settingtypes.txt for
 settings tab

- Accept numbers prefixed with '+'
- Accept multiple spaces instead of just a single one where spaces are expected
- Allow flags to have an empty default value
---
 builtin/mainmenu/tab_settings.lua | 36 ++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua
index db8d08d5e..f3a09a985 100644
--- a/builtin/mainmenu/tab_settings.lua
+++ b/builtin/mainmenu/tab_settings.lua
@@ -20,8 +20,8 @@ local FILENAME = "settingtypes.txt"
 local CHAR_CLASSES = {
 	SPACE = "[%s]",
 	VARIABLE = "[%w_%-%.]",
-	INTEGER = "[-]?[%d]",
-	FLOAT = "[-]?[%d%.]",
+	INTEGER = "[+-]?[%d]",
+	FLOAT = "[+-]?[%d%.]",
 	FLAGS = "[%w_%-%.,]",
 }
 
@@ -65,11 +65,11 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
 			--  so we can later strip it from the rest of the line
 			.. "("
 				.. "([" .. CHAR_CLASSES.VARIABLE .. "+)" -- variable name
-				.. CHAR_CLASSES.SPACE
+				.. CHAR_CLASSES.SPACE .. "*"
 				.. "%(([^%)]*)%)"  -- readable name
-				.. CHAR_CLASSES.SPACE
+				.. CHAR_CLASSES.SPACE .. "*"
 				.. "(" .. CHAR_CLASSES.VARIABLE .. "+)" -- type
-				.. CHAR_CLASSES.SPACE .. "?"
+				.. CHAR_CLASSES.SPACE .. "*"
 			.. ")")
 
 	if not first_part then
@@ -88,8 +88,8 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
 	if setting_type == "int" then
 		local default, min, max = remaining_line:match("^"
 				-- first int is required, the last 2 are optional
-				.. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "?"
-				.. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "?"
+				.. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "*"
+				.. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "*"
 				.. "(" .. CHAR_CLASSES.INTEGER .. "*)"
 				.. "$")
 
@@ -151,8 +151,8 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
 	if setting_type == "float" then
 		local default, min, max = remaining_line:match("^"
 				-- first float is required, the last 2 are optional
-				.. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "?"
-				.. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "?"
+				.. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "*"
+				.. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "*"
 				.. "(" .. CHAR_CLASSES.FLOAT .. "*)"
 				.."$")
 
@@ -175,7 +175,11 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
 	end
 
 	if setting_type == "enum" then
-		local default, values = remaining_line:match("^(.+)" .. CHAR_CLASSES.SPACE .. "(.+)$")
+		local default, values = remaining_line:match("^"
+				-- first value (default) may be empty (i.e. is optional)
+				.. "(" .. CHAR_CLASSES.VARIABLE .. "*)" .. CHAR_CLASSES.SPACE .. "*"
+				.. "(" .. CHAR_CLASSES.FLAGS .. "+)"
+				.. "$")
 
 		if not default or values == "" then
 			return "Invalid enum setting"
@@ -211,14 +215,22 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
 
 	if setting_type == "flags" then
 		local default, possible = remaining_line:match("^"
-				.. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. ""
-				.. "(" .. CHAR_CLASSES.FLAGS .. "+)"
+				-- first value (default) may be empty (i.e. is optional)
+				-- this is implemented by making the last value optional, and
+				-- swapping them around if it turns out empty.
+				.. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. "*"
+				.. "(" .. CHAR_CLASSES.FLAGS .. "*)"
 				.. "$")
 
 		if not default or not possible then
 			return "Invalid flags setting"
 		end
 
+		if possible == "" then
+			possible = default
+			default = ""
+		end
+
 		table.insert(settings, {
 			name = name,
 			readable_name = readable_name,
-- 
GitLab