public static void  doShowFuncs(DebugCLI cli)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            String        arg      = null;
            FileInfoCache fileInfo = cli.FileCache;

            // we take an optional single arg which specifies a module
            try
            {
                // let's wait a bit for the background load to complete
                cli.waitForMetaData();

                if (cli.hasMoreTokens())
                {
                    arg = cli.nextToken();
                    int id = arg.Equals(".")?cli.propertyGet(DebugCLI.LIST_MODULE):cli.parseFileArg(-1, arg);                      //$NON-NLS-1$

                    DModule m = (DModule)fileInfo.getFile(id);
                    m.lineMapping(sb);
                }
                else
                {
                    SourceFile[] ar = fileInfo.FileList;
                    if (ar == null)
                    {
                        cli.err(LocalizationManager.getLocalizedTextString("key18"));
                    }
                    //$NON-NLS-1$
                    else
                    {
                        for (int i = 0; ar != null && i < ar.Length; i++)
                        {
                            DModule m = (DModule)ar[i];
                            m.lineMapping(sb);
                        }
                    }
                }

                cli.output(sb.ToString());
            }
            catch (NullReferenceException)
            {
                cli.err(LocalizationManager.getLocalizedTextString("key19"));                 //$NON-NLS-1$
            }
            catch (FormatException pe)
            {
                cli.err(pe.Message);
            }
            catch (AmbiguousException ae)
            {
                cli.err(ae.Message);
            }
            catch (NoMatchException nme)
            {
                cli.err(nme.Message);
            }
            catch (InProgressException)
            {
                cli.err(LocalizationManager.getLocalizedTextString("key20"));                 //$NON-NLS-1$
            }
        }
        public static void  doDisassemble(DebugCLI cli)
        {
            /* currentXXX may NOT be invalid! */
            int currentModule = cli.propertyGet(DebugCLI.LIST_MODULE);
            int currentLine   = cli.propertyGet(DebugCLI.LIST_LINE);

            String arg1    = null;
            int    module1 = currentModule;
            int    line1   = currentLine;

            String arg2  = null;
            int    line2 = currentLine;

            bool functionNamed = false;
            int  numLines      = 0;

            try
            {
                FileInfoCache fileInfo = cli.FileCache;
                Session       session  = cli.Session;
                if (cli.hasMoreTokens())
                {
                    arg1 = cli.nextToken();
                    if (arg1.Equals("-"))
                    //$NON-NLS-1$
                    {
                        // move back one line
                        line1 = line2 = line1 - 1;
                    }
                    else
                    {
                        int[] result = cli.parseLocationArg(currentModule, currentLine, arg1);
                        module1       = result[0];
                        line2         = line1 = result[1];
                        functionNamed = (result[2] == 0)?false:true;

                        if (cli.hasMoreTokens())
                        {
                            arg2  = cli.nextToken();
                            line2 = cli.parseLineArg(module1, arg2);
                        }
                    }
                }
                else
                {
                    // since no parms test for valid location if none use players concept of where we stopped
                    if (fileInfo.getFile(currentModule) == null)
                    {
                        //here we simply use the players concept of suspsend
                        DSuspendInfo info  = ((PlayerSession)session).SuspendInfo;
                        int          at    = info.Offset;
                        int          which = info.ActionIndex;
                        int          until = info.NextOffset;
                        if (info.Reason == SuspendReason.Unknown)
                        {
                            throw new SuspendedException();
                        }

                        SwfInfo swf = fileInfo.Swfs[which];
                        outputAssembly(cli, (DSwfInfo)swf, at, until);
                        throw new AmbiguousException(LocalizationManager.getLocalizedTextString("key27"));                         //$NON-NLS-1$
                    }
                }

                /*
                 * Check for a few error conditions, otherwise we'll write a listing!
                 */
                if (cli.hasMoreTokens())
                {
                    cli.err(LocalizationManager.getLocalizedTextString("key28"));                     //$NON-NLS-1$
                }
                else
                {
                    SourceFile file = fileInfo.getFile(module1);
                    numLines = file.LineCount;

                    // pressing return is ok, otherwise throw the exception
                    if (line1 > numLines && arg1 != null)
                    {
                        throw new IndexOutOfRangeException();
                    }

                    /* if no arg2 then user list a single line */
                    if (arg2 == null)
                    {
                        line2 = line1;
                    }

                    /* adjust our range of lines to ensure we conform */
                    if (line1 < 1)
                    {
                        /* shrink line 1, grow line2 */
                        line2 += -(line1 - 1);
                        line1  = 1;
                    }

                    if (line2 > numLines)
                    {
                        line2 = numLines;
                    }

                    //			    System.out.println("1="+module1+":"+line1+",2="+module2+":"+line2+",num="+numLines+",half="+half);

                    /* nothing to display */
                    if (line1 > line2)
                    {
                        throw new IndexOutOfRangeException();
                    }

                    /* now dump the mixed source / assembly */
                    // now lets find which swf this in
                    DSwfInfo       swf    = (DSwfInfo)fileInfo.swfForFile(file);
                    ActionLocation lStart = null;
                    ActionLocation lEnd   = null;

                    if (swf == null)
                    {
                        System.Collections.IDictionary args = new System.Collections.Hashtable();
                        args["arg3"] = file.Name;                                           //$NON-NLS-1$
                        cli.err(LocalizationManager.getLocalizedTextString("key29", args)); //$NON-NLS-1$
                    }
                    else if (functionNamed)
                    {
                        // if we name a function just dump the whole thing without source.
                        int offset = file.getOffsetForLine(line1);
                        lStart = swf.locate(offset);
                        if (lStart.function == null)
                        {
                            cli.err(LocalizationManager.getLocalizedTextString("key30"));
                        }
                        //$NON-NLS-1$
                        else
                        {
                            // create a psudeo action list from which to disasemble the function
                            ActionList al = new ActionList(true);
                            al.setActionOffset(0, lStart.function);
                            lStart.actions = al;
                            lStart.at      = 0;
                            lEnd           = new ActionLocation();
                            lEnd.actions   = al;
                            lEnd.at        = 0;
                            outputAssembly(cli, swf, lStart, lEnd);
                        }
                    }
                    else
                    {
                        ActionLocation lastEnd = null;
                        for (int i = line1; i <= line2; i++)
                        {
                            int offset = file.getOffsetForLine(i);

                            // locate the action list associated with this of the swf
                            if (offset != 0)
                            {
                                // get the starting point and try to locate a nice ending
                                lStart = swf.locate(offset);
                                lEnd   = swf.locateSourceLineEnd(lStart);

                                // now see if we skipped some assembly between source lines
                                if (lastEnd != null)
                                {
                                    lastEnd.at++;                                     // point our pseudo start to the next action

                                    // new actions list so attempt to find the end of source in the old actions list
                                    if (lastEnd.actions != lStart.actions && lastEnd.actions.size() != lastEnd.at)
                                    {
                                        String atString = lastEnd.actions.getOffset(lastEnd.at).ToString("X");
                                        System.Collections.IDictionary args = new System.Collections.Hashtable();
                                        args["arg4"] = atString;                                               //$NON-NLS-1$
                                        cli.output(LocalizationManager.getLocalizedTextString("key31", args)); //$NON-NLS-1$

                                        // we are missing some of the dissassembly, so back up a bit and dump it out
                                        ActionLocation gapEnd = swf.locateSourceLineEnd(lastEnd);
                                        outputAssembly(cli, swf, lastEnd, gapEnd);
                                    }
                                    else if (lastEnd.at < lStart.at)
                                    {
                                        // same action list but we skipped some instructions
                                        ActionLocation gapEnd = new ActionLocation(lStart);
                                        gapEnd.at--;
                                        outputAssembly(cli, swf, lastEnd, gapEnd);
                                    }
                                }
                                lastEnd = lEnd;
                            }

                            // dump source
                            cli.outputSource(module1, i, file.getLine(i));

                            // obtain the offset, locate it in the swf
                            if (offset != 0)
                            {
                                outputAssembly(cli, swf, lStart, lEnd);
                            }
                        }

                        /* save away valid context */
                        cli.propertyPut(DebugCLI.LIST_MODULE, module1);
                        cli.propertyPut(DebugCLI.LIST_LINE, line2 + 1);                             // add one
                        cli.m_repeatLine = "disassemble"; /* allow repeated listing by typing CR */ //$NON-NLS-1$
                    }
                }
            }
            catch (IndexOutOfRangeException)
            {
                String name = "#" + module1;                                        //$NON-NLS-1$
                System.Collections.IDictionary args = new System.Collections.Hashtable();
                args["arg5"] = Convert.ToString(line1);                             //$NON-NLS-1$
                args["arg6"] = name;                                                //$NON-NLS-1$
                args["arg7"] = Convert.ToString(numLines);                          //$NON-NLS-1$
                cli.err(LocalizationManager.getLocalizedTextString("key32", args)); //$NON-NLS-1$
            }
            catch (AmbiguousException ae)
            {
                cli.err(ae.Message);
            }
            catch (NullReferenceException)
            {
                cli.err(LocalizationManager.getLocalizedTextString("key33"));                 //$NON-NLS-1$
            }
            catch (FormatException pe)
            {
                cli.err(pe.Message);
            }
            catch (NoMatchException nme)
            {
                cli.err(nme.Message);
            }
            catch (SuspendedException)
            {
                cli.err(LocalizationManager.getLocalizedTextString("key34"));                 //$NON-NLS-1$
            }
        }