mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00

When passing an empty string as a directory, the function would produce filenames starting with a slash even when the given file_name is not an absolute path. Defaulting to the root directory is likely never intended and might conveivably be dangerous. The middle "/" is now skipped also if dir is an empty string.
45 lines
1.4 KiB
Text
45 lines
1.4 KiB
Text
##! Functions to parse and manipulate UNIX style paths and directories.
|
|
|
|
const absolute_path_pat = /(\/|[A-Za-z]:[\\\/]).*/;
|
|
|
|
## Given an arbitrary string, extracts a single, absolute path (directory
|
|
## with filename).
|
|
##
|
|
## .. todo:: Make this work on Window's style directories.
|
|
##
|
|
## input: a string that may contain an absolute path.
|
|
##
|
|
## Returns: the first absolute path found in input string, else an empty string.
|
|
function extract_path(input: string): string
|
|
{
|
|
const dir_pattern = /(\/|[A-Za-z]:[\\\/])([^\"\ ]|(\\\ ))*/;
|
|
local parts = split_string_all(input, dir_pattern);
|
|
|
|
if ( |parts| < 3 )
|
|
return "";
|
|
|
|
return parts[1];
|
|
}
|
|
|
|
## Constructs a path to a file given a directory and a file name.
|
|
##
|
|
## dir: the directory in which the file lives.
|
|
##
|
|
## file_name: the name of the file.
|
|
##
|
|
## Returns: the concatenation of the directory path and file name, or just
|
|
## the file name if it's already an absolute path or dir is empty.
|
|
function build_path(dir: string, file_name: string): string
|
|
{
|
|
# Avoid introducing "//" into the result:
|
|
local sep = ends_with(dir, "/") ? "" : "/";
|
|
return (file_name == absolute_path_pat || dir == "") ?
|
|
file_name : cat(dir, sep, file_name);
|
|
}
|
|
|
|
## Returns a compressed path to a file given a directory and file name.
|
|
## See :zeek:id:`build_path` and :zeek:id:`compress_path`.
|
|
function build_path_compressed(dir: string, file_name: string): string
|
|
{
|
|
return compress_path(build_path(dir, file_name));
|
|
}
|