public TGINI()
        {
            var g = this;

            //fmt.Println("Init new GINI variable")
            //fmt.Printf("before %s\n",g.vars)
            //g.init = true
            //g.vars = map[string] string{ }
            //g.lists = make([][]string,0)
            //g.listpointer = map[string]int{ }
            //g.lists = map[string] []string{}
            //g.lists = map[string] qll.StringList{}
            //fmt.Printf("after %s\n",g.vars)
            GINI.DBGChat("TGINI class created");
        }
        // Parses the lines of a text-based GINI file into the GINI data
        // Please note this method is for merging data purposes, if you don't
        // want to merge, use the regular functions ;)
        public void ParseLines(string[] l)
        {
            // this entire function has been translated from BlitzMax, however the [OLD] tag has been removed. (it was deprecated anyway).
            //g.init1st()
            //lst:=make([]string,0)
            var lst = new List <string>();
            //var lst //qll.StringList
            var tag      = "";
            var tagsplit = new string[0];
            //tagparam:=make([] string,0)
            var tline      = "";
            var cmd        = "";
            var para       = "";
            var pos        = 0;
            var line       = "";
            var listkeys   = new string[0];
            var linenumber = 0;// Not present in BMax, but required in go, and makes it even easier of debugging too :P (And for C# I made a different loop function JUST for the ocassion).

            for (linenumber = 0; linenumber < l.Length; linenumber++)
            {
                line = l[linenumber];
                if (line != "")
                {
                    if (qstr.Left(qstr.MyTrim(line), 1) == "[" && qstr.Right(qstr.MyTrim(line), 1) == "]")
                    {
                        var wTag = qstr.Mid(qstr.MyTrim(line), 2, qstr.Len(qstr.MyTrim(line)) - 2);
                        if (wTag.ToUpper() == "OLD")
                        {
                            throw new Exception($"[OLD] has been removed in the Go and C# versions of GINI! (line #{linenumber})");
                            //fmt.Printf("ERROR! The [old] tag is NOT supported in this Go version of GINI (and in the original BlitzMax version it's deprecated) in line %d", linenumber)
                            //return
                        }
                        tagsplit = wTag.Split(':');
                        tag      = tagsplit[0].ToUpper();
                        if (tagsplit[0].ToUpper() == "LIST")
                        {
                            if (tagsplit[0].Length < 2)
                            {
                                throw new Exception($"ERROR! Incorrectly defined list in line #{linenumber}");
                                //return;
                            }
                            //lst = qll.CreateStringList() //make([] string,0)
                            //                    lst = len(g.lists) //[]string{}
                            //g.lists = append(g.lists,[]string{})
                            var templist = new List <string>();
                            lst      = templist;
                            listkeys = tagsplit[1].Split(',');
                            foreach (string K in listkeys)
                            {
                                //'ini.clist(UnIniString(K))
                                //fmt.Printf("Creating list: %s\n",K)
                                //g.lists[strings.ToUpper(UnIniString(K))] = lst
                                //g.listpointer[strings.ToUpper(UnIniString(K))] = lst
                                lists[K.ToUpper()] = templist;
                            } //Next
                              //'lst=ini.list(UnIniString(K))
                        }     //EndIf
                    }
                    else
                    {
                        switch (tag)   //Select tag
                        {
                        case "REM":
                        case "LIC":     // This for full compatibility with MKL in the future.
                            break;

                        case "SYS":
                        case "SYSTEM":
                            tline = qstr.MyTrim(line);
                            pos   = tline.IndexOf(' ', 0);   //tline.find(" ")
                            if (pos <= -1)
                            {
                                pos = tline.Length;
                            }
                            cmd  = qstr.Left(tline, pos).ToUpper();
                            para = qstr.Mid(tline, pos, tline.Length - pos);
                            //cmd  = strings.ToUpper(tline[:pos])
                            //para = tline[pos + 1:]
                            switch (cmd)
                            {
                            case "IMPORT":
                            case "INCLUDE":
                                //pos = strings.IndexAny(para,"/") //para.find("/")<0

                                /*
                                 * ?win32
                                 * pos = pos And Chr(para[1])<>":"
                                 * pos = pos And para.find("\")
                                 * ?
                                 */
                                /*
                                 * if pos>0 {
                                 *  para=filepath(String(file))+"/"+para
                                 * }
                                 */
                                /*
                                 * ?debug
                                 * Print "Including: "+para
                                 * ?
                                 */
                                //g.ReadFile(para) //LoadIni para,ini
                                Console.WriteLine($"Line {linenumber} -- WARNING\nNo support yet for file inclusion or importing\n");
                                break;

                            default:
                                throw new Exception($"System command {cmd} not understood: {tline} in line #{linenumber}\n");
                            }     //End Select
                            break;

                        case "VARS":
                            if (line.IndexOf('=') < 0)
                            {
                                Console.WriteLine($"Warning! Invalid var definition: {line} in line #{linenumber} \t=> {line}\n");
                            }
                            else
                            {
                                //tagsplit=line.split("=")
                                var temppos = line.IndexOf('=');
                                tagsplit    = new string[2];
                                tagsplit[0] = qstr.Left(line, temppos);
                                tagsplit[1] = qstr.Right(line, line.Length - temppos - 1);
                                D(GINI.UnIniString(GINI.UnIniString(tagsplit[0])), GINI.UnIniString(tagsplit[1]));
                            }     //EndIf
                            break;

                        case "LIST":
                            //g.lists[lst] = append(g.lists[lst], UnIniString(line)) //ListAddLast lst,uninistring(line)
                            lst.Add(GINI.UnIniString(line).Trim());
                            break;

                        case "CALL":
                            Console.WriteLine($"WARNING! I cannot execute line {linenumber} as the [CALL] block is not supported in C#\n");
                            break;

                        default:
                            throw new Exception($"ERROR! Unknown tag: {tag} (line #{linenumber}:{line})\n");
                        } //End Select
                    }     //EndIf
                }         //EndIf
            }             // Next
        }                 //End Function