using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Adaptation.FileHandlers.Stratus; #nullable enable public class Wafer { public Wafer(string destination, string mean, string passFail, string recipe, string reference, List sites, string slot, string source, string stdDev, string waferText) { Destination = destination; Mean = mean; PassFail = passFail; Recipe = recipe; Reference = reference; Sites = sites; Slot = slot; Source = source; StdDev = stdDev; Text = waferText; } public string Destination { get; } public string Mean { get; } public string PassFail { get; } public string Recipe { get; } public string Reference { get; } public List Sites { get; } public string Slot { get; } public string Source { get; } public string StdDev { get; } public string Text { get; } internal static string GetToken(string text, int[] i) { while (true) { if (i[0] >= text.Length || !IsNullOrWhiteSpace(text.Substring(i[0], 1))) break; i[0]++; } int num = i[0]; while (true) { if (num >= text.Length || IsNullOrWhiteSpace(text.Substring(num, 1))) break; num++; } string str = text.Substring(i[0], num - i[0]); i[0] = num; return str.Trim(); } internal static bool IsNullOrWhiteSpace(string search) { bool flag; int num = 0; while (true) { if (num >= search.Length) { flag = true; break; } else if (char.IsWhiteSpace(search[num])) num++; else { flag = false; break; } } return flag; } internal static string PeekNextLine(string text, int[] i) { int num = i[0]; string toEOL = Header.GetToEOL(text, i); i[0] = num; return toEOL; } internal static ReadOnlyCollection GetGroups(string text, Constant constant, int[] i) { List results = new(); string[] lines = text.Substring(i[0]).Split(new string[] { Environment.NewLine }, StringSplitOptions.None); if (lines.Length > 0) { List group = new(); foreach (string line in lines) { group.Add(line); if (!line.StartsWith(constant.Destination)) continue; results.Add(string.Join(Environment.NewLine, group)); group.Clear(); } results.Add(string.Join(Environment.NewLine, group)); } return results.AsReadOnly(); } internal static ReadOnlyCollection Get(Constant constant, ReadOnlyCollection groups) { List results = new(); string mean; string slot; Wafer wafer; string recipe; string source; string stdDev; string nextLine; string passFail; string reference; string thickness; string waferText; string destination; List sites; int[] j = new int[] { 0 }; foreach (string groupText in groups) { j[0] = 0; sites = new(); if (groupText.Contains(constant.ProcessFailed)) { mean = string.Empty; slot = string.Empty; recipe = string.Empty; source = string.Empty; stdDev = string.Empty; passFail = string.Empty; reference = string.Empty; waferText = string.Empty; destination = string.Empty; } else if (groupText.Contains(constant.Reference)) { mean = string.Empty; slot = string.Empty; recipe = string.Empty; stdDev = string.Empty; passFail = string.Empty; waferText = string.Empty; Header.ScanPast(groupText, j, constant.Reference); reference = Header.GetToEOL(groupText, j); Header.ScanPast(groupText, j, constant.Source); source = Header.GetToEOL(groupText, j).Trim(); Header.ScanPast(groupText, j, constant.Destination); destination = Header.GetToEOL(groupText, j).Trim(); } else { if (!groupText.Contains(constant.Wafer)) continue; Header.ScanPast(groupText, j, constant.Wafer); waferText = Header.GetToEOL(groupText, j); if (waferText.EndsWith(".")) waferText = waferText.Remove(waferText.Length - 1, 1); Header.ScanPast(groupText, j, constant.Slot); slot = Header.GetToEOL(groupText, j); Header.ScanPast(groupText, j, constant.Recipe); recipe = Header.GetToEOL(groupText, j); if (recipe.EndsWith(".")) recipe = recipe.Remove(recipe.Length - 1, 1); Header.ScanPast(groupText, j, constant.Thickness); _ = GetToken(groupText, j); nextLine = PeekNextLine(groupText, j); if (nextLine.Contains(constant.OneHypen)) { Header.ScanPast(groupText, j, constant.OneHypen); _ = GetToken(groupText, j); } for (int k = 0; k < 100; k++) { nextLine = PeekNextLine(groupText, j); if (nextLine.Contains("Slot")) break; if (string.IsNullOrEmpty(nextLine)) { _ = Header.GetToEOL(groupText, j); continue; } thickness = GetToken(groupText, j); if (thickness == constant.Thickness) { _ = GetToken(groupText, j); continue; } sites.Add(thickness); } Header.ScanPast(groupText, j, constant.Slot); _ = GetToken(groupText, j); passFail = GetToken(groupText, j); if (passFail.EndsWith(".")) passFail = passFail.Remove(passFail.Length - 1, 1); Header.ScanPast(groupText, j, constant.Mean); mean = GetToken(groupText, j); if (mean.EndsWith(",")) mean = mean.Remove(mean.Length - 1, 1); Header.ScanPast(groupText, j, constant.STDD); stdDev = Header.GetToEOL(groupText, j); if (stdDev.EndsWith(".")) stdDev = stdDev.Remove(stdDev.Length - 1, 1); reference = string.Empty; Header.ScanPast(groupText, j, constant.Source); source = Header.GetToEOL(groupText, j).Trim(); Header.ScanPast(groupText, j, constant.Destination); destination = Header.GetToEOL(groupText, j).Trim(); } wafer = new(destination: destination, mean: mean, passFail: passFail, recipe: recipe, reference: reference, sites: sites, slot: slot, source: source, stdDev: stdDev, waferText: waferText); results.Add(wafer); } return results.AsReadOnly(); } }