static PrefNode wvaBuildTree(HeapPrefNode hn, char c) { PrefNode pn = new PrefNode { C = c, Word = hn.Word }; if (hn.Nexts.Count == 0) { return(pn); } pn.Nexts = new PrefNode[hn.Nexts.Count]; List <char> nexts = new List <char>(); foreach (char next in hn.Nexts.Keys) { nexts.Add(next); } nexts.Sort(); for (int i = 0; i != nexts.Count; ++i) { pn.Nexts[i] = wvaBuildTree(hn.Nexts[nexts[i]], nexts[i]); } return(pn); }
static void wvaReadCedict() { Console.WriteLine("Building simplified ZH prefix tree"); Dictionary <int, int> senseCountToEntryCount = new Dictionary <int, int>(); HeapPrefNode hroot = new HeapPrefNode(); HashSet <string> simps = new HashSet <string>(); string line; using (var sr = ropen("cedict_ts.u8")) { while ((line = sr.ReadLine()) != null) { if (line.StartsWith("#") || line == "") { continue; } Match m = reEntry.Match(line); string simp = m.Groups[2].Value; if (simps.Contains(simp)) { continue; } simps.Add(simp); HeapPrefNode n = hroot; foreach (char c in simp) { if (!n.Nexts.ContainsKey(c)) { n.Nexts[c] = new HeapPrefNode(); } n = n.Nexts[c]; } n.Word = true; // How many senses? int senseCount = -1; foreach (char c in line) { if (c == '/') { ++senseCount; } } if (senseCountToEntryCount.ContainsKey(senseCount)) { ++senseCountToEntryCount[senseCount]; } else { senseCountToEntryCount[senseCount] = 1; } } } prefRoot = wvaBuildTree(hroot, (char)0); List <int> scList = new List <int>(); foreach (var x in senseCountToEntryCount) { scList.Add(x.Key); } scList.Sort((x, y) => senseCountToEntryCount[y].CompareTo(senseCountToEntryCount[x])); Console.WriteLine("Sense #\tEntry #"); foreach (int sc in scList) { Console.WriteLine(sc + "\t" + senseCountToEntryCount[sc]); } }
static string wvaTokZh(string zh) { StringBuilder sb = new StringBuilder(); int start = 0; while (start < zh.Length) { int end = start; int pos = start; PrefNode pn = prefRoot; while (pos < zh.Length) { if (pn.Nexts == null) { break; } int ix = Array.BinarySearch(pn.Nexts, new PrefNode { C = zh[pos] }, prefComp); if (ix < 0) { break; } ++pos; pn = pn.Nexts[ix]; if (pn.Word) { end = pos; } } if (start == end) { char c = zh[start]; if (!char.IsWhiteSpace(c) && !char.IsPunctuation(c)) { // No space: if both this, and previous, are a-zA-Z0-9 bool blockSpace = false; bool isAlnum = (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'); if (sb.Length > 0 && isAlnum) { char d = sb[sb.Length - 1]; if (d >= '0' && d <= '9' || d >= 'a' && d <= 'z' || d >= 'A' && d <= 'Z') { blockSpace = true; } } if (!blockSpace && sb.Length > 0 && sb[sb.Length - 1] != ' ') { sb.Append(' '); } if (!isAlnum) { sb.Append('@'); } sb.Append(zh[start]); } ++start; continue; } string tok = zh.Substring(start, end - start).Trim(); if (sb.Length > 0 && sb[sb.Length - 1] != ' ') { sb.Append(' '); } sb.Append(tok); start = end; } return(sb.ToString()); }
public DiffPolicyInfo Compare(Policy OldPolicy) { DiffPolicyInfo returnValue = new DiffPolicyInfo(); returnValue.PolicyGuid = GUID; returnValue.Name = Name; if (MachinePreferencesFiles != null && OldPolicy.MachinePreferencesFiles != null) { if (OldPolicy.MachinePreferencesFiles.Count > 0) { returnValue.Name = Name; } foreach (PolReaderXMLNode PrefNode in MachinePreferencesFiles) { bool found = false; foreach (PolReaderXMLNode oldPrefNode in OldPolicy.MachinePreferencesFiles) { if (PrefNode.Name.Equals(oldPrefNode.Name)) { XmlNodeDiffInfo DiffItems = PrefNode.Compare(oldPrefNode); if (DiffItems.nodeItems.Count > 0 || DiffItems.propItems.Count > 0) { returnValue.MachinePreferenceDifferenceInfo.Name = "Machine Preferences"; returnValue.MachinePreferenceDifferenceInfo.Type = XmlNodeDiffInfo.UPDATED_POLICY; DiffItems.Type = XmlNodeDiffInfo.UPDATED_POLICY; returnValue.MachinePreferenceDifferenceInfo.nodeItems.Add(DiffItems); } found = true; break; } } if (!found) { returnValue.MachinePreferenceDifferenceInfo.Name = "Machine Preferences"; returnValue.MachinePreferenceDifferenceInfo.Type = XmlNodeDiffInfo.NEW_POLICY; XmlNodeDiffInfo DiffItem = PrefNode.Compare(new PolReaderXMLNode()); DiffItem.Type = XmlNodeDiffInfo.NEW_POLICY; returnValue.MachinePreferenceDifferenceInfo.nodeItems.Add(DiffItem); } } foreach (PolReaderXMLNode oldPrefNode in OldPolicy.MachinePreferencesFiles) { bool found = false; foreach (PolReaderXMLNode PrefNode in MachinePreferencesFiles) { if (PrefNode.Name.Equals(oldPrefNode.Name)) { found = true; break; } } if (!found) { returnValue.MachinePreferenceDifferenceInfo.Name = "Machine Preferences"; returnValue.MachinePreferenceDifferenceInfo.Type = XmlNodeDiffInfo.UPDATED_POLICY; XmlNodeDiffInfo DiffItem = new PolReaderXMLNode().Compare(oldPrefNode); DiffItem.DBID = oldPrefNode.DBID; DiffItem.Type = XmlNodeDiffInfo.DELETED_POLICY; DiffItem.Name = oldPrefNode.Name; returnValue.MachinePreferenceDifferenceInfo.nodeItems.Add(DiffItem); } } } if (PreferencesFiles != null && OldPolicy.PreferencesFiles != null) { if (OldPolicy.MachinePreferencesFiles.Count > 0) { returnValue.Name = Name; } foreach (PolReaderXMLNode PrefNode in PreferencesFiles) { bool found = false; foreach (PolReaderXMLNode oldPrefNode in OldPolicy.PreferencesFiles) { if (PrefNode.Name.Equals(oldPrefNode.Name)) { XmlNodeDiffInfo DiffItems = PrefNode.Compare(oldPrefNode); if (DiffItems.nodeItems.Count > 0 || DiffItems.propItems.Count > 0) { returnValue.PreferenceDifferenceInfo.Name = "User Preferences"; returnValue.PreferenceDifferenceInfo.Type = XmlNodeDiffInfo.UPDATED_POLICY; DiffItems.Type = XmlNodeDiffInfo.UPDATED_POLICY; returnValue.PreferenceDifferenceInfo.nodeItems.Add(DiffItems); } found = true; break; } } if (!found) { returnValue.PreferenceDifferenceInfo.Name = "User Preferences"; returnValue.PreferenceDifferenceInfo.Type = XmlNodeDiffInfo.NEW_POLICY; XmlNodeDiffInfo DiffItem = PrefNode.Compare(new PolReaderXMLNode()); DiffItem.Type = XmlNodeDiffInfo.NEW_POLICY; returnValue.PreferenceDifferenceInfo.nodeItems.Add(DiffItem); } } foreach (PolReaderXMLNode oldPrefNode in OldPolicy.PreferencesFiles) { bool found = false; foreach (PolReaderXMLNode PrefNode in PreferencesFiles) { if (PrefNode.Name.Equals(oldPrefNode.Name)) { found = true; break; } } if (!found) { returnValue.PreferenceDifferenceInfo.Name = "User Preferences"; returnValue.PreferenceDifferenceInfo.Type = XmlNodeDiffInfo.UPDATED_POLICY; XmlNodeDiffInfo DiffItem = new PolReaderXMLNode().Compare(oldPrefNode); DiffItem.Type = XmlNodeDiffInfo.DELETED_POLICY; DiffItem.DBID = oldPrefNode.DBID; DiffItem.Name = oldPrefNode.Name; returnValue.PreferenceDifferenceInfo.nodeItems.Add(DiffItem); } } } if (SecEditFileData != null && SecEditFileData.Sections != null && OldPolicy.SecEditFileData != null && OldPolicy.SecEditFileData.Sections != null) { foreach (SecEditSection Section in SecEditFileData.Sections) { bool found = false; foreach (SecEditSection oldSection in OldPolicy.SecEditFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { List <SecEditDiffValueInfo> Items = Section.Compare(oldSection); if (Items.Count > 0) { returnValue.SecEditDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.UPDATED_POLICY_ITEM; secEditDiffInfo.Values = Items; returnValue.SecEditDifferenceInfo.Sections.Add(secEditDiffInfo); } found = true; break; } } if (!found && Section.Entries.Count > 0) { returnValue.SecEditDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.NEW_POLICY_ITEM; secEditDiffInfo.Values = Section.Compare(new SecEditSection()); returnValue.SecEditDifferenceInfo.Sections.Add(secEditDiffInfo); } } foreach (SecEditSection oldSection in OldPolicy.SecEditFileData.Sections) { bool found = false; foreach (SecEditSection Section in SecEditFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { found = true; break; } } if (!found && oldSection.Entries.Count > 0) { returnValue.SecEditDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = oldSection.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.DELETED_POLICY_ITEM; secEditDiffInfo.Values = new SecEditSection().Compare(oldSection); returnValue.SecEditDifferenceInfo.Sections.Add(secEditDiffInfo); } } } if (IEAKFileData != null && IEAKFileData.Sections != null && OldPolicy.IEAKFileData != null && OldPolicy.IEAKFileData.Sections != null) { foreach (SecEditSection Section in IEAKFileData.Sections) { bool found = false; foreach (SecEditSection oldSection in OldPolicy.IEAKFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { List <SecEditDiffValueInfo> Items = Section.Compare(oldSection); if (Items.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.UPDATED_POLICY_ITEM; secEditDiffInfo.Values = Items; returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } found = true; break; } } if (!found && Section.Entries.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.NEW_POLICY_ITEM; secEditDiffInfo.Values = Section.Compare(new SecEditSection()); returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } } foreach (SecEditSection oldSection in OldPolicy.IEAKFileData.Sections) { bool found = false; foreach (SecEditSection Section in IEAKFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { found = true; break; } } if (!found && oldSection.Entries.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = oldSection.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.DELETED_POLICY_ITEM; secEditDiffInfo.Values = new SecEditSection().Compare(oldSection); returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } } } if (IEAKMachineFileData != null && IEAKMachineFileData.Sections != null && OldPolicy.IEAKMachineFileData != null && OldPolicy.IEAKMachineFileData.Sections != null) { foreach (SecEditSection Section in IEAKMachineFileData.Sections) { bool found = false; foreach (SecEditSection oldSection in OldPolicy.IEAKMachineFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { List <SecEditDiffValueInfo> Items = Section.Compare(oldSection); if (Items.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.UPDATED_POLICY_ITEM; secEditDiffInfo.Values = Items; returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } found = true; break; } } if (!found && Section.Entries.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = Section.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.NEW_POLICY_ITEM; secEditDiffInfo.Values = Section.Compare(new SecEditSection()); returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } } foreach (SecEditSection oldSection in OldPolicy.IEAKMachineFileData.Sections) { bool found = false; foreach (SecEditSection Section in IEAKMachineFileData.Sections) { if (oldSection.Name.Equals(Section.Name)) { found = true; break; } } if (!found && oldSection.Entries.Count > 0) { returnValue.IEAKDifferenceInfo.Type = SecEditDiffInfo.UPDATED_POLICY_ITEM; SecEditDiffSectionInfo secEditDiffInfo = new SecEditDiffSectionInfo(); secEditDiffInfo.Name = oldSection.Name; secEditDiffInfo.Type = SecEditDiffSectionInfo.DELETED_POLICY_ITEM; secEditDiffInfo.Values = new SecEditSection().Compare(oldSection); returnValue.IEAKDifferenceInfo.Sections.Add(secEditDiffInfo); } } } foreach (WMIItem WmiFilter in WMIFilters) { bool found = false; foreach (WMIItem oldWmiFilter in OldPolicy.WMIFilters) { if (oldWmiFilter.WMIFilter.Equals(WmiFilter.WMIFilter)) { found = true; break; } } if (!found) { returnValue.WMIDifferenceInfo.Type = WMIDiffInfo.UPDATED_POLICY_ITEM; WMIDiffInfoItem wmiItem = new WMIDiffInfoItem(); wmiItem.WMIQuery = WmiFilter.WMIFilter; wmiItem.Type = SecEditDiffSectionInfo.NEW_POLICY_ITEM; returnValue.WMIDifferenceInfo.WMIItems.Add(wmiItem); } } foreach (WMIItem oldWmiFilter in OldPolicy.WMIFilters) { bool found = false; foreach (WMIItem WmiFilter in WMIFilters) { if (oldWmiFilter.WMIFilter.Equals(WmiFilter.WMIFilter)) { found = true; break; } } if (!found) { returnValue.WMIDifferenceInfo.Type = WMIDiffInfo.UPDATED_POLICY_ITEM; WMIDiffInfoItem wmiItem = new WMIDiffInfoItem(); wmiItem.WMIQuery = oldWmiFilter.WMIFilter; wmiItem.Type = SecEditDiffSectionInfo.DELETED_POLICY_ITEM; returnValue.WMIDifferenceInfo.WMIItems.Add(wmiItem); } } foreach (AssignmentItem Assignment in AppliedTo) { bool found = false; foreach (AssignmentItem oldAssignment in OldPolicy.AppliedTo) { if (oldAssignment.Assignment.Equals(Assignment.Assignment)) { found = true; break; } } if (!found) { returnValue.AssignmentsDifferenceInfo.Type = AssignmentsDiffInfo.UPDATED_POLICY_ITEM; AssignmentsDiffInfoItem assignItem = new AssignmentsDiffInfoItem(); assignItem.Name = Assignment.Assignment; assignItem.Type = AssignmentsDiffInfoItem.NEW_POLICY_ITEM; returnValue.AssignmentsDifferenceInfo.Assignmments.Add(assignItem); } } foreach (AssignmentItem oldAssignment in OldPolicy.AppliedTo) { bool found = false; foreach (AssignmentItem Assignment in AppliedTo) { if (oldAssignment.Assignment.Equals(Assignment.Assignment)) { found = true; break; } } if (!found) { returnValue.AssignmentsDifferenceInfo.Type = AssignmentsDiffInfo.UPDATED_POLICY_ITEM; AssignmentsDiffInfoItem assignItem = new AssignmentsDiffInfoItem(); assignItem.Name = oldAssignment.Assignment; assignItem.Type = AssignmentsDiffInfoItem.DELETED_POLICY_ITEM; returnValue.AssignmentsDifferenceInfo.Assignmments.Add(assignItem); } } foreach (LinkageItem Linkage in LinkedTo) { bool found = false; foreach (LinkageItem oldLinkage in OldPolicy.LinkedTo) { if (oldLinkage.Linkage.Equals(Linkage.Linkage)) { found = true; break; } } if (!found) { returnValue.LinkageDifferenceInfo.Type = LinkageDiffInfo.UPDATED_POLICY_ITEM; LinkageDiffInfoItem linkItem = new LinkageDiffInfoItem(); linkItem.Name = Linkage.Linkage; linkItem.Type = LinkageDiffInfoItem.NEW_POLICY_ITEM; returnValue.LinkageDifferenceInfo.Linkages.Add(linkItem); } } foreach (LinkageItem oldLinkage in OldPolicy.LinkedTo) { bool found = false; foreach (LinkageItem Linkage in LinkedTo) { if (oldLinkage.Linkage.Equals(Linkage.Linkage)) { found = true; break; } } if (!found) { returnValue.LinkageDifferenceInfo.Type = LinkageDiffInfo.UPDATED_POLICY_ITEM; LinkageDiffInfoItem linkItem = new LinkageDiffInfoItem(); linkItem.Name = oldLinkage.Linkage; linkItem.Type = LinkageDiffInfoItem.DELETED_POLICY_ITEM; returnValue.LinkageDifferenceInfo.Linkages.Add(linkItem); } } foreach (PolicyFile polFile in PolicyFiles) { bool found = false; foreach (PolicyFile oldPolFile in OldPolicy.PolicyFiles) { if (polFile.Type == oldPolFile.Type) { List <RegDiffItemInfo> DiffItems = polFile.Compare(oldPolFile); if (DiffItems.Count > 0) { if (polFile.Type == PolicyFile.POLICY_FILE_TYPE_MACHINE) { returnValue.MachineRegDifferenceInfo.Type = RegDiffInfo.UPDATED_POLICY_ITEM; returnValue.MachineRegDifferenceInfo.Items = polFile.Compare(oldPolFile); } else if (polFile.Type == PolicyFile.POLICY_FILE_TYPE_USER) { returnValue.UserRegDifferenceInfo.Type = RegDiffInfo.UPDATED_POLICY_ITEM; returnValue.UserRegDifferenceInfo.Items = polFile.Compare(oldPolFile); } } found = true; break; } } if (!found) { if (polFile.Type == PolicyFile.POLICY_FILE_TYPE_MACHINE && polFile.PolicyItems.Count > 0) { returnValue.MachineRegDifferenceInfo.Type = RegDiffInfo.NEW_POLICY_ITEM; returnValue.MachineRegDifferenceInfo.Items = polFile.Compare(new PolicyFile()); } else if (polFile.Type == PolicyFile.POLICY_FILE_TYPE_USER && polFile.PolicyItems.Count > 0) { returnValue.UserRegDifferenceInfo.Type = RegDiffInfo.NEW_POLICY_ITEM; returnValue.UserRegDifferenceInfo.Items = polFile.Compare(new PolicyFile()); } } } foreach (PolicyFile oldPolFile in OldPolicy.PolicyFiles) { bool found = false; foreach (PolicyFile polFile in PolicyFiles) { if (polFile.Type == oldPolFile.Type) { found = true; } } if (!found) { if (oldPolFile.Type == PolicyFile.POLICY_FILE_TYPE_MACHINE && oldPolFile.PolicyItems.Count > 0) { returnValue.MachineRegDifferenceInfo.Type = RegDiffInfo.DELETED_POLICY_ITEM; returnValue.MachineRegDifferenceInfo.Items = new PolicyFile().Compare(oldPolFile); } else if (oldPolFile.Type == PolicyFile.POLICY_FILE_TYPE_USER && oldPolFile.PolicyItems.Count > 0) { returnValue.UserRegDifferenceInfo.Type = RegDiffInfo.DELETED_POLICY_ITEM; returnValue.UserRegDifferenceInfo.Items = new PolicyFile().Compare(oldPolFile); } } } return(returnValue); }