@echo off

:: cobenv.cmd
:: Batch for setting GnuCOBOL Environment in Windows
:: from MSYS2 MINGW32/MINGW64
::
:: Copyright (C) 2017 Free Software Foundation, Inc.
:: Written by Simon Sobisch
::
:: This file is part of GnuCOBOL.
::
:: The GnuCOBOL compiler is free software: you can redistribute it
:: and/or modify it under the terms of the GNU General Public License
:: as published by the Free Software Foundation, either version 3 of the
:: License, or (at your option) any later version.
::
:: GnuCOBOL is distributed in the hope that it will be useful,
:: but WITHOUT ANY WARRANTY; without even the implied warranty of
:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
:: GNU General Public License for more details.
::
:: You should have received a copy of the GNU General Public License
:: along with GnuCOBOL.  If not, see <https://www.gnu.org/licenses/>.
goto :evaluate_opts


:help
  echo.
  echo %_ce_myname% - set, show, store or restore GnuCOBOL environment
  echo.
  echo usage: %_ce_myextname% [options]
  echo  note: if no option is given %_ce_myname% defaults to --setenv
  echo.
  echo options:
  echo   --help,    -h  display this information
  echo   --verbose, -v  print the environment variables set / restored
  echo   --quiet,   -q  don't print anything
  echo   --setenv       store current environment and set environment
  echo                  according to MSYS2 package structure
  echo   --save         store current environment
  echo   --restore      restore environment to previous saved point
  echo   --showenv      show current environment
goto :eof


:output
  if %_ce_verbose% lss 0 goto :eof
  if %_ce_verbose% equ 0 (
    echo %*
    goto :eof
  )
  echo %*:
  echo   PATH=%PATH%
  echo   COB_LIBRARY_PATH=%COB_LIBRARY_PATH%
  echo   COB_CONFIG_DIR=%COB_CONFIG_DIR%
  echo   COB_COPY_DIR=%COB_COPY_DIR%
goto :eof


:save
  set "_ce_restore_path=%PATH%"
  set "_ce_restore_library_path=%COB_LIBRARY_PATH%"
  set "_ce_restore_copy=%COB_COPY_DIR%"
  set "_ce_restore_config=%COB_CONFIG_DIR%"
  call :output environment saved
goto :eof


:setenv
  if %_ce_verbose% geq 0 (
     echo Setup GnuCOBOL environment - MinGW
  )
  if "%_ce_restore_path%"=="" (
    call :save
  ) else (
    call :restore silent
  )
  set "PATH=%MINGW_ROOT_PATH%bin;%PATH%"
  if not "%COB_LIBRARY_PATH%"=="" set "COB_LIBRARY_PATH=;%COB_LIBRARY_PATH%"
  set "COB_LIBRARY_PATH=%MINGW_ROOT_PATH%lib\gnucobol%COB_LIBRARY_PATH%"
  set "COB_COPY_DIR=%MINGW_ROOT_PATH%share\gnucobol\copy"
  set "COB_CONFIG_DIR=%MINGW_ROOT_PATH%share\gnucobol\config"
  if %_ce_verbose% lss 0 goto :eof
  call :output environment set
goto :eof


:unset_restore
  set "_ce_restore_path="
  set "_ce_restore_library_path="
  set "_ce_restore_copy="
  set "_ce_restore_config="
goto :eof


:restore
  if "%_ce_restore_path%"=="" (
    if %_ce_verbose% geq 0 (
      echo nothing to restore
    )
    set "COB_LIBRARY_PATH="
    set "COB_COPY_DIR="
    set "COB_CONFIG_DIR="
  )
  set "PATH=%_ce_restore_path%"
  set "COB_LIBRARY_PATH=%_ce_restore_library_path%"
  set "COB_COPY_DIR=%_ce_restore_copy%"
  set "COB_CONFIG_DIR=%_ce_restore_config%"
  if [%1]==[] (
    call :output environment restored
  )
goto :eof


:showenv
  set _ce_verbose=1
  call :output current environment
goto :eof


:setcleanroot
  set "MINGW_ROOT_PATH=%~dp1"
goto :eof


:evaluate_opts
set "_ce_myname=cobenv.bat"
set "_ce_myextname=%0"
call :setcleanroot "%~dp0..\"
set _ce_verbose=0

if /i [%2]==[--verbose] (
  set _ce_verbose=1
) else if /i [%2]==[-v] (
  set _ce_verbose=1
) else if /i [%2]==[--quiet] (
  set _ce_verbose=-1
) else if /i [%2]==[-q] (
  set _ce_verbose=-1
) else if not [%2]==[] (
  shift
) else (
  if /i [%1]==[--verbose] (
    set _ce_verbose=1  && shift
  ) else if /i [%1]==[-v] (
    set _ce_verbose=1  && shift
  ) else if /i [%1]==[--quiet] (
    set _ce_verbose=-1 && shift
  ) else if /i [%1]==[-q] (
    set _ce_verbose=-1 && shift
  )
)

if [%1]==[--restore] (
  call :restore
  call :unset_restore
) else if /i [%1]==[/restore] (
  call :restore
  call :unset_restore
) else if /i [%1]==[--save] (
  call :save
) else if /i [%1]==[/save] (
  call :save
) else if /i [%1]==[--setenv] (
  call :setenv
) else if /i [%1]==[/setenv] (
  call :setenv
) else if [%1]==[] (
  call :setenv
) else if /i [%1]==[--showenv] (
  call :showenv
) else if /i [%1]==[/showenv] (
  call :showenv
) else if /i [%1]==[--help] (
  call :help
) else if /i [%1]==[/help] (
  call :help
) else if /i [%1]==[-h] (
  call :help
) else if /i [%1]==[/?] (
  call :help
) else (
  echo unrecognized or misplaced option "%1"
  call :help
)

set "_ce_verbose="
set "_ce_myname="
set "_ce_myextname="

