public SerializedType ParseDataTypeCode(List<Argument_v1> compoundArgs)
{
if (PeekAndDiscard('?'))
{
switch (str[i++])
{
case 'A': break;
case 'B': /* const */ break;
default: Error("Expected 'A' or 'B', but saw '{0}'.", str[i - 1]); break;
}
}
switch (str[i++])
{
case '0': return compoundArgs[0].Type;
case '1': return compoundArgs[1].Type;
case '2': return compoundArgs[2].Type;
case '3': return compoundArgs[3].Type;
case '4': return compoundArgs[4].Type;
case '5': return compoundArgs[5].Type;
case '6': return compoundArgs[6].Type;
case '7': return compoundArgs[7].Type;
case '8': return compoundArgs[8].Type;
case '9': return compoundArgs[9].Type;
case 'A': return ParsePointer(compoundArgs); //$TODO: really is a lvalue reference but is implemented as a pointer on Win32...
case 'B': return ParsePointer(compoundArgs); //$TODO: really is a volatile lvalue reference but is implemented as a pointer on Win32...
case 'C': return new PrimitiveType_v1(Domain.Character | Domain.SignedInt, 1);
case 'D': return new PrimitiveType_v1(Domain.Character, 1);
case 'E': return new PrimitiveType_v1(Domain.Character | Domain.UnsignedInt, 1);
case 'F': return new PrimitiveType_v1(Domain.SignedInt, 2);
case 'G': return new PrimitiveType_v1(Domain.UnsignedInt, 2);
case 'H': return new PrimitiveType_v1(Domain.SignedInt, 4);
case 'I': return new PrimitiveType_v1(Domain.UnsignedInt, 4);
case 'J': return new PrimitiveType_v1(Domain.SignedInt, 4); // 'long' on Win32 is actually 4 bytes
case 'K': return new PrimitiveType_v1(Domain.UnsignedInt, 4); // 'long' on Win32 is actually 4 bytes
case 'M': return new PrimitiveType_v1(Domain.Real, 4);
case 'N': return new PrimitiveType_v1(Domain.Real, 8);
case 'O': return new PrimitiveType_v1(Domain.Real, 10);
case 'P': return ParsePointer(compoundArgs); // pointer
case 'Q': return ParsePointer(compoundArgs); // const pointer
case 'R': return ParsePointer(compoundArgs); // volatile pointer
case 'T': return ParseStructure(compoundArgs); // union
case 'U': return ParseStructure(compoundArgs); // struct (see below)
case 'V': return ParseStructure(compoundArgs); // class (see below)
case 'W': return ParseEnum(compoundArgs);
case 'X': return new VoidType_v1(); // void (as in 'void return value', 'X' terminates argument list)
case 'Y': return ParseStructure(compoundArgs); // cointerface (see below)
case '_':
PrimitiveType_v1 prim;
switch (str[i++])
{
case 'J': prim = new PrimitiveType_v1(Domain.SignedInt, 8); break; // __int64
case 'K': prim = new PrimitiveType_v1(Domain.UnsignedInt, 8); break; // unsigned __int64
case 'N': prim = new PrimitiveType_v1(Domain.Boolean, 1); break; // bool
case 'W': prim = new PrimitiveType_v1(Domain.Character, 2); break; // wchar_t
default: Error("Unsupported type code '_{0}'.", str[i - 1]); return null;
}
compoundArgs.Add(new Argument_v1 { Type = prim });
return prim;
case '$':
switch (str[i++])
{
case '$':
switch (str[i++])
{
case 'Q': return ParsePointer(compoundArgs); //$ rvalue reference
}
Error("Unsupported type code '$${0}'.", str[i - 1]); return null;
default:
Error("Unsupported type code '$${0}'.", str[i - 1]); return null;
}
default:
Error("Unsupported type code '{0}'.", str[i - 1]);
return null;
}
}