예제 #1
0
파일: ParsedItem.cs 프로젝트: zhitian/3P
        /// <summary>
        /// This function returns a value of 1 if the argument was a name defined with the & GLOBAL-DEFINE directive;
        /// a value of 2 if the argument was passed as an include file parameter;
        /// and a value of 3 if the argument was a name defined with the & SCOPED-DEFINE directive.
        /// If the argument was not defined and was not an include file parameter, then this function returns a value of 0.
        /// </summary>
        /// <param name="variableName">Can be a position e.g. "1" or a name e.g. "& name"</param>
        /// <returns></returns>
        public int GetScopedPreProcVariableDefinedLevel(string variableName)
        {
            // TODO: this does not work correctly because we can't distinguish between a scope variable on root file and a global variable.
            if (string.IsNullOrEmpty(variableName))
            {
                return(0);
            }
            if (variableName.Equals("0"))
            {
                return(2);
            }
            // &scoped-define variables prevail over preproc parameters passed to the include
            if (DefinedPreProcVariables != null && DefinedPreProcVariables.ContainsKey(variableName))
            {
                return(3);
            }
            if (ParametersPreProcVariables != null && ParametersPreProcVariables.ContainsKey(variableName))
            {
                return(2);
            }
            // search for the value in parent scope
            // the global preproc, available to the whole include stack, are defined in the "root" include (which is the compiled program).
            var parentInclude = Parent;

            while (parentInclude != null)
            {
                if (parentInclude.DefinedPreProcVariables != null && parentInclude.DefinedPreProcVariables.ContainsKey(variableName))
                {
                    return(1);
                }
                parentInclude = parentInclude.Parent;
            }
            return(0);
        }
예제 #2
0
파일: ParsedItem.cs 프로젝트: zhitian/3P
        /// <summary>
        /// Returns the value of a given preproc variable.
        /// </summary>
        /// <param name="variableName">Can be a position e.g. "1" or a name e.g. "& name"</param>
        /// <returns></returns>
        public string GetScopedPreProcVariableValue(string variableName)
        {
            if (string.IsNullOrEmpty(variableName))
            {
                return(null);
            }
            if (variableName.Equals("0"))
            {
                return(string.IsNullOrEmpty(IncludeFilePath) ? null : Path.GetFileName(IncludeFilePath));
            }
            // &scoped-define variables prevail over preproc parameters passed to the include
            if (DefinedPreProcVariables != null && DefinedPreProcVariables.ContainsKey(variableName))
            {
                return(DefinedPreProcVariables[variableName]);
            }
            if (ParametersPreProcVariables != null && ParametersPreProcVariables.ContainsKey(variableName))
            {
                return(ParametersPreProcVariables[variableName]);
            }
            // search for the value in parent scope
            // the global preproc, available to the whole include stack, are defined in the "root" include (which is the compiled program).
            var parentInclude = Parent;

            while (parentInclude != null)
            {
                if (parentInclude.DefinedPreProcVariables != null && parentInclude.DefinedPreProcVariables.ContainsKey(variableName))
                {
                    return(parentInclude.DefinedPreProcVariables[variableName]);
                }
                parentInclude = parentInclude.Parent;
            }
            return(null);
        }
예제 #3
0
파일: ParsedItem.cs 프로젝트: zhitian/3P
 /// <summary>
 /// Set a new defined preproc variable belonging to that include (the base parsed program is also an include!)
 /// </summary>
 /// <param name="variableName"></param>
 /// <param name="variableValue"></param>
 public void SetDefinedPreProcVariable(string variableName, string variableValue)
 {
     if (DefinedPreProcVariables == null)
     {
         DefinedPreProcVariables = new Dictionary <string, string>(StringComparer.CurrentCultureIgnoreCase);
     }
     if (DefinedPreProcVariables.ContainsKey(variableName))
     {
         DefinedPreProcVariables[variableName] = variableValue;
     }
     else
     {
         DefinedPreProcVariables.Add(variableName, variableValue);
     }
 }