Cosmos/source/Cosmos.Debug.GDB/AsmLine.cs

129 lines
No EOL
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cosmos.Debug.GDB
{
public class AsmLine
{
public readonly string OrignalLine;
private uint mAddress;
private string mAddressLine;
private string mLabel;
private string mFirstToken;
public AsmLine(string line)
{
OrignalLine = line;
mAddressLine = OrignalLine;
Parse();
}
private void Parse()
{
string startTrim = OrignalLine.TrimStart(' ', '\t');
if(startTrim.Length == 0)
return;
char firstChar = startTrim[0];
int firstCharAsNumber = (int) firstChar;
bool possibleLabel = false;
if (firstCharAsNumber >= 'A' && firstCharAsNumber <= 'Z'
|| firstCharAsNumber >= 'a' && firstCharAsNumber <= 'z'
|| firstChar == '_')
{
possibleLabel = true;
}
bool needToFoundDoublePoint = false;
int lengthOfLabel = -1;
for (int i = 1; i < startTrim.Length; i++)
{
if (needToFoundDoublePoint == false)
{
if (startTrim[i] == ':' && possibleLabel)
{
mLabel = startTrim.Substring(0, i);
break;
}
if (startTrim[i] == ' ' || startTrim[i] == '\t')
{
mFirstToken = startTrim.Substring(0, i);
if(possibleLabel == false)
break;
needToFoundDoublePoint = true;
lengthOfLabel = i;
}
continue;
}
else
{
if (startTrim[i] == ':' && possibleLabel)
{
mLabel = startTrim.Substring(0, lengthOfLabel);
break;
}
if (startTrim[i] == ' ' || startTrim[i] == '\t')
continue;
// other characters found, so no label
break;
}
}
}
public uint Address
{
get
{
return mAddress;
}
set
{
if (mAddress != value)
{
mAddress = value;
mAddressLine = string.Format("{0:X08}: {1}", value, OrignalLine);
}
}
}
public string LineWithAddress
{
get
{
return mAddressLine;
}
}
public bool IsLabel
{
get
{
return mLabel != null;
}
}
public string Label
{
get
{
return mLabel == null ? string.Empty : mLabel;
}
}
public string FirstToken
{
get
{
return mFirstToken;
}
}
public string GDBLine { get; set; }
public override string ToString()
{
return mAddressLine;
}
}
}