Приведем пример исходного кода, показывающий, как можно ис-
пользовать некоторые функции обработки строк. Этот пример исполь-
зован при разработке функции FileSplit в модуле WinDos.
{ максимальные размеры компонентов имени файла }
const
fsPathName = 79; { имя маршрута }
fsDirectory = 67; { имя каталога }
fsFileName = 8; { имя файла }
fsExtension = 4; { расширение имени файла }
{ флаги, возвращаемые FileSplit }
const
fcWildcards = $0008 { трафаретные символы }
fcDirectory = $0004 { имя каталога }
fcFileName = $0002 { имя файла }
fcExtension = $0001 { расширение имени файла }
{ FileSplit разбивает имя файла, заданное маршрутом, на три }
{ компонента. Dir принимает значение диска и каталога с }
{ предшествующей и завершающей обратной косой чертой, Name }
{ принимает значение имени файла, а Ext - расширения с }
{ предшествующей точкой. Если компонент строки-параметра }
{ равен NIL, то соответствующая часть маршрута не }
{ записывается. Если маршрут не содержит данного компонента, }
{ то возвращаемая строка компонента будет пустой. }
{ Максимальные длины строк, возвращаемых в Dir, Name и Ext, }
{ определяются битовыми масками fsDirectory, fsFileName, }
{ fsExtension. Возвращаемое значение представляет собой }
{ комбинацию битовых масок fсDirectory, fсFileName и }
{ fсExtension, показывающую, какие компоненты присутствуют в }
{ маршруте. Если имя и расширение содержат трафаретные }
{ символы (* и ?), то в возвращаемом значении устанавливается }
{ флаг fcWildcards. }
function FileSplit(Path, Dir, Name, Ext: PChar): Word;
var
DirLen, NameLEn, Flags: Word;
NamePtr, ExtPtr: PChar;
begin
NamePtr := StrRScan(Path, '/');
if NamePtr = nil then NamePtr := StrRScan(Path, ':');
if NamePtr = nil then NamePtr := Path else Inc(NamePtr);
ExtPtr := StrScan(NamePtr, '.');
if ExtPtr = nil then ExtPtr := StrEnd(NamePtr);
DirLen := NamePtr - Path;
if DirLen > fsDirectory then DirLen := fsDirectory;
NameLen := ExtPtr - NamePtr;
B.Pascal 7 & Objects/LR - 307 -
if NameLen > fsFilename then NameLen := fsFileName;
Flags := 0;
if (StrScan(NamePtr, '?') <> nil) or
(StrScan(NamePtr, '*') <> nil) then
Falgs := fcWildcards;
if DirLen <> 0 then Flags := Flags or fcDirectory;
if NameLen <> 0 then Flags := Flags or fcFilename;
if ExtPtr[0] <> #0 then Flags := Flags or fcExtension;
if Dir <> nil then StrLCopy(Dir, Path, DirLen);
if Name <> nil then StrLCopy(Name, NamePtr, NameLen);
if Ext <> nil then StrLCopy(Ext, ExtPtr, fsExtension);
FileSplit := Flags:
end;