-- Convert.mesa, definitions for safe number/string conversions -- Russ Atkinson, August 26, 1982 5:23 pm DIRECTORY Real USING [DefaultSinglePrecision, MaxSinglePrecision], Rope USING [ROPE], Time USING [defaultTime, Packed]; Convert: CEDAR DEFINITIONS = BEGIN OPEN Real, Rope; Base: TYPE = [2..36]; CARD: TYPE = LONG CARDINAL; Precision: TYPE = [0..MaxSinglePrecision]; Index: TYPE = INT; MaxIndex: INT = LAST[INT]; ErrorKind: TYPE = {badFormat, empty, overflow, badIndex}; Value: TYPE = RECORD [value: SELECT kind: * FROM unsigned => [unsigned: CARD _ 0, base: Base _ 10], signed => [signed: INT _ 0, base: Base _ 10], real => [real: REAL _ 0.0, precision: Precision _ DefaultSinglePrecision, useE: BOOL _ FALSE], time => [time: Time.Packed _ Time.defaultTime, useDate: BOOL _ TRUE, useTime: BOOL _ TRUE, useZone: BOOL _ FALSE], error => [kind: ErrorKind _ badFormat] ENDCASE]; DefaultValue: Value = [signed[0]]; DefaultUnsigned: Value = [unsigned[0]]; DefaultSigned: Value = [signed[0]]; DefaultReal: Value = [real[0.0]]; DefaultTime: Value = [time[Time.defaultTime]]; Text: TYPE = RECORD [text: SELECT kind: * FROM string => [string: REF READONLY TEXT], rope => [rope: ROPE], get => [get: Get], ENDCASE]; DefaultText: Text = [rope[NIL]]; Get: TYPE = PROC [INT] RETURNS [CHAR]; Put: TYPE = PROC [CHAR]; ValueToRope: PROC [value: Value] RETURNS [ROPE]; ValueToRefText: PROC [value: Value] RETURNS [REF TEXT]; MapValue: PROC [put: Put, value: Value]; Parse: PROC [text: Text, template: Value _ DefaultValue, pos: INT _ 0, size: INT _ MaxIndex] RETURNS [value: Value, stop: Index]; IntFromRope: PROC [rope: ROPE] RETURNS [INT] = INLINE { v: Value = Parse[[rope[rope]]].value; RETURN [NARROW[v, Value[signed]].signed]}; -- illustration of how to use Parse -- can raise RTTypesBasic.NarrowFault END. สŒ– "Mesa" style˜Iprocšชฯcjœฯk œžœ6žœžœ žœ"žœž œžœžœžœžœžœžœžœžœ&žœžœžœžœžœžœ5žœžœ žœ žœ"žœ5žœ2žœ=žœžœEžœžœžœžœ žœžœ8žœึžœžœžœ žœžœžœžœžœ"žœžœ ฯnœžœžœžœžœžœŸœžœžœžœŸ œžœžœžœŸœžœžœžœžœŸœžœŸœžœBžœ žœžœ"Ÿ œžœžœžœžœžœ1žœžœ!$œ&œžœ˜า—…—ิ f