File: //usr/share/jed/lib/misc.sl
% misc functions that should be in site.sl but they are not because we want
% jed to start up fast and they are not always needed.
%!%+
%\function{make_tmp_buffer_name}
%\synopsis{make_tmp_buffer_name}
%\usage{String make_tmp_buffer_name (String base);}
%\description
% Generates a unique buffer name using the string 'base' for the beginning
% of the name. The buffer name is returned. The buffer is not created.
%!%-
define make_tmp_buffer_name (tmp)
{
variable n = 0, buf;
variable t = time ();
tmp = strcat (tmp, time);
do
{
buf = sprintf("%s%d", tmp, n);
n++;
}
while (bufferp(buf));
buf;
}
define misc_do_write_to_file (str, file, write_function)
{
variable ret = -1;
variable buf = make_tmp_buffer_name (Null_String);
variable cbuf = whatbuf ();
setbuf (buf);
insert (str);
set_buffer_modified_flag (0);
push_mark ();
bob ();
#iffalse
ERROR_BLOCK
{
_clear_error ();
}
#endif
ret = @write_function (file);
setbuf (cbuf);
delbuf (buf);
ret;
}
%!%+
%\function{append_string_to_file}
%\synopsis{append_string_to_file}
%\usage{Integer append_string_to_file (String str, String file);}
%\description
% The string 'str' is appended to file 'file'. This function returns -1
% upon failure or the number of lines written upon success.
% See append_region_to_file for more information.
%!%-
define append_string_to_file (str, file)
{
misc_do_write_to_file (str, file, &append_region_to_file);
}
%!%+
%\function{write_string_to_file}
%\synopsis{write_string_to_file}
%\usage{Integer write_string_to_file (String str, String file);}
%\description
% The string 'str' is written to file 'file'. This function returns -1
% upon failure or the number of lines written upon success.
% This function does not modify a buffer visiting the file.
%!%-
define write_string_to_file (str, file)
{
misc_do_write_to_file (str, file, &write_region_to_file);
}
#ifnexists glob_to_regexp
define glob_to_regexp (glob)
{
variable regexp;
#ifdef UNIX
regexp = "^";
#else
regexp = "^\\C"; % case-insensitive
#endif
foreach (glob)
{
variable ch = ();
switch (ch)
{
case '.':
ch = "\\.";
}
{
case '?':
ch = ".";
}
{
case '*':
ch = ".*";
}
{
% default
ch = char (ch);
if (is_substr ("[]\\^$+", ch))
ch = strcat ("\\", ch);
}
regexp = strcat (regexp, ch);
}
strcat (regexp, "$");
}
#endif
define list_directory ()
{
variable pat = read_file_from_mini ("list directory");
ifnot (strlen (pat))
return;
variable dir = path_dirname (pat);
pat = path_basename (pat);
ifnot (strlen(pat))
pat = "*";
if (file_status (dir) != 2)
verror ("%s is not a directory", dir);
variable files = listdir (dir);
if (files == NULL) files = String_Type[0];
pat = glob_to_regexp (pat);
files = files[where(array_map (Int_Type, &string_match, files, pat, 1))];
files = files[array_sort(files)];
variable cbuf = whatbuf ();
pop2buf ("*directory*");
variable file, buf, flags;
(file,,buf,flags) = getbuf_info ();
setbuf_info (file, dir, buf, flags);
erase_buffer ();
if (length (files))
{
array_map (Void_Type, &vinsert, "%s\n", files);
buffer_format_in_columns ();
}
bob ();
vinsert ("Directory %s\n", dir);
bob ();
set_buffer_modified_flag (0);
pop2buf (cbuf);
}
define directory (dirspec)
{
variable buf_dir, dir;
variable pattern;
variable files, i;
ifnot (strlen (dirspec))
dirspec = "*";
(,buf_dir,,) = getbuf_info ();
pattern = extract_filename (dirspec);
dir = substr (dirspec, 1, strlen (dirspec) - strlen (pattern));
dir = dircat (buf_dir, dir);
ifnot (strlen (dir))
dir = ".";
pattern = glob_to_regexp (pattern);
files = listdir (dir);
if ((files == NULL) or (length (files) == 0))
return 0;
i = array_map (Int_Type, &string_match, files, pattern, 1);
files = files[where (i)];
% Push them onto the stack to mimick
foreach (files)
;
length (files);
}