-- File: Format.mesa  last edit by Sandman on August 12, 1980  10:03 AM

DIRECTORY
  String USING [SubString],
  Time USING [Packed];

Format: DEFINITIONS =
  BEGIN

  -- Format various types into strings and call procedure.

  -- Types

  StringProc: TYPE = PROCEDURE [s: STRING];
  DateFormat: TYPE = {dateOnly, noSeconds, dateTime, full};
  NumberFormat: TYPE = RECORD [
    base: [2..36], zerofill, unsigned: BOOLEAN, columns: [0..255]];
  LongSubStringDescriptor: TYPE = RECORD [
    base: LONG STRING, offset, length: CARDINAL];
  LongSubString: TYPE = POINTER TO LongSubStringDescriptor;

  -- Constants

  OctalFormat: NumberFormat =
    [ -- 0 columns means use as many as needed.
      base: 8, zerofill: FALSE, unsigned: TRUE, columns: 0];
  DecimalFormat: NumberFormat =
    [base: 10, zerofill: FALSE, unsigned: FALSE, columns: 0];

  -- Format procedures

  Char: PROCEDURE [c: CHARACTER, proc: StringProc];
  Date: PROCEDURE [
    pt: Time.Packed, format: DateFormat ← noSeconds, proc: StringProc];
  Decimal: PROCEDURE [n: INTEGER, proc: StringProc] = INLINE
    BEGIN Number[n, DecimalFormat, proc] END;

  LongDecimal: PROCEDURE [n: LONG INTEGER, proc: StringProc] = INLINE
    BEGIN LongNumber[n, DecimalFormat, proc]; END;

  LongNumber: PROCEDURE [
    n: LONG UNSPECIFIED, format: NumberFormat, proc: StringProc];
  LongOctal: PROCEDURE [n: LONG UNSPECIFIED, proc: StringProc];
  -- Adds 'B after number.
  LongString: PROCEDURE [s: LONG STRING, proc: StringProc];
  LongSubStringItem: PROCEDURE [ss: LongSubString, proc: StringProc];
  -- Repeatedly calls proc with strings filled from ss
  Number: PROCEDURE [n: UNSPECIFIED, format: NumberFormat, proc: StringProc];
  Octal: PROCEDURE [n: UNSPECIFIED, proc: StringProc]; -- Adds 'B after number.
  SubString: PROCEDURE [ss: String.SubString, proc: StringProc];
  -- Repeatedly calls proc with strings filled from ss

  END. -- Format.mesa