HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/jed/lib/chglog.sl
% Maintain ChangeLog files

custom_variable ("ChangeLog_Filename",
#ifdef VMS
		 "$CHANGE_LOG$.TXT"
#else
		 "ChangeLog"
#endif
		 );

custom_variable ("ChangeLog_User",
		 sprintf ("%s  <%s>", get_realname (), get_emailaddress ()));
custom_variable ("ChangeLog_Indent_Amount", 8);

private define get_changelog_date ()
{
   variable tm, day, month, year;
   tm = localtime (_time ());

   sprintf ("%d-%0d-%0d", 1900 + tm.tm_year, 1+tm.tm_mon, tm.tm_mday);
}

private define format_changelog_heading ()
{
   variable date = get_changelog_date ();

   return sprintf ("%s  %s", date, ChangeLog_User);
}

private define locate_changelog_file ()
{
   variable file, dir;

   (,dir,,) = getbuf_info ();

   forever
     {
	file = dircat (dir, ChangeLog_Filename);
	if (1 == file_status (file))
	  return file;

	% This may need modified for non-Unix systems...
#ifdef UNIX
	dir = expand_filename (dircat (dir, "../"));
	if (dir == "/")
	  break;
#elifdef IBMPC_SYSTEM
	dir = expand_filename (dircat (dir, "..\\"));
	if ((dir == "/") or (dir == "\\"))
	  break;
	if (strlen (dir) == 3)
	  {
	     if (dir[1] == ':')
	       break;
	  }
#elifdef VMS
	% Does this work?
	dir = expand_filename (dircat (dir, "[-]"));
#endif
     }

   verror ("Unable to find a ChangeLog file");
}

private define get_changelog_file_item ()
{
   variable dir, file;

   (file, dir,,) = getbuf_info ();
   ifnot (strlen (file))
     return "";
   if (file == ChangeLog_Filename)
     return "";

   return dircat (dir, file);
}

private define get_changelog_function ()
{
   variable fun = mode_get_mode_info ("chglog_get_item");
   if (fun != NULL)
     fun = @fun ();
   if (fun == NULL)
     return "";
   return fun;
}

private define wrap_hook ()
{
   push_spot ();
   bol_trim (); whitespace (ChangeLog_Indent_Amount + 2);
   pop_spot ();
}

public define changelog_add_change ()
{
   variable heading = format_changelog_heading ();
   variable file = get_changelog_file_item ();
   variable function = get_changelog_function ();
   variable changelog = locate_changelog_file ();

   if (strlen (file))
     {
	% Make it with respect to the changelog directory
	variable i = 0;
	while (changelog[i] == file[i]) % can this fail in practice?
	  i++;
	file = file [[i:]];
     }

   () = read_file (changelog);
   set_buffer_no_backup ();
   pop2buf (whatbuf ());
   text_mode ();

   set_buffer_hook ("wrap_hook", &wrap_hook);

   bob ();
   ifnot (bol_fsearch (heading))
     {
	vinsert ("%s\n\n", heading);
	bob ();
     }
   eol ();
   variable m = create_user_mark ();

   skip_chars (" \t\n*");

   variable create_new_entry = 1;

   if (looking_at (file))
     {
	go_right (strlen (file));
	_get_point ();		       %  on stack
	skip_chars (" :");
	create_new_entry = (() == _get_point ());
     }

   if (create_new_entry)
     {
	goto_user_mark (m);
	insert ("\n\n");
	whitespace (ChangeLog_Indent_Amount);
	vinsert ("* %s ", file);
     }
   else
     {
	ifnot (re_fsearch ("^[ \t]*$"))
	  {
	     eob ();
	  }
	trim ();
	newline ();
	go_up_1 ();
	whitespace (8);
     }

   if (strlen (function))
     vinsert ("(%s): ", function);
   else if (create_new_entry and strlen (file))
     {
	trim ();
	insert (": ");
     }
}