예제 #1
0
파일: CGenDotNet.cs 프로젝트: rgl/TSS.MSR
        void GenEnum(TpmType e, List <TpmNamedConstant> elements, bool needsNone = false)
        {
            WriteComment(e);
            if (e is TpmBitfield)
            {
                Write("[Flags]");
            }
            Write("[DataContract]");
            Write($"[SpecTypeName(\"{e.SpecName}\")]");
            Write($"public enum {e.Name} : {e.GetFinalUnderlyingType().Name}");
            TabIn("{");

            if (needsNone)
            {
                Write("None = 0,");
            }

            foreach (TpmNamedConstant nc in elements)
            {
                string commaAfterOld = Separator(nc, elements);
                string comma         = nc.Name != nc.OldStyleName ? "," : commaAfterOld;

                WriteComment(nc);
                Write("[EnumMember]");

                string value        = nc.Value,
                       valueComment = "";
                if (nc.SpecValue.Expr != null)
                {
                    // Bitfields keep their member names unchanged, so they do not need the SpecTypeName attr.
                    Write($"[SpecTypeName(\"{nc.SpecName}\")]");

                    uint val = unchecked ((uint)nc.NumericValue);
                    valueComment = Expression.IsNumber(nc.SpecValue.Expr) ? "" : " // 0x" + val.ToString("X");
                    if (val >= unchecked ((uint)(0x90 << 24)))
                    {
                        value = $"unchecked (({e.GetFinalUnderlyingType().Name})({nc.Value}))";
                    }
                }
                Write($"{nc.Name} = {value}{comma}{valueComment}");

                if (nc.Name != nc.OldStyleName)
                {
                    Write($"[Obsolete(\"Use {e.Name}.{nc.Name} instead\")]");
                    Write($"{nc.OldStyleName} = {nc.Value}{commaAfterOld}");
                }
            }
            ;
            TabOut("}");
        } // GenEnum()
예제 #2
0
        } // GenerateHeader()

        void GenEnum(TpmType e, List <TpmNamedConstant> elements)
        {
            WriteComment(e);
            Write($"struct {e.Name} : public TpmEnum<{e.GetFinalUnderlyingType().Name}>");
            TabIn("{");
            Write($"TPM_ENUM_PROLOGUE({e.Name})");

            var enumVals = new Dictionary <string, string>();

            foreach (var elt in elements)
            {
                WriteComment(AsSummary(elt.Comment));
                string delimiter = Separator(elt, elements);
                Write($"{elt.Name} = {elt.Value}{delimiter}");

                // Do not include artificially added named constants into the name conversion maps
                if (elt.SpecName != null)
                {
                    enumVals[elt.Name] = e is TpmEnum?ToHex(elt.NumericValue) : elt.Value;
                }

                // Backward compat
                if (elt.Name == "PW")
                {
                    WriteComment(AsSummary("Deprecated: use PW instead"));
                    Write($"RS_PW [[deprecated(\"Use TPM_RH::PW instead\")]] = {elt.Value},");
                }
            }
            Write($"TPM_ENUM_EPILOGUE({e.Name})");
            TabOut("};");
            EnumMap[e.Name] = enumVals;
        } // GenEnum()
예제 #3
0
파일: TpmTypes.cs 프로젝트: rgl/TSS.MSR
 public TpmType GetFinalUnderlyingType()
 => UnderlyingType == null ? this : UnderlyingType.GetFinalUnderlyingType();