public void AddAllDwavesOnLine(string line) { foreach (Match match in DwaveRegex.Matches(line)) { //Note: this variable does not have quotes! eg ["test\path"] is converted to [test\path] string dwavePathOrAlias = match.Groups[1].Value; DwaveArgument dwaveArgumentObject = new DwaveArgument(dwavePathOrAlias); string normalizedDwaveArgument = dwaveArgumentObject.GetNormalizedValue(); if (allDwaveArgs.ContainsKey(normalizedDwaveArgument)) { logger.Warning($"Duplicate dwave command: {normalizedDwaveArgument}"); } else { allDwaveArgs.Add(dwaveArgumentObject.GetNormalizedValue(), dwaveArgumentObject); } } }
//expects a list of dwave strings like: //{ ":dwave 0, beae14:", ":dwave 0, bea21:", } //outputs a new list with missing voices added in public AutoFixResult FixMissingDwaves(List <string> dwaveStrings, int numberOfDwaveToGenerate, out List <string> fixedDwaves) { List <DwaveArgument> argumentsOnly = new List <DwaveArgument>(); //get only the arguments of each dwave foreach (string s in dwaveStrings) { Match match = DwaveRegex.Match(s); DwaveArgument dwaveArgument = new DwaveArgument(match.Groups[1].Value); argumentsOnly.Add(dwaveArgument); } //check the 'head' of all the dwaves are the same - stop if not the same string firstHead = argumentsOnly[0].GetHead(); foreach (DwaveArgument dwaveArgument in argumentsOnly) { if (dwaveArgument.GetHead() != firstHead) { throw new PrefixOfDwaveArgNotTheSame($"ERROR: head {dwaveArgument.GetHead()} is not the same as {firstHead}!"); } } //find the min and max values in the list. Also, create a hashset //containing all the dwave arguments in the orginal japanese dwave list HashSet <int> digitsInOriginalList = new HashSet <int>(); int minValue = int.MaxValue; int maxValue = int.MinValue; foreach (DwaveArgument dwaveArgument in argumentsOnly) { int trailingDigits = dwaveArgument.GetTrailingDigits(); digitsInOriginalList.Add(trailingDigits); minValue = Math.Min(trailingDigits, minValue); maxValue = Math.Max(trailingDigits, maxValue); } //DEBUG: check the dwaves one before, one after, and inbetween the min and max dwaves. //this debugging for printing. if (debugEnabled) { Console.WriteLine("----------------------------"); for (int i = minValue - 1; i <= maxValue + 1; i++) { string generatedDwaveArgument = $"{firstHead}{i}"; Console.Write(generatedDwaveArgument); if (i == minValue - 1 || i == maxValue + 1) { Console.Write(" <PREPOST> "); } if (digitsInOriginalList.Contains(i)) { Console.WriteLine(": Already in current line."); } else if (CheckDwaveUsed(generatedDwaveArgument)) { Console.WriteLine(": Appears in script."); } else { Console.WriteLine(": NOT USED"); } } } //Make a new list of dwaves of length "numberOfDwaveToGenerate" List <DwaveArgument> generatedDwaveArguments = new List <DwaveArgument>(); for (int i = minValue - 1; i <= maxValue + 1; i++) { string generatedDwaveArgumentString = $"{firstHead}{i}"; //accept the dwave argument if it was already in the current line, OR if it doesn't exist anywhere in the script if (!CheckDwaveUsed(generatedDwaveArgumentString) || digitsInOriginalList.Contains(i)) { generatedDwaveArguments.Add(new DwaveArgument(generatedDwaveArgumentString)); } if (generatedDwaveArguments.Count == numberOfDwaveToGenerate) { break; } } if (debugEnabled) { Console.WriteLine("Generated Dwaves:"); foreach (DwaveArgument i in generatedDwaveArguments) { Console.WriteLine(i.GetNormalizedValue()); } } //regenerate the full dwave strings fixedDwaves = new List <string>(); foreach (DwaveArgument dwaveArgument in generatedDwaveArguments) { fixedDwaves.Add($":dwave 0, {dwaveArgument.GetUnNormalizedValue()}:"); } //DEBUG: print the two dwave lists if (debugEnabled) { foreach (string dwaveCommand in fixedDwaves) { Console.Write($"{dwaveCommand},"); } Console.WriteLine(); foreach (string dwaveCommand in dwaveStrings) { Console.Write($"{dwaveCommand},"); } Console.WriteLine(); } //Return whether fixing was sucessfull or unsuccesful if (generatedDwaveArguments.Count < numberOfDwaveToGenerate) { //Couldn't generate enough DWaves return(AutoFixResult.Failure); } else if (numberOfDwaveToGenerate < dwaveStrings.Count) { //was asked to 'remove' dwaves from english line - needs manual check return(AutoFixResult.NeedsManualCheck); } else if (generatedDwaveArguments.Count == numberOfDwaveToGenerate) { //was asked to add more dwaves to japanese line, and succesfully generated the number of dwaves asked. return(AutoFixResult.OK); } throw new Exception("FixMissingDwaves: shouldn't be able to reach here"); }
//might change this later to accept a full dwave command line dwave 0, sadf;alskdfj public bool CheckDwaveUsed(string dwaveArgString) { DwaveArgument dwaveArgumentObject = new DwaveArgument(dwaveArgString); return(allDwaveArgs.ContainsKey(dwaveArgumentObject.GetNormalizedValue())); }