C2.Flash.frmMain.loadDeviceList C# (CSharp) Method

loadDeviceList() private method

private loadDeviceList ( ) : void
return void
		private void loadDeviceList()
		{
			try
			{
				devices.Clear();
				using (TextReader dl = new StreamReader(Path.Combine(Application.StartupPath, "DeviceList.txt")))
				{
					string line;
					int lineNum = 0;
					List<string> fields = null;

					while ((line = dl.ReadLine()) != null)
					{
						lineNum++;
						line = line.Trim();
						if (line.Length == 0 || (fields != null && (line.StartsWith("#") || line.StartsWith("\"#"))))
							continue;

						List<string> values = new List<string>();

						#region Parse to values

						string part = string.Empty;
						int state = 0;

						foreach (char c in line)
						{
							switch (state)
							{
								case 0:
									if (!Char.IsWhiteSpace(c))
									{
										if (c == '"')
											state = 2;		// Collect up to next " ("" replaced to single ")
										else if (c == ',')
										{
											values.Add(part.Trim());
											part = string.Empty;
										}
										else
										{
											part += c;
											state = 1;
										}
									}
									break;
								case 1:
									if (c == ',')
									{
										values.Add(part.Trim());
										part = string.Empty;
										state = 0;
									}
									else
										part += c;
									break;
								case 2:
									if (c == '"')
										state = 3;
									else
										part += c;
									break;
								case 3:
									if (c == '"')
									{
										part += '"';
										state = 2;
									}
									else
									{
										values.Add(part.Trim());
										part = string.Empty;
										if (c == ',')
											state = 0;
										else if (!Char.IsWhiteSpace(c))
											state = 10;
										else
											state = 4;
									}
									break;
								case 4:
									if (c == ',')
										state = 0;
									else if (!Char.IsWhiteSpace(c))
										state = 10;
									break;
							}
							if (state == 10)
								break;
						}

						if (state == 0 || state == 1 || state == 3)
						{
							if (part.Length > 0)
								values.Add(part.Trim());
						}
						else if (state != 4)
						{
							MessageBox.Show(string.Format("Bad line ({0}): {1}", lineNum, line));
							continue;
						}
						#endregion

						if (fields == null)
						{
							if (values.Count > 0)
								fields = values;
							else
							{
								MessageBox.Show("First line not contains fields name");
								break;
							}

							for (int i = 0; i < fields.Count; i++)
							{
								string field = fields[i];
								if (field == null)
									field = string.Empty;
								if (field.StartsWith("#"))
									field = field.Substring(1).Trim();
								if (field.Length == 0)
								{
									MessageBox.Show(string.Format("Empty field name at position {0}", i + 1));
									fields = null;
									break;
								}
								else
									fields[i] = field;
							}
							if (fields == null)
								break;

							continue;
						}

						C2Device device = new C2Device();
						bool scan = true;

						device.Name = parseString(values, fields, "Name", ref scan, true);
						device.ID = parseByte(values, fields, "ID", ref scan, true);
						device.ExtraID = parseByte(values, fields, "Extraid", ref scan, true);
						device.Version = parseInt(values, fields, "Version", ref scan, true);
						device.StringObserved = parseString(values, fields, "String observed", ref scan, false);
						device.FlashSize = parseInt(values, fields, "Flash size", ref scan, true);
						device.FlashSectorSize = parseInt(values, fields, "Flash sector Size", ref scan, true);
						device.XramSize = parseInt(values, fields, "Xram size", ref scan, true);
						device.ExternalBus = parseBool(values, fields, "External bus", ref scan, true);
						device.Tested = parseBool(values, fields, "Tested", ref scan, true);
						device.LockType = parseString(values, fields, "Lock Type", ref scan, true);
						device.Readlock = parseInt(values, fields, "Read lock", ref scan, true);
						device.WriteLock = parseInt(values, fields, "Write Lock", ref scan, true);
						device.SingleLock = parseInt(values, fields, "Single lock", ref scan, true);
						device.Bottom = parseInt(values, fields, "Bottom", ref scan, true);
						device.Top = parseInt(values, fields, "Top", ref scan, true);
						device.Present = parseBool(values, fields, "Present", ref scan, true);
						device.Start = parseInt(values, fields, "Start", ref scan, true);
						device.Length = parseInt(values, fields, "Length", ref scan, true);
						device.SectorSize = parseInt(values, fields, "Sector Size", ref scan, true);
						device.PagedSFR = parseBool(values, fields, "Paged SFR", ref scan, true);
						device.SFR_Page = parseInt(values, fields, "SFR_Page", ref scan, true);
						if (scan)
						{
							device.USBFIFOSize = parseInt(values, fields, "USB FIFO", ref scan, true);
							if (scan)
								device.USBFIFO = true;
							else
							{
								scan = true;
								device.USBFIFO = parseBool(values, fields, "USB FIFO", ref scan, true);
							}
						}
						device.DebugInterface = parseString(values, fields, "Debug Interface", ref scan, true);
						device.Cache = parseInt(values, fields, "Cache", ref scan, true);
						device.BP0L = parseString(values, fields, "BP0L", ref scan, true);
						device.BP0H = parseString(values, fields, "BP0H", ref scan, true);
						device.BP1L = parseString(values, fields, "BP1L", ref scan, true);
						device.BP1H = parseString(values, fields, "BP1H", ref scan, true);
						device.BP2L = parseString(values, fields, "BP2L", ref scan, true);
						device.BP2H = parseString(values, fields, "BP2H", ref scan, true);
						device.BP3L = parseString(values, fields, "BP3L", ref scan, true);
						device.BP3H = parseString(values, fields, "BP3H", ref scan, true);
						device.Comments = parseString(values, fields, "Comments", ref scan, false);
						device.FPREG = parseByte(values, fields, "FPREG", ref scan, false);
						if (device.FPREG == 0)
							device.FPREG = 0xAD;

						if (scan)
							devices.Add(device);
						else
						{
							MessageBox.Show(string.Format("DeviceList.txt has bad values at line:{0}.", lineNum));
							break;
						}
					}
					dl.Close();
				}
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}

			cbDevices.Items.Clear();
			foreach (C2Device device in devices)
			{
				cbDevices.Items.Add(device);
			}
		}