From 2269a611da40bd7242dbd1a3204c212ac6091fd7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 6 Feb 2024 05:22:12 +0200 Subject: Add experimental support for JSON value types --- libbuild2/parser.cxx | 124 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 24 deletions(-) (limited to 'libbuild2/parser.cxx') diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx index 043cd10..1ac159b 100644 --- a/libbuild2/parser.cxx +++ b/libbuild2/parser.cxx @@ -5761,30 +5761,106 @@ namespace build2 const value_type* parser:: find_value_type (const scope*, const string& n) { - auto ptr = [] (const value_type& vt) {return &vt;}; - - return - n == "bool" ? ptr (value_traits::value_type) : - n == "int64" ? ptr (value_traits::value_type) : - n == "uint64" ? ptr (value_traits::value_type) : - n == "string" ? ptr (value_traits::value_type) : - n == "path" ? ptr (value_traits::value_type) : - n == "dir_path" ? ptr (value_traits::value_type) : - n == "abs_dir_path" ? ptr (value_traits::value_type) : - n == "name" ? ptr (value_traits::value_type) : - n == "name_pair" ? ptr (value_traits::value_type) : - n == "target_triplet" ? ptr (value_traits::value_type) : - n == "project_name" ? ptr (value_traits::value_type) : - - n == "int64s" ? ptr (value_traits::value_type) : - n == "uint64s" ? ptr (value_traits::value_type) : - n == "strings" ? ptr (value_traits::value_type) : - n == "paths" ? ptr (value_traits::value_type) : - n == "dir_paths" ? ptr (value_traits::value_type) : - n == "names" ? ptr (value_traits>::value_type) : - n == "cmdline" ? ptr (value_traits::value_type) : - - nullptr; + switch (n[0]) + { + case 'a': + { + if (n == "abs_dir_path") return &value_traits::value_type; + break; + } + case 'b': + { + if (n == "bool") return &value_traits::value_type; + break; + } + case 'c': + { + if (n == "cmdline") return &value_traits::value_type; + break; + } + case 'd': + { + if (n.compare (0, 8, "dir_path") == 0) + { + if (n[8] == '\0') return &value_traits::value_type; + if (n[8] == 's' && + n[9] == '\0') return &value_traits::value_type; + } + break; + } + case 'i': + { + if (n.compare (0, 5, "int64") == 0) + { + if (n[5] == '\0') return &value_traits::value_type; + if (n[5] == 's' && + n[6] == '\0') return &value_traits::value_type; + } + break; + } + case 'j': + { + if (n.compare (0, 4, "json") == 0) + { + if (n[4] == '\0') return &value_traits::value_type; + if (n == "json_array") return &value_traits::value_type; + if (n == "json_object") return &value_traits::value_type; + } + break; + } + case 'n': + { + if (n.compare (0, 4, "name") == 0) + { + if (n[4] == '\0') return &value_traits::value_type; + if (n[4] == 's' && + n[5] == '\0') return &value_traits>::value_type; + if (n == "name_pair") return &value_traits::value_type; + } + break; + } + + case 'p': + { + if (n.compare (0, 4, "path") == 0) + { + if (n[4] == '\0') return &value_traits::value_type; + if (n[4] == 's' && + n[5] == '\0') return &value_traits::value_type; + } + else if (n == "project_name") return &value_traits::value_type; + break; + } + case 's': + { + if (n.compare (0, 6, "string") == 0) + { + if (n[6] == '\0') return &value_traits::value_type; + if (n[6] == 's' && + n[7] == '\0') return &value_traits::value_type; + } + break; + } + case 't': + { + if (n == "target_triplet") return &value_traits::value_type; + break; + } + case 'u': + { + if (n.compare (0, 6, "uint64") == 0) + { + if (n[6] == '\0') return &value_traits::value_type; + if (n[6] == 's' && + n[7] == '\0') return &value_traits::value_type; + } + break; + } + default: + break; + } + + return nullptr; } void parser:: -- cgit v1.1