showcase17.mod 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. MODULE Showcase17;
  2. // Session showcase: Clarion CLASS lowering, CHAR-array string
  3. // concatenation, and ISO ConvResults.
  4. //
  5. // A Bounded counter class (single inheritance from Counter) is driven
  6. // through its hidden THIS receiver; a value is parsed with the
  7. // ConvResults API, and a label is built by CHAR-array concatenation
  8. // for the output line.
  9. // Expected ExitCode: 42.
  10. IMPORT TextIO, Conversions;
  11. FROM Conversions IMPORT strAllRight, strWrongFormat, strOutOfRange;
  12. TYPE
  13. CLASS Counter;
  14. total : INTEGER;
  15. PROCEDURE Bump(by : INTEGER);
  16. PROCEDURE Value() : INTEGER;
  17. END Counter;
  18. CLASS Bounded (Counter); (* single inheritance *)
  19. limit : INTEGER;
  20. PROCEDURE SetLimit(v : INTEGER);
  21. PROCEDURE Over() : BOOLEAN;
  22. END Bounded;
  23. CLASS IMPLEMENTATION Counter;
  24. PROCEDURE Bump(by : INTEGER);
  25. BEGIN total := total + by END Bump;
  26. PROCEDURE Value() : INTEGER;
  27. BEGIN RETURN total END Value;
  28. END Counter;
  29. CLASS IMPLEMENTATION Bounded;
  30. PROCEDURE SetLimit(v : INTEGER);
  31. BEGIN limit := v END SetLimit;
  32. PROCEDURE Over() : BOOLEAN;
  33. BEGIN RETURN total > limit END Over;
  34. END Bounded;
  35. VAR ExitCode : INTEGER;
  36. VAR c : Bounded;
  37. VAR n : INTEGER;
  38. VAR label : ARRAY [0 .. 31] OF CHAR;
  39. VAR msg : ARRAY [0 .. 63] OF CHAR;
  40. VAR r : Conversions.ConvResults;
  41. BEGIN
  42. ExitCode := 0;
  43. (* class methods: own + inherited, through the receiver *)
  44. c.SetLimit(100);
  45. c.Bump(15);
  46. c.Bump(27); (* total = 42 *)
  47. IF c.Value() = 42 THEN ExitCode := ExitCode + 1 ELSE ExitCode := 100 END;
  48. IF NOT c.Over() THEN ExitCode := ExitCode + 2 ELSE ExitCode := 100 END;
  49. (* ISO ConvResults *)
  50. r := Conversions.StrToInt("-42", n);
  51. IF (r = strAllRight) AND (n = -42) THEN
  52. ExitCode := ExitCode + 4
  53. ELSE ExitCode := 100 END;
  54. r := Conversions.StrToInt("nope", n);
  55. IF r = strWrongFormat THEN ExitCode := ExitCode + 8 ELSE ExitCode := 100 END;
  56. r := Conversions.StrToInt("99999999999", n);
  57. IF r = strOutOfRange THEN ExitCode := ExitCode + 16 ELSE ExitCode := 100 END;
  58. (* CHAR-array concatenation *)
  59. Conversions.IntToStr(c.Value(), label);
  60. msg := "showcase17 total=" + label;
  61. TextIO.WriteString(msg);
  62. TextIO.WriteLn;
  63. IF ExitCode = 31 THEN ExitCode := c.Value() END (* 42 *)
  64. END Showcase17.