Exemplo n.º 1
0
        /// <summary>
        /// Get the String representation of an parameter with a Sharing Mode.
        /// Rule: TCCODEGEN_FUNCALL_PARAMS
        /// </summary>
        /// <param name="parameter">The Parameter</param>
        /// <param name="table">The Symbol table</param>
        /// <param name="mode">Argument mode Input, InOut, Output, etc...</param>
        /// <param name="previousSharingMode">The previous Sharing Mode</param>
        /// <param name="previousSpan">The previous marging span</param>
        /// <returns>The String representation of the Sharing Mode paramaters</returns>
        private string ToString(TypeCobol.Compiler.CodeElements.CallSiteParameter parameter, Compiler.CodeModel.SymbolTable table, ArgMode mode,
                                ref TypeCobol.Compiler.CodeElements.ParameterSharingMode previousSharingMode, ref int previousSpan)
        {
            Variable variable    = parameter.StorageAreaOrValue;
            var      name        = variable.ToString(true);
            string   share_mode  = "";
            int      defaultSpan = string.Intern("by reference ").Length;

            if (parameter.SharingMode.Token != null)
            {
                if (previousSharingMode != parameter.SharingMode.Value)
                {
                    share_mode          = "by " + parameter.SharingMode.Token.Text;
                    share_mode         += new string(' ', defaultSpan - share_mode.Length);
                    previousSharingMode = parameter.SharingMode.Value;
                }
            }
            else
            {
                if (mode == ArgMode.InOut || mode == ArgMode.Output)
                {
                    if (previousSharingMode != TypeCobol.Compiler.CodeElements.ParameterSharingMode.ByReference)
                    {
                        share_mode          = string.Intern("by reference ");
                        previousSharingMode = TypeCobol.Compiler.CodeElements.ParameterSharingMode.ByReference;
                    }
                }
            }
            if (share_mode.Length == 0)
            {
                share_mode = new string(' ', previousSpan == 0 ? defaultSpan : previousSpan);
            }
            else
            {
                previousSpan = share_mode.Length;
            }

            if (variable.IsLiteral)
            {
                return(share_mode + name);
            }
            var found = table.GetVariable(variable);

            if (found.Count < 1) //this can happens for special register : LENGTH OF, ADDRESS OF
            {
                return(share_mode + variable.ToCobol85());
            }
//		if (found.Count > 1) return "?AMBIGUOUS?";
            var data = found[0] as Compiler.Nodes.DataDescription;

            if (data.DataType == DataType.Boolean)
            {
                name += "-value";
            }
            return(share_mode + name);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Get the String representation of an parameter with a Sharing Mode.
        /// Rule: TCCODEGEN_FUNCALL_PARAMS
        /// </summary>
        /// <param name="parameter">The Parameter</param>
        /// <param name="node">The node</param>
        /// <param name="mode">Argument mode Input, InOut, Output, etc...</param>
        /// <param name="previousSharingMode">The previous Sharing Mode</param>
        /// <param name="previousSpan">The previous marging span</param>
        /// <returns>The String representation of the Sharing Mode paramaters</returns>
        private string ToString(TypeCobol.Compiler.CodeElements.CallSiteParameter parameter, Node node, ArgMode mode,
                                ref TypeCobol.Compiler.CodeElements.ParameterSharingMode previousSharingMode, ref int previousSpan)
        {
            Variable variable  = parameter.StorageAreaOrValue;
            bool     bTypeBool = false;

            if (variable != null)
            {//We must detect a boolean variable
                if (!variable.IsLiteral)
                {
                    var found = node.GetDataDefinitionFromStorageAreaDictionary(variable.StorageArea);
                    if (found != null)
                    {
                        var data = found as DataDescription;
                        bTypeBool = (data != null && data.DataType == DataType.Boolean);
                    }
                }
            }

            var name = parameter.IsOmitted ? "omitted" : variable.ToString(true, bTypeBool);

            string share_mode  = "";
            int    defaultSpan = string.Intern("by reference ").Length;

            if (parameter.SharingMode.Token != null)
            {
                if (previousSharingMode != parameter.SharingMode.Value)
                {
                    share_mode          = "by " + parameter.SharingMode.Token.Text;
                    share_mode         += new string(' ', defaultSpan - share_mode.Length);
                    previousSharingMode = parameter.SharingMode.Value;
                }
            }
            else
            {
                if (mode == ArgMode.InOut || mode == ArgMode.Output)
                {
                    if (previousSharingMode != TypeCobol.Compiler.CodeElements.ParameterSharingMode.ByReference)
                    {
                        share_mode          = string.Intern("by reference ");
                        previousSharingMode = TypeCobol.Compiler.CodeElements.ParameterSharingMode.ByReference;
                    }
                }
            }
            if (share_mode.Length == 0)
            {
                share_mode = new string(' ', previousSpan == 0 ? defaultSpan : previousSpan);
            }
            else
            {
                previousSpan = share_mode.Length;
            }

            if (variable != null)
            {
                if (variable.IsLiteral)
                {
                    return(share_mode + name);
                }
                var found = node.GetDataDefinitionFromStorageAreaDictionary(variable.StorageArea);
                if (found == null) //this can happens for special register : LENGTH OF, ADDRESS OF
                {
                    return(share_mode + variable.ToCobol85());
                }
            }
            return(share_mode + name);
        }