использования функций с завершающим нулем
Приведем пример исходного кода, показывающий, как можно ис- пользовать некоторые функции обработки строк. Этот пример исполь- зован при разработке функции 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; 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;