home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* FPARSCP2.PAS *)
- (* (c) 1987 Michael Ceol & PASCAL INT. *)
- (* FCB erstellen: CP/M-Dateispez. in FCB-gerechte Struktur umsetzen.
- Neuere BS wie CP/M-Plus stellen dazu ebenfalls eine BDOS-Funktion zu
- Verfuegung (CP/M-Plus: Funktion 152: Parse Filename, s. FPARSCP3.PAS).
- Die hier implementierte Version wurde an die Konventionen der MS-DOS-
- Funktion 29 angepasst: result = 0 -> fname war ok, result = 1 -> fname
- enthaelt '*' oder '?', result = 255 -> fname fehlerhaft (z.B. illegales
- Laufwerk). nextch zeigt auf das erste, nicht mehr zum Dateinamen ge-
- hoerende Zeichen. *)
-
- PROCEDURE FParsName (VAR fname: Dir_Chr0; VAR nextch, result: INTEGER);
- VAR i, j: INTEGER; delimiters: SET OF CHAR; fstr: Dir_Str;
-
- PROCEDURE fpart; (* einen Teil (Laufwerk, Dateiname...) abteilen *)
- BEGIN
- fstr := ''; nextch := Succ(nextch);
- WHILE (NOT (fname[nextch] IN delimiters)) AND (fname[nextch] <> Chr(0))
- DO BEGIN
- fstr := Concat(fstr,UpCase(fname[nextch])); nextch := Succ(nextch);
- END;
- END;
-
- PROCEDURE fillFCB (start, len: INTEGER); (* Dateispez. nach FCB bringen *)
- BEGIN
- IF fstr <> '' THEN BEGIN
- i := 1;
- WHILE (i <= Length(fstr)) AND (fstr[i] <> '*') DO BEGIN
- IF fstr[i] = '?' THEN result := 1;
- DirFCB.name[start+i] := fstr[i]; i := Succ(i);
- END;
- IF fstr[i] = '*' THEN BEGIN
- FOR j := i TO len DO DirFCB.name[start+j] := '?'; result := 1;
- END;
- END;
- END;
-
- BEGIN
- delimiters := [#1..#32,';','=','<','>','.',':',',','[',']','|'];
- result := 0;
- WITH DirFCB DO BEGIN (* FCB initialisieren *)
- drive := 0; (* angemeldetes Laufwerk annehmen *)
- FOR i := 1 TO 11 DO name[i] := ' '; (* keine Dateispezifikation *)
- extend := 0; system[1] := 0; system[2] := 0;
- END;
- nextch := 1; (* fuehrende Trennzeichen entfernen: *)
- WHILE (fname[nextch] IN delimiters) AND (fname[nextch] <> Chr(0)) DO
- nextch := Succ(nextch);
- nextch := Pred(nextch);
- fpart; (* ersten Teil des Dateinamens trennen *)
- IF (fname[nextch] = ':') AND (Length(fstr) = 1) THEN (* Laufwerksangabe? *)
- CASE fstr[1] OF
- 'A'..'P': BEGIN (* ja. ... und naechsten Teil abtrennen: *)
- DirFCB.drive := Succ(Ord(fstr[1])-Ord('A')); fpart;
- END;
- ELSE BEGIN result := 255; Exit; END; (* ungueltiges Laufwerk!*)
- END;
- IF Length(fstr) <= 8 THEN (* ordentlicher Dateiname ? *)
- BEGIN
- fillFCB(0,8); (* ja, in FCB uebertragen... *)
- IF fname[nextch] = '.' THEN (* kommt noch Erweiterung ? *)
- BEGIN
- fpart;
- IF Length(fstr) <= 3 THEN fillFCB(8,3) ELSE result := 255;
- END;
- END
- ELSE result := 255;
- IF fname[nextch] = Chr(0) THEN nextch := 0;
- END;
- (*-------------------------------------------------------------------------*)
- (* Ende FPARSCP2.PAS *)