/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
/*                                                                     */
/*        P�l Hedne 1991                                               */
/*                                                                     */
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
sort (...)
{
	string pattern,text,word;
   int line,col,line1,col1,linex,colx,mtype,wlength,ind;
   int buf_key,scratch_key;
   int i,j,wsum,linesum,linesummin,iline,nline;

   pause_on_error(0);
   scratch_key=create_buffer("Kladd ",NULL,1);
/*   error("scratch_key = %d",scratch_key);*/
   buf_key=inq_buffer();

	inq_position (line, col);
   mtype = inq_marked (line1, col1, linex, colx);
   if (mtype > 0)
     {
       pattern="";
       text="Sort on word no.: ";
       if (get_parm (0, pattern, text, NULL,pattern))
         {
          ind=atoi(pattern);
          sprintf(text,"Sorting on column %d...",ind);  
          message(text);
/*          error("Sorting marked block on word %d",ind);*/
          for (j=line1; j<=linex; ++j)
            {
              move_abs(j,col1);
              text=read();
              word=get_word(text,ind);
              wlength=strlen(word);
/*              error(" Word returned = %s",word);*/
              wsum=0;
              if (wlength>4) wlength=4;
              for (i=1; i<=wlength; ++i)
                {
/*                error("sub=%s,atoi=%d",substr(word,i,1),atoi(substr(word,i,1),0));*/
                 wsum=wsum+exp127(atoi(substr(word,i,1),0),5-i);
/*              error(" Wsum(%d) = %d",i,wsum);*/
                }
/*              error(" Wsum = %d",wsum);*/
              set_buffer(scratch_key);
              end_of_buffer();
              sprintf(text,"%d\n",wsum);
              insert(text);
              set_buffer(buf_key);
            }
          nline=linex-line1+1;
          set_buffer(scratch_key);
          for (i=1; i<=nline; ++i)
            {
             linesummin=2147483647;
             iline=i;
             move_abs(i,1);
             sprintf(text,"%d/%d  done",i,nline);  
             message(text);
             for (j=i; j<=nline; ++j)
               {
                text=read();
                linesum=atoi(text);
/*                error("Line=%d sum=%d min=%d",j,linesum,linesummin);*/
                if (linesum<linesummin)
                  {linesummin=linesum;
                   iline=j;
                  }
                move_rel(1,0);
               }
             if (iline>i)
               {
                swap_lines(i,iline);
                set_buffer(buf_key);
                swap_lines(line1+i-1,line1+iline-1);
                set_buffer(scratch_key);
               }
            }
          set_buffer(buf_key);
         }
     }
   pause_on_error(0);
   move_abs(line,col);
   message(" ");  
}
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
get_word(string text, int wno)
{
   string mword;
   int ind,wlength;
   int wcount=0;

   text=ltrim(text);
/*   error("Index = %d  Text = %s",ind,text);*/
   do
   {
    ind=search_string("[\t\n, ]",text,0,1,0);
/*    error("Ind1 = %d text = %s",ind,text);*/
    if (ind>0)
      {
       ++wcount;
       if (wcount==wno) 
         {
          mword=substr(text,1,ind-1);
          return(mword);
         }
       text=substr(text,ind);
/*       error("Word no. %d = %s",wcount,mword);*/

       ind=search_string("[~\t\n, ]",text,0,1,0);
/*       error("Ind2 = %d text = %s",ind,text);*/
       text=substr(text,ind);
      }
    }
   while((wcount<wno)&&(ind>0));
   return(" ");
}	
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
exp127(int num, int exp)
{
  int i;
  int val=1;

  for (i=1; i<exp; ++i)
   {
    val=val*127;
/*    error(" val(%d) = %d",i,val);*/
   }
    num=num*val;
  return num;
}
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
swap_lines(int line1, int line2)
{
   string text1,text2;
   int line,col;

	inq_position (line, col);

   move_abs(line1,1);
   text1=read();
   text1=trim(text1);
   delete_to_eol();

   move_abs(line2,1);
   text2=read();
   text2=trim(text2);
   delete_to_eol();

   move_abs(line2,1);
   insert(text1);
   move_abs(line1,1);
   insert(text2);

   move_abs(line,col);
}