/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
/* */
/* 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);
}