Compatible with:
DOS Maximite CMM MM150 MM170 MM+ MMX Picromite ArmiteL4
Armite F4
ArmiteH7 Picomite CMM2
Syntax:
SORT array() [,indexarray()] [,flags] [,startposition] [,elementstosort]
Description:
This command takes an array of any type (integer, float or string) and sorts it
into ascending order in place.
It has an optional parameter ‘indexarray%()’. If used this must be an
integer array of the same size as the array to be sorted.
flag values are:
bit0: 0 (default if omitted) normal sort - 1 reverse sort
bit1: 0 (default) case dependent - 1 sort is case independent
startposition defines which element in the array to start the sort. Default is 0
(OPTION BASE 0) or 1 (OPTION BASE 1)
elementstosort defines how many elements in the array should be sorted. Default
is all elements after the startposition
After the sort ‘indexarray%()’ will contain the original index position of each
element in the array being sorted before it was sorted.
Any data in the array will be overwritten.
This allows connected arrays to be sorted.
The optional ‘startposition’ defines which element in the array to start
the sort. Default is 0 (OPTION BASE 0) or 1 (OPTION BASE 1)
The optional ‘elementstosort’ defines how many elements in the array should
be sorted. The default is all elements after the startposition.
Any of the optional parameters may be omitted so, for example, to sort just the
first 50 elements of an array you could use: SORT array(), , , ,50
OPTION EXPLICIT
OPTION DEFAULT NONE
DIM INTEGER maxFiles = 500 ' adjust to suit expected maximum
DIM fList$(maxFiles) LENGTH 80' file names for sorting
DIM fSize%(maxFiles) ' file sizes
DIM fDate$(maxFiles) LENGTH 20' file dates
DIM fSort$(maxFiles) LENGTH 80
DIM fsortSize%(maxFiles)
DIM fIndex%(maxFiles)
DIM INTEGER mf, z
DIM f$
' by ignoring array location zero, we can work safely with OPTION BASE 0
or 1
'
mf = 1
f$ = DIR$("*", ALL)
DO WHILE f$ <> ""
fSize%(mf) = MM.INFO$(FILESIZE f$)
IF fSize%(mf)=-2 THEN
fList$(mf) = "(DIR) "+f$
fDate$(mf) = " "+MM.INFO$(MODIFIED f$)' the
leading space keeps directories sorted first
ELSE
fList$(mf) = f$
fDate$(mf) = "."+MM.INFO$(MODIFIED f$)
ENDIF
mf = mf + 1
IF mf > maxFiles THEN EXIT DO
f$ = DIR$()
LOOP
mf = mf -1 ' we now know the number of entries
' print the unsorted list
PRINT
PRINT "Unsorted lsit:"
FOR z = 1 TO mf
PRINT fList$(z)
NEXT z
FOR z = 1 TO mf
fSort$(z)= fList$(z)
NEXT z
SORT fSort$(), fIndex%(),&b10,1, mf
' print the sorted list using the index array to refer to the original
data
PRINT
PRINT "Sorted by Name with directories first"
FOR z = 1 TO mf
PRINT STR$(fIndex%(z),4);" ";fList$(fIndex%(z))
NEXT z
' sort by date
FOR z = 1 TO mf
fSort$(z)= fDate$(z)
NEXT z
SORT fSort$(), fIndex%(),&b10,1, mf
' print the sorted list
PRINT
PRINT "Sorted by Date with directories first"
FOR z = 1 TO mf
PRINT STR$(fIndex%(z),4);" "; fDate$(fIndex%(z));"
 ";STR$(fSize%(fIndex%(z)),10,0);"  ";
fList$(fIndex%(z))
NEXT z
' sort by file size using numbers instead of strings
MATH add fSize%(), 0, fSortSize%()
SORT fSortSize%(), fIndex%(),&b10,1, mf
' print the sorted list
PRINT
PRINT "Sorted by Size with directories first because size = -2"
' this time we print index zero to show it is not hiding any data.
FOR z = 0 TO mf
PRINT STR$(fIndex%(z),4);" "; STR$(fSize%(fIndex%(z)),10,0);"
 ";fDate$(fIndex%(z));"  "; fList$(fIndex%(z))
NEXT z
Last edited: 25 February, 2021