CharacterInput.mod 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. IMPLEMENTATION MODULE CharacterInput;
  2. FROM InOut IMPORT Read,
  3. Write, WriteCard, WriteString, WriteLn,
  4. Done, EOL;
  5. FROM Scanner IMPORT traceParser, printCode, printListing;
  6. CONST maxLine = 120;
  7. HT = 11C; (* tab char *)
  8. VAR inLine : ARRAY[1..maxLine-1] OF CHAR;
  9. xL : [0..maxLine];
  10. PROCEDURE GetCh;
  11. VAR c: CHAR;
  12. BEGIN
  13. IF currCol >= xL THEN
  14. IF endOfInput THEN ch := EOF; RETURN END;
  15. (* read a new line *)
  16. xL := 0; currCol := 0; INC(currLine);
  17. REPEAT
  18. Read(c);
  19. IF Done THEN
  20. IF c = HT THEN
  21. REPEAT
  22. INC(xL); inLine[xL] := ' '
  23. UNTIL xL MOD 8 = 0;
  24. ELSE
  25. INC(xL); inLine[xL] := c
  26. END
  27. ELSE
  28. INC(xL); endOfInput := TRUE;
  29. END
  30. UNTIL NOT Done OR (inLine[xL] = EOL);
  31. IF printListing THEN
  32. inLine[xL] := 0C;
  33. WriteCard(currLine, 6); WriteString(': ');
  34. WriteString(inLine); WriteLn;
  35. END;
  36. inLine[xL] := ' '; (* newline returns ' ' *)
  37. END;
  38. (* return next character *)
  39. INC(currCol);
  40. ch := inLine[currCol];
  41. Write(ch); (*___________________*)
  42. END GetCh;
  43. PROCEDURE InitInput;
  44. BEGIN
  45. xL := 0; currCol := 0;
  46. currLine := 0; endOfInput := FALSE;
  47. END InitInput;
  48. BEGIN
  49. END CharacterInput.