{{{  description
; mode-number mode-tag mode-name
;      0
;      2      c-mode   C-Mode
;      3      p-mode   PASCAL-M
;      4      r-mode   ROFF-M
;      5      t-mode   TEX-Mode
;      6      o-mode   OCCAM-M
;      7      m-mode   MIRA-M
; other tags
;      mode-number
;      got-c-mode
;      got-p-mode
;      start-up-moved
;      start-up-x
;      start-up-y
}}}
{{{  set-mode
(deffun set-mode (
  {{{  handle c/p store
  if counter>0 c-mode (set-counter got-c-mode 1) fi
  if counter>0 p-mode (set-counter got-p-mode 1) fi
  }}}
  {{{  reset all modes
  set-counter c-mode 0
  set-counter p-mode 0
  set-counter r-mode 0
  set-counter t-mode 0
  set-counter o-mode 0
  }}}
  {{{  set mode
  add-counter mode-number -2
  if counter-0 mode-number (
    {{{  c-mode
    set-counter mode-number 2
    set-counter c-mode 1
    set-counter got-c-mode 1
    set-counter got-p-mode 0
    set-counter tab-width 2
    set-user-mode "C-Mode O_RETURN
    if not(test-language "C) (O_LANGUAGE "C) fi
    }}}
  ) else (
    {{{  others
    add-counter mode-number -1
    if counter-0 mode-number (
      {{{  p-mode
      set-counter mode-number 3
      set-counter p-mode 1
      set-counter got-c-mode 0
      set-counter got-p-mode 1
      set-counter tab-width 2
      set-user-mode "PASCAL-M O_RETURN
      if not(test-language "P) (O_LANGUAGE "P) fi
      }}}
    ) else (
      {{{  others
      add-counter mode-number -1
      if counter-0 mode-number (
        {{{  r-mode
        set-counter mode-number 4
        set-counter r-mode 1
        set-counter tab-width 1
        set-counter let-single-blank 0
        set-user-mode "ROFF-M O_RETURN
        if not(test-language "R) (set-language "R) fi
        }}}
      ) else (
        {{{  others
        add-counter mode-number -1
        if counter-0 mode-number (
          {{{  t-mode
          set-counter mode-number 5
          set-counter t-mode 1
          set-counter tab-width 1
          set-counter let-single-blank 1
          set-user-mode "TEX-Mode O_RETURN
          if not(test-language "U) (O_LANGUAGE "U "% O_RETURN O_RETURN) fi
          }}}
        ) else (
          {{{  others
          add-counter mode-number -1
          if counter-0 mode-number (
            {{{  o-mode
            set-counter mode-number 6
            set-counter o-mode 1
            set-counter tab-width 2
            set-user-mode "OCCAM-M O_RETURN
            if and(not(test-language "O),not(test-language "T)) (set-language "O) fi
            }}}
          ) else (
            {{{  others
            add-counter mode-number -1
            if counter-0 mode-number (
              {{{  m-mode
              set-counter mode-number 7
              set-counter m-mode 1
              set-counter tab-width 8
              set-user-mode "MIRA-M O_RETURN
              if not(test-language "U) (O_LANGUAGE "U "|| O_RETURN O_RETURN) fi
              }}}
            ) else (
              {{{  none
              set-counter mode-number 0
              reset-user-mode
              }}}
            ) fi
            }}}
          ) fi
          }}}
        ) fi
        }}}
      ) fi
      }}}
    ) fi
    }}}
  ) fi
  }}}
  {{{  maybe move to call-position
  if counter>0 start-up-moved (
    goto-line-counter start-up-y
    goto-counter start-up-x
    set-counter start-up-moved 0
  ) fi
  }}}
))
}}}
{{{  skip-mode
(deffun skip-mode (
  read-repeat xxx
  if counter>0 xxx (
    set-counter mode-number 1
    sum-counter mode-number xxx
  ) else (
    if counter-0 mode-number (
      set-counter mode-number 7
    ) else (
      add-counter mode-number -1
    ) fi
  ) fi
  set-counter start-up-moved 0
  set-mode
))
}}}
{{{  startup
(deffun start-up (
  set-counter mode-number 0
  {{{  tds-language -> o-mode
  if test-language "T (
    set-counter mode-number 6
    set-mode
  ) fi
  }}}
  {{{  roff-language -> r-mode
  if test-language "R (
    set-counter mode-number 4
    set-mode
  ) fi
  }}}
  store-pos start-up-x
  store-line start-up-y
  set-counter start-up-moved 1
  O_TOP_OF_FOLD
  O_END_OF_LINE
  O_LEFT
  case
    {{{  files ending on c
    (test-char "c (
      O_LEFT
      if test-char ". (set-counter mode-number 2) fi
    ))
    }}}
    {{{  files ending on p
    (test-char "p (
      O_LEFT
      if test-char ". (set-counter mode-number 3) fi
    ))
    }}}
    {{{  files ending on m
    (test-char "m (
      O_LEFT
      if test-char ". (set-counter mode-number 7) fi
    ))
    }}}
    {{{  files ending on h
    (test-char "h (
      O_LEFT
      if test-char ". (
        if counter>0 got-c-mode ( set-counter mode-number 2) fi
        if counter>0 got-p-mode ( set-counter mode-number 3) fi
      ) fi
    ))
    }}}
    {{{  files ending on s
    (test-char "s (
      O_LEFT
      if test-char "m (
        O_LEFT
        if test-char ". (set-counter mode-number 4) fi
      ) fi
    ))
    }}}
    {{{  files ending on n
    (test-char "n (
      O_LEFT
      if test-char "a (
        O_LEFT
        if test-char "m (
          O_LEFT
          if test-char ". (set-counter mode-number 4) fi
        ) fi
      ) fi
    ))
    }}}
    {{{  files ending on x
    (test-char "x (
      O_LEFT
      if test-char "e (
        O_LEFT
        if test-char "t (
          O_LEFT
          if test-char ". (set-counter mode-number 5) fi
        ) fi
      ) fi
    ))
    }}}
    {{{  files ending on r
    (test-char "r (
      O_LEFT
      if test-char "s (
        O_LEFT
        if test-char "t (
          O_LEFT
          if test-char ". (set-counter mode-number 6) fi
        ) fi
      ) fi
    ))
    }}}
    {{{  files ending on p
    (test-char "p (
      O_LEFT
      if test-char "o (
        O_LEFT
        if test-char "t (
          O_LEFT
          if test-char ". (set-counter mode-number 6) fi
        ) fi
      ) fi
    ))
    }}}
  esac
  set-mode
))
}}}
