コード例 #1
0
ファイル: FunctionDataBuilder.cs プロジェクト: ctddjyds/npoi
        public void Add(int functionIndex, String functionName, int minParams, int maxParams,
                byte returnClassCode, byte[] parameterClassCodes, bool hasFootnote)
        {
            FunctionMetadata fm = new FunctionMetadata(functionIndex, functionName, minParams, maxParams,
                    returnClassCode, parameterClassCodes);

            int indexKey = functionIndex;


            if (functionIndex > _maxFunctionIndex)
            {
                _maxFunctionIndex = functionIndex;
            }
            // allow function definitions to Change only if both previous and the new items have footnotes
            FunctionMetadata prevFM;
            prevFM = (FunctionMetadata)_functionDataByName[functionName];
            if (prevFM != null)
            {
                if (!hasFootnote || !_mutatingFunctionIndexes.Contains(indexKey))
                {
                    throw new Exception("Multiple entries for function name '" + functionName + "'");
                }
                _functionDataByIndex.Remove(prevFM.Index);
            }
            prevFM = (FunctionMetadata)_functionDataByIndex[indexKey];
            if (prevFM != null)
            {
                if (!hasFootnote || !_mutatingFunctionIndexes.Contains(indexKey))
                {
                    throw new Exception("Multiple entries for function index (" + functionIndex + ")");
                }
                _functionDataByName.Remove(prevFM.Name);
            }
            if (hasFootnote)
            {
                _mutatingFunctionIndexes.Add(indexKey);
            }
            _functionDataByIndex[indexKey]=fm;
            _functionDataByName[functionName]=fm;
        }
コード例 #2
0
ファイル: FunctionDataBuilder.cs プロジェクト: ctddjyds/npoi
        public FunctionMetadataRegistry Build()
        {

            FunctionMetadata[] jumbledArray = new FunctionMetadata[_functionDataByName.Count];
            IEnumerator values = _functionDataByName.Values.GetEnumerator();
            FunctionMetadata[] fdIndexArray = new FunctionMetadata[_maxFunctionIndex + 1];
            while (values.MoveNext())
            {
                FunctionMetadata fd = (FunctionMetadata)values.Current;
                fdIndexArray[fd.Index] = fd;
            }

            return new FunctionMetadataRegistry(fdIndexArray, _functionDataByName);
        }
コード例 #3
0
ファイル: FormulaParser.cs プロジェクト: xoposhiy/npoi
 private void ValidateNumArgs(int numArgs, FunctionMetadata fm)
 {
     if (numArgs < fm.MinParams)
     {
         String msg = "Too few arguments to function '" + fm.Name + "'. ";
         if (fm.HasFixedArgsLength)
         {
             msg += "Expected " + fm.MinParams;
         }
         else
         {
             msg += "At least " + fm.MinParams + " were expected";
         }
         msg += " but got " + numArgs + ".";
         throw new FormulaParseException(msg);
     }
     if (numArgs > fm.MaxParams)
     {
         String msg = "Too many arguments to function '" + fm.Name + "'. ";
         if (fm.HasFixedArgsLength)
         {
             msg += "Expected " + fm.MaxParams;
         }
         else
         {
             msg += "At most " + fm.MaxParams + " were expected";
         }
         msg += " but got " + numArgs + ".";
         throw new FormulaParseException(msg);
     }
 }
コード例 #4
0
ファイル: FuncPtg.cs プロジェクト: hanwangkun/npoi
 private FuncPtg(int funcIndex, FunctionMetadata fm):
     base(funcIndex, fm.ReturnClassCode, fm.ParameterClassCodes, fm.MinParams)  // minParams same as max since these are not var-arg funcs {
 {
 }
コード例 #5
0
 private void ValidateNumArgs(int numArgs, FunctionMetadata fm)
 {
     if (numArgs < fm.MinParams)
     {
         String msg = "Too few arguments to function '" + fm.Name + "'. ";
         if (fm.HasFixedArgsLength)
         {
             msg += "Expected " + fm.MinParams;
         }
         else
         {
             msg += "At least " + fm.MinParams + " were expected";
         }
         msg += " but got " + numArgs + ".";
         throw new FormulaParseException(msg);
     }
     //the maximum number of arguments depends on the Excel version
     int maxArgs;
     if (fm.HasUnlimitedVarags)
     {
         if (_book != null)
         {
             maxArgs = _book.GetSpreadsheetVersion().MaxFunctionArgs;
         }
         else
         {
             //_book can be omitted by test cases
             maxArgs = fm.MaxParams; // just use BIFF8
         }
     }
     else
     {
         maxArgs = fm.MaxParams;
     }
     if (numArgs > maxArgs)
     {
         String msg = "Too many arguments to function '" + fm.Name + "'. ";
         if (fm.HasFixedArgsLength)
         {
             msg += "Expected " + fm.MaxParams;
         }
         else
         {
             msg += "At most " + fm.MaxParams + " were expected";
         }
         msg += " but got " + numArgs + ".";
         throw new FormulaParseException(msg);
     }
 }
コード例 #6
0
 /* package */
 public FunctionMetadataRegistry(FunctionMetadata[] functionDataByIndex, Hashtable functionDataByName)
 {
     _functionDataByIndex = functionDataByIndex;
     _functionDataByName = functionDataByName;
 }