home *** CD-ROM | disk | FTP | other *** search
- type
- NameString = String [40] ;
-
- const
- HighestValidDrive : Char = 'B' ;
-
- function CheckFileName (Name : NameString) : Boolean ;
-
- type
- Valid = Set of Char ;
-
- const
- Colon = ':' ;
- Period = '.' ;
- FileChars : Valid = ['@'..'Z', '0'..'9', '!', '#'..')', '-', '_', '`', '{', '}'] ;
- Blank = ' ' ;
-
- type
- GenStr = String [60] ;
-
- var
- NameChars : Valid ;
- OK : Boolean ;
- I : Byte ;
- AllBlanks : Boolean ;
-
- procedure BlankStrip (var Str : NameString) ;
-
- var
- I, J : Byte ;
-
- begin
- repeat
- for I := 1 to Length (Str) do if Str [I] = Blank then for J := (I + 1) to Length (Str) do Str [J - 1] := Str [J] ;
- until Str [1] <> Blank ;
- J := Length (Str) ;
- if J > 14 then for I := J downto 14 do if Str [I] = Blank then Str := Copy (Str, 1, (I - 1)) ;
- end ;
-
- procedure FormSet (var ChSet : Valid ; Name : NameString) ;
-
- var
- I : 1..14 ;
- Ch : Char ;
-
- begin
- ChSet := [] ;
- for I := 1 to Length (Name) do begin
- Ch := Name[I] ;
- ChSet := ChSet + [Ch] ;
- end ;
- end ;
-
-
- procedure NameErr (var NameErr : Boolean ; Errms : GenStr) ;
-
- begin
- NameErr := False ;
- Writeln (Output) ;
- Write (Output, ^G) ;
- Writeln (Output, Errms) ;
- end ;
-
- procedure ParseName (ChSet : Valid ; Name : NameString ; var Flag : Boolean) ;
-
- var
- TStr : NameString ;
-
- procedure CheckExt (Name : NameString ; var Errf : Boolean) ;
-
- var
- I, Len : Byte ;
- MSvar : GenStr ;
-
- begin
- I := Pos (Period, Name) ;
- Len := Length (Name) ;
- if ((Len - I) > 3) or (I > 9) then begin
- if I > 9 then MSvar := 'name' else MSvar := 'extension' ;
- NameErr (Errf, 'Invalid length, ' + MSvar) ;
- end ;
- end ;
-
- begin
- Flag := True ;
- if Colon in ChSet then begin
- if Name[2] <> Colon then NameErr (Flag, 'Invalid drive specifier') ;
- if not (Name[1] in ['A'..HighestValidDrive]) then NameErr (Flag, 'Drive specified not in system') ;
- Tstr := Copy (Name, 3, 14) ;
- end
- else Tstr := Copy (Name, 1, 14) ;
- if Period in ChSet then CheckExt (Tstr, Flag)
- else if Length (Tstr) > 8 then NameErr (Flag, 'Invalid length, name') ;
- end ;
-
-
- begin
- AllBlanks := True ;
- for I := 1 to Length (Name) do if Name [I] <> Blank then AllBlanks := False ;
- if not AllBlanks then begin
- BlankStrip (Name) ;
- if Length (Name) > 14 then NameErr (OK, 'Input name string too long')
- else begin
- FileChars := FileChars + [Colon] + [Period] ;
- FormSet (NameChars, Name) ;
- if NameChars - FileChars <> [] then NameErr (OK, 'Invalid characters in name')
- else ParseName (NameChars, Name, OK) ;
- end ;
- end
- else NameErr (OK, 'Non-existent name, all blanks') ;
- CheckFileName := OK ;
- end ;