| gSort1400 Front EndI wrote the multitasking front end of gSort1400 as a RISC OS 3 application (circa 1992) to make things more interesting.  All of the operating system calls are handled by hand.  This is my first (and probably last) RISC OS Application. | 
REM gSort front end v0.1 (c) Rob Geleit September 2007
DIM space 256,menu_space 512
DIM LIMITmenu_space 128,LIMITspace 6,LIMITvalid 12
DIM icon0 6
DIM co_name 256
DIM header_text 256
DIM info_window_space 2048,info_indirected_space 2048
DIM main_window_space 4096,main_indirected_space 2048
DIM message_list 128
DIM icon_space 2048, icon2_space 2048
DIM string 256
DIM leaf_space 256
DIM weight 24
REM$weight="122"
DIM icon1space 20, icon1valid 20
DIM formenu_space 256,classmenu_space 256
DIM icon_class 4
DIM icon_format 16
DIM ref_text 256
DIM errorstring_exp 256
DIM space% 256, error_block 256
task=&4B534154
vers=310
!message_list=3
message_list!4=0
currentmenu=0
use_ramdisk=TRUE
folder$=""
leaf$=""
PROCinit
PROCload_windows
PROCmenu1
PROCmenu2
PROCmenu3
PROCmenu4
PROCloadsettings
quit=FALSE
REPEAT
SYS"Wimp_Poll",1,space TO event_code,event_block:REM &1831
CASE event_code OF
    WHEN 2:SYS"Wimp_OpenWindow",,event_block
    WHEN 3:SYS"Wimp_CloseWindow",,event_block
    WHEN 6:PROCbutton(!event_block,event_block!4,event_block!8,event_block!12,event_block!16)
    WHEN 9:PROCmenu_click(event_block)
    WHEN 17:PROCuser_message(event_block!16)
    WHEN 18:PROCuser_message(event_block!16)
ENDCASE
UNTIL quit=TRUE
SYS"Wimp_CloseDown",handle,task
END
DEF PROCinit
SYS"Wimp_Initialise",vers,task,"gSort1400",message_list TO,handle
space!0=-1
space!4=0
space!8=0
space!12=68
space!16=68
space!20=&301A
$(space+24)="!gSort1400"
SYS "Wimp_CreateIcon",,space TO icon
$LIMITspace="0"
$LIMITvalid="A0-9"
ENDPROC
DEF PROCmenu1
LOCAL T%
FOR T%=0TO2 STEP2
P%=menu_space
[OPTT%
ALIGN
.menu1  EQUS    "gSort1400"+CHR$0
        EQUW    0
ALIGN
        EQUB    7
        EQUB    2
        EQUB    7
        EQUB    0
        EQUD    200
        EQUD    40
        EQUD    0
        EQUD    %00000000
        EQUD    info_window
        EQUD    &07000039
        EQUS    "Info       "+CHR$0
        EQUD    %10000000
        EQUD    -1
        EQUD    &07000039
        EQUS    "Quit       "+CHR$0
]
NEXT
ENDPROC
DEF PROCmenu2
LOCAL T%
FOR T%=0TO2 STEP2
P%=LIMITmenu_space
[OPTT%
ALIGN
.menu2  EQUS    "Limit"+CHR$0:EQUB0:EQUB0
        EQUD    0
ALIGN
        EQUB    7
        EQUB    2
        EQUB    7
        EQUB    0
        EQUD    100
        EQUD    40
        EQUD    0
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000019
        EQUS    "25"+CHR$0:EQUD0:EQUD0:ALIGN
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000019
        EQUS    "5"+CHR$0:EQUD0:EQUD0:ALIGN
        
        EQUD    %10000100
        EQUD    -1
        EQUD    &07000119
        EQUD    LIMITspace
        EQUD    LIMITvalid
        EQUD    6
]
NEXT
ENDPROC
DEF PROCmenu3
LOCAL T%
FOR T%=0TO2 STEP2
P%=classmenu_space
[OPTT%
ALIGN
.menu3  EQUS    "Class"+CHR$0:EQUB0:EQUB0
        EQUD    0
ALIGN
        EQUB    7
        EQUB    2
        EQUB    7
        EQUB    0
        EQUD    100
        EQUD    40
        EQUD    0
        EQUD    %00000000
        EQUD    -1
        EQUD    &07400019
        EQUS    "1"+CHR$0:EQUW0:EQUD0:EQUD0
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000019
        EQUS    "2"+CHR$0:EQUW0:EQUD0:EQUD0
        
        EQUD    %10000000
        EQUD    -1
        EQUD    &07000019
        EQUS    "3"+CHR$0:EQUW0:EQUD0:EQUD0
]
NEXT
ENDPROC
DEF PROCmenu4
LOCAL T%
FOR T%=0TO2 STEP2
P%=formenu_space
[OPTT%
ALIGN
.menu4  EQUS    "Format"+CHR$0:EQUB0:EQUD0
        EQUB    7
        EQUB    2
        EQUB    7
        EQUB    0
        EQUD    100
        EQUD    40
        EQUD    0
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000011
        EQUS    "Letter     "+CHR$0
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000011
        EQUS    "Large Letter"
        EQUD    %00000000
        EQUD    -1
        EQUD    &07000011
        EQUS    "A3 Packet  "+CHR$0
                
        EQUD    %10000000
        EQUD    -1
        EQUD    &07000011
        EQUS    "Packet     "+CHR$0
]
NEXT
ENDPROC
DEF PROCbutton(X%,Y%,press,windowid,iconid)
IF windowid=-2 THEN
    IF iconid=icon THEN
        IF press AND 2 THEN PROCmenu
        IF press AND 4 THEN PROCselect
    ENDIF
ENDIF
IF windowid=main_window THEN
    CASE iconid OF
        WHEN 2: PROCprocess
        WHEN 3: PROCLIMITmenu
        WHEN 11: use_ramdisk=NOT(use_ramdisk)
        WHEN 12: PROCsavesettings
        WHEN 16: !space=main_window:SYS"Wimp_CloseWindow",,space
        WHEN 23: PROCclassmenu
        WHEN 24: PROCformenu
    ENDCASE
ENDIF
ENDPROC
DEF PROCmenu
SYS"Wimp_CreateMenu",,menu1,X%-100,176
currentmenu=0
ENDPROC
DEF PROCLIMITmenu
currentmenu=1
SYS"Wimp_CreateMenu",,menu2,X%,Y%
ENDPROC
DEF PROCclassmenu
currentmenu=2
SYS"Wimp_CreateMenu",,menu3,X%,Y%
ENDPROC
DEF PROCformenu
currentmenu=3
SYS"Wimp_CreateMenu",,menu4,X%,Y%
ENDPROC
DEF PROCselect
!space=main_window
space!4=1024
space!8=1024
space!12=1024
space!16=1024
space!20=786
space!24=786
space!28=-1
SYS"Wimp_OpenWindow",,space
ENDPROC
DEF PROCuser_message(message)
CASE message OF
    WHEN 0:quit=TRUE
    WHEN 3:PROCdata_load
ENDCASE
ENDPROC
DEF PROCmenu_click(menu_struct)
LOCAL menu1
menu1=!menu_struct
IF currentmenu=0 THEN
    IF menu1<>-1 THEN
        CASE menu1 OF
            WHEN 0:REM info
            WHEN 1:quit=TRUE:REM quit
        ENDCASE
    ENDIF
ENDIF
IF currentmenu=1 THEN
    IF menu1<>-1 THEN
        CASE menu1 OF
            WHEN 0:$icon0="25"
            WHEN 1:$icon0="5"
            WHEN 2:$icon0=$LIMITspace
        ENDCASE
    ENDIF
    PROCredrawicon(0)
ENDIF
IF currentmenu=2 THEN
    IF menu1<>-1 THEN
        CASE menu1 OF
            WHEN 0:$icon_class="1"
            WHEN 1:$icon_class="2"
            WHEN 2:$icon_class="3"
        ENDCASE
    ENDIF
    PROCredrawicon(14)
ENDIF
IF currentmenu=3 THEN
    IF menu1<>-1 THEN
        CASE menu1 OF
            WHEN 0:$icon_format="Letter"
            WHEN 1:$icon_format="Large Letter"
            WHEN 2:$icon_format="A3 Packet"
            WHEN 3:$icon_format="Packet"
        ENDCASE
    ENDIF
    PROCredrawicon(15)
ENDIF
ENDPROC
DEF PROCload_windows
$space="ProgInfo"
SYS"Wimp_OpenTemplate",,"<gSort$Dir>.Templates"
SYS"Wimp_LoadTemplate",,info_window_space,info_indirected_space,info_indirected_space+2048,-1,space,0 TO ,,next,,,,nextpos
$space="BSAnchor"
SYS"Wimp_LoadTemplate",,main_window_space,main_indirected_space,main_indirected_space+2048,-1,space,0
SYS"Wimp_CloseTemplate"
main_window_space!236=leaf_space
$leaf_space="Drop Folder Here"
main_window_space!140=icon1space
main_window_space!144=icon1valid
$icon1valid="A0-9"
main_window_space!108=icon0
main_window_space!396=header_text
main_window_space!428=co_name
 main_window_space!524=ref_text
 $ref_text="Hello!"
 main_window_space!556=icon_class
 $icon_class="5"
 main_window_space!588=icon_format
 $icon_format="Poot"
main_window_space!684=weight
main_window_space!688=icon1valid
main_window_space!692=16
SYS"Wimp_CreateWindow",,info_window_space TO info_window
SYS"Wimp_CreateWindow",,main_window_space TO main_window
ENDPROC
DEF PROCprocess
LOCAL file%,processed%,a%,o%,s%,error$
processed%=TRUE
IF VAL($weight)*VAL($icon1space)>11000 PROCerrorbox(3,"Warning: Weight x Quantity is greter than 11Kg")
IF folder$="" THEN
    PROCerrorbox(1,"Drag a work folder containing an ""addresses"" file to the Drop Folder box.")
    processed%=FALSE
ELSE
    SYS"Hourglass_On"
    file%=OPENOUT(folder$+".gSortData")
    PRINT#file%,$icon1space,$icon0,$header_text,$co_name,$weight,$ref_text,$icon_class,$icon_format
    CLOSE#file%
    OSCLI("set gSortTarget$Path "+folder$+".")
    IF use_ramdisk=TRUE THEN OSCLI("set gSortTemp$Path RAM::RamDisc0.$.") ELSE OSCLI("set gSortTemp$Path <gSort$Dir>.Temp.")
    OSCLI("wimpslot -next 8320k")
    SYS"Hourglass_LEDs",1,0
    OSCLI("set gSort$Error Fatal")
REM*fx200,1
    SYS"Wimp_StartTask","<gSort$Dir>.sort -l"+$icon0+" -w"+$weight+" -m"+$icon1space+" ""-h"+$header_text+""" ""-n"+$co_name+""" ""-j"+$ref_text+""" ""-s"+$icon_class+""" ""-f"+$icon_format+""""
*fx200,0
    error$=FNvar_expand("gSort$Error")
    IF error$="Fatal" PROCerrorbox(3,"gSort1400 encountered an unexplained error. If you get a Checksum Error next time you run, simply run gSort1400 a second time (beta)."):processed%=FALSE:quit=TRUE
    IF error$<>"Fatal" AND error$<>"None" PROCerrorbox(4,"Error: "+error$+"."):processed%=FALSE        
ENDIF
IF processed%=TRUE THEN
    SYS"Hourglass_LEDs",0,0
    o%=FNcountlines("<gSortTarget$path>outfile")
    s%=FNcountlines("<gSortTarget$path>linelist")
    a%=FNcountlines("<gSortTarget$path>addresses")
    IF a%+s%-o%<>7 PROCerrorbox(2,"Checksum error!")
    SYS"Hourglass_Off"
ENDIF
ENDPROC
DEF FNcountlines(file$)
LOCAL file%,T%,c%
T%=0
file%=OPENIN(file$)
IF file%<>0 THEN
    REPEAT
    c%=BGET#file%
    IF c%=10 THEN T%=T%+1
    UNTIL EOF#file%
    CLOSE#file%
ENDIF
=T%
DEF PROCdata_load
LOCAL T%,D%,I%,file%
IF event_block!20=main_window AND event_block!24=4 AND event_block!40=&1000 THEN
    T%=event_block+43
    D%=T%+1
    REPEAT
        T%+=1
        IF?T%=ASC(".") D%=T%
    UNTIL?T%=0
    ?T%=13
    folder$=$(event_block+44)
    leaf$=$(D%+1)
    file%=OPENIN(folder$+".addresses")
    IF file%<>0 THEN
        $leaf_space=leaf$
        PROCredrawicon(4)
        CLOSE #file%
    ELSE
        PROCerrorbox(0,"No addresses file in work folder.")
    ENDIF
    file%=OPENIN(folder$+".gSortData")
    IF file%<>0 THEN
        INPUT#file%,$icon1space,$icon0,$header_text,$co_name,$weight,$ref_text,$icon_class,$icon_format
        CLOSE#file%
        PROCredrawicon(1)
        PROCredrawicon(0)
        PROCredrawicon(9)
        PROCredrawicon(10)
        PROCredrawicon(13)
        PROCredrawicon(14)
        PROCredrawicon(15)
        PROCredrawicon(18)
    ENDIF
ENDIF
ENDPROC
DEF PROCsavesettings
LOCAL defaults%
defaults%=OPENOUT("<gSort$Dir>.defaults")
PRINT#defaults%,$icon1space,$icon0,$header_text,$co_name,$weight,$ref_text,$icon_class,$icon_format
CLOSE#defaults%
ENDPROC
DEF PROCloadsettings
defaults%=OPENIN("<gSort$Dir>.defaults")
INPUT#defaults%,$icon1space,$icon0,$header_text,$co_name,$weight,$ref_text,$icon_class,$icon_format
CLOSE#defaults%
ENDPROC
DEF PROCredrawicon(icon%)
!space%=main_window
space%!4=icon%
space%!8=0
space%!12=0
SYS"Wimp_SetIconState",,space%
ENDPROC
DEF FNvar_expand(V$)
SYS"XOS_ReadVarVal",V$,errorstring_exp,-1 TO ,,R2
SYS"OS_ReadVarVal",V$,errorstring_exp,255
errorstring_exp?(-R2-1)=13
=$errorstring_exp
DEF PROCerrorbox(errno,text$)
!error_block=errno
$(error_block+4)=text$+CHR$0
SYS"Wimp_ReportError",error_block,&1,"gSort"+CHR$0
ENDPROC