 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* InputEnv.mod							*)[23m[31m
	[3m[33m(* Version 2.0 of InputEnv					*)[23m[31m
	[3m[33m(* Versions 1.0, 1.1 written in C;				*)[23m[31m
	[3m[33m(* Versions 2.0 and above written in Modula-2			*)[23m[31m
	[3m[33m(* Copyright © 1994 John E> Perry, ///				*)[23m[31m
	[3m[33m(* This program and its source are freely distributable		*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* This program is a DOS interface, with prompting, for the	*)[23m[31m
	[3m[33m(* user to set an environment variable.  For example, I use it	*)[23m[31m
	[3m[33m(* in my S:Shell-Startup file like so:				*)[23m[31m
	[3m[33m(*								*)[23m[31m
	[3m[33m(* InputEnv SUPPRESS SHELL UserName Please input your name:	*)[23m[31m
	[3m[33m(* Prompt "$UserName @ *E[1m$Hostname*E[0m : *E[33;3m%S*E[0m> "	*)[23m[31m
	[3m[33m(*								*)[23m[31m
	[3m[33m(* which gives the prompt (special styles excluded :)		*)[23m[31m
	[3m[33m(*								*)[23m[31m
	[3m[33m(*	jack@Sara : >						*)[23m[31m
	[3m[33m(*								*)[23m[31m
	[3m[33m(* for whatever shell I'm using.  (Sara is the name of my Amiga.*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* Suggestions, Bugs, Questions, Comments, Snide Remarks, Etc.:	*)[23m[31m
	[3m[33m(*			jep@nauvax.ucc.nau.edu			*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m

[1mMODULE[22m InputEnv;
 
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* Imported modules.						*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
   
  [1mFROM[22m System [1mIMPORT[22m argv, argc;
  [1mFROM[22m SYSTEM [1mIMPORT[22m ADDRESS, ADR;
  [1mFROM[22m Terminal [1mIMPORT[22m WriteString, WriteLn, Write, Read;
  [1mFROM[22m Strings [1mIMPORT[22m ConcatString, CompareString, Relation, StringLength;
  [1mFROM[22m AmigaDOS2 [1mIMPORT[22m SetVar, GVBLocalOnly, GVBGlobalOnly,
		DOSVariableFlagsSet, GetVar;
 
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* Programmer-defined constants.				*)[23m[31m
	[3m[33m(* These are special characters that I need to define like so	*)[23m[31m
	[3m[33m(* in order to achieve various desired effects with a Write.	*)[23m[31m
	[3m[33m(* Or... defined for my convenience.				*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
  [1mCONST[22m
    [3mEOS[23m = [1m[3mCHAR[22m[23m(0);	[3m[33m(* end of string	*)[23m[31m
    [3mTAB[23m = [1m[3mCHAR[22m[23m(9);	[3m[33m(* tab			*)[23m[31m
    [3mEOL[23m = [1m[3mCHAR[22m[23m(10);	[3m[33m(* end of line		*)[23m[31m
    [3mESC[23m = [1m[3mCHAR[22m[23m(27);	[3m[33m(* escape		*)[23m[31m
 
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* Module Variables.						*)[23m[31m
	[3m[33m(* yesNo: an input variable (yes or no)				*)[23m[31m
	[3m[33m(* counter: a string counter					*)[23m[31m
	[3m[33m(* envVar: name of the environment variable being created	*)[23m[31m
	[3m[33m(* envString: string AmigaDOS is to associate with envVar	*)[23m[31m
	[3m[33m(* suppressFlag: suppress "...overwrite?" prompt?		*)[23m[31m
	[3m[33m(* shellFlag: shell or globale environment variable?		*)[23m[31m
	[3m[33m(* promptString: how to prompt user				*)[23m[31m
	[3m[33m(* argString: used to point to command-line arguments		*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
  [1mVAR[22m
    yesNo: [1m[3mCHAR[22m[23m;
    counter: [1m[3mCARDINAL[22m[23m;
    envVar: [1mARRAY[22m[0..63] [1mOF[22m [1m[3mCHAR[22m[23m;
    envString: [1mARRAY[22m[0..255] [1mOF[22m [1m[3mCHAR[22m[23m;
    suppressFlag, shellFlag: [1m[3mBOOLEAN[22m[23m;
    promptString: [1mARRAY[22m[0..127] [1mOF[22m [1m[3mCHAR[22m[23m;
    argString: [1mPOINTER[22m [1mTO[22m [1mARRAY[22m [0..63] [1mOF[22m [1m[3mCHAR[22m[23m;
 
 	[3m[33m(****************************************************************)[23m[31m
	[3m[33m(* PROCEDURE ReadLn(VAR string: ARRAY OF CHAR);			*)[23m[31m
	[3m[33m(* Reads string until EOL is encountered.			*)[23m[31m
 	[3m[33m(****************************************************************)[23m[31m
  [1mPROCEDURE[22m ReadLn([1mVAR[22m string: [1mARRAY[22m [1mOF[22m [1m[3mCHAR[22m[23m);
    [1mVAR[22m
      in: [1m[3mCHAR[22m[23m;		[3m[33m(* input character	*)[23m[31m
      loc: [1m[3mCARDINAL[22m[23m;	[3m[33m(* location in string	*)[23m[31m
    [1mBEGIN[22m
      loc := 0;
      in := [1m[3mCHAR[22m[23m(0);
      [3m[33m(* read string *)[23m[31m
      [1mWHILE[22m in # [1m[3mCHAR[22m[23m(10)
        [1mDO[22m
	  Read(in);
	  string[loc] := in;
	  [1m[3mINC[22m[23m(loc);
	[1mEND[22m; [3m[33m(* WHILE *)[23m[31m
      string[loc - 1] := [1m[3mCHAR[22m[23m(0);
    [1mEND[22m ReadLn;
 
  [1mBEGIN[22m
    [1mIF[22m argc = 1
      [1mTHEN[22m
        WriteString('Dude! The usage is:'); WriteLn;
        Write([3mTAB[23m); WriteString('InputEnv [SUPPRESS] [SHELL] <envname> <prompt>'); 
	WriteLn;
        WriteString('where <envname> is the name of the environment string and'); 
	WriteLn;
        WriteString('<prompt> is the prompt for the user.  ');
	Write([3mESC[23m); 
	WriteString('[3mNOTE THAT <prompt> MUST'); WriteLn;
        WriteString('BE THE LAST THING ON THE LINE, AND <envname> ');
	Write([3mESC[23m); 
	WriteString('[1mMUST '); 
	Write([3mESC[23m);
	WriteString('[22m BE NEXT TO LAST!!!');
	Write([3mESC[23m);
	WriteString('[23m'); 
	WriteLn;
        Write([3mTAB[23m); 
	WriteString('To suppress verification of new environment variable,'); 
	WriteLn;
        WriteString('use SUPPRESS, and to make a shell instead of a global'); 
	WriteLn;
        WriteString('environment variable, user SHELL.'); 
	WriteLn;
	WriteLn;
        WriteString('InputEnv v2.0 Copyright © 1994 John E> Perry, ///'); WriteLn;
	[1m[3mHALT[22m[23m;
      [1mEND[22m; [3m[33m(* IF *)[23m[31m
    [3m[33m(* process command line *)[23m[31m
    counter := 1;
    argString := ADDRESS(argv^[1]);
    [3m[33m(* suppress "...overwrite?" prompt? *)[23m[31m
    [1mIF[22m CompareString(argString^, 'SUPPRESS') = equal
      [1mTHEN[22m
        suppressFlag := [1m[3mTRUE[22m[23m;
	[1m[3mINC[22m[23m(counter);
      [1mEND[22m; [3m[33m(* IF *)[23m[31m
    argString := ADDRESS(argv^[counter]);
    [3m[33m(* shell variable? default is global *)[23m[31m
    [1mIF[22m CompareString(argString^, 'SHELL') = equal
      [1mTHEN[22m
	shellFlag := [1m[3mTRUE[22m[23m;
	[1m[3mINC[22m[23m(counter);
      [1mEND[22m; [3m[33m(* IF *)[23m[31m
    ConcatString(envVar, argv^[counter]^);
    [1m[3mINC[22m[23m(counter);
    [3m[33m(* prompt *)[23m[31m
    [1mWHILE[22m counter <= (argc - 1)
      [1mDO[22m
        ConcatString(promptString, argv^[counter]^);
        ConcatString(promptString, ' ');
	[1m[3mINC[22m[23m(counter);
      [1mEND[22m; [3m[33m(* WHILE *)[23m[31m
    [3m[33m(* get string *)[23m[31m
    WriteString(promptString);
    ReadLn(envString);
    [3m[33m(* check to see if variable exists *)[23m[31m
    [1mIF[22m [1mNOT[22m suppressFlag
      [1mTHEN[22m
        [1mIF[22m [1mNOT[22m ((GetVar(ADR(envVar), ADR(promptString), 63, DOSVariableFlagsSet {GVBGlobalOnly}) = [1m[3mLONGINT[22m[23m-(1DH)) [1mOR[22m (GetVar(ADR(envVar), ADR(promptString), 63, DOSVariableFlagsSet {GVBLocalOnly}) = [1m[3mLONGINT[22m[23m-(1DH)))
	  [1mTHEN[22m
	    WriteString('Variable already exists! overwrite? (Y/N) ');
	    Read(yesNo);
	    [1mIF[22m (yesNo = 'N') [1mOR[22m (yesNo = 'n')
	      [1mTHEN[22m
	        [1m[3mHALT[22m[23m;
	      [1mEND[22m; [3m[33m(* IF *)[23m[31m
	  [1mEND[22m; [3m[33m(* IF *)[23m[31m
      [1mEND[22m; [3m[33m(* IF *)[23m[31m
    [3m[33m(* okay, write it out *)[23m[31m
    [1mIF[22m shellFlag
      [1mTHEN[22m
	shellFlag := SetVar(ADR(envVar), ADR(envString), [1m[3mLONGINT[22m[23m(StringLength(envString)), DOSVariableFlagsSet{GVBLocalOnly});
      [1mELSE[22m
	shellFlag := SetVar(ADR(envVar), ADR(envString), [1m[3mLONGINT[22m[23m(StringLength(envString)), DOSVariableFlagsSet{GVBGlobalOnly});
      [1mEND[22m; [3m[33m(* IF *)[23m[31m
  [1mEND[22m InputEnv.
