/
mudtem/
mudtem/area/scripts/
mudtem/bin/
mudtem/log/
mudtem/player/
mudtem/slang/autoconf/
mudtem/slang/doc/
mudtem/slang/doc/OLD/help/
mudtem/slang/doc/internal/
mudtem/slang/doc/text/
mudtem/slang/doc/tm/tools/
mudtem/slang/examples/
mudtem/slang/modules/
mudtem/slang/slsh/
mudtem/slang/slsh/lib/
mudtem/slang/slsh/scripts/
mudtem/slang/src/mkfiles/
mudtem/slang/src/util/
mudtem/src/CVS/
mudtem/src/include/
mudtem/src/include/CVS/
mudtem/src/var/CVS/
#! /usr/bin/env slsh

% This program presents the solution to a problem posed by 
% Tom Christiansen <tchrist@mox.perl.com>.  The problem reads:
%
%    Sort an input file that consists of lines like this
%
%        var1=23 other=14 ditto=23 fred=2
%
%    such that each output line is sorted WRT to the number.  Order
%    of output lines does not change.  Resolve collisions using the
%    variable name.   e.g.
%
%        fred=2 other=14 ditto=23 var1=23 
%
%    Lines may be up to several kilobytes in length and contain
%    zillions of variables.
%---------------------------------------------------------------------------
%
% The solution presented below works by breaking up the line into an
% array of alternating keywords and values with the keywords as the even
% elements and the values as the odd.

static variable Keys, Values;
static define sort_fun (i, j)
{
   variable s, a, b;

   s = Values[i] - Values[j];
   if (s) return s;
   return strcmp (Keys[i], Keys[j]);
}


define main ()
{
   variable line, len, i;
   while (-1 != fgets (&line, stdin))
     {
	line = strtok (line, " \t\n=");
	len = length(line)/2;
	if (len == 0)
	  continue;

	% Even elements are keys, odd are values
	Keys = line[[0::2]];
	Values = array_map(Int_Type, &integer, line[[1::2]]);
	
	foreach (array_sort ([0:len-1], &sort_fun))
	  {
	     i = ();
	     () = fprintf (stdout, "%s=%d ", Keys[i], Values[i]);
	  }
	() = fputs ("\n", stdout);
     }
}

main ();