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

  1. IMPLEMENTATION MODULE NumericIO;
  2.  
  3.         (****************************************************************)
  4.         (*                                                              *)
  5.         (*              Numeric I/O using windows.                      *)
  6.         (*                                                              *)
  7.         (*  Programmer:         P. Moylan                               *)
  8.         (*  Last edited:        3 September 1996                        *)
  9.         (*  Status:             OK                                      *)
  10.         (*                                                              *)
  11.         (****************************************************************)
  12.  
  13. FROM SYSTEM IMPORT
  14.     (* type *)  CARD8, CARD16, CARD32, ADDRESS;
  15.  
  16. FROM Windows IMPORT
  17.     (* type *)  Window, ColumnRange,
  18.     (* proc *)  WriteChar, WriteString, ReadChar, LookaheadChar,
  19.                 ReadCharWithoutEcho, EditString, SaveCursor, SetCursor;
  20.  
  21. FROM Conversions IMPORT
  22.     (* type *)  HexDigit, EightChar,
  23.     (* proc *)  CardinalToString, StringToCardinal, StringToHex,
  24.                 LongCardToString, HexToChar, HexToString, LongHexToString;
  25.  
  26. FROM LowLevel IMPORT
  27.     (* proc *)  SEGMENT, OFFSET,
  28.                 HighByte, LowByte, HighWord, LowWord,
  29.                 IANDB, RSB;
  30.  
  31. FROM Keyboard IMPORT
  32.     (* proc *)  InKey, PutBack;
  33.  
  34. (************************************************************************)
  35.  
  36. TYPE CharSet = SET OF CHAR;
  37.  
  38. CONST Digits = CharSet {"0".."9"};
  39.  
  40. (************************************************************************)
  41. (*                              OUTPUT                                  *)
  42. (************************************************************************)
  43.  
  44. PROCEDURE WriteHexDigit (w: Window;  number: CARD8);
  45.  
  46.     (* Writes a one-digit hexadecimal number.   *)
  47.  
  48.     BEGIN
  49.         WriteChar (w, HexToChar(VAL(HexDigit, number)));
  50.     END WriteHexDigit;
  51.  
  52. (************************************************************************)
  53.  
  54. PROCEDURE WriteHexByte (w: Window;  number: CARD8);
  55.  
  56.     (* Writes the second argument as a two-digit hexadecimal number.    *)
  57.  
  58.     BEGIN
  59.  
  60.         (* The obscure function names from LowLevel are:        *)
  61.         (*      RSB = right shift       IANDB = logical AND     *)
  62.  
  63.         WriteHexDigit (w, RSB(number, 4));
  64.         WriteHexDigit (w, IANDB(number,15));
  65.  
  66.     END WriteHexByte;
  67.  
  68. (************************************************************************)
  69.  
  70. PROCEDURE WriteHexWord (w: Window;  number: CARD16);
  71.  
  72.     (* Writes the second argument as a four-digit hexadecimal number.   *)
  73.  
  74.     BEGIN
  75.         WriteHexByte (w, HighByte(number));
  76.         WriteHexByte (w, LowByte(number));
  77.     END WriteHexWord;
  78.  
  79. (************************************************************************)
  80.  
  81. PROCEDURE WriteHexLongword (w: Window;  number: CARD32);
  82.  
  83.     (* Writes the second argument as an eight-digit hexadecimal number. *)
  84.  
  85.     BEGIN
  86.         WriteHexWord (w, HighWord(number));
  87.         WriteHexWord (w, LowWord(number));
  88.     END WriteHexLongword;
  89.  
  90. (************************************************************************)
  91.  
  92. PROCEDURE WriteAddress (w: Window;  addr: ADDRESS);
  93.  
  94.     (* Writes a segmented address to the screen.        *)
  95.  
  96.     BEGIN
  97.         WriteHexWord (w, SEGMENT(addr));  WriteChar (w, ":");
  98.         WriteHexWord (w, OFFSET(addr));
  99.     END WriteAddress;
  100.  
  101. (************************************************************************)
  102.  
  103. PROCEDURE WriteLongCard (w: Window;  number: CARD32);
  104.  
  105.     (* Writes the second argument as a decimal number.  *)
  106.  
  107.     VAR remainder: CARDINAL;
  108.  
  109.     BEGIN
  110.         IF number > 9 THEN
  111.             WriteLongCard (w, number DIV 10);
  112.         END (*IF*);
  113.         remainder := number MOD 10;
  114.         WriteChar (w, CHR(remainder + ORD("0")));
  115.     END WriteLongCard;
  116.  
  117. (************************************************************************)
  118.  
  119. PROCEDURE WriteCard (w: Window;  number: CARDINAL);
  120.  
  121.     (* Writes the second argument as a decimal number.  *)
  122.  
  123.     BEGIN
  124.         WriteLongCard (w, number);
  125.     END WriteCard;
  126.  
  127. (************************************************************************)
  128.  
  129. PROCEDURE WriteShortCard (w: Window;  number: CARD8);
  130.  
  131.     (* Writes the second argument as a decimal number.  *)
  132.  
  133.     BEGIN
  134.         WriteLongCard (w, number);
  135.     END WriteShortCard;
  136.  
  137. (************************************************************************)
  138.  
  139. PROCEDURE WriteInt (w: Window;  number: INTEGER);
  140.  
  141.     (* Writes the second argument as a decimal number.  *)
  142.  
  143.     BEGIN
  144.         IF number < 0 THEN
  145.             WriteChar (w, '-');  number := -number;
  146.         END (*IF*);
  147.         WriteCard (w, number);
  148.     END WriteInt;
  149.  
  150. (************************************************************************)
  151.  
  152. PROCEDURE WriteRJLongCard (w: Window;  number: CARD32; fieldsize: CARDINAL);
  153.  
  154.     (* Like WriteLongCard, but the result is right justified in a field *)
  155.     (* of fieldsize characters.                                         *)
  156.  
  157.     VAR buffer: ARRAY [0..79] OF CHAR;
  158.  
  159.     BEGIN
  160.         LongCardToString (number, buffer, fieldsize);
  161.         buffer[fieldsize] := CHR(0);
  162.         WriteString (w, buffer);
  163.     END WriteRJLongCard;
  164.  
  165. (************************************************************************)
  166.  
  167. PROCEDURE WriteRJCard (w: Window;  number, fieldsize: CARDINAL);
  168.  
  169.     (* Like WriteCard, but the result is right justified in a field     *)
  170.     (* of fieldsize characters.                                         *)
  171.  
  172.     VAR buffer: ARRAY [0..79] OF CHAR;
  173.  
  174.     BEGIN
  175.         CardinalToString (number, buffer, fieldsize);
  176.         buffer[fieldsize] := CHR(0);
  177.         WriteString (w, buffer);
  178.     END WriteRJCard;
  179.  
  180. (************************************************************************)
  181.  
  182. PROCEDURE WriteRJShortCard (w: Window;  number: CARD8;
  183.                                         fieldsize: CARDINAL);
  184.  
  185.     (* Like WriteShortCard, but the result is right justified in a      *)
  186.     (* field of fieldsize characters.                                   *)
  187.  
  188.     BEGIN
  189.         WriteRJCard (w, number, fieldsize);
  190.     END WriteRJShortCard;
  191.  
  192. (************************************************************************)
  193. (*                      CHECK FOR Esc KEY                               *)
  194. (************************************************************************)
  195.  
  196. PROCEDURE EditOK (): BOOLEAN;
  197.  
  198.     (* Returns TRUE unless the Esc key was pressed.     *)
  199.  
  200.     CONST Esc = CHR(27);
  201.  
  202.     VAR ch: CHAR;
  203.  
  204.     BEGIN
  205.         ch := InKey();  PutBack(ch);
  206.         RETURN ch <> Esc;
  207.     END EditOK;
  208.  
  209. (************************************************************************)
  210. (*                        HEXADECIMAL INPUT                             *)
  211. (************************************************************************)
  212.  
  213. PROCEDURE EditHexByte (w: Window;  VAR (*INOUT*) value: CARD8);
  214.  
  215.     (* Screen editing of a 2-digit hexadecimal value *)
  216.  
  217.     VAR buffer: ARRAY [0..1] OF CHAR;
  218.  
  219.     BEGIN
  220.         HexToString (value, buffer);
  221.         EditString (w, buffer, 2);
  222.         IF EditOK() THEN
  223.             value := StringToHex (buffer);
  224.         END (*IF*);
  225.     END EditHexByte;
  226.  
  227. (************************************************************************)
  228.  
  229. PROCEDURE EditHexWord (w: Window;  VAR (*INOUT*) value: CARD16);
  230.  
  231.     (* Screen editing of a 4-digit hexadecimal value *)
  232.  
  233.     VAR buffer: ARRAY [0..3] OF CHAR;
  234.  
  235.     BEGIN
  236.         HexToString (value, buffer);
  237.         EditString (w, buffer, 4);
  238.         IF EditOK() THEN
  239.             value := StringToHex (buffer);
  240.         END (*IF*);
  241.     END EditHexWord;
  242.  
  243. (************************************************************************)
  244.  
  245. PROCEDURE EditHexLongword (w: Window;  VAR (*INOUT*) value: CARD32);
  246.  
  247.     (* Screen editing of an 8-digit hexadecimal value *)
  248.  
  249.     VAR buffer: EightChar;
  250.  
  251.     BEGIN
  252.         LongHexToString (value, buffer);
  253.         EditString (w, buffer, 8);
  254.         IF EditOK() THEN
  255.             value := StringToHex (buffer);
  256.         END (*IF*);
  257.     END EditHexLongword;
  258.  
  259. (************************************************************************)
  260. (*                          DECIMAL INPUT                               *)
  261. (************************************************************************)
  262.  
  263. PROCEDURE ReadCard (w: Window;  VAR (*OUT*) number: CARDINAL);
  264.  
  265.     (* Reads a decimal number, skipping over all non-numeric input.     *)
  266.  
  267.     VAR ch: CHAR;
  268.  
  269.     BEGIN
  270.         number := 0;
  271.  
  272.         (* Skip over any leading non-numeric input.     *)
  273.  
  274.         WHILE NOT (LookaheadChar(w) IN Digits) DO
  275.             ReadCharWithoutEcho (w, ch);
  276.         END (*WHILE*);
  277.  
  278.         (* Now read and convert the desired input.      *)
  279.  
  280.         WHILE LookaheadChar(w) IN Digits DO
  281.             ReadChar (w, ch);
  282.             number := 10*number + ORD(ch) - ORD("0");
  283.         END (*WHILE*);
  284.     END ReadCard;
  285.  
  286. (*************************************************************************)
  287.  
  288. PROCEDURE ReadBufferedCardinal (w: Window;  fieldsize: CARDINAL): CARDINAL;
  289.  
  290.     (* Reads a decimal number.  The difference between this and         *)
  291.     (* ReadCard is that the user is given a reverse-video field of a    *)
  292.     (* fixed width to work in, and is able to use the cursor control    *)
  293.     (* keys to edit within that field.                                  *)
  294.  
  295.     VAR buffer: ARRAY ColumnRange OF CHAR;
  296.         result: CARDINAL;  row, column: CARDINAL;
  297.  
  298.     BEGIN
  299.         SaveCursor (w, row, column);
  300.         buffer := "";
  301.         EditString (w, buffer, fieldsize);
  302.         result := StringToCardinal (buffer);
  303.         SetCursor (w, row, column);
  304.         WriteRJCard (w, result, fieldsize);
  305.         RETURN result;
  306.     END ReadBufferedCardinal;
  307.  
  308. (*************************************************************************)
  309.  
  310. PROCEDURE EditCardinal (w: Window;  VAR (*INOUT*) value: CARDINAL;
  311.                                                 fieldsize: CARDINAL);
  312.  
  313.     (* Screen editing of a decimal number. *)
  314.  
  315.     VAR buffer: ARRAY ColumnRange OF CHAR;
  316.         row, column: CARDINAL;
  317.  
  318.     BEGIN
  319.         SaveCursor (w, row, column);
  320.         CardinalToString (value, buffer, fieldsize);
  321.         EditString (w, buffer, fieldsize);
  322.         IF EditOK() THEN
  323.             value := StringToCardinal (buffer);
  324.         END (*IF*);
  325.         SetCursor (w, row, column);
  326.         WriteRJCard (w, value, fieldsize);
  327.     END EditCardinal;
  328.  
  329. (*************************************************************************)
  330.  
  331. PROCEDURE EditShortCard (w: Window;  VAR (*INOUT*) value: CARD8;
  332.                                                 fieldsize: CARDINAL);
  333.  
  334.     (* Screen editing of a decimal number. *)
  335.  
  336.     VAR temp: CARDINAL;
  337.  
  338.     BEGIN
  339.         temp := ORD (value);
  340.         EditCardinal (w, temp, fieldsize);
  341.         value := temp;
  342.     END EditShortCard;
  343.  
  344. (*************************************************************************)
  345.  
  346. END NumericIO.
  347. 
  348.