(* Last edited on 1999-06-06 00:58:48 by stolfi *)

MODULE TTMode;

IMPORT Text;

CONST Vowels = SET OF CHAR { 'a', 'e', 'i', 'o', 'u',  'A', 'E', 'I', 'O', 'U' };

PROCEDURE ToISOLatin1(VAR (*IO*) buf: REF CHARS; VAR (*IO*) len: CARDINAL) =
    
  PROCEDURE Translate(v: CHAR; a, b: TEXT): CHAR =
    BEGIN
      FOR i := 0 TO Text.Length(a) DO
        IF v = Text.GetChar(a, i) THEN RETURN Text.GetChar(b,i) END
      END;
      <* ASSERT FALSE *>
    END Translate;
      
  VAR i, j: CARDINAL := 0;
       
  BEGIN
    WHILE i < len DO
      IF i+1 >= len THEN
        buf[j] := buf[i]; INC(j); INC(i) 
      ELSE
        WITH x = buf[i], y = buf[i+1] DO
          IF x = '\'' THEN
            IF y = '\'' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y IN Vowels OR y = 'y' OR y = 'Y' OR y = 'c' OR y = 'C' THEN 
              buf[j] := Translate(y, "aeiouycAEIOUYC", "áéíóúýçÁÉÍÓÚÝÇ");
              INC(j); INC(i,2)
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSIF x = '`' THEN
            IF y = '`' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y IN Vowels THEN 
              buf[j] := Translate(y, "aeiouAEIOU", "àèìòùÀÈÌÒÙ");
              INC(j); INC(i,2)
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSIF x = '"' THEN
            IF y = '"' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y IN Vowels OR y = 'y' THEN 
              buf[j] := Translate(y, "aeiouyAEIOU", "äëïöüÿÄËÏÖÜ");
              INC(j); INC(i,2)
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSIF x = '^' THEN
            IF y = '^' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y IN Vowels THEN 
              buf[j] := Translate(y, "aeiouAEIOU", "âêîôûÂÊÎÔÛ");
              INC(j); INC(i,2)
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSIF x = '~' THEN
            IF y = '~' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y = 'a' OR y = 'A' 
            OR    y = 'o' OR y = 'O' 
            OR    y = 'n' OR y = 'N' THEN 
              buf[j] := Translate(y, "aonAON", "ãõñÃÕÑ");
              INC(j); INC(i,2);
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSIF x = ',' THEN
            IF y = ',' THEN 
              buf[j] := x;
              INC(j); INC(i,2)
            ELSIF y = 'c' OR y = 'C' THEN
              buf[j] := Translate(y, "cC", "çÇ");
              INC(j); INC(i,2)
            ELSE
              buf[j] := x; INC(j); INC(i) 
            END
          ELSE
            buf[j] := x; INC(j); INC(i)
          END
        END
      END
    END;
    len := j
  END ToISOLatin1;

BEGIN
  
END TTMode.
