public int RegisterDecimalFormat(XmlQualifiedName name, string infinitySymbol, string nanSymbol, string characters)
        {
            if (decimalFormats == null)
            {
                decimalFormats = new DecimalFormats();
            }
            DecimalFormatDecl format = new DecimalFormatDecl(name, infinitySymbol, nanSymbol, characters);

            decimalFormats.Add(format);
            return(0);   // have to return something
        }
 public QilNode InvokeRegisterDecimalFormat(DecimalFormatDecl format) {
     Debug.Assert(format != null);
     return XsltInvokeEarlyBound(QName("register-decimal-format"),
         XsltMethods.RegisterDecimalFormat, T.IntX,
         new QilNode[] {
             QName(format.Name.Name, format.Name.Namespace),
             String(format.InfinitySymbol), String(format.NanSymbol), String(new string(format.Characters))
         }
     );
 }
Exemple #3
0
        private void LoadDecimalFormat(NsDecl stylesheetNsList)
        {
            const int NumCharAttrs = 8, NumSignAttrs = 7;
            ContextInfo ctxInfo = _input.GetAttributes(_decimalFormatAttributes);
            ctxInfo.nsList = MergeNamespaces(ctxInfo.nsList, stylesheetNsList);

            XmlQualifiedName name;
            if (_input.MoveToXsltAttribute(0, "name"))
            {
                _compiler.EnterForwardsCompatible();
                name = ResolveQName(/*ignoreDefaultNs:*/true, _input.Value);
                if (!_compiler.ExitForwardsCompatible(_input.ForwardCompatibility))
                {
                    name = new XmlQualifiedName();
                }
            }
            else
            {
                // Use name="" for the default decimal-format
                name = new XmlQualifiedName();
            }

            string infinity = DecimalFormatDecl.Default.InfinitySymbol;
            if (_input.MoveToXsltAttribute(1, "infinity"))
            {
                infinity = _input.Value;
            }

            string nan = DecimalFormatDecl.Default.NanSymbol;
            if (_input.MoveToXsltAttribute(2, "NaN"))
            {
                nan = _input.Value;
            }

            char[] DefaultValues = DecimalFormatDecl.Default.Characters;
            char[] characters = new char[NumCharAttrs];
            Debug.Assert(NumCharAttrs == DefaultValues.Length);

            for (int idx = 0; idx < NumCharAttrs; idx++)
            {
                characters[idx] = ParseCharAttribute(3 + idx, _decimalFormatAttributes[3 + idx].name, DefaultValues[idx]);
            }

            // Check all NumSignAttrs signs are distinct
            for (int i = 0; i < NumSignAttrs; i++)
            {
                for (int j = i + 1; j < NumSignAttrs; j++)
                {
                    if (characters[i] == characters[j])
                    {
                        // Try move to second attribute and if it is missing to first.
                        bool dummy = _input.MoveToXsltAttribute(3 + j, _decimalFormatAttributes[3 + j].name) || _input.MoveToXsltAttribute(3 + i, _decimalFormatAttributes[3 + i].name);
                        Debug.Assert(dummy, "One of the atts should have lineInfo. if both are defualt they can't conflict.");
                        ReportError(/*[XT1300]*/SR.Xslt_DecimalFormatSignsNotDistinct, _decimalFormatAttributes[3 + i].name, _decimalFormatAttributes[3 + j].name);
                        break;
                    }
                }
            }

            if (_compiler.DecimalFormats.Contains(name))
            {
                // Check all attributes have the same values
                DecimalFormatDecl format = _compiler.DecimalFormats[name];
                _input.MoveToXsltAttribute(1, "infinity");
                CheckError(infinity != format.InfinitySymbol, /*[XT1290]*/SR.Xslt_DecimalFormatRedefined, "infinity", infinity);
                _input.MoveToXsltAttribute(2, "NaN");
                CheckError(nan != format.NanSymbol, /*[XT1290]*/SR.Xslt_DecimalFormatRedefined, "NaN", nan);
                for (int idx = 0; idx < NumCharAttrs; idx++)
                {
                    _input.MoveToXsltAttribute(3 + idx, _decimalFormatAttributes[3 + idx].name);
                    CheckError(characters[idx] != format.Characters[idx], /*[XT1290]*/SR.Xslt_DecimalFormatRedefined, _decimalFormatAttributes[3 + idx].name, char.ToString(characters[idx]));
                }
                Debug.Assert(name.Equals(format.Name));
            }
            else
            {
                // Add format to the global collection
                DecimalFormatDecl format = new DecimalFormatDecl(name, infinity, nan, new string(characters));
                _compiler.DecimalFormats.Add(format);
            }
            CheckNoContent();
        }
        private void LoadDecimalFormat(NsDecl stylesheetNsList) {
            const int NumAttrs = 11, NumCharAttrs = 8, NumSignAttrs = 7;

            string[] attValues = new string[NumAttrs];
            string[] attNames  = new string[NumAttrs] {
                input.Atoms.DecimalSeparator ,
                input.Atoms.GroupingSeparator,
                input.Atoms.Percent          ,
                input.Atoms.PerMille         ,
                input.Atoms.ZeroDigit        ,
                input.Atoms.Digit            ,
                input.Atoms.PatternSeparator ,
                input.Atoms.MinusSign        ,
                input.Atoms.Infinity         ,
                input.Atoms.NaN              ,
                input.Atoms.Name             ,
            };

            ContextInfo ctxInfo = input.GetAttributes(/*required:*/0, NumAttrs, attNames, attValues);
            ctxInfo.nsList = MergeNamespaces(ctxInfo.nsList, stylesheetNsList);

            // Apply default values
            char[] DefaultValues = DecimalFormatDecl.Default.Characters;
            char[] characters = new char[NumCharAttrs];
            Debug.Assert(NumCharAttrs == DefaultValues.Length);
            int idx;

            for (idx = 0; idx < NumCharAttrs; idx++) {
                characters[idx] = ParseCharAttribute(attValues[idx], DefaultValues[idx], attNames[idx]);
            }

            string attInfinity = attValues[idx++];
            string attNaN      = attValues[idx++];
            string attName     = attValues[idx++];
            Debug.Assert(idx == NumAttrs);

            if (attInfinity == null) {
                attInfinity = DecimalFormatDecl.Default.InfinitySymbol;
            }
            if (attNaN == null) {
                attNaN = DecimalFormatDecl.Default.NanSymbol;
            }

            // Check all NumSignAttrs signs are distinct
            for (int i = 0; i < NumSignAttrs; i++) {
                for (int j = i+1; j < NumSignAttrs; j++) {
                    if (characters[i] == characters[j]) {
                        ReportError(/*[XT1300]*/Res.Xslt_DecimalFormatSignsNotDistinct, attNames[i], attNames[j]);
                        break;
                    }
                }
            }

            XmlQualifiedName name;
            if (attName == null) {
                // Use name="" for the default decimal-format
                name = new XmlQualifiedName();
            } else {
                compiler.EnterForwardsCompatible();
                name = ResolveQName(/*ignoreDefaultNs:*/true, attName);
                if (!compiler.ExitForwardsCompatible(input.ForwardCompatibility)) {
                    name = new XmlQualifiedName();
                }
            }

            if (compiler.DecimalFormats.Contains(name)) {
                // Check all attributes have the same values
                DecimalFormatDecl format = compiler.DecimalFormats[name];
                for (idx = 0; idx < NumCharAttrs; idx++) {
                    if (characters[idx] != format.Characters[idx]) {
                        ReportError(/*[XT1290]*/Res.Xslt_DecimalFormatRedefined, attNames[idx], char.ToString(characters[idx]));
                    }
                }
                if (attInfinity != format.InfinitySymbol) {
                    ReportError(/*[XT1290]*/Res.Xslt_DecimalFormatRedefined, attNames[idx], attInfinity);
                }
                idx++;
                if (attNaN != format.NanSymbol) {
                    ReportError(/*[XT1290]*/Res.Xslt_DecimalFormatRedefined, attNames[idx], attNaN);
                }
                idx++;
                Debug.Assert(name.Equals(format.Name));
                idx++;
                Debug.Assert(idx == NumAttrs);
            } else {
                // Add format to the global collection
                DecimalFormatDecl format = new DecimalFormatDecl(name, attInfinity, attNaN, new string(characters));
                compiler.DecimalFormats.Add(format);
            }
            CheckNoContent();
        }
 public int RegisterDecimalFormat(XmlQualifiedName name, string infinitySymbol, string nanSymbol, string characters) {
     if (decimalFormats == null) {
         decimalFormats = new DecimalFormats();
     }
     DecimalFormatDecl format = new DecimalFormatDecl(name, infinitySymbol, nanSymbol, characters);
     decimalFormats.Add(format);
     return 0;   // have to return something
 }
 public QilNode InvokeRegisterDecimalFormatter(QilNode formatPicture, DecimalFormatDecl format) {
     CheckString(formatPicture);
     Debug.Assert(format != null);
     return XsltInvokeEarlyBound(QName("register-decimal-formatter"),
         XsltMethods.RegisterDecimalFormatter, T.DoubleX,
         new QilNode[] {
             formatPicture,
             String(format.InfinitySymbol), String(format.NanSymbol), String(new string(format.Characters))
         }
     );
 }