cm3/src/Arg.m3


 Copyright (C) 1994, Digital Equipment Corporation           
 All rights reserved.                                        
 See the file COPYRIGHT for a full description.              
                                                             
 Last modified on Wed Jul  6 16:22:57 PDT 1994 by kalsow     

MODULE Arg;

PROCEDURE NewList (): List =
  BEGIN
    RETURN NEW (List);
  END NewList;

PROCEDURE Append (list: List;  val: TEXT) =
  VAR n := NEW (T, next := NIL, arg := val);
  BEGIN
    IF (list.head = NIL)
      THEN list.head := n;
      ELSE list.tail.next := n;
    END;
    list.tail := n;
    INC (list.cnt);
  END Append;

PROCEDURE Prepend (list: List;  val: TEXT) =
  VAR n := NEW (T, next := list.head, arg := val);
  BEGIN
    IF (list.tail = NIL) THEN list.tail := n END;
    list.head := n;
    INC (list.cnt);
  END Prepend;

PROCEDURE AppendL (a, b: List) =
  VAR n := b.head;
  BEGIN
    WHILE (n # NIL) DO
      Append (a, n.arg);
      n := n.next;
    END;
  END AppendL;

PROCEDURE Pop (list: List): TEXT =
  VAR txt: TEXT;
  BEGIN
    IF (list = NIL) OR (list.cnt <= 0) THEN RETURN NIL END;
    txt := list.head.arg;
    list.head := list.head.next;
    DEC (list.cnt);
    RETURN txt;
  END Pop;

PROCEDURE Flatten (list: List;  other: TEXT): REF ARRAY OF TEXT =
  VAR n := 0;  array: REF ARRAY OF TEXT;  t: T;
  BEGIN
    IF (list # NIL) AND (list.cnt > 0) THEN INC (n, list.cnt); END;
    IF (other # NIL) THEN INC (n); END;
    array := NEW (REF ARRAY OF TEXT, n);
    n := 0;
    IF (list # NIL) THEN
      t := list.head;
      WHILE (t # NIL) DO
        array [n] := t.arg;  INC (n);
        t := t.next;
      END;
    END;
    IF (other # NIL) THEN
      array [n] := other;  INC (n);
    END;
    RETURN array;
  END Flatten;

BEGIN
END Arg.