home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pmos2002.zip / SRC / DUMPFILE.MOD < prev    next >
Text File  |  1996-11-11  |  5KB  |  158 lines

  1. IMPLEMENTATION MODULE DumpFile;
  2.  
  3.         (****************************************************************)
  4.         (*                                                              *)
  5.         (*   Debugging aid: writes data out to a file DUMP.$$$          *)
  6.         (*                                                              *)
  7.         (*      Programmer:     P. Moylan                               *)
  8.         (*      Last edited:    11 November 1996                        *)
  9.         (*      Status:         OK                                      *)
  10.         (*                                                              *)
  11.         (****************************************************************)
  12.  
  13. IMPORT SYSTEM, IOChan, RawIO, SeqFile, FileSys, OS2;
  14.  
  15. (********************************************************************************)
  16.  
  17. VAR dump: IOChan.ChanId;
  18.     DumpFileOpen: BOOLEAN;
  19.  
  20. (********************************************************************************)
  21.  
  22. PROCEDURE OpenDumpFile;
  23.  
  24.     CONST DumpFileName = "DUMP.$$$";
  25.  
  26.     VAR status: SeqFile.OpenResults;  done: BOOLEAN;
  27.  
  28.     BEGIN
  29.         IF FileSys.Exists (DumpFileName) THEN
  30.             FileSys.Remove (DumpFileName, done);
  31.         END (*IF*);
  32.         SeqFile.OpenWrite (dump, DumpFileName, SeqFile.raw, status);
  33.         DumpFileOpen := TRUE;
  34.     END OpenDumpFile;
  35.  
  36. (********************************************************************************)
  37.  
  38. PROCEDURE Dump (data: ARRAY OF SYSTEM.LOC);
  39.  
  40.     (* Writes the data to the dump file. *)
  41.  
  42.     BEGIN
  43.         (* The critical section protection here is because we could have        *)
  44.         (* several tasks all writing to the dump file.                          *)
  45.  
  46.         OS2.DosEnterCritSec();
  47.         IF NOT DumpFileOpen THEN
  48.             OpenDumpFile;
  49.         END (*IF*);
  50.         RawIO.Write (dump, data);
  51.         OS2.DosExitCritSec();
  52.     END Dump;
  53.  
  54. (********************************************************************************)
  55.  
  56. PROCEDURE DumpString (message: ARRAY OF CHAR);
  57.  
  58.     (* Writes a character string. *)
  59.  
  60.     VAR j: CARDINAL;
  61.  
  62.     BEGIN
  63.         j := 0;
  64.         LOOP
  65.             IF (j > HIGH(message)) OR (message[j] = CHR(0)) THEN
  66.                 EXIT (*LOOP*);
  67.             END (*IF*);
  68.             Dump (message[j]);
  69.             INC (j);
  70.         END (*LOOP*);
  71.     END DumpString;
  72.  
  73. (********************************************************************************)
  74.  
  75. PROCEDURE DumpCard (value: CARDINAL);
  76.  
  77.     (* Converts the number to a text string and writes it to the dump file. *)
  78.  
  79.     VAR ch: CHAR;
  80.  
  81.     BEGIN
  82.         IF value > 9 THEN DumpCard (value DIV 10);  END (*IF*);
  83.         ch := CHR(value MOD 10 + ORD("0"));
  84.         Dump (ch);
  85.     END DumpCard;
  86.  
  87. (********************************************************************************)
  88.  
  89. PROCEDURE DumpHexDigit (value: SYSTEM.CARD8);
  90.  
  91.     (* Dumps the value as a one-digit hexadecimal text string. *)
  92.  
  93.     VAR result: CHAR;
  94.  
  95.     BEGIN
  96.         IF value < 10 THEN result := CHR(value + ORD("0"));
  97.         ELSE result := CHR(value -10 + ORD("A"));
  98.         END (*IF*);
  99.         Dump (result);
  100.     END DumpHexDigit;
  101.  
  102. (********************************************************************************)
  103.  
  104. PROCEDURE DumpHexByte (value: SYSTEM.CARD8);
  105.  
  106.     (* Dumps the value as a two-digit hexadecimal text string. *)
  107.  
  108.     BEGIN
  109.         DumpHexDigit (value DIV 16);
  110.         DumpHexDigit (value MOD 16);
  111.     END DumpHexByte;
  112.  
  113. (********************************************************************************)
  114.  
  115. PROCEDURE DumpHex (value: ARRAY OF SYSTEM.LOC);
  116.  
  117.     (* Converts the value to a hexadecimal text string and writes it to the dump file. *)
  118.  
  119.     VAR j: CARDINAL;
  120.  
  121.     BEGIN
  122.         FOR j := HIGH(value) TO 0 BY -1 DO
  123.             DumpHexByte (SYSTEM.CAST(SYSTEM.CARD8,value[j]));
  124.         END (*FOR*);
  125.     END DumpHex;
  126.  
  127. (********************************************************************************)
  128.  
  129. PROCEDURE DumpEOL;
  130.  
  131.     (* Writes an "end of line" to the dump file. *)
  132.  
  133.     BEGIN
  134.         Dump(CHR(13));  Dump(CHR(10));
  135.     END DumpEOL;
  136.  
  137. (********************************************************************************)
  138.  
  139. PROCEDURE CloseDumpFile;
  140.  
  141.     BEGIN
  142.         SeqFile.Close (dump);
  143.         DumpFileOpen := FALSE;
  144.     END CloseDumpFile;
  145.  
  146. (********************************************************************************)
  147.  
  148. BEGIN
  149.     DumpFileOpen := FALSE;
  150. FINALLY
  151.     IF DumpFileOpen THEN
  152.         DumpString ("About to close dump file and exit process.");  DumpEOL;
  153.         CloseDumpFile;
  154.         OS2.DosExit(OS2.EXIT_PROCESS, 0);
  155.     END (*IF*);
  156. END DumpFile.
  157.  
  158.