68 lines
1.2 KiB
Plaintext
68 lines
1.2 KiB
Plaintext
INT FUNC FindRange(INT ARRAY a INT len,start)
|
|
INT count
|
|
|
|
count=1
|
|
WHILE start<len-1
|
|
DO
|
|
IF a(start)+1#a(start+1) THEN
|
|
EXIT
|
|
FI
|
|
start==+1
|
|
count==+1
|
|
OD
|
|
RETURN (count)
|
|
|
|
PROC Append(CHAR ARRAY text,suffix)
|
|
BYTE POINTER srcPtr,dstPtr
|
|
BYTE len
|
|
|
|
len=suffix(0)
|
|
IF text(0)+len>255 THEN
|
|
len=255-text(0)
|
|
FI
|
|
IF len THEN
|
|
srcPtr=suffix+1
|
|
dstPtr=text+text(0)+1
|
|
MoveBlock(dstPtr,srcPtr,len)
|
|
text(0)==+suffix(0)
|
|
FI
|
|
RETURN
|
|
|
|
PROC RangeToStr(INT ARRAY a INT len CHAR ARRAY res)
|
|
INT i,count
|
|
CHAR ARRAY tmp(10)
|
|
|
|
i=0
|
|
res(0)=0
|
|
WHILE i<len
|
|
DO
|
|
count=FindRange(a,len,i)
|
|
StrI(a(i),tmp) Append(res,tmp)
|
|
IF count=2 THEN
|
|
Append(res,",")
|
|
StrI(a(i+1),tmp) Append(res,tmp)
|
|
ELSEIF count>2 THEN
|
|
Append(res,"-")
|
|
StrI(a(i+count-1),tmp) Append(res,tmp)
|
|
FI
|
|
i==+count
|
|
IF i<len THEN
|
|
Append(res,",")
|
|
FI
|
|
OD
|
|
RETURN
|
|
|
|
PROC Main()
|
|
INT ARRAY a=[0 1 2 4 6 7 8 11 12 14
|
|
15 16 17 18 19 20 21 22 23 24 25 27
|
|
28 29 30 31 32 33 35 36 37 38 39]
|
|
INT ARRAY b=[65530 65533 65534 65535
|
|
0 1 3 4 5 7 8 9 10 11 14 15 17 18 19 20]
|
|
CHAR ARRAY res(256)
|
|
|
|
RangeToStr(a,33,res)
|
|
PrintE(res) PutE()
|
|
RangeToStr(b,20,res)
|
|
PrintE(res)
|
|
RETURN
|