//Быстрая сортировка. Leency 2008. GPL license.

void Sort_by_Size(int a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
{                                        
	int i= a;
	IF (a >= b) return;
	FOR (j = a; j <= b; j++)
		IF (ESDWORD[file_mas[j]*304 + buf+64] <= ESDWORD[file_mas[b]*304 + buf+64])
		{ file_mas[i] >< file_mas[j];   i++;}
	Sort_by_Size (a, i-2);
	Sort_by_Size (i, b);
}


void Sort_by_Name(int a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
{                                        
	int i = a;
	IF (a >= b) return;
	FOR (j = a; j <= b; j++)
		IF (strcmp(file_mas[j]*304 + buf+72, file_mas[b]*304 + buf+72)<=0) { file_mas[i] >< file_mas[j];   i++;}
	Sort_by_Name(a, i-2);
	Sort_by_Name(i, b);
}

 
void Sort_by_Type(int a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
{                                        
	int i=a; dword offset=buf+72;  byte filename1[256], filename2[256]; int n;
	IF (a >= b) return;
	for (j = a; j <= b; j++)
	{
	    //
		copystr(file_mas[j]*304 + offset, #filename1);
		copystr(file_mas[b]*304 + offset, #filename2);
		n=strlen(#filename1)-1;
		WHILE (filename1[n]<>'.') && (n>0) n--;
		IF (n) copystr(#filename1+n+1, #filename1);
		n=strlen(#filename2)-1;
		WHILE (filename2[n]<>'.') && (n>0) n--;
		IF (n) copystr(#filename2+n+1, #filename2);
		//
		n=strcmp(#filename1, #filename2);
		IF (n<0) { file_mas[i] >< file_mas[j];   i++;} 
		IF (n==0) && (strcmp(file_mas[j]*304 + offset, file_mas[b]*304 + offset)<=0) { file_mas[i] >< file_mas[j];   i++;}
	}
	Sort_by_Type(a, i-2);
	Sort_by_Type(i, b);
}



