CrystalSpace

Public API Reference

csutil/callstack.h
Go to the documentation of this file.
00001 /*
00002   Call stack creation helper
00003   Copyright (C) 2004 by Jorrit Tyberghein
00004             (C) 2004 by Frank Richter
00005 
00006   This library is free software; you can redistribute it and/or
00007   modify it under the terms of the GNU Library General Public
00008   License as published by the Free Software Foundation; either
00009   version 2 of the License, or (at your option) any later version.
00010 
00011   This library is distributed in the hope that it will be useful,
00012   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014   Library General Public License for more details.
00015 
00016   You should have received a copy of the GNU Library General Public
00017   License along with this library; if not, write to the Free
00018   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019 */
00020 #ifndef __CS_UTIL_CALLSTACK_H__
00021 #define __CS_UTIL_CALLSTACK_H__
00022 
00027 #include "csextern.h"
00028 #include "csutil/csstring.h"
00029 
00030 // Avoid using csRefCount, which uses the ref tracker, which in turn uses csCallStack
00032 class CS_CRYSTALSPACE_EXPORT csCallStack
00033 {
00034 protected:
00035   int ref_count;
00036 
00037   virtual ~csCallStack() {}
00038 public:
00039   csCallStack () : ref_count (1) { }
00040 
00041   void IncRef () { ref_count++; }
00042   void DecRef ()
00043   {
00044     ref_count--;
00045     if (ref_count <= 0)
00046       Free ();
00047   }
00048   int GetRefCount () const { return ref_count; }
00049 
00053   virtual void Free() = 0;
00054   
00056   virtual size_t GetEntryCount () = 0;
00057   //{@
00063   virtual bool GetFunctionName (size_t num, char*& str) = 0;
00064   bool GetFunctionName (size_t num, csString& str)
00065   {
00066     char* cstr;
00067     if (GetFunctionName (num, cstr))
00068     {
00069       str = cstr;
00070       free (cstr);
00071       return true;
00072     }
00073     return false;
00074   }
00076   //{@
00082   virtual bool GetLineNumber (size_t num, char*& str) = 0;
00083   bool GetLineNumber (size_t num, csString& str)
00084   {
00085     char* cstr;
00086     if (GetLineNumber (num, cstr))
00087     {
00088       str = cstr;
00089       free (cstr);
00090       return true;
00091     }
00092     return false;
00093   }
00095   //{@
00100   virtual bool GetParameters (size_t num, char*& str) = 0;
00101   bool GetParameters (size_t num, csString& str)
00102   {
00103     char* cstr;
00104     if (GetParameters (num, cstr))
00105     {
00106       str = cstr;
00107       free (cstr);
00108       return true;
00109     }
00110     return false;
00111   }
00113 
00118   void Print (FILE* f = stdout, bool brief = false)
00119   {
00120     for (size_t i = 0; i < GetEntryCount(); i++)
00121     {
00122       char* s;
00123       bool hasFunc = GetFunctionName (i, s);
00124       fprintf (f, "%s", hasFunc ? (const char*)s : "<unknown>");
00125       if (hasFunc) free (s);
00126       if (!brief && (GetLineNumber (i, s)))
00127       {
00128         fprintf (f, " @%s", (const char*)s);
00129         free (s);
00130       }
00131       if (!brief && (GetParameters (i, s)))
00132       {
00133         fprintf (f, " (%s)", (const char*)s);
00134         free (s);
00135       }
00136       fprintf (f, "\n");
00137     }
00138     fflush (f);
00139   }
00145   csString GetEntryAll (size_t i, bool brief = false)
00146   {
00147     csString line;
00148     char* s;
00149     bool hasFunc = GetFunctionName (i, s);
00150     line << (hasFunc ? (const char*)s : "<unknown>");
00151     if (hasFunc) free (s);
00152     if (!brief && GetLineNumber (i, s))
00153     {
00154       line << " @" << s;
00155       free (s);
00156     }
00157     if (!brief && GetParameters (i, s))
00158     {
00159       line << " (" << s << ")";
00160       free (s);
00161     }
00162     return line;
00163   }
00164 };
00165 
00167 class CS_CRYSTALSPACE_EXPORT csCallStackHelper
00168 {
00169 public:
00181   static csCallStack* CreateCallStack (int skip = 0, bool fast = false);
00182 };
00183 
00184 #endif // __CS_UTIL_CALLSTACK_H__

Generated for Crystal Space 2.0 by doxygen 1.7.6.1