home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / packery / xpk_source / xpkmaster / debug.c < prev    next >
C/C++ Source or Header  |  1996-10-21  |  3KB  |  142 lines

  1. #ifndef XPKMASTER_DEBUF_C
  2. #define XPKMASTER_DEBUG_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        debug.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: debug.c 1.1 (20.10.96)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    the debug stuff
  12.  
  13.  1.0   05.10.96 : first real version
  14.  1.1   20.10.96 : added the external debug modes
  15.  1.2   21.10.96 : changed debug totally
  16. */
  17.  
  18. #include <exec/types.h>
  19. #include <exec/memory.h>
  20. #include <pragma/exec_lib.h>
  21. #include <pragma/dos_lib.h>
  22.  
  23. typedef void (*putchtype) ();
  24.  
  25. #ifdef __MAXON__
  26.   #define __asm
  27. #endif
  28.  
  29. extern KPutChar(LONG);
  30. extern DPutChar(LONG);
  31. extern struct DosLibrary *DOSBase;
  32. extern void DoDebug(UBYTE mode, STRPTR fmt, APTR data);
  33.  
  34. static UBYTE Mode = 0xFF;
  35.  
  36. static void __asm serfunc(register __d0 UBYTE c, register __a3 ULONG pd)
  37. { KPutChar(c ? c : '\n'); }
  38.  
  39. static void __asm parfunc(register __d0 UBYTE c, register __a3 ULONG pd)
  40. { DPutChar(c ? c : '\n'); }
  41.  
  42. static void __asm normfunc(register __d0 UBYTE c, register __a3 ULONG pd)
  43. {
  44.   UBYTE d = c;
  45.  
  46.   if(!d)
  47.     d = '\n';
  48.  
  49.   Write(pd, &d, 1);
  50. }
  51.  
  52. void DebugError(STRPTR format, ...)
  53. {
  54.   DoDebug(1, format, (APTR)((ULONG)(&format)+sizeof(STRPTR)));
  55. }
  56.  
  57. void DebugRunTime(STRPTR format, ...)
  58. {
  59.   DoDebug(0, format, (APTR)((ULONG)(&format)+sizeof(STRPTR)));
  60. }
  61.  
  62. void DoDebug(UBYTE mode, STRPTR fmt, APTR data)
  63. {
  64.   ULONG fh = 0;
  65.   void __asm (*function)(register __d0 UBYTE, register __a3 ULONG) = 0;
  66.  
  67.   Forbid();
  68.  
  69.   if(Mode == 0xFF)
  70.   {
  71.     struct FileInfoBlock *fib;
  72.     if((fib = (struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock), MEMF_ANY)))
  73.     {
  74.       ULONG lock;
  75.       if((lock = Lock("LIBS:xpkmaster.library", SHARED_LOCK)))
  76.       {
  77.         if(Examine(lock,fib))
  78.         {
  79.           switch(*fib->fib_Comment)
  80.           {
  81.           case '0' : Mode = 0; break;
  82.           case '2' : Mode = 2; break;
  83.           case 'S' : Mode = 3; break;
  84.           case 'P' : Mode = 4; break;
  85.           default: Mode = 1; break;
  86.           }
  87.         }
  88.         else
  89.           Mode = 1;
  90.         UnLock(lock);
  91.       }
  92.       else
  93.         Mode = 1;
  94.       FreeMem(fib, sizeof(struct FileInfoBlock));
  95.     }
  96.     else
  97.       Mode = 1;
  98.   }
  99.  
  100.   switch(Mode)
  101.   {
  102.   case 1: case 2:
  103.     if(mode || Mode == 2)
  104.     {
  105.       if((fh = Open("T:XpkMasterOut", MODE_READWRITE)))
  106.       {
  107.         Seek(fh, 0, OFFSET_END);
  108.         function = normfunc;
  109.       }
  110.     } break;
  111.   case 3: function = serfunc; break;
  112.   case 4: function = parfunc; break;
  113.   }
  114.  
  115.   if(function)
  116.   {
  117.     ULONG i, j = 32;
  118.     UBYTE c;
  119.     i = (ULONG) FindTask(0);
  120.  
  121.     do
  122.     {
  123.       j -= 4;
  124.       if((c = ((i >> j) & 0xF) + '0') > '9')
  125.         c += 'A' - '0' - 10;
  126.       
  127.       function(c, fh);
  128.     } while(j);
  129.  
  130.     function(':', fh);
  131.  
  132.     RawDoFmt(fmt, data, (putchtype) function, (APTR) fh);
  133.   }
  134.  
  135.   if(fh)
  136.     Close(fh);
  137.  
  138.   Permit();
  139. }
  140.  
  141. #endif /* XPKMASTER_DEBUG_C */
  142.