Unit globals;

{ Use this Unit For Procedures, Functions and Variables that every Program you
  Write will share.
}

Interface

Uses 
  Dos;
  
Type
  str1 = String[1]; str2 = String[2]; str3 = String[3];
  str4 = String[4]; str5 = String[5]; str6 = String[6];
  str7 = String[7]; str8 = String[8]; str9 = String[9];
  str10 = String[10]; str11 = String[11]; str12 = String[12];
  str13 = String[13]; str14 = String[14]; str15 = String[15];
  str16 = String[16]; str17 = String[17]; str18 = String[18];
  str19 = String[19]; str20 = String[20]; str21 = String[21];
  str22 = String[22]; str23 = String[23]; str24 = String[24];
  str25 = String[25]; str26 = String[26]; str27 = String[27];
  str28 = String[28]; str29 = String[29]; str30 = String[30];
  str31 = String[31]; str32 = String[32]; str33 = String[33];
  str34 = String[34]; str35 = String[35]; str36 = String[36];
  str37 = String[37]; str38 = String[38]; str39 = String[39];
  str40 = String[40]; str41 = String[41]; str42 = String[42];
  str43 = String[43]; str44 = String[44]; str45 = String[45];
  str46 = String[46]; str47 = String[47]; str48 = String[48];
  str49 = String[49]; str50 = String[50]; str51 = String[51];
  str52 = String[52]; str53 = String[53]; str54 = String[54];
  str55 = String[55]; str56 = String[56]; str57 = String[57];
  str58 = String[58]; str59 = String[59]; str60 = String[60];
  str61 = String[61]; str62 = String[62]; str63 = String[63];
  str64 = String[64]; str65 = String[65]; str66 = String[66];
  str67 = String[67]; str68 = String[68]; str69 = String[69];
  str70 = String[70]; str71 = String[71]; str72 = String[72];
  str73 = String[73]; str74 = String[74]; str75 = String[75];
  str76 = String[76]; str77 = String[77]; str78 = String[78];
  str79 = String[79]; str80 = String[80]; str81 = String[81];
  str82 = String[82]; str83 = String[83]; str84 = String[84];
  str85 = String[85]; str86 = String[86]; str87 = String[87];
  str88 = String[88]; str89 = String[89]; str90 = String[90];
  str91 = String[91]; str92 = String[92]; str93 = String[93];
  str94 = String[94]; str95 = String[95]; str96 = String[96];
  str97 = String[97]; str98 = String[98]; str99 = String[99];
  str100 = String[100]; str101 = String[101]; str102 = String[102];
  str103 = String[103]; str104 = String[104]; str105 = String[105];
  str106 = String[106]; str107 = String[107]; str108 = String[108];
  str109 = String[109]; str110 = String[110]; str111 = String[111];
  str112 = String[112]; str113 = String[113]; str114 = String[114];
  str115 = String[115]; str116 = String[116]; str117 = String[117];
  str118 = String[118]; str119 = String[119]; str120 = String[120];
  str121 = String[121]; str122 = String[122]; str123 = String[123];
  str124 = String[124]; str125 = String[125]; str126 = String[126];
  str127 = String[127]; str128 = String[128]; str129 = String[129];
  str130 = String[130]; str131 = String[131]; str132 = String[132];
  str133 = String[133]; str134 = String[134]; str135 = String[135];
  str136 = String[136]; str137 = String[137]; str138 = String[138];
  str139 = String[139]; str140 = String[140]; str141 = String[141];
  str142 = String[142]; str143 = String[143]; str144 = String[144];
  str145 = String[145]; str146 = String[146]; str147 = String[147];
  str148 = String[148]; str149 = String[149]; str150 = String[150];
  str151 = String[151]; str152 = String[152]; str153 = String[153];
  str154 = String[154]; str155 = String[155]; str156 = String[156];
  str157 = String[157]; str158 = String[158]; str159 = String[159];
  str160 = String[160]; str161 = String[161]; str162 = String[162];
  str163 = String[163]; str164 = String[164]; str165 = String[165];
  str166 = String[166]; str167 = String[167]; str168 = String[168];
  str169 = String[169]; str170 = String[170]; str171 = String[171];
  str172 = String[172]; str173 = String[173]; str174 = String[174];
  str175 = String[175]; str176 = String[176]; str177 = String[177];
  str178 = String[178]; str179 = String[179]; str180 = String[180];
  str181 = String[181]; str182 = String[182]; str183 = String[183];
  str184 = String[184]; str185 = String[185]; str186 = String[186];
  str187 = String[187]; str188 = String[188]; str189 = String[189];
  str190 = String[190]; str191 = String[191]; str192 = String[192];
  str193 = String[193]; str194 = String[194]; str195 = String[195];
  str196 = String[196]; str197 = String[197]; str198 = String[198];
  str199 = String[199]; str200 = String[200]; str201 = String[201];
  str202 = String[202]; str203 = String[203]; str204 = String[204];
  str205 = String[205]; str206 = String[206]; str207 = String[207];
  str208 = String[208]; str209 = String[209]; str210 = String[210];
  str211 = String[211]; str212 = String[212]; str213 = String[213];
  str214 = String[214]; str215 = String[215]; str216 = String[216];
  str217 = String[217]; str218 = String[218]; str219 = String[219];
  str220 = String[220]; str221 = String[221]; str222 = String[222];
  str223 = String[223]; str224 = String[224]; str225 = String[225];
  str226 = String[226]; str227 = String[227]; str228 = String[228];
  str229 = String[229]; str230 = String[230]; str231 = String[231];
  str232 = String[232]; str233 = String[233]; str234 = String[234];
  str235 = String[235]; str236 = String[236]; str237 = String[237];
  str238 = String[238]; str239 = String[239]; str240 = String[240];
  str241 = String[241]; str242 = String[242]; str243 = String[243];
  str244 = String[244]; str245 = String[245]; str246 = String[246];
  str247 = String[247]; str248 = String[248]; str249 = String[249];
  str250 = String[250]; str251 = String[251]; str252 = String[252];
  str253 = String[253]; str254 = String[254]; str255 = String[255];

Const
  MaxWord    = $ffff;
  MinWord    = 0;
  MinInt     = Integer($8000);
  MinLongInt = $80000000;
  UseCfg     = True;

  {Color Constants:
   Black     = 0; Blue   = 1; Green   = 2; Cyan   = 3; Red   = 4;
   Magenta   = 5; Brown  = 6; LtGray  = 7;
   DkGray    = 8; LtBlue = 9; LtGreen = A; LtCyan = B; LtRed = C;
   LtMagenta = D; Yellow = E; White   = F
   }

Const  Blink               = $80;

  {Screen color Constants}
Const   BlackOnBlack       = $00;          BlueOnBlack        = $01;
Const   BlackOnBlue        = $10;          BlueOnBlue         = $11;
Const   BlackOnGreen       = $20;          BlueOnGreen        = $21;
Const   BlackOnCyan        = $30;          BlueOnCyan         = $31;
Const   BlackOnRed         = $40;          BlueOnRed          = $41;
Const   BlackOnMagenta     = $50;          BlueOnMagenta      = $51;
Const   BlackOnBrown       = $60;          BlueOnBrown        = $61;
Const   BlackOnLtGray      = $70;          BlueOnLtGray       = $71;
Const   GreenOnBlack       = $02;          CyanOnBlack        = $03;
Const   GreenOnBlue        = $12;          CyanOnBlue         = $13;
Const   GreenOnGreen       = $22;          CyanOnGreen        = $23;
Const   GreenOnCyan        = $32;          CyanOnCyan         = $33;
Const   GreenOnRed         = $42;          CyanOnRed          = $43;
Const   GreenOnMagenta     = $52;          CyanOnMagenta      = $53;
Const   GreenOnBrown       = $62;          CyanOnBrown        = $63;
Const   GreenOnLtGray      = $72;          CyanOnLtGray       = $73;
Const   RedOnBlue          = $14;          MagentaOnBlue      = $15;
Const   RedOnGreen         = $24;          MagentaOnGreen     = $25;
Const   RedOnCyan          = $34;          MagentaOnCyan      = $35;
Const   RedOnRed           = $44;          MagentaOnRed       = $45;
Const   RedOnMagenta       = $54;          MagentaOnMagenta   = $55;
Const   RedOnBrown         = $64;          MagentaOnBrown     = $65;
Const   RedOnLtGray        = $74;          MagentaOnLtGray    = $75;
Const   BrownOnBlack       = $06;          LtGrayOnBlack      = $07;
Const   BrownOnBlue        = $16;          LtGrayOnBlue       = $17;
Const   BrownOnGreen       = $26;          LtGrayOnGreen      = $27;
Const   BrownOnCyan        = $36;          LtGrayOnCyan       = $37;
Const   BrownOnRed         = $46;          LtGrayOnRed        = $47;
Const   BrownOnMagenta     = $56;          LtGrayOnMagenta    = $57;
Const   BrownOnBrown       = $66;          LtGrayOnBrown      = $67;
Const   BrownOnLtGray      = $76;          LtGrayOnLtGray     = $77;
Const   DkGrayOnBlack      = $08;          LtBlueOnBlack      = $09;
Const   DkGrayOnBlue       = $18;          LtBlueOnBlue       = $19;
Const   DkGrayOnGreen      = $28;          LtBlueOnGreen      = $29;
Const   DkGrayOnCyan       = $38;          LtBlueOnCyan       = $39;
Const   DkGrayOnRed        = $48;          LtBlueOnRed        = $49;
Const   DkGrayOnMagenta    = $58;          LtBlueOnMagenta    = $59;
Const   DkGrayOnBrown      = $68;          LtBlueOnBrown      = $69;
Const   DkGrayOnLtGray     = $78;          LtBlueOnLtGray     = $79;
Const   LtGreenOnBlack     = $0A;          LtCyanOnBlack      = $0B;
Const   LtGreenOnBlue      = $1A;          LtCyanOnBlue       = $1B;
Const   LtGreenOnGreen     = $2A;          LtCyanOnGreen      = $2B;
Const   LtGreenOnCyan      = $3A;          LtCyanOnCyan       = $3B;
Const   LtGreenOnRed       = $4A;          LtCyanOnRed        = $4B;
Const   LtGreenOnMagenta   = $5A;          LtCyanOnMagenta    = $5B;
Const   LtGreenOnBrown     = $6A;          LtCyanOnBrown      = $6B;
Const   LtGreenOnLtGray    = $7A;          LtCyanOnLtGray     = $7B;
Const   LtRedOnBlue        = $1C;          LtMagentaOnBlue    = $1D;
Const   LtRedOnGreen       = $2C;          LtMagentaOnGreen   = $2D;
Const   LtRedOnCyan        = $3C;          LtMagentaOnCyan    = $3D;
Const   LtRedOnRed         = $4C;          LtMagentaOnRed     = $4D;
Const   LtRedOnMagenta     = $5C;          LtMagentaOnMagenta = $5D;
Const   LtRedOnBrown       = $6C;          LtMagentaOnBrown   = $6D;
Const   LtRedOnLtGray      = $7C;          LtMagentaOnLtGray  = $7D;
Const   YellowOnBlack      = $0E;          WhiteOnBlack       = $0F;
Const   YellowOnBlue       = $1E;          WhiteOnBlue        = $1F;
Const   YellowOnGreen      = $2E;          WhiteOnGreen       = $2F;
Const   YellowOnCyan       = $3E;          WhiteOnCyan        = $3F;
Const   YellowOnRed        = $4E;          WhiteOnRed         = $4F;
Const   YellowOnMagenta    = $5E;          WhiteOnMagenta     = $5F;
Const   YellowOnBrown      = $6E;          WhiteOnBrown       = $6F;
Const   YellowOnLtGray     = $7E;          WhiteOnLtGray      = $7F;
Const   BlackOnDkGray     = Blink + $00;   BlueOnDkGray      = Blink + $01;
Const   BlackOnLtBlue     = Blink + $10;   BlueOnLtBlue      = Blink + $11;
Const   BlackOnLtGreen    = Blink + $20;   BlueOnLtGreen     = Blink + $21;
Const   BlackOnLtCyan     = Blink + $30;   BlueOnLtCyan      = Blink + $31;
Const   BlackOnLtRed      = Blink + $40;   BlueOnLtRed       = Blink + $41;
Const   BlackOnLtMagenta  = Blink + $50;   BlueOnLtMagenta   = Blink + $51;
Const   BlackOnYellow     = Blink + $60;   BlueOnYellow      = Blink + $61;
Const   BlackOnWhite      = Blink + $70;   BlueOnWhite       = Blink + $71;
Const   GreenOnDkGray     = Blink + $02;   CyanOnDkGray      = Blink + $03;
Const   GreenOnLtBlue     = Blink + $12;   CyanOnLtBlue      = Blink + $13;
Const   GreenOnLtGreen    = Blink + $22;   CyanOnLtGreen     = Blink + $23;
Const   GreenOnLtCyan     = Blink + $32;   CyanOnLtCyan      = Blink + $33;
Const   GreenOnLtRed      = Blink + $42;   CyanOnLtRed       = Blink + $43;
Const   GreenOnLtMagenta  = Blink + $52;   CyanOnLtMagenta   = Blink + $53;
Const   GreenOnYellow     = Blink + $62;   CyanOnYellow      = Blink + $63;
Const   GreenOnWhite      = Blink + $72;   CyanOnWhite       = Blink + $73;
Const   RedOnDkGray       = Blink + $04;   MagentaOnDkGray   = Blink + $05;
Const   RedOnLtBlue       = Blink + $14;   MagentaOnLtBlue   = Blink + $15;
Const   RedOnLtGreen      = Blink + $24;   MagentaOnLtGreen  = Blink + $25;
Const   RedOnLtCyan       = Blink + $34;   MagentaOnLtCyan   = Blink + $35;
Const   RedOnLtRed        = Blink + $44;   MagentaOnLtRed    = Blink + $45;
Const   RedOnLtMagenta    = Blink + $54;   MagentaOnLtMagenta= Blink + $55;
Const   RedOnYellow       = Blink + $64;   MagentaOnYellow   = Blink + $65;
Const   RedOnWhite        = Blink + $74;   MagentaOnWhite    = Blink + $75;
Const   BrownOnDkGray     = Blink + $06;   LtGrayOnDkGray    = Blink + $07;
Const   BrownOnLtBlue     = Blink + $16;   LtGrayOnLtBlue    = Blink + $17;
Const   BrownOnLtGreen    = Blink + $26;   LtGrayOnLtGreen   = Blink + $27;
Const   BrownOnLtCyan     = Blink + $36;   LtGrayOnLtCyan    = Blink + $37;
Const   BrownOnLtRed      = Blink + $46;   LtGrayOnLtRed     = Blink + $47;
Const   BrownOnLtMagenta  = Blink + $56;   LtGrayOnLtMagenta = Blink + $57;
Const   BrownOnYellow     = Blink + $66;   LtGrayOnYellow    = Blink + $67;
Const   BrownOnWhite      = Blink + $76;   LtGrayOnWhite     = Blink + $77;
Const   DkGrayOnDkGray    = Blink + $08;   LtBlueOnDkGray    = Blink + $09;
Const   DkGrayOnLtBlue    = Blink + $18;   LtBlueOnLtBlue    = Blink + $19;
Const   DkGrayOnLtGreen   = Blink + $28;   LtBlueOnLtGreen   = Blink + $29;
Const   DkGrayOnLtCyan    = Blink + $38;   LtBlueOnLtCyan    = Blink + $39;
Const   DkGrayOnLtRed     = Blink + $48;   LtBlueOnLtRed     = Blink + $49;
Const   DkGrayOnLtMagenta = Blink + $58;   LtBlueOnLtMagenta = Blink + $59;
Const   DkGrayOnYellow    = Blink + $68;   LtBlueOnYellow    = Blink + $69;
Const   DkGrayOnWhite     = Blink + $78;   LtBlueOnWhite     = Blink + $79;
Const   LtGreenOnDkGray   = Blink + $0A;   LtCyanOnDkGray    = Blink + $0B;
Const   LtGreenOnLtBlue   = Blink + $1A;   LtCyanOnLtBlue    = Blink + $1B;
Const   LtGreenOnLtGreen  = Blink + $2A;   LtCyanOnLtGreen   = Blink + $2B;
Const   LtGreenOnLtCyan   = Blink + $3A;   LtCyanOnLtCyan    = Blink + $3B;
Const   LtGreenOnLtRed    = Blink + $4A;   LtCyanOnLtRed     = Blink + $4B;
Const   LtGreenOnLtMagenta= Blink + $5A;   LtCyanOnLtMagenta = Blink + $5B;
Const   LtGreenOnYellow   = Blink + $6A;   LtCyanOnYellow    = Blink + $6B;
Const   LtGreenOnWhite    = Blink + $7A;   LtCyanOnWhite     = Blink + $7B;
Const   LtRedOnDkGray     = Blink + $0C;   LtMagentaOnDkGray = Blink + $0D;
Const   LtRedOnLtBlue     = Blink + $1C;   LtMagentaOnLtBlue = Blink + $1D;
Const   LtRedOnLtGreen    = Blink + $2C;   LtMagentaOnLtGreen= Blink + $2D;
Const   LtRedOnLtCyan     = Blink + $3C;   LtMagentaOnLtCyan = Blink + $3D;
Const   LtRedOnLtRed      = Blink + $4C;   LtMagentaOnLtRed  = Blink + $4D;
Const   LtRedOnLtMagenta  = Blink + $5C;   LtMagentaOnLtMagenta= Blink + $5D;
Const   LtRedOnYellow     = Blink + $6C;   LtMagentaOnYellow = Blink + $6D;
Const   LtRedOnWhite      = Blink + $7C;   LtMagentaOnWhite  = Blink + $7D;
Const   YellowOnDkGray    = Blink + $0E;   WhiteOnDkGray     = Blink + $0F;
Const   YellowOnLtBlue    = Blink + $1E;   WhiteOnLtBlue     = Blink + $1F;
Const   YellowOnLtGreen   = Blink + $2E;   WhiteOnLtGreen    = Blink + $2F;
Const   YellowOnLtCyan    = Blink + $3E;   WhiteOnLtCyan     = Blink + $3F;
Const   YellowOnLtRed     = Blink + $4E;   WhiteOnLtRed      = Blink + $4F;
Const   YellowOnLtMagenta = Blink + $5E;   WhiteOnLtMagenta  = Blink + $5F;
Const   YellowOnYellow    = Blink + $6E;   WhiteOnYellow     = Blink + $6F;
Const   YellowOnWhite     = Blink + $7E;   WhiteOnWhite      = Blink + $7F;

Var
  TempStr    : String;
  TempStrLen : Byte Absolute TempStr;
  
Function Exist(fn: str80): Boolean;
{ Returns True if File fn exists in the current directory                    }

Function ExistsOnPath(Var fn: str80): Boolean;
{ Returns True if File fn exists in any directory specified in the current   }
{ path and changes fn to a fully qualified path/File.                        }

Function StrUpCase(s : String): String;
{ Returns an upper Case String from s. Applicable to the English language.   }

Function StrLowCase(s : String): String;
{ Returns a String = to s With all upper Case Characters converted to lower  }

Function Asc2Str(Var s; max: Byte): String;
{ Converts an ASCIIZ String to a Turbo Pascal String With a maximum length   }
{ of max Characters.                                                         }

Procedure Str2Asc(s: String; Var ascStr; max: Word);
{ Converts a TP String to an ASCIIZ String of no more than max length.       }
{ WARNinG:  No checks are made that there is sufficient room in destination  }
{           Variable.                                                        }

Function LastPos(ch: Char; s: String): Byte;
{ Returns the last position of ch in s                                       }

Procedure CheckIO(a: Byte);

Implementation

Function Exist(fn: str80): Boolean;
  begin
    TempStrLen := 0;
    TempStr    := FSearch(fn,'');
    Exist      := TempStrLen <> 0;
  end; { Exist }

Function ExistsOnPath(Var fn: str80): Boolean;
  begin
    TempStrLen   := 0;
    TempStr      := FSearch(fn,GetEnv('PATH'));
    ExistsOnPath := TempStrLen <> 0;
    fn           := FExpand(TempStr);
  end; { ExistsOnPath }

Function StrUpCase(s : String): String;
  Var x : Byte;
  begin
    StrUpCase[0] := s[0];
    For x := 1 to length(s) do
      StrUpCase[x] := UpCase(s[x]);
  end; { StrUpCase }

Function StrLowCase(s : String): String;
  Var x : Byte;
  begin
    StrLowCase[0] := s[0];
    For x := 1 to length(s) do
      Case s[x] of
      'a'..'z': StrLowCase[x] := chr(ord(s[x]) and $df);
      else StrLowCase[x] := s[x];
      end; { Case }
  end; { StrLowCase }

Function Asc2Str(Var s; max: Byte): String;
  Var stArray  : Array[1..255] of Char Absolute s;
      len      : Integer;
  begin
    len        := pos(#0,stArray)-1;                       { Get the length }
    if (len > max) or (len < 0) then               { length exceeds maximum }
      len      := max;                                  { so set to maximum }
    Asc2Str    := stArray;
    Asc2Str[0] := chr(len);                                    { Set length }
  end;  { Asc2Str }

Procedure Str2Asc(s: String; Var ascStr; max: Word);
  begin
    FillChar(AscStr,max,0);
    if length(s) < max then
      move(s[1],AscStr,length(s))
    else
      move(s[1],AscStr,max);
  end; { Str2Asc }


Function LastPos(ch: Char; s: String): Byte;
  Var x : Word;
  begin
    x := succ(length(s));
    Repeat
      dec(x);
    Until (s[x] = ch) or (x = 0);
  end; { LastPos }

Procedure CheckIO(a: Byte);
  Var e : Integer;
  begin
    e := Ioresult;
    if e <> 0 then begin
      Writeln('I/O error ',e,' section ',a);
      halt(e);
    end;
  end; { CheckIO }

end. { Globals }
  
