Home » Archimedes archive » Zipped Apps » Impression Publisher » !Publisher/!MailMerge/!RunImage

!Publisher/!MailMerge/!RunImage

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Zipped Apps » Impression Publisher
Filename: !Publisher/!MailMerge/!RunImage
Read OK:
File size: 753E bytes
Load address: 0000
Exec address: 0000
File contents
    1REM > !RunImage
    2
    3ON ERROR ERROR EXT ERR,REPORT$+" at line "+STR$(ERL)
    4
    5PROCconsts
    6hourglass_count%=0
    7PROChourglass_on
    8
    9REM Find out what the currently selected country is.
   10DIM countrybuff 64
   11
   12PROCreadopsys
   13SYS "OS_Byte", 70, 127 TO ,country%
   14SYS "OS_ServiceCall", , &43, 2, country% , countrybuff, 256 TO ,,,,, length%
   15countrybuff?length%=13
   16
   17PROCmsg_initialise(appdir$+"."+$countrybuff)
   18PROCtask_initialise(FNmsg_0("ID"))
   19PROCicon_initialise
   20PROCwin_initialise
   21PROCerror_initialise
   22PROCinitialise
   23
   24END=END+8096:REM give us 8K of floating memory
   25heap_end%=HIMEM:REM where the memory now ends
   26HIMEM=END+8096
   27heap_start%=HIMEM:REM where the heap will start
   28heap_size%=heap_end%-heap_start%
   29SYS"OS_ReadMemMapInfo" TO heap_psize%
   30
   31IFheap_size%<>0 THEN
   32 SYS"OS_Heap",0,heap_start%,,heap_size%
   33ELSE
   34 PROCheap_increase
   35ENDIF
   36
   37PROChourglass_off
   38ON ERROR PROCerror
   39
   40REPEAT
   41 SYS "Wimp_Poll",task_mask%,task_buff% TO task_action%
   42 SYS "Impulse_Decode",task_action%,task_buff%,,,,method_table%,task_handle% TO task_action%,,,,,token%,params%,object%
   43
   44 CASE task_action% OF
   45   WHEN 0 : PROCnull
   46   WHEN 2 : SYS"Wimp_OpenWindow",,task_buff%
   47   WHEN 3 : IF printing% THEN
   48              pending_close%=TRUE
   49            ELSE
   50              PROChost_shutdown
   51            ENDIF
   52   WHEN 6 : PROCmouse_click
   53   WHEN 9 : PROCmenu_click
   54   WHEN 17,18 : PROCreceive
   55   WHEN Impulse_Command%, Impulse_Request%:
   56     PROCcommand(token%,params%,object%)
   57   WHEN Impulse_Reply%:
   58     PROCreply(token%)
   59   WHEN Impulse_SendData%:
   60     PROCsend_data(token%,params%,object%)
   61 ENDCASE
   62
   63UNTIL FALSE
   64END
   65
   66
   67
   68DEF PROCinitialise
   69SYS"Impulse_Initialise",0,task_handle%,FNmsg_0("ID"),-1
   70PROCwin_load_create(appdir$+".Templates","main",1,main%)
   71PROCicon_hide(main%,Icon_ToProc%)
   72PROCicon_hide(main%,Icon_RecsProc%)
   73PROCicon_hide(main%,Icon_PrintAll%)
   74PROCicon_hide(main%,Icon_ToGo%)
   75PROCicon_hide(main%,Icon_Done%)
   76PROCicon_hide(main%,Icon_Print%)
   77PROCicon_hide(main%,Icon_Next%)
   78PROCicon_hide(main%,Icon_Edit%)
   79PROCicon_hide(main%,Icon_StartMerge%)
   80PROCicon_write(main%,Icon_CSV%,"")
   81PROCicon_write(main%,Icon_document%,"")
   82PROCicon_shade(main%,Icon_DispHead%)
   83!win_buff%=main%:SYS"Wimp_GetWindowState",,win_buff%
   84win_buff%!8=win_buff%!16 - Window_Small%
   85SYS"Wimp_OpenWindow",,win_buff%
   86
   87DIM method_table% 64
   88P%=method_table%
   89[ OPT 0
   90   EQUD 0                       ; method structure format
   91   EQUD 0                       ; flags
   92   EQUD T_GetField%       ; token
   93   EQUS "GetField"+CHR$0        ; method
   94   EQUS CHR$0                   ; syntax
   95   ALIGN
   96
   97
   98   EQUD 0
   99   EQUD T_CloseDown%      ; token
  100   EQUS "CloseDown"+CHR$0       ; method
  101   EQUS CHR$0                   ; syntax
  102   ALIGN
  103]
  104REM
  105menu%=0
  106merge%=FALSE
  107printing%=FALSE
  108dieplease%=FALSE      : REM TRUE if Impression sends us a window closed message
  109preserved_start_of_data_ptr%=0
  110pending_close%=FALSE
  111transmit%=FALSE
  112transmit_count%=0
  113transmit_block%=0
  114
  115gotprintreply%=FALSE
  116PROCmerge_off
  117ENDPROC
  118
  119
  120
  121
  122DEF PROCnull
  123LOCAL result%
  124REM We need to wimp_poll between merge_next_record and PROCsend.
  125IF ((printing%=TRUE) AND (gotprintreply%=TRUE)) THEN
  126        gotprintreply%=FALSE
  127        PROCsend("Print",T_Print%)
  128ENDIF
  129ENDPROC
  130
  131
  132
  133
  134DEF PROChost_shutdown
  135IF NOT dieplease% THEN PROCsend("MailDied",-1)
  136
  137PROCclose_csv_file
  138WHILE hourglass_count%
  139 PROChourglass_off
  140ENDWHILE
  141IFmerge% PROCmerge_off
  142
  143SYS"Impulse_CloseDown",task_handle%
  144PROCtask_shutdown
  145ENDPROC
  146
  147DEF PROCreceive
  148CASE task_buff%!16 OF
  149WHEN Message_Quit%:
  150  PROChost_shutdown
  151WHEN Message_DataSave%:
  152  PROCdatasave
  153WHEN Message_DataLoad%:
  154  PROCdataload
  155WHEN Message_PreQuit%:
  156  PROCprequit
  157WHEN Message_TaskCloseDown%:
  158  IFdoc_file$<>"" AND task_buff%!4=doc_task% PROChost_shutdown
  159WHEN Message_WindowClosed%:
  160REM  IFdoc_file$<>"" THEN PROChost_shutdown
  161WHEN Message_MM_Document%:
  162  IF doc_file$="" THEN PROCdoc_received
  163ENDCASE
  164ENDPROC
  165
  166
  167DEF PROCmouse_click
  168LOCAL menuptr%,maxx%,i%,p%,ix%,iy%
  169IF task_buff%!8<>4 ENDPROC
  170CASE task_buff%!16 OF
  171  WHEN Icon_Headings%:
  172
  173    IF csv_file$<>"" THEN
  174      IF FNicon_set(main%,Icon_Headings%) THEN
  175        PROCcreate_csv_headings
  176        rec_togo% += 1
  177      ELSE
  178        PROCget_csv_headings
  179        rec_togo% -= 1
  180      ENDIF
  181    ENDIF
  182
  183  WHEN Icon_DispHead%:
  184    IF menu% PROCheap_free("MENU",menu%)
  185    menu%=FNheap_claim("MENU",28+csv_count%*24)
  186    $menu%=FNmsg_0("MT")
  187    menu%?12=7
  188    menu%?13=2
  189    menu%?14=7
  190    menu%?15=0
  191    menu%!20=44
  192    menu%!24=0
  193    menuptr%=menu%+28
  194    maxx%=LEN(FNmsg_0("MT"))-3
  195    p%=csv_headings%
  196    FORi%=1 TO csv_count%
  197      IFi%=csv_count% !menuptr%=&80 ELSE !menuptr%=0
  198      menuptr%!4=-1
  199      menuptr%!8=&07000121
  200      menuptr%!12=p%+4
  201      menuptr%!16=-1
  202      menuptr%!20=LEN($(p%+4))+1
  203      menuptr%+=24
  204      IFLEN($(p%+4))>maxx% maxx%=LEN($(p%+4))
  205      p%=!p%
  206    NEXT
  207    menu%!16=(maxx%*8+6)*2
  208    !task_buff%=main%:task_buff%!4=Icon_DispHead%
  209    SYS"Wimp_GetIconState",,task_buff%:ix%=task_buff%!16:iy%=task_buff%!20
  210    SYS"Wimp_GetWindowState",,task_buff%
  211    display_menu_x% = task_buff%!20+task_buff%!4+ix%+2
  212    display_menu_y% = task_buff%!24+task_buff%!16+iy%-2
  213    SYS"Wimp_CreateMenu",,menu%,display_menu_x%,display_menu_y%
  214  WHEN Icon_StartMerge%:
  215    PROCtry_merge_on
  216  WHEN Icon_Next%:
  217    PROCmerge_next_record
  218  WHEN Icon_Print%:
  219    PROCsend("Print",T_Print%)
  220    printing%=TRUE
  221    PROCdisable_merging_buttons
  222  WHEN Icon_Edit%:
  223    PROCsend("ClearMerge",-1)
  224    PROChost_shutdown
  225ENDCASE
  226ENDPROC
  227
  228
  229DEFPROCmenu_click
  230REM send the appropriate DDF for the selected field to the WP
  231LOCAL c%,l%,f%
  232f%=!task_buff%
  233SYS"Wimp_GetCaretPosition",,task_buff%+20
  234IFtask_buff%!20<>doc_window% ERROR task_ok%, FNmsg_0("OK5")
  235l%=csv_headings%
  236WHILE f%
  237  l%=!l%
  238  f%-=1
  239ENDWHILE
  240c%=OPENOUT"<Wimp$Scrap>"
  241
  242BPUT#c%,"{ merge "+CHR$Char_Quote%+":"+FNmsg_0("ID")+" GetField "+$(l%+4)+CHR$Char_Quote%+"}";
  243
  244l%=EXT#c%
  245CLOSE#c%
  246SYS"OS_File",18,"<Wimp$Scrap>",DDF_Type%
  247!task_buff%=60
  248task_buff%!12=0
  249task_buff%!16=3
  250task_buff%!24=&4B535554:REM "TUSK"
  251task_buff%!36=l%
  252task_buff%!40=DDF_Type%
  253$(task_buff%+44)="<Wimp$Scrap>"+CHR$0
  254SYS"Wimp_SendMessage",17,task_buff%,doc_task%
  255SYS"Wimp_GetPointerInfo",,task_buff%
  256IF(task_buff%!8 AND 1) SYS"Wimp_CreateMenu",,menu%,display_menu_x%,display_menu_y%
  257ENDPROC
  258
  259
  260DEF PROCdataload
  261REM receipt of a CSV file
  262IFtask_buff%!40<>CSV_Type% OR doc_file$="" ENDPROC
  263IFmerge% ERROR task_ok%,FNmsg_0("OK1")
  264csv_file$=FNtask_rtoz(task_buff%+44)
  265task_buff%!12=task_buff%!8
  266task_buff%!16=4
  267SYS"Wimp_SendMessage",17,task_buff%,task_buff%!4
  268PROCicon_hide(main%,Icon_DropHere%)
  269PROCicon_unhide(main%,Icon_StartMerge%)
  270PROCicon_unshade(main%,Icon_DispHead%)
  271csv_count%=FNdetermine_number_of_fields
  272IF NOT FNicon_set(main%,Icon_Headings%) PROCget_csv_headings ELSE PROCcreate_csv_headings
  273rec_togo%=FNdetermine_number_of_records
  274PROCicon_write(main%,Icon_CSV%,FNleaf(csv_file$))
  275ENDPROC
  276
  277
  278DEF PROCcopy_field(to%, RETURN last_field%, RETURN field_length%, fudge_spaces%)
  279REM copies the next field from the open CSV file into memory, specified by to%
  280REM which CAN be NULL.
  281REM returns last_field=TRUE if the last field in the record
  282REM returns field_length=the real length of the field
  283LOCAL got_quote%, got_slash%, b%, finished%
  284got_quote%=FALSE
  285got_slash%=FALSE
  286last_field%=FALSE
  287field_length%=0
  288finished%=FALSE
  289REPEAT
  290 b%=BGET#csv_file_handle%
  291
  292 CASE TRUE OF
  293
  294 WHEN b%=Char_Quote%:
  295  got_quote%=NOT got_quote%
  296
  297 WHEN b%=Char_Slash%:
  298  IF got_slash% THEN
  299   PROCcopy_field_stuff_char(to%,ASC"\",field_length%)
  300   got_slash%=FALSE
  301  ELSE
  302   got_slash%=TRUE
  303  ENDIF
  304
  305 WHEN b%=Char_Space%:
  306  IF fudge_spaces% THEN
  307   PROCcopy_field_stuff_char(to%,Char_HardSpace%,field_length%)
  308  ELSE
  309   PROCcopy_field_stuff_char(to%,Char_Space%,field_length%)
  310  ENDIF
  311
  312 WHEN b%=Char_Comma%:
  313  IF got_quote% PROCcopy_field_stuff_char(to%,b%,field_length%) ELSE finished%=TRUE
  314
  315 WHEN b%=Char_LF% OR b%=Char_CR% OR EOF#csv_file_handle%:
  316  last_field%=TRUE
  317  finished%=TRUE
  318
  319 OTHERWISE:
  320  IF got_slash% THEN
  321   CASE b% OF
  322        WHEN ASC"n": PROCcopy_field_stuff_char(to%,10,field_length%)
  323   ENDCASE
  324   got_slash%=FALSE
  325  ELSE
  326   PROCcopy_field_stuff_char(to%,b%,field_length%)
  327  ENDIF
  328
  329 ENDCASE
  330UNTIL finished%
  331IF to% ?to%=13
  332ENDPROC
  333
  334
  335DEFPROCcopy_field_stuff_char(RETURN to%, char%, RETURN length%)
  336length%+=1
  337IFto% ?to%=char%:to%+=1
  338ENDPROC
  339
  340
  341DEF FNdetermine_number_of_fields
  342LOCAL s$,count%,last_field%,dummy%
  343PROCopen_csv_file
  344IF csv_file_handle%=0 s$=csv_file$:csv_file$="":ERROR task_ok%,FNmsg_1("OK2",s$)
  345REPEAT
  346 PROCcopy_field(0,last_field%,dummy%,FALSE)
  347 count%+=1
  348UNTIL last_field%
  349PROCclose_csv_file
  350=count%
  351
  352
  353
  354DEF PROCget_csv_headings
  355LOCAL s$,i%,last_node%,node%,dummy%
  356WHILE csv_headings%
  357 next%=!csv_headings%
  358 PROCheap_free("CSVH",csv_headings%)
  359 csv_headings%=next%
  360ENDWHILE
  361PROCopen_csv_file
  362last_node%=0
  363FOR i%=1 TO csv_count%
  364 PROCcopy_field(task_buff%,dummy%,dummy%,TRUE)
  365 s$=$task_buff%
  366 IF s$="" s$=FNmsg_1("FI",STR$(i%)):REM if a null heading, create an arbitrary one
  367 node%=FNheap_claim("CSVH",LEN(s$)+5)
  368 !node%=0
  369 $(node%+4)=s$
  370 IF last_node% !last_node%=node% ELSE csv_headings%=node%
  371 last_node%=node%
  372NEXT
  373csv_file_ptr%=PTR#csv_file_handle%
  374PROCclose_csv_file
  375ENDPROC
  376
  377
  378
  379DEF PROCcreate_csv_headings
  380LOCAL s$,i%,last%,node%
  381WHILE csv_headings%
  382 node%=!csv_headings%
  383 PROCheap_free("CSVH",csv_headings%)
  384 csv_headings%=node%
  385ENDWHILE
  386last%=0
  387FOR i%=1 TO csv_count%
  388 s$=FNmsg_1("FI",STR$(i%))
  389 node%=FNheap_claim("CSVH",LEN(s$)+5)
  390 !node%=0
  391 $(node%+4)=s$
  392 IF last% !last%=node% ELSE csv_headings%=node%
  393 last%=node%
  394NEXT
  395csv_file_ptr%=0
  396ENDPROC
  397
  398
  399
  400DEF FNdetermine_number_of_records
  401LOCAL count%,b%,new_line%
  402count%=0
  403PROChourglass_on
  404PROCopen_csv_file
  405PTR#csv_file_handle%=csv_file_ptr% :REM put at field start
  406new_line%=TRUE
  407REPEAT
  408 b%=BGET#csv_file_handle%
  409 IF b%=Char_CR% OR b%=Char_LF% OR EOF#csv_file_handle% THEN
  410  IF NOT new_line% THEN count%+=1
  411  new_line%=TRUE
  412 ELSE
  413  new_line%=FALSE
  414 ENDIF
  415UNTIL EOF#csv_file_handle%
  416PROCclose_csv_file
  417PROChourglass_off
  418=count%
  419
  420
  421
  422DEF PROCdoc_received
  423LOCAL loop%, temp$
  424
  425IF doc_file$="" THEN
  426 doc_task%=task_buff%!4
  427 doc_window%=task_buff%!20
  428 doc_file$=FNleaf(FNtask_rtoz(task_buff%+24))
  429ENDIF
  430IFdoc_task%=task_buff%!4 AND doc_window%=task_buff%!20 AND doc_file$=FNleaf(FNtask_rtoz(task_buff%+24)) THEN
  431 task_buff%!12=task_buff%!8
  432 SYS"Wimp_SendMessage",19,task_buff%,task_buff%!4
  433 !win_buff%=main%:SYS"Wimp_GetWindowState",,win_buff%
  434 win_buff%!28=-1:SYS"Wimp_OpenWindow",,win_buff%
  435 PROCicon_write(main%,Icon_document%,doc_file$)
  436ENDIF
  437
  438REM Attack string
  439temp$=""
  440FOR loop%=1 TO LEN(doc_file$)
  441IF ASC(MID$(doc_file$, loop%,1))>32 THEN temp$+=MID$(doc_file$, loop%, 1)
  442NEXT loop%
  443doc_file$=temp$
  444ENDPROC
  445
  446
  447
  448DEF PROCdatasave
  449LOCAL loop%, byte%
  450
  451REM receipt of CSV file directly from application
  452
  453IF task_buff%!40=CSV_Type% THEN
  454 task_buff%!0=256
  455 task_buff%!12=task_buff%!8
  456 task_buff%!16=2
  457 task_buff%!36=-1
  458
  459REM Convert terminated string to a string terminated by 13.
  460loop%=44
  461WHILE (task_buff%?loop%)>31
  462      loop%+=1
  463ENDWHILE
  464task_buff%?loop%=13
  465
  466$(task_buff%+44)="<Wimp$ScrapDir>."+$(task_buff%+44)
  467SYS"Wimp_SendMessage",17,task_buff%,task_buff%!4
  468ENDIF
  469ENDPROC
  470
  471
  472DEF FNleaf(s$)
  473LOCAL dotindex%
  474dotindex%=0
  475WHILE INSTR(s$,".",dotindex%+1)
  476  dotindex%=INSTR(s$,".",dotindex%+1)
  477ENDWHILE
  478=MID$(s$,dotindex%+1)
  479
  480
  481
  482DEF PROCprequit
  483IFmerge% THEN
  484 REM ***** do some prompting regarding merge in progress
  485ENDIF
  486ENDPROC
  487
  488
  489
  490DEF PROCtry_merge_on
  491REM try to display the first record
  492merge%=TRUE
  493preserved_start_of_data_ptr%=csv_file_ptr%
  494PROCsend("Edit Off",-1)
  495PROCmerge_next_record
  496ENDPROC
  497
  498
  499DEF PROCmerge_off
  500REM stop merging and initialise everything
  501LOCAL next%
  502
  503IF merge% PROCsend("Edit On",-1)
  504merge%=FALSE
  505csv_file$=""
  506csv_file_handle%=0
  507csv_count%=0
  508csv_headings%=0
  509csv_field_ptrs%=0
  510csv_field_lens%=0
  511csv_file_ptr%=0
  512doc_file$=""
  513doc_task%=0
  514doc_window%=0
  515field_count%=0
  516rec_togo%=0
  517rec_done%=0
  518ENDPROC
  519
  520
  521DEF PROCmerge_next_record
  522IF rec_togo%<>0 THEN
  523 PROChourglass_on
  524 PROCnext_record
  525 PROCsend("Merge",T_Merge%)
  526 PROCdisable_merging_buttons
  527ELSE
  528 $(error_buff%+4)=FNmsg_0("OK6")+CHR$0
  529 SYS"Wimp_ReportError",error_buff%,%10001,FNmsg_1("MS",FNmsg_0("ID"))
  530 PROChost_shutdown
  531ENDIF
  532ENDPROC
  533
  534
  535DEF PROCnext_record
  536REM calculates pointers to each field, and the length of each field
  537LOCAL len%,i%,dummy%,finished%,this_ptr%
  538
  539REM check all records have identical number of fields
  540LOCAL numfields%
  541numfields%=0
  542PROCopen_csv_file
  543IF csv_file_handle%=0 ERROR task_ok%,FNmsg_1("OK2",csv_file$)
  544REM free up the memory occupied by any existing pointers
  545WHILE csv_field_ptrs%
  546 next%=!csv_field_ptrs%
  547 PROCheap_free("CSVP",csv_field_ptrs%)
  548 csv_field_ptrs%=next%
  549ENDWHILE
  550WHILE csv_field_lens%
  551 next%=!csv_field_lens%
  552 PROCheap_free("CSVL",csv_field_lens%)
  553 csv_field_lens%=next%
  554ENDWHILE
  555PTR#csv_file_handle%=csv_file_ptr%
  556i%=0
  557REPEAT
  558  i%+=1
  559  REPEAT
  560    this_ptr%=PTR#csv_file_handle%    :REM pointer to real start of field
  561    PROCcopy_field(0,dummy%,len%,FALSE)
  562    finished%=TRUE
  563    IF NOT EOF#csv_file_handle% AND i%=1 AND len%=0 AND dummy% THEN finished%=FALSE
  564  UNTIL finished%
  565  PROCadd_field_ptr(this_ptr%)
  566  PROCadd_field_len(len%)
  567UNTIL i%=csv_count% OR dummy% OR EOF#csv_file_handle%
  568IF NOT dummy% PROCeol
  569IF i%<csv_count% THEN
  570  WHILE i%<csv_count%
  571   i%+=1
  572   PROCadd_field_ptr(0)
  573   PROCadd_field_len(0)
  574  ENDWHILE
  575ENDIF
  576csv_file_ptr%=PTR#csv_file_handle%
  577PROCclose_csv_file
  578ENDPROC
  579
  580
  581DEF PROCeol
  582LOCAL x
  583x=0
  584REPEAT
  585 IF NOT EOF#csv_file_handle% THEN x=BGET#csv_file_handle%
  586UNTIL x=Char_CR% OR x=Char_LF% OR EOF#csv_file_handle%
  587ENDPROC
  588
  589
  590
  591DEF PROCadd_field_ptr(index%)
  592LOCAL node%,last%
  593node%=FNheap_claim("CSVP",8)
  594node%!0=0
  595node%!4=index%
  596IF csv_field_ptrs%=0 THEN
  597 csv_field_ptrs%=node%
  598ELSE
  599 last%=csv_field_ptrs%
  600 WHILE !last%
  601  last%=!last%
  602 ENDWHILE
  603 !last%=node%
  604ENDIF
  605ENDPROC
  606
  607
  608
  609DEFPROCadd_field_len(index%)
  610LOCAL node%,last%
  611node%=FNheap_claim("CSVL",8)
  612node%!0=0
  613node%!4=index%
  614IF csv_field_lens%=0 THEN
  615 csv_field_lens%=node%
  616ELSE
  617 last%=csv_field_lens%
  618 WHILE !last%
  619  last%=!last%
  620 ENDWHILE
  621 !last%=node%
  622ENDIF
  623ENDPROC
  624
  625
  626
  627DEF FNfield_ptr(index%)
  628REM return the nth (starting at 0) ptr
  629LOCAL node%
  630node%=csv_field_ptrs%
  631WHILE index%
  632 REM this is safe 'cos its validated before calling
  633 node%=!node%:IFnode%=0 ERROR task_fatal%,"Bad field ptr requested"
  634 index%-=1
  635ENDWHILE
  636=node%!4
  637
  638
  639
  640DEF FNfield_len(index%)
  641REM return the nth (starting at 0) length
  642LOCAL node%
  643node%=csv_field_lens%
  644WHILE index%
  645 REM this is safe 'cos its validated before calling
  646 node%=!node%:IFnode%=0 ERROR task_fatal%,"Bad field len requested"
  647 index%-=1
  648ENDWHILE
  649=node%!4
  650
  651
  652
  653DEF PROCsend(command$,replytoken%)
  654LOCAL i%,m$
  655IF doc_file$="" THEN ENDPROC
  656IF replytoken%<>-1 i%=Impulse_Request% ELSE i%=Impulse_Command%
  657m$=":"+FNmsg_0("SV")+"."+doc_file$+" "+command$
  658SYS"Impulse_SendMessage",i%,m$,0,0,0,replytoken%,task_handle%,0
  659ENDPROC
  660
  661
  662DEFPROCdisable_merging_buttons
  663PROCicon_shade(main%,Icon_PrintAll%)
  664PROCicon_shade(main%,Icon_Print%)
  665PROCicon_shade(main%,Icon_Next%)
  666PROCicon_shade(main%,Icon_Edit%)
  667ENDPROC
  668
  669
  670DEFPROCenable_merging_buttons
  671PROCicon_unshade(main%,Icon_PrintAll%)
  672PROCicon_unshade(main%,Icon_Print%)
  673PROCicon_unshade(main%,Icon_Next%)
  674PROCicon_unshade(main%,Icon_Edit%)
  675ENDPROC
  676
  677
  678DEF PROCcommand(token%,params%,object%)
  679CASE token% OF
  680  WHEN T_GetField%
  681      PROCget_field(params%,object%)
  682      field_count%+=1
  683  WHEN T_CloseDown%
  684      dieplease% = TRUE
  685      PROChost_shutdown
  686ENDCASE
  687ENDPROC
  688
  689
  690DEF PROCget_field(params%,object%)
  691REM params% points to the results of OS_ReadArgs
  692LOCAL field_index%, field_name$, ptr%, finished%
  693IF params%=-1 ENDPROC
  694field_name$=FNtask_rtoz(params%)
  695field_index%=0
  696ptr%=csv_headings%
  697finished%=FALSE
  698REPEAT
  699 field_index%+=1
  700 IF $(ptr%+4)=field_name$ THEN
  701  finished%=TRUE
  702 ELSE
  703  ptr%=!ptr%
  704  IF ptr%=0 THEN finished%=TRUE:field_index%=-1
  705 ENDIF
  706
  707REM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  708REM  IF ptr%=0 ERROR task_fatal%, FNmsg_1("OK4",field_name$)
  709  IF ptr%=0 THEN
  710    $(error_buff%+4)=FNmsg_1("OK4", field_name$)
  711    SYS "Wimp_ReportError",error_buff%,%10001,FNmsg_1("MS",FNmsg_0("ID"))
  712  ENDIF
  713REM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  714
  715UNTIL finished%
  716IF field_index%<1 OR field_index%>csv_count% THEN
  717  PROCtrans_reply_block(0,0)
  718ELSE
  719  PROCtrans_reply_block(FNfield_ptr(field_index%-1),FNfield_len(field_index%-1))
  720ENDIF
  721ENDPROC
  722
  723
  724DEFPROCtrans_reply_block(ptr%,len%)
  725LOCAL dummy%
  726transmit%=TRUE
  727transmit_ptr%=0
  728IF transmit_block% PROCheap_free("BLCK",transmit_block%)
  729transmit_block%=FNheap_claim("BLCK",len%+1)
  730IF len%>0 THEN
  731  PROCopen_csv_file
  732  IF csv_file_handle%=0 transmit%=FALSE:ERROR task_ok%,FNmsg_2("OK2",csv_file$)
  733  PTR#csv_file_handle%=ptr%
  734  PROCcopy_field(transmit_block%,dummy%,len%,FALSE)
  735  PROCclose_csv_file
  736ELSE
  737  $transmit_block%=""
  738ENDIF
  739transmit_top%=(len%+1+3)ANDNOT3
  740transmit_size%=len%
  741transmit_tag%=FNnext_transmit_tag
  742SYS"Impulse_SendMessage",Impulse_Reply%,"Dummy text",-1,,,transmit_tag%,task_handle%,transmit_top%-transmit_ptr%
  743ENDPROC
  744
  745
  746DEFFNnext_transmit_tag
  747transmit_count%+=1
  748=transmit_count%
  749
  750
  751DEFPROCsend_data(token%,buffer%,buffersize%)
  752LOCAL size%,i%
  753
  754IFNOTtransmit% OR (token%<>transmit_tag%) ERROR task_ok%, FNmsg_0("OK3")
  755size%=transmit_top%-transmit_ptr%
  756IF size%<buffersize% OR size%=0 transmit%=FALSE
  757IF size%>buffersize% size=buffersize%
  758?(transmit_ptr%+transmit_block%+transmit_size%)=0
  759SYS"Impulse_TransmitData",transmit_ptr%+transmit_block%,size%,,,,,task_handle%
  760transmit_ptr%+=size%
  761ENDPROC
  762
  763
  764DEF PROCreply(token%)
  765CASE token% OF
  766  WHEN T_Print%: PROCreply_print
  767  WHEN T_Merge%: PROCmerge_done
  768ENDCASE
  769ENDPROC
  770
  771
  772DEF PROCmerge_done
  773IFrec_done%=0 THEN
  774  IFfield_count%=0 THEN
  775    PROCsend("Edit On",-1)
  776    csv_file_ptr%=preserved_start_of_data_ptr%
  777    merge%=FALSE
  778    ERROR task_ok%, FNmsg_0("OK7")
  779  ENDIF
  780  PROCicon_write(main%,Icon_ToGo%,STR$(rec_togo%))
  781  PROCicon_write(main%,Icon_Done%,"1")
  782  PROCicon_unhide(main%,Icon_ToProc%)
  783  PROCicon_unhide(main%,Icon_RecsProc%)
  784  PROCicon_unhide(main%,Icon_PrintAll%)
  785  PROCicon_unhide(main%,Icon_ToGo%)
  786  PROCicon_unhide(main%,Icon_Done%)
  787  PROCicon_unhide(main%,Icon_Print%)
  788  PROCicon_unhide(main%,Icon_Next%)
  789  PROCicon_unhide(main%,Icon_Edit%)
  790  PROCicon_hide(main%,Icon_Headings%)
  791  PROCicon_hide(main%,Icon_DispHead%)
  792  PROCicon_hide(main%,Icon_StartMerge%)
  793  !win_buff%=main%:SYS"Wimp_GetWindowState",,win_buff%
  794  win_buff%!8=win_buff%!16 - Window_Big%
  795  SYS"Wimp_OpenWindow",,win_buff%
  796ENDIF
  797PROCdone_record
  798PROCenable_merging_buttons
  799PROChourglass_off
  800ENDPROC
  801
  802
  803DEFPROCdone_record
  804rec_togo%-=1
  805rec_done%+=1
  806PROCicon_write(main%,Icon_ToGo%,STR$(rec_togo%))
  807PROCicon_write(main%,Icon_Done%,STR$(rec_done%))
  808ENDPROC
  809
  810
  811DEFPROCreply_print
  812LOCAL command$
  813  command$=FNtask_rtoz(task_buff%+36)
  814  CASE command$ OF
  815    WHEN "PrintDone" : PROCprint_done
  816    WHEN "PrintError": PROCprint_error
  817  ENDCASE
  818ENDPROC
  819
  820
  821DEFPROCprint_error
  822REM No printer driver was loaded if we get here.  If we are doing a
  823REM print all records, then we should stop the print here.
  824  printing%=FALSE
  825  gotprintreply%=FALSE
  826
  827  $(error_buff%+4)=FNmsg_0("OK9")
  828  SYS "Wimp_ReportError", error_buff%, %10001, FNmsg_1("MS",FNmsg_0("ID"))
  829
  830  IFpending_close% THEN PROChost_shutdown
  831  PROCenable_merging_buttons
  832  PROCicon_unhide(main%, Icon_PrintAll%)
  833
  834ENDPROC
  835
  836
  837DEFPROCprint_done
  838REM Print went OK if we get here
  839printing%=FALSE
  840IFpending_close% THEN
  841        PROChost_shutdown
  842ELSE
  843        IFFNicon_set(main%,Icon_PrintAll%) THEN
  844                REM PROCdone_record
  845                PROCmerge_next_record
  846
  847                REM !!!!!!!!!!!!!!!!
  848                REM Now done after wimp_poll
  849                REM  PROCsend("Print",T_Print%)
  850        
  851                REM Set reply variable TRUE
  852                gotprintreply%=TRUE
  853                REM !!!!!!!!!!!!!!!!
  854
  855                printing%=TRUE
  856        ELSE
  857                PROCenable_merging_buttons
  858        ENDIF
  859ENDIF
  860ENDPROC
  861
  862REM Error library
  863
  864DEFPROCerror_initialise
  865DIM error_buff% 256
  866ENDPROC
  867
  868DEFPROCerror
  869LOCAL r$,r%
  870r$=REPORT$
  871IFERR=task_ok% OR ERR=task_fatal% THEN
  872 r%=INSTR(r$,"in "+CHR$Char_Quote%)
  873 IFr%<>0 r$=LEFT$(r$,r%-1)
  874ENDIF
  875CASE ERR OF
  876WHEN    task_ok%: PROCerror_box(r$,1)
  877WHEN task_fatal%: PROCerror_box(r$,2)
  878       OTHERWISE: PROCerror_box("Unexpected error :- "+r$+" ("+STR$(ERR)+"/"+STR$(ERL)+")",3)
  879ENDCASE
  880ENDPROC
  881
  882DEFPROCerror_box(r$,error_flag%)
  883LOCAL r%
  884SYS"Wimp_CreateMenu",,-1
  885!error_buff%=ERR:$(error_buff%+4)=r$+CHR$0
  886SYS"Wimp_ReportError",error_buff%,error_flag%,task_id$ TO ,r%
  887IFr%=2 ON ERROR OFF:PROChost_shutdown:END
  888ENDPROC
  889:
  890REM Heap library
  891:
  892DEFPROCheap_free(ident$,block%)
  893LOCAL r0%,f%
  894IFblock%<>0 THEN
  895 block%-=4
  896 REM PROCtrace_0("","PROCheap_free("+ident$+",&"+STR$~(block%)+")")
  897 IF!block%<>FNheap_ident_num(ident$) ERROR task_ok%,"Corrupt "+ident$+" block not freed"
  898 SYS"XOS_Heap",3,heap_start%,block% TO r0%;f%
  899 IF(f% AND 1) ERROR task_fatal%,"Block "+ident$+": "+FNtask_rtoz(r0%+4)
  900ENDIF
  901ENDPROC
  902:
  903DEFFNheap_claim(ident$,size%)
  904LOCAL p%
  905REM need to add 4 extra bytes 'cos if the block needs
  906REM extending then the first word gets trampled on
  907size%+=4
  908WHILE size%>=FNheap_freespace PROCheap_increase:ENDWHILE
  909REM claim the block and store the ident
  910SYS"OS_Heap",2,heap_start%,,size% TO ,,p%
  911!p%=FNheap_ident_num(ident$)
  912p%+=4
  913=p%
  914:
  915DEFPROCheap_increase
  916LOCAL slot%
  917SYS"Wimp_SlotSize",-1,-1 TO slot%
  918SYS"Wimp_SlotSize",slot%+heap_psize%,-1
  919IFheap_size%=0 THEN
  920 SYS"OS_Heap",0,heap_start%,,heap_psize%
  921ELSE
  922 SYS"OS_Heap",5,heap_start%,,heap_psize%
  923ENDIF
  924heap_size%+=heap_psize%
  925ENDPROC
  926:
  927DEFFNheap_ident_num(v$)
  928LOCAL i%,j%
  929FORi%=0 TO 3
  930 j%=j% OR ASC(MID$(v$,i%+1,1))<<(i%*8)
  931NEXT
  932=j%
  933:
  934DEFFNheap_freespace
  935LOCAL f%
  936IFheap_size%=0 THEN =0
  937SYS"OS_Heap",1,heap_start% TO ,,f%
  938=f%
  939:
  940REM Window library
  941:
  942DEFPROCwin_initialise
  943DIM win_buff% 2048
  944win_template$=""
  945ENDPROC
  946:
  947DEFPROCwin_load_create(f$,n$,sprite_pool%,RETURN handle%)
  948PROCwin_load(f$,n$,win_buff%,2048)
  949win_buff%!64=sprite_pool%
  950PROCwin_create(win_buff%,handle%)
  951ENDPROC
  952:
  953DEFPROCwin_load(f$,n$,buf%,limit%)
  954REM   f$ - filename of template file
  955REM   n$ - name of template to load
  956REM buf% - buffer which needs to be big enough to hold the window definition
  957REM        AND the indirected data, due to the way Wimp_LoadTemplate works.
  958REM
  959REM PROCwin_load will automatically dimension enough memory for
  960REM the indirected data.
  961LOCAL ws_buf%
  962LOCAL size%
  963LOCAL data%
  964LOCAL found%
  965LOCAL s%,f%
  966IFf$<>"" THEN
  967 PROCwin_sizes(f$,n$,size%,data%)
  968ELSE
  969 PROCwin_sizes(win_template$,n$,size%,data%)
  970ENDIF
  971IFlimit%<(size%+data%) ERROR task_ok%,"Buffer not big enough for '"+n$+"' - "+STR$(size%)+" + "+STR$(data%)+" bytes required"
  972IFf$<>"" SYS"Wimp_OpenTemplate",,f$
  973IF data%<>0 THEN
  974 DIM ws_buf% data%
  975 SYS"XWimp_LoadTemplate",,buf%,ws_buf%,ws_buf%+data%,-1,n$,0 TO s%,,,,,,found%;f%
  976ELSE
  977 SYS"XWimp_LoadTemplate",,buf%,0,0,-1,n$,0 TO s%,,,,,,found%;f%
  978ENDIF
  979IFf$<>"" SYS"Wimp_CloseTemplate"
  980IF(f%AND1) ERROR task_ok%,n$+": "+FNtask_rtoz(s%+4)
  981IFfound%=0 ERROR task_ok%,"Template '"+n$+"' not found"
  982ENDPROC
  983:
  984DEFPROCwin_create(buf%,RETURN handle%)
  985REM    buf% - buffer holding the window definition
  986REM handle% - handle of the created window
  987SYS"Wimp_CreateWindow",,buf% TO handle%
  988ENDPROC
  989:
  990DEFPROCwin_sizes(f$,n$,RETURN size%,RETURN data%)
  991LOCAL i%
  992LOCAL file%
  993LOCAL ptr%
  994LOCAL offset%
  995LOCAL type%
  996LOCAL ident$
  997LOCAL num_icons%
  998file%=OPENIN(f$)
  999size%=0
 1000data%=0
 1001ptr%=16
 1002REPEAT
 1003 PTR#file%=ptr%
 1004 offset%=FNwin_word(file%)
 1005 IF offset%<>0 THEN
 1006  PTR#file%=ptr%+8
 1007  type%=FNwin_word(file%)
 1008  ident$=FNwin_string(file%)
 1009  ptr%+=24
 1010  IFtype%=1 THEN
 1011   IFident$=n$ THEN
 1012    PTR#file%=offset%+84
 1013    num_icons%=FNwin_word(file%)
 1014    data%=FNwin_title(file%,offset%)
 1015    IFnum_icons%<>0 data%+=FNwin_icon(file%,num_icons%,offset%)
 1016    size%=88+(num_icons%*32)
 1017    offset%=0:REM just to get out of the loop
 1018   ENDIF
 1019  ENDIF
 1020 ENDIF
 1021UNTIL offset%=0
 1022CLOSE#file%
 1023ENDPROC
 1024:
 1025DEFFNwin_word(h%)
 1026=BGET#h%+(BGET#h% << 8)+(BGET#h% << 16)+(BGET#h% << 24)
 1027:
 1028DEFFNwin_string(h%)
 1029LOCAL s$,c%
 1030REPEAT
 1031 c%=BGET#h%
 1032 IFc%>31 s$+=CHR$(c%)
 1033UNTIL c%<32
 1034=s$
 1035:
 1036DEFFNwin_title(file%,offset%)
 1037LOCAL v%
 1038PTR#file%=offset%+28
 1039v%=FNwin_word(file%)
 1040IF (v% AND 1<<31) THEN
 1041 IF (v% AND 1<<26) THEN
 1042  =FNwin_isd(file%,offset%+56,offset%+72,offset%)
 1043 ENDIF
 1044ELSE
 1045 IF (v% AND 1) THEN
 1046  =FNwin_isd(file%,offset%+56,offset%+72,offset%)
 1047 ENDIF
 1048ENDIF
 1049=0
 1050:
 1051DEFFNwin_icon(file%,num%,offset%)
 1052LOCAL i%,j%
 1053j%=0
 1054FORi%=0 TO num%-1
 1055 j%+=FNwin_isd(file%,offset%+88+i%*32+16,offset%+88+i%*32+20,offset%)
 1056NEXT
 1057=j%
 1058:
 1059DEFFNwin_isd(file%,o1%,o2%,offset%)
 1060LOCAL v%,ist%,size%,i%
 1061PTR#file%=o1%
 1062v%=FNwin_word(file%)
 1063REM even if an icon is marked as deleted
 1064REM it must be allowed for!
 1065i%=(v% AND %100000000)
 1066ist%=(v% AND 3) + (i% >> 6)
 1067CASE ist% OF
 1068WHEN   0: size%=0
 1069WHEN   1: size%=0
 1070WHEN   2: size%=0
 1071WHEN   3: size%=0
 1072WHEN   4: size%=0
 1073WHEN 5,7: PTR#file%=o2%+4
 1074          v%=FNwin_word(file%)
 1075          IFv%=-1 THEN
 1076           size%=0
 1077          ELSE
 1078           PTR#file%=offset%+v%
 1079           size%=LEN(FNwin_string(file%))+1
 1080          ENDIF
 1081          PTR#file%=o2%+8
 1082          size%+=FNwin_word(file%)
 1083WHEN   6: PTR#file%=o2%+8
 1084          size%=FNwin_word(file%)
 1085ENDCASE
 1086=size%
 1087:
 1088REM Icon library
 1089:
 1090DEFPROCicon_initialise
 1091DIM icon_buffer% 256
 1092ENDPROC
 1093:
 1094DEFPROCicon_hide(a%,b%)
 1095!icon_buffer%=a%
 1096icon_buffer%!4=b%
 1097icon_buffer%!8=(1<<7)+(1<<23)
 1098icon_buffer%!12=(1<<7)+(1<<23)
 1099SYS"Wimp_SetIconState",,icon_buffer%
 1100ENDPROC
 1101:
 1102DEFPROCicon_write(a%,b%,s$)
 1103!icon_buffer%=a%
 1104icon_buffer%!4=b%
 1105SYS"Wimp_GetIconState",,icon_buffer%
 1106IF(LEN(s$)+1)>icon_buffer%!36 THEN
 1107 ERROR task_fatal%,"'"+s$+"' won't fit icon "+STR$(b%)
 1108ENDIF
 1109$(icon_buffer%!28)=s$
 1110icon_buffer%!8=0:icon_buffer%!12=0
 1111SYS"Wimp_SetIconState",,icon_buffer%
 1112ENDPROC
 1113:
 1114DEFPROCicon_shade(a%,b%)
 1115!icon_buffer%=a%
 1116icon_buffer%!4=b%
 1117icon_buffer%!8=1<<22
 1118icon_buffer%!12=1<<22
 1119SYS"Wimp_SetIconState",,icon_buffer%
 1120ENDPROC
 1121:
 1122DEFFNicon_set(a%,b%)
 1123!icon_buffer%=a%
 1124icon_buffer%!4=b%
 1125SYS"Wimp_GetIconState",,icon_buffer%
 1126=((icon_buffer%!24 AND (1<<21))<>0)
 1127:
 1128DEFPROCicon_unhide(a%,b%)
 1129!icon_buffer%=a%
 1130icon_buffer%!4=b%
 1131icon_buffer%!8=0
 1132icon_buffer%!12=1<<23
 1133SYS"Wimp_SetIconState",,icon_buffer%
 1134ENDPROC
 1135:
 1136DEFPROCicon_unshade(a%,b%)
 1137!icon_buffer%=a%
 1138icon_buffer%!4=b%
 1139icon_buffer%!8=0
 1140icon_buffer%!12=1<<22
 1141SYS"Wimp_SetIconState",,icon_buffer%
 1142ENDPROC
 1143:
 1144REM Task library
 1145:
 1146DEF PROCtask_initialise(n$)
 1147task_id$=n$
 1148DIM task_buff% 256
 1149IF RiscOS%>=300 THEN
 1150  task_buff%!0=Message_MM_Document%
 1151  task_buff%!4=Message_WindowClosed%
 1152  task_buff%!8=Message_TaskCloseDown%
 1153  task_buff%!12=Message_PreQuit%
 1154  task_buff%!16=Message_RAMFetch%
 1155  task_buff%!20=Message_DataLoad%
 1156  task_buff%!24=Message_DataSave%
 1157  task_buff%!28=Message_Impulse_1%
 1158  task_buff%!32=Message_Impulse_2%
 1159  task_buff%!36=Message_Quit%
 1160  SYS"Wimp_Initialise",310,&4B534154,n$,task_buff%+36 TO wimp_version%,task_handle%
 1161ELSE
 1162  SYS "Wimp_Initialise",200,&4B534154,n$ TO wimp_version%,task_handle%
 1163ENDIF
 1164OSCLI("Set MailMerge$Running TRUE")
 1165task_action%=0
 1166
 1167REM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 1168REM task_mask%=1:REM no null events
 1169
 1170task_mask%=0           : REM I want my null events!
 1171
 1172REM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 1173
 1174task_ok%=254
 1175
 1176task_fatal%=253
 1177ENDPROC
 1178:
 1179DEFPROCtask_shutdown
 1180SYS"Wimp_CloseDown"
 1181OSCLI("UnSet MailMerge$Running")
 1182END
 1183ENDPROC
 1184:
 1185DEFFNtask_rtoz(p%)
 1186LOCAL p$
 1187WHILE ?p%<>0
 1188 p$+=CHR$(?p%)
 1189 p%+=1
 1190ENDWHILE
 1191=p$
 1192:
 1193REM Message library
 1194:
 1195DEFPROCmsg_initialise(N$)
 1196LOCAL c%,c$,i%
 1197c%=OPENIN(N$)
 1198IFc%=0 ERROR 0, "Cannot find messages file"
 1199ms_tags%=0
 1200PROChourglass_on
 1201WHILE NOT(EOF#c%)
 1202 c$=GET$#c%
 1203 IFc$<>"" THEN
 1204  IFLEFT$(c$,1)<>"#" THEN
 1205   IFINSTR(c$,":")<>0 ms_tags%+=1
 1206  ENDIF
 1207 ENDIF
 1208ENDWHILE
 1209IFms_tags%<>0 THEN
 1210 DIM ms_text$(ms_tags%-1),ms_tags$(ms_tags%-1)
 1211 PTR#c%=0
 1212 i%=0
 1213 WHILE NOTEOF#c%
 1214  c$=GET$#c%
 1215  IFc$<>"" THEN
 1216   IFLEFT$(c$,1)<>"#" THEN
 1217    ms_tags$(i%)=LEFT$(c$,INSTR(c$,":")-1)
 1218    ms_text$(i%)=MID$(c$,INSTR(c$,":")+1)
 1219    i%+=1
 1220   ENDIF
 1221  ENDIF
 1222 ENDWHILE
 1223ENDIF
 1224CLOSE#c%
 1225PROChourglass_off
 1226ENDPROC
 1227:
 1228DEFFNmsg_0(T$)
 1229=FNmsg_4(T$,"","","","")
 1230:
 1231DEFFNmsg_1(T$,S$)
 1232=FNmsg_4(T$,S$,"","","")
 1233;
 1234DEFFNmsg_2(T$,S0$,S1$)
 1235=FNmsg_4(T$,S0$,S1$,"","")
 1236:
 1237DEFFNmsg_4(T$,S0$,S1$,S2$,S3$)
 1238LOCAL i%,f%
 1239IFms_tags%=0 THEN
 1240 =T$
 1241ELSE
 1242 FORi%=0 TO ms_tags%-1
 1243  IFT$=ms_tags$(i%) THEN
 1244   T$=ms_text$(i%)
 1245   f%=INSTR(T$,"%0")
 1246   IFf%<>0 T$=LEFT$(T$,f%-1)+S0$+MID$(T$,f%+2)
 1247   f%=INSTR(T$,"%1")
 1248   IFf%<>0 T$=LEFT$(T$,f%-1)+S1$+MID$(T$,f%+2)
 1249   f%=INSTR(T$,"%2")
 1250   IFf%<>0 T$=LEFT$(T$,f%-1)+S2$+MID$(T$,f%+2)
 1251   f%=INSTR(T$,"%3")
 1252   IFf%<>0 T$=LEFT$(T$,f%-1)+S3$+MID$(T$,f%+2)
 1253   i%=ms_tags%
 1254  ENDIF
 1255 NEXT
 1256ENDIF
 1257=T$
 1258:
 1259DEFPROChourglass_on
 1260SYS"Hourglass_On"
 1261hourglass_count%+=1
 1262ENDPROC
 1263:
 1264DEFPROChourglass_off
 1265SYS"Hourglass_Off"
 1266hourglass_count%-=1
 1267ENDPROC
 1268:
 1269DEFPROCopen_csv_file
 1270IF csv_file$="" ENDPROC
 1271csv_file_handle%=OPENIN(csv_file$)
 1272ENDPROC
 1273:
 1274DEFPROCclose_csv_file
 1275IFcsv_file_handle%=0 ENDPROC
 1276CLOSE#csv_file_handle%
 1277csv_file_handle%=0
 1278ENDPROC
 1279
 1280
 1281DEF PROCconsts
 1282appdir$="<MailMerge$Dir>"
 1283Icon_ToProc%=1
 1284Icon_RecsProc%=2
 1285Icon_Headings%=3
 1286Icon_PrintAll%=4
 1287Icon_CSV%=5
 1288Icon_ToGo%=6
 1289Icon_Done%=7
 1290Icon_Print%=8
 1291Icon_document%=10
 1292Icon_Next%=11
 1293Icon_Edit%=12
 1294Icon_DispHead%=13
 1295Icon_StartMerge%=14
 1296Icon_DropHere%=15
 1297
 1298Window_Small%=236
 1299Window_Big%=360
 1300
 1301T_GetField%=0
 1302T_GetData%=1
 1303T_GetTimeDate%=2
 1304T_Print%=3
 1305T_Merge%=4
 1306T_CloseDown%=7
 1307
 1308Impulse_Command%=&200
 1309Impulse_Request%=&201
 1310Impulse_Reply%=&202
 1311Impulse_SendData%=&203
 1312Impulse_ReceiveData%=&204
 1313Impulse_DeferredReply%=&205
 1314
 1315DDF_Type%=&D93
 1316CSV_Type%=&DFE
 1317
 1318Message_Quit%=0
 1319Message_DataSave%=1
 1320Message_DataLoad%=3
 1321Message_RAMFetch%=6
 1322Message_PreQuit%=8
 1323Message_TaskCloseDown%=&400C3
 1324Message_WindowClosed%=&400CB
 1325Message_Impulse_1%=&80E18
 1326Message_Impulse_2%=&80E19
 1327Message_MM_Document%=&82140
 1328
 1329Char_Space%=32
 1330Char_Quote%=34
 1331Char_Comma%=44
 1332Char_LF%=10
 1333Char_CR%=13
 1334Char_Slash%=92
 1335Char_HardSpace%=160
 1336ENDPROC
 1337
 1338DEF PROCreadopsys
 1339SYS "OS_Byte",129,0,255 TO ,RiscOS%
 1340IF RiscOS%<163 THEN RiscOS%=200 ELSE RiscOS%=300
 1341ENDPROC
 1342
� > !RunImage

!� � � � �,�$+" at line "+�(�)

�consts
hourglass_count%=0
�hourglass_on

	6� Find out what the currently selected country is.

� countrybuff 64

�readopsys

%ș "OS_Byte", 70, 127 � ,country%
Nș "OS_ServiceCall", , &43, 2, country% , countrybuff, 256 � ,,,,, length%
countrybuff?length%=13

-�msg_initialise(appdir$+"."+$countrybuff)
"�task_initialise(�msg_0("ID"))
�icon_initialise
�win_initialise
�error_initialise
�initialise

,�=�+8096:� give us 8K of floating memory
+heap_end%=�:� where the memory now ends
�=�+8096
-heap_start%=�:� where the heap will start
$heap_size%=heap_end%-heap_start%
'ș"OS_ReadMemMapInfo" � heap_psize%

�heap_size%<>0 �
 * ș"OS_Heap",0,heap_start%,,heap_size%
!�
" �heap_increase
#�
$
%�hourglass_off
&� � �error
'
(�
)8 ș "Wimp_Poll",task_mask%,task_buff% � task_action%
*x ș "Impulse_Decode",task_action%,task_buff%,,,,method_table%,task_handle% � task_action%,,,,,token%,params%,object%
+
, Ȏ task_action% �
-   � 0 : �null
.,   � 2 : ș"Wimp_OpenWindow",,task_buff%
/   � 3 : � printing% �
0"              pending_close%=�
1            �
2               �host_shutdown
3            �
4   � 6 : �mouse_click
5   � 9 : �menu_click
6   � 17,18 : �receive
7,   � Impulse_Command%, Impulse_Request%:
8)     �command(token%,params%,object%)
9   � Impulse_Reply%:
:     �reply(token%)
;   � Impulse_SendData%:
<+     �send_data(token%,params%,object%)
= �
>
?� �
@�
A
B
C
D� �initialise
E9ș"Impulse_Initialise",0,task_handle%,�msg_0("ID"),-1
F9�win_load_create(appdir$+".Templates","main",1,main%)
G"�icon_hide(main%,Icon_ToProc%)
H$�icon_hide(main%,Icon_RecsProc%)
I$�icon_hide(main%,Icon_PrintAll%)
J �icon_hide(main%,Icon_ToGo%)
K �icon_hide(main%,Icon_Done%)
L!�icon_hide(main%,Icon_Print%)
M �icon_hide(main%,Icon_Next%)
N �icon_hide(main%,Icon_Edit%)
O&�icon_hide(main%,Icon_StartMerge%)
P#�icon_write(main%,Icon_CSV%,"")
Q(�icon_write(main%,Icon_document%,"")
R%�icon_shade(main%,Icon_DispHead%)
S7!win_buff%=main%:ș"Wimp_GetWindowState",,win_buff%
T,win_buff%!8=win_buff%!16 - Window_Small%
U"ș"Wimp_OpenWindow",,win_buff%
V
W� method_table% 64
XP%=method_table%
Y[ OPT 0
Z=   EQUD 0                       ; method structure format
[+   EQUD 0                       ; flags
\%   EQUD T_GetField%       ; token
])   EQUS "GetField"+�0        ; method
^)   EQUS �0                   ; syntax
_   ALIGN
`
a
b
   EQUD 0
c%   EQUD T_CloseDown%      ; token
d)   EQUS "CloseDown"+�0       ; method
e)   EQUS �0                   ; syntax
f   ALIGN
g]
h�
imenu%=0
jmerge%=�
kprinting%=�
lMdieplease%=�      : � TRUE if Impression sends us a window closed message
m"preserved_start_of_data_ptr%=0
npending_close%=�
otransmit%=�
ptransmit_count%=0
qtransmit_block%=0
r
sgotprintreply%=�
t�merge_off
u�
v
w
x
y
z� �null
{
� result%
|B� We need to wimp_poll between merge_next_record and PROCsend.
},� ((printing%=�) � (gotprintreply%=�)) �
~        gotprintreply%=�
#        �send("Print",T_Print%)
��
��
�
�
�
�
�� �host_shutdown
�)� � dieplease% � �send("MailDied",-1)
�
��close_csv_file
�ȕ hourglass_count%
� �hourglass_off
��
��merge% �merge_off
�
�&ș"Impulse_CloseDown",task_handle%
��task_shutdown
��
�
�� �receive
�Ȏ task_buff%!16 �
�� Message_Quit%:
�  �host_shutdown
�� Message_DataSave%:
�  �datasave
�� Message_DataLoad%:
�  �dataload
�� Message_PreQuit%:
�  �prequit
�� Message_TaskCloseDown%:
�<  �doc_file$<>"" � task_buff%!4=doc_task% �host_shutdown
�� Message_WindowClosed%:
�-�  IFdoc_file$<>"" THEN PROChost_shutdown
�� Message_MM_Document%:
�$  � doc_file$="" � �doc_received
��
��
�
�
�� �mouse_click
�"� menuptr%,maxx%,i%,p%,ix%,iy%
�� task_buff%!8<>4 �
�Ȏ task_buff%!16 �
�  � Icon_Headings%:
�
�    � csv_file$<>"" �
�-      � �icon_set(main%,Icon_Headings%) �
�         �create_csv_headings
�        rec_togo% += 1
�      �
�        �get_csv_headings
�        rec_togo% -= 1
�      �
�	    �
�
�  � Icon_DispHead%:
�(    � menu% �heap_free("MENU",menu%)
�2    menu%=�heap_claim("MENU",28+csv_count%*24)
�    $menu%=�msg_0("MT")
�    menu%?12=7
�    menu%?13=2
�    menu%?14=7
�    menu%?15=0
�    menu%!20=44
�    menu%!24=0
�    menuptr%=menu%+28
�    maxx%=�(�msg_0("MT"))-3
�    p%=csv_headings%
�    �i%=1 � csv_count%
�4      �i%=csv_count% !menuptr%=&80 � !menuptr%=0
�      menuptr%!4=-1
�      menuptr%!8=&07000121
�      menuptr%!12=p%+4
�      menuptr%!16=-1
�"      menuptr%!20=�($(p%+4))+1
�      menuptr%+=24
�,      �($(p%+4))>maxx% maxx%=�($(p%+4))
�      p%=!p%
�	    �
�    menu%!16=(maxx%*8+6)*2
�5    !task_buff%=main%:task_buff%!4=Icon_DispHead%
�M    ș"Wimp_GetIconState",,task_buff%:ix%=task_buff%!16:iy%=task_buff%!20
�+    ș"Wimp_GetWindowState",,task_buff%
�:    display_menu_x% = task_buff%!20+task_buff%!4+ix%+2
�;    display_menu_y% = task_buff%!24+task_buff%!16+iy%-2
�B    ș"Wimp_CreateMenu",,menu%,display_menu_x%,display_menu_y%
�  � Icon_StartMerge%:
�    �try_merge_on
�  � Icon_Next%:
�    �merge_next_record
�  � Icon_Print%:
�    �send("Print",T_Print%)
�    printing%=�
�     �disable_merging_buttons
�  � Icon_Edit%:
�    �send("ClearMerge",-1)
�    �host_shutdown
��
��
�
�
���menu_click
�?� send the appropriate DDF for the selected field to the WP
�� c%,l%,f%
�f%=!task_buff%
�,ș"Wimp_GetCaretPosition",,task_buff%+20
�9�task_buff%!20<>doc_window% � task_ok%, �msg_0("OK5")
�l%=csv_headings%
�	ȕ f%
�  l%=!l%
�  f%-=1
��
�c%=�"<Wimp$Scrap>"
�
�X�#c%,"{ merge "+�Char_Quote%+":"+�msg_0("ID")+" GetField "+$(l%+4)+�Char_Quote%+"}";
�
�l%=�#c%
��#c%
�+ș"OS_File",18,"<Wimp$Scrap>",DDF_Type%
�!task_buff%=60
�task_buff%!12=0
�task_buff%!16=3
�$task_buff%!24=&4B535554:� "TUSK"
�task_buff%!36=l%
�task_buff%!40=DDF_Type%
�&$(task_buff%+44)="<Wimp$Scrap>"+�0
�0ș"Wimp_SendMessage",17,task_buff%,doc_task%
�'ș"Wimp_GetPointerInfo",,task_buff%
R�(task_buff%!8 � 1) ș"Wimp_CreateMenu",,menu%,display_menu_x%,display_menu_y%
�


� �dataload
� receipt of a CSV file
.�task_buff%!40<>CSV_Type% � doc_file$="" �
$�merge% � task_ok%,�msg_0("OK1")
'csv_file$=�task_rtoz(task_buff%+44)
	task_buff%!12=task_buff%!8

task_buff%!16=4
3ș"Wimp_SendMessage",17,task_buff%,task_buff%!4
$�icon_hide(main%,Icon_DropHere%)

(�icon_unhide(main%,Icon_StartMerge%)
'�icon_unshade(main%,Icon_DispHead%)
*csv_count%=�determine_number_of_fields
P� � �icon_set(main%,Icon_Headings%) �get_csv_headings � �create_csv_headings
*rec_togo%=�determine_number_of_records
1�icon_write(main%,Icon_CSV%,�leaf(csv_file$))
�


E� �copy_field(to%, � last_field%, � field_length%, fudge_spaces%)
P� copies the next field from the open CSV file into memory, specified by to%
� which CAN be NULL.
=� returns last_field=TRUE if the last field in the record
7� returns field_length=the real length of the field
+� got_quote%, got_slash%, b%, finished%
got_quote%=�
got_slash%=�
last_field%=�
field_length%=0
 finished%=�
!�
" b%=�#csv_file_handle%
#
$ Ȏ � �
%
& � b%=Char_Quote%:
'  got_quote%=� got_quote%
(
) � b%=Char_Slash%:
*  � got_slash% �
+5   �copy_field_stuff_char(to%,�"\",field_length%)
,   got_slash%=�
-  �
.   got_slash%=�
/  �
0
1 � b%=Char_Space%:
2  � fudge_spaces% �
3@   �copy_field_stuff_char(to%,Char_HardSpace%,field_length%)
4  �
5<   �copy_field_stuff_char(to%,Char_Space%,field_length%)
6  �
7
8 � b%=Char_Comma%:
9M  � got_quote% �copy_field_stuff_char(to%,b%,field_length%) � finished%=�
:
;6 � b%=Char_LF% � b%=Char_CR% � �#csv_file_handle%:
<  last_field%=�
=  finished%=�
>
? :
@  � got_slash% �
A   Ȏ b% �
B@        � �"n": �copy_field_stuff_char(to%,10,field_length%)
C   �
D   got_slash%=�
E  �
F3   �copy_field_stuff_char(to%,b%,field_length%)
G  �
H
I �
J� finished%
K� to% ?to%=13
L�
M
N
O4��copy_field_stuff_char(� to%, char%, � length%)
Plength%+=1
Q�to% ?to%=char%:to%+=1
R�
S
T
U!� �determine_number_of_fields
V"� s$,count%,last_field%,dummy%
W�open_csv_file
XN� csv_file_handle%=0 s$=csv_file$:csv_file$="":� task_ok%,�msg_1("OK2",s$)
Y�
Z( �copy_field(0,last_field%,dummy%,�)
[ count%+=1
\� last_field%
]�close_csv_file
^=count%
_
`
a
b� �get_csv_headings
c#� s$,i%,last_node%,node%,dummy%
dȕ csv_headings%
e next%=!csv_headings%
f% �heap_free("CSVH",csv_headings%)
g csv_headings%=next%
h�
i�open_csv_file
jlast_node%=0
k� i%=1 � csv_count%
l, �copy_field(task_buff%,dummy%,dummy%,�)
m s$=$task_buff%
nO � s$="" s$=�msg_1("FI",�(i%)):� if a null heading, create an arbitrary one
o& node%=�heap_claim("CSVH",�(s$)+5)
p
 !node%=0
q $(node%+4)=s$
r9 � last_node% !last_node%=node% � csv_headings%=node%
s last_node%=node%
t�
u$csv_file_ptr%=�#csv_file_handle%
v�close_csv_file
w�
x
y
z
{� �create_csv_headings
|� s$,i%,last%,node%
}ȕ csv_headings%
~ node%=!csv_headings%
% �heap_free("CSVH",csv_headings%)
� csv_headings%=node%
��
�last%=0
�� i%=1 � csv_count%
� s$=�msg_1("FI",�(i%))
�& node%=�heap_claim("CSVH",�(s$)+5)
�
 !node%=0
� $(node%+4)=s$
�/ � last% !last%=node% � csv_headings%=node%
� last%=node%
��
�csv_file_ptr%=0
��
�
�
�
�"� �determine_number_of_records
�� count%,b%,new_line%
�count%=0
��hourglass_on
��open_csv_file
�:�#csv_file_handle%=csv_file_ptr% :� put at field start
�new_line%=�
��
� b%=�#csv_file_handle%
�7 � b%=Char_CR% � b%=Char_LF% � �#csv_file_handle% �
�  � � new_line% � count%+=1
�  new_line%=�
� �
�  new_line%=�
� �
�� �#csv_file_handle%
��close_csv_file
��hourglass_off
�=count%
�
�
�
�� �doc_received
�� loop%, temp$
�
�� doc_file$="" �
� doc_task%=task_buff%!4
� doc_window%=task_buff%!20
�/ doc_file$=�leaf(�task_rtoz(task_buff%+24))
��
�f�doc_task%=task_buff%!4 � doc_window%=task_buff%!20 � doc_file$=�leaf(�task_rtoz(task_buff%+24)) �
� task_buff%!12=task_buff%!8
�4 ș"Wimp_SendMessage",19,task_buff%,task_buff%!4
�8 !win_buff%=main%:ș"Wimp_GetWindowState",,win_buff%
�3 win_buff%!28=-1:ș"Wimp_OpenWindow",,win_buff%
�0 �icon_write(main%,Icon_document%,doc_file$)
��
�
�� Attack string
�temp$=""
�� loop%=1 � �(doc_file$)
�?� �(�doc_file$, loop%,1))>32 � temp$+=�doc_file$, loop%, 1)
�� loop%
�doc_file$=temp$
��
�
�
�
�� �datasave
�� loop%, byte%
�
�3� receipt of CSV file directly from application
�
�� task_buff%!40=CSV_Type% �
� task_buff%!0=256
� task_buff%!12=task_buff%!8
� task_buff%!16=2
� task_buff%!36=-1
�
�=� Convert terminated string to a string terminated by 13.
�loop%=44
�ȕ (task_buff%?loop%)>31
�      loop%+=1
��
�task_buff%?loop%=13
�
�8$(task_buff%+44)="<Wimp$ScrapDir>."+$(task_buff%+44)
�3ș"Wimp_SendMessage",17,task_buff%,task_buff%!4
��
��
�
�
�� �leaf(s$)
�� dotindex%
�dotindex%=0
�ȕ �s$,".",dotindex%+1)
�$  dotindex%=�s$,".",dotindex%+1)
��
�=�s$,dotindex%+1)
�
�
�
�� �prequit
�
�merge% �
�: � ***** do some prompting regarding merge in progress
��
��
�
�
�
�� �try_merge_on
�%� try to display the first record
�merge%=�
�.preserved_start_of_data_ptr%=csv_file_ptr%
��send("Edit Off",-1)
��merge_next_record
��
�
�
�� �merge_off
�,� stop merging and initialise everything
�� next%
�
� � merge% �send("Edit On",-1)
�merge%=�
�csv_file$=""
�csv_file_handle%=0
�csv_count%=0
�csv_headings%=0
�csv_field_ptrs%=0
�csv_field_lens%=0
�csv_file_ptr%=0
doc_file$=""
doc_task%=0
doc_window%=0
field_count%=0
rec_togo%=0
rec_done%=0
�


	� �merge_next_record

� rec_togo%<>0 �
 �hourglass_on
 �next_record

 �send("Merge",T_Merge%)
 �disable_merging_buttons
�
& $(error_buff%+4)=�msg_0("OK6")+�0
F ș"Wimp_ReportError",error_buff%,%10001,�msg_1("MS",�msg_0("ID"))
 �host_shutdown
�
�


� �next_record
E� calculates pointers to each field, and the length of each field
(� len%,i%,dummy%,finished%,this_ptr%

7� check all records have identical number of fields
� numfields%
numfields%=0
�open_csv_file
;� csv_file_handle%=0 � task_ok%,�msg_1("OK2",csv_file$)
 :� free up the memory occupied by any existing pointers
!ȕ csv_field_ptrs%
" next%=!csv_field_ptrs%
#' �heap_free("CSVP",csv_field_ptrs%)
$ csv_field_ptrs%=next%
%�
&ȕ csv_field_lens%
' next%=!csv_field_lens%
(' �heap_free("CSVL",csv_field_lens%)
) csv_field_lens%=next%
*�
+$�#csv_file_handle%=csv_file_ptr%
,i%=0
-�
.  i%+=1
/  �
0I    this_ptr%=�#csv_file_handle%    :� pointer to real start of field
1$    �copy_field(0,dummy%,len%,�)
2    finished%=�
3E    � � �#csv_file_handle% � i%=1 � len%=0 � dummy% � finished%=�
4  � finished%
5  �add_field_ptr(this_ptr%)
6  �add_field_len(len%)
71� i%=csv_count% � dummy% � �#csv_file_handle%
8� � dummy% �eol
9� i%<csv_count% �
:  ȕ i%<csv_count%
;   i%+=1
<   �add_field_ptr(0)
=   �add_field_len(0)
>  �
?�
@$csv_file_ptr%=�#csv_file_handle%
A�close_csv_file
B�
C
D
E
� �eol
F� x
Gx=0
H�
I2 � � �#csv_file_handle% � x=�#csv_file_handle%
J2� x=Char_CR% � x=Char_LF% � �#csv_file_handle%
K�
L
M
N
O� �add_field_ptr(index%)
P� node%,last%
Qnode%=�heap_claim("CSVP",8)
R
node%!0=0
Snode%!4=index%
T� csv_field_ptrs%=0 �
U csv_field_ptrs%=node%
V�
W last%=csv_field_ptrs%
X ȕ !last%
Y  last%=!last%
Z �
[ !last%=node%
\�
]�
^
_
`
a��add_field_len(index%)
b� node%,last%
cnode%=�heap_claim("CSVL",8)
d
node%!0=0
enode%!4=index%
f� csv_field_lens%=0 �
g csv_field_lens%=node%
h�
i last%=csv_field_lens%
j ȕ !last%
k  last%=!last%
l �
m !last%=node%
n�
o�
p
q
r
s� �field_ptr(index%)
t(� return the nth (starting at 0) ptr
u� node%
vnode%=csv_field_ptrs%
w
ȕ index%
x5 � this is safe 'cos its validated before calling
yB node%=!node%:�node%=0 � task_fatal%,"Bad field ptr requested"
z index%-=1
{�
|=node%!4
}
~

�� �field_len(index%)
�+� return the nth (starting at 0) length
�� node%
�node%=csv_field_lens%
�
ȕ index%
�5 � this is safe 'cos its validated before calling
�B node%=!node%:�node%=0 � task_fatal%,"Bad field len requested"
� index%-=1
��
�=node%!4
�
�
�
�!� �send(command$,replytoken%)
�� i%,m$
�� doc_file$="" � �
�?� replytoken%<>-1 i%=Impulse_Request% � i%=Impulse_Command%
�2m$=":"+�msg_0("SV")+"."+doc_file$+" "+command$
�Bș"Impulse_SendMessage",i%,m$,0,0,0,replytoken%,task_handle%,0
��
�
�
���disable_merging_buttons
�%�icon_shade(main%,Icon_PrintAll%)
�"�icon_shade(main%,Icon_Print%)
�!�icon_shade(main%,Icon_Next%)
�!�icon_shade(main%,Icon_Edit%)
��
�
�
���enable_merging_buttons
�'�icon_unshade(main%,Icon_PrintAll%)
�$�icon_unshade(main%,Icon_Print%)
�#�icon_unshade(main%,Icon_Next%)
�#�icon_unshade(main%,Icon_Edit%)
��
�
�
�&� �command(token%,params%,object%)
�Ȏ token% �
�  � T_GetField%
�%      �get_field(params%,object%)
�      field_count%+=1
�  � T_CloseDown%
�      dieplease% = �
�      �host_shutdown
��
��
�
�
�!� �get_field(params%,object%)
�2� params% points to the results of OS_ReadArgs
�0� field_index%, field_name$, ptr%, finished%
�� params%=-1 �
�#field_name$=�task_rtoz(params%)
�field_index%=0
�ptr%=csv_headings%
�finished%=�
��
� field_index%+=1
� � $(ptr%+4)=field_name$ �
�  finished%=�
� �
�  ptr%=!ptr%
�,  � ptr%=0 � finished%=�:field_index%=-1
� �
�
�$� !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
�>�  IF ptr%=0 ERROR task_fatal%, FNmsg_1("OK4",field_name$)
�  � ptr%=0 �
�3    $(error_buff%+4)=�msg_1("OK4", field_name$)
�J    ș "Wimp_ReportError",error_buff%,%10001,�msg_1("MS",�msg_0("ID"))
�  �
�%� !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
�
�� finished%
�0� field_index%<1 � field_index%>csv_count% �
�  �trans_reply_block(0,0)
��
�O  �trans_reply_block(�field_ptr(field_index%-1),�field_len(field_index%-1))
��
��
�
�
�"��trans_reply_block(ptr%,len%)
�� dummy%
�transmit%=�
�transmit_ptr%=0
�8� transmit_block% �heap_free("BLCK",transmit_block%)
�.transmit_block%=�heap_claim("BLCK",len%+1)
�� len%>0 �
�  �open_csv_file
�I  � csv_file_handle%=0 transmit%=�:� task_ok%,�msg_2("OK2",csv_file$)
�  �#csv_file_handle%=ptr%
�0  �copy_field(transmit_block%,dummy%,len%,�)
�  �close_csv_file
��
�  $transmit_block%=""
��
�transmit_top%=(len%+1+3)��3
�transmit_size%=len%
�$transmit_tag%=�next_transmit_tag
�sș"Impulse_SendMessage",Impulse_Reply%,"Dummy text",-1,,,transmit_tag%,task_handle%,transmit_top%-transmit_ptr%
��
�
�
�ݤnext_transmit_tag
�transmit_count%+=1
�=transmit_count%
�
�
�+��send_data(token%,buffer%,buffersize%)
�� size%,i%
�
�C�transmit% � (token%<>transmit_tag%) � task_ok%, �msg_0("OK3")
�%size%=transmit_top%-transmit_ptr%
�-� size%<buffersize% � size%=0 transmit%=�
�(� size%>buffersize% size=buffersize%
�5?(transmit_ptr%+transmit_block%+transmit_size%)=0
�Qș"Impulse_TransmitData",transmit_ptr%+transmit_block%,size%,,,,,task_handle%
�transmit_ptr%+=size%
��
�
�
�� �reply(token%)
�Ȏ token% �
�  � T_Print%: �reply_print
�  � T_Merge%: �merge_done
�
�


� �merge_done
�rec_done%=0 �
  �field_count%=0 �
    �send("Edit On",-1)
2    csv_file_ptr%=preserved_start_of_data_ptr%
	    merge%=�

!    � task_ok%, �msg_0("OK7")
  �
0  �icon_write(main%,Icon_ToGo%,�(rec_togo%))

'  �icon_write(main%,Icon_Done%,"1")
&  �icon_unhide(main%,Icon_ToProc%)
(  �icon_unhide(main%,Icon_RecsProc%)
(  �icon_unhide(main%,Icon_PrintAll%)
$  �icon_unhide(main%,Icon_ToGo%)
$  �icon_unhide(main%,Icon_Done%)
%  �icon_unhide(main%,Icon_Print%)
$  �icon_unhide(main%,Icon_Next%)
$  �icon_unhide(main%,Icon_Edit%)
&  �icon_hide(main%,Icon_Headings%)
&  �icon_hide(main%,Icon_DispHead%)
(  �icon_hide(main%,Icon_StartMerge%)
9  !win_buff%=main%:ș"Wimp_GetWindowState",,win_buff%
,  win_buff%!8=win_buff%!16 - Window_Big%
$  ș"Wimp_OpenWindow",,win_buff%
�
�done_record
�enable_merging_buttons
�hourglass_off
 �
!
"
#��done_record
$rec_togo%-=1
%rec_done%+=1
&.�icon_write(main%,Icon_ToGo%,�(rec_togo%))
'.�icon_write(main%,Icon_Done%,�(rec_done%))
(�
)
*
+��reply_print
,� command$
-(  command$=�task_rtoz(task_buff%+36)
.  Ȏ command$ �
/#    � "PrintDone" : �print_done
0$    � "PrintError": �print_error
1  �
2�
3
4
5��print_error
6E� No printer driver was loaded if we get here.  If we are doing a
7<� print all records, then we should stop the print here.
8  printing%=�
9  gotprintreply%=�
:
;$  $(error_buff%+4)=�msg_0("OK9")
<K  ș "Wimp_ReportError", error_buff%, %10001, �msg_1("MS",�msg_0("ID"))
=
>&  �pending_close% � �host_shutdown
?  �enable_merging_buttons
@)  �icon_unhide(main%, Icon_PrintAll%)
A
B�
C
D
E��print_done
F"� Print went OK if we get here
Gprinting%=�
H�pending_close% �
I        �host_shutdown
J�
K.        �icon_set(main%,Icon_PrintAll%) �
L%                � PROCdone_record
M&                �merge_next_record
N
O&                � !!!!!!!!!!!!!!!!
P.                � Now done after wimp_poll
Q1                �  PROCsend("Print",T_Print%)
R        
S-                � Set reply variable TRUE
T$                gotprintreply%=�
U&                � !!!!!!!!!!!!!!!!
V
W                printing%=�
X
        �
Y+                �enable_merging_buttons
Z
        �
[�
\�
]
^� Error library
_
`��error_initialise
a� error_buff% 256
b�
c
d��error
e� r$,r%
f	r$=�$
g!�=task_ok% � �=task_fatal% �
h r%=�r$,"in "+�Char_Quote%)
i �r%<>0 r$=�r$,r%-1)
j�
k
Ȏ � �
l#�    task_ok%: �error_box(r$,1)
m#� task_fatal%: �error_box(r$,2)
nL       : �error_box("Unexpected error :- "+r$+" ("+�(�)+"/"+�(�)+")",3)
o�
p�
q
r��error_box(r$,error_flag%)
s� r%
tș"Wimp_CreateMenu",,-1
u)!error_buff%=�:$(error_buff%+4)=r$+�0
v?ș"Wimp_ReportError",error_buff%,error_flag%,task_id$ � ,r%
w �r%=2 � � �:�host_shutdown:�
x�
y:
z� Heap library
{:
|��heap_free(ident$,block%)
}� r0%,f%
~�block%<>0 �
 block%-=4
�E � PROCtrace_0("","PROCheap_free("+ident$+",&"+STR$~(block%)+")")
�V �!block%<>�heap_ident_num(ident$) � task_ok%,"Corrupt "+ident$+" block not freed"
�/ ș"XOS_Heap",3,heap_start%,block% � r0%;f%
�C �(f% � 1) � task_fatal%,"Block "+ident$+": "+�task_rtoz(r0%+4)
��
��
�:
�ݤheap_claim(ident$,size%)
�� p%
�7� need to add 4 extra bytes 'cos if the block needs
�4� extending then the first word gets trampled on
�size%+=4
�.ȕ size%>=�heap_freespace �heap_increase:�
�)� claim the block and store the ident
�+ș"OS_Heap",2,heap_start%,,size% � ,,p%
�!p%=�heap_ident_num(ident$)
�	p%+=4
�=p%
�:
���heap_increase
�� slot%
�#ș"Wimp_SlotSize",-1,-1 � slot%
�*ș"Wimp_SlotSize",slot%+heap_psize%,-1
��heap_size%=0 �
�+ ș"OS_Heap",0,heap_start%,,heap_psize%
��
�+ ș"OS_Heap",5,heap_start%,,heap_psize%
��
�heap_size%+=heap_psize%
��
�:
�ݤheap_ident_num(v$)
�� i%,j%
�
�i%=0 � 3
�# j%=j% � �(�v$,i%+1,1))<<(i%*8)
��
�=j%
�:
�ݤheap_freespace
�� f%
��heap_size%=0 � =0
�$ș"OS_Heap",1,heap_start% � ,,f%
�=f%
�:
�� Window library
�:
���win_initialise
�� win_buff% 2048
�win_template$=""
��
�:
�3��win_load_create(f$,n$,sprite_pool%,� handle%)
�#�win_load(f$,n$,win_buff%,2048)
�win_buff%!64=sprite_pool%
�"�win_create(win_buff%,handle%)
��
�:
�!��win_load(f$,n$,buf%,limit%)
�&�   f$ - filename of template file
�%�   n$ - name of template to load
�N� buf% - buffer which needs to be big enough to hold the window definition
�M�        AND the indirected data, due to the way Wimp_LoadTemplate works.
��
�A� PROCwin_load will automatically dimension enough memory for
�� the indirected data.
�
� ws_buf%
�� size%
�� data%
�� found%
�� s%,f%
�
�f$<>"" �
�" �win_sizes(f$,n$,size%,data%)
��
�- �win_sizes(win_template$,n$,size%,data%)
��
�v�limit%<(size%+data%) � task_ok%,"Buffer not big enough for '"+n$+"' - "+�(size%)+" + "+�(data%)+" bytes required"
�%�f$<>"" ș"Wimp_OpenTemplate",,f$
�� data%<>0 �
� � ws_buf% data%
�S ș"XWimp_LoadTemplate",,buf%,ws_buf%,ws_buf%+data%,-1,n$,0 � s%,,,,,,found%;f%
��
�A ș"XWimp_LoadTemplate",,buf%,0,0,-1,n$,0 � s%,,,,,,found%;f%
��
�"�f$<>"" ș"Wimp_CloseTemplate"
�/�(f%�1) � task_ok%,n$+": "+�task_rtoz(s%+4)
�6�found%=0 � task_ok%,"Template '"+n$+"' not found"
��
�:
� ��win_create(buf%,� handle%)
�4�    buf% - buffer holding the window definition
�,� handle% - handle of the created window
�)ș"Wimp_CreateWindow",,buf% � handle%
��
�:
�&��win_sizes(f$,n$,� size%,� data%)
�� i%
�� file%
�
� ptr%
�
� offset%
�� type%
�� ident$
�� num_icons%
�file%=�(f$)
�size%=0
�data%=0
�ptr%=16
��
� �#file%=ptr%
� offset%=�win_word(file%)
� � offset%<>0 �
�  �#file%=ptr%+8
�  type%=�win_word(file%)
�  ident$=�win_string(file%)
�  ptr%+=24
�  �type%=1 �
�   �ident$=n$ �
�    �#file%=offset%+84
�#    num_icons%=�win_word(file%)
�'    data%=�win_title(file%,offset%)
�A    �num_icons%<>0 data%+=�win_icon(file%,num_icons%,offset%)
�     size%=88+(num_icons%*32)
�/    offset%=0:� just to get out of the loop
�   �
�  �
� �
�� offset%=0
��#file%
��
:
ݤwin_word(h%)
/=�#h%+(�#h% << 8)+(�#h% << 16)+(�#h% << 24)
:
ݤwin_string(h%)
� s$,c%
�
 c%=�#h%
 �c%>31 s$+=�(c%)
	� c%<32

=s$
:
ݤwin_title(file%,offset%)

� v%
�#file%=offset%+28
v%=�win_word(file%)
� (v% � 1<<31) �
 � (v% � 1<<26) �
4  =�win_isd(file%,offset%+56,offset%+72,offset%)
 �
�
 � (v% � 1) �
4  =�win_isd(file%,offset%+56,offset%+72,offset%)
 �
�
=0
:
"ݤwin_icon(file%,num%,offset%)
� i%,j%
j%=0
�i%=0 � num%-1
H j%+=�win_isd(file%,offset%+88+i%*32+16,offset%+88+i%*32+20,offset%)
 �
!=j%
":
#$ݤwin_isd(file%,o1%,o2%,offset%)
$� v%,ist%,size%,i%
%�#file%=o1%
&v%=�win_word(file%)
'*� even if an icon is marked as deleted
(� it must be allowed for!
)i%=(v% � %100000000)
*ist%=(v% � 3) + (i% >> 6)
+
Ȏ ist% �
,�   0: size%=0
-�   1: size%=0
.�   2: size%=0
/�   3: size%=0
0�   4: size%=0
1� 5,7: �#file%=o2%+4
2!          v%=�win_word(file%)
3          �v%=-1 �
4           size%=0
5          �
6!           �#file%=offset%+v%
7,           size%=�(�win_string(file%))+1
8          �
9          �#file%=o2%+8
:%          size%+=�win_word(file%)
;�   6: �#file%=o2%+8
<$          size%=�win_word(file%)
=�
>
=size%
?:
@� Icon library
A:
B��icon_initialise
C� icon_buffer% 256
D�
E:
F��icon_hide(a%,b%)
G!icon_buffer%=a%
Hicon_buffer%!4=b%
I!icon_buffer%!8=(1<<7)+(1<<23)
J"icon_buffer%!12=(1<<7)+(1<<23)
K'ș"Wimp_SetIconState",,icon_buffer%
L�
M:
N��icon_write(a%,b%,s$)
O!icon_buffer%=a%
Picon_buffer%!4=b%
Q'ș"Wimp_GetIconState",,icon_buffer%
R �(�(s$)+1)>icon_buffer%!36 �
S3 � task_fatal%,"'"+s$+"' won't fit icon "+�(b%)
T�
U$(icon_buffer%!28)=s$
V&icon_buffer%!8=0:icon_buffer%!12=0
W'ș"Wimp_SetIconState",,icon_buffer%
X�
Y:
Z��icon_shade(a%,b%)
[!icon_buffer%=a%
\icon_buffer%!4=b%
]icon_buffer%!8=1<<22
^icon_buffer%!12=1<<22
_'ș"Wimp_SetIconState",,icon_buffer%
`�
a:
bݤicon_set(a%,b%)
c!icon_buffer%=a%
dicon_buffer%!4=b%
e'ș"Wimp_GetIconState",,icon_buffer%
f%=((icon_buffer%!24 � (1<<21))<>0)
g:
h��icon_unhide(a%,b%)
i!icon_buffer%=a%
jicon_buffer%!4=b%
kicon_buffer%!8=0
licon_buffer%!12=1<<23
m'ș"Wimp_SetIconState",,icon_buffer%
n�
o:
p��icon_unshade(a%,b%)
q!icon_buffer%=a%
ricon_buffer%!4=b%
sicon_buffer%!8=0
ticon_buffer%!12=1<<22
u'ș"Wimp_SetIconState",,icon_buffer%
v�
w:
x� Task library
y:
z� �task_initialise(n$)
{task_id$=n$
|� task_buff% 256
}� RiscOS%>=300 �
~'  task_buff%!0=Message_MM_Document%
(  task_buff%!4=Message_WindowClosed%
�)  task_buff%!8=Message_TaskCloseDown%
�$  task_buff%!12=Message_PreQuit%
�%  task_buff%!16=Message_RAMFetch%
�%  task_buff%!20=Message_DataLoad%
�%  task_buff%!24=Message_DataSave%
�&  task_buff%!28=Message_Impulse_1%
�&  task_buff%!32=Message_Impulse_2%
�!  task_buff%!36=Message_Quit%
�U  ș"Wimp_Initialise",310,&4B534154,n$,task_buff%+36 � wimp_version%,task_handle%
��
�H  ș "Wimp_Initialise",200,&4B534154,n$ � wimp_version%,task_handle%
��
�#�("Set MailMerge$Running TRUE")
�task_action%=0
�
�*� !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
�%� task_mask%=1:REM no null events
�
�5task_mask%=0           : � I want my null events!
�
�*� !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
�
�task_ok%=254
�
�task_fatal%=253
��
�:
���task_shutdown
�ș"Wimp_CloseDown"
� �("UnSet MailMerge$Running")
��
��
�:
�ݤtask_rtoz(p%)
�� p$
�
ȕ ?p%<>0
� p$+=�(?p%)
�
 p%+=1
��
�=p$
�:
�� Message library
�:
���msg_initialise(N$)
�� c%,c$,i%
�c%=�(N$)
�*�c%=0 � 0, "Cannot find messages file"
�ms_tags%=0
��hourglass_on
�ȕ �(�#c%)
� c$=�#c%
� �c$<>"" �
�  �c$,1)<>"#" �
�   �c$,":")<>0 ms_tags%+=1
�  �
� �
��
��ms_tags%<>0 �
�0 � ms_text$(ms_tags%-1),ms_tags$(ms_tags%-1)
� �#c%=0
�	 i%=0
�
 ȕ ��#c%
�
  c$=�#c%
�  �c$<>"" �
�   �c$,1)<>"#" �
�$    ms_tags$(i%)=�c$,�c$,":")-1)
�$    ms_text$(i%)=�c$,�c$,":")+1)
�
    i%+=1
�   �
�  �
� �
��
��#c%
��hourglass_off
��
�:
�ݤmsg_0(T$)
�=�msg_4(T$,"","","","")
�:
�ݤmsg_1(T$,S$)
�=�msg_4(T$,S$,"","","")
�;
�ݤmsg_2(T$,S0$,S1$)
�=�msg_4(T$,S0$,S1$,"","")
�:
�ݤmsg_4(T$,S0$,S1$,S2$,S3$)
�� i%,f%
��ms_tags%=0 �
� =T$
��
� �i%=0 � ms_tags%-1
�  �T$=ms_tags$(i%) �
�   T$=ms_text$(i%)
�   f%=�T$,"%0")
�(   �f%<>0 T$=�T$,f%-1)+S0$+�T$,f%+2)
�   f%=�T$,"%1")
�(   �f%<>0 T$=�T$,f%-1)+S1$+�T$,f%+2)
�   f%=�T$,"%2")
�(   �f%<>0 T$=�T$,f%-1)+S2$+�T$,f%+2)
�   f%=�T$,"%3")
�(   �f%<>0 T$=�T$,f%-1)+S3$+�T$,f%+2)
�   i%=ms_tags%
�  �
� �
��
�=T$
�:
���hourglass_on
�ș"Hourglass_On"
�hourglass_count%+=1
��
�:
���hourglass_off
�ș"Hourglass_Off"
�hourglass_count%-=1
��
�:
���open_csv_file
�� csv_file$="" �
�!csv_file_handle%=�(csv_file$)
��
�:
���close_csv_file
��csv_file_handle%=0 �
��#csv_file_handle%
�csv_file_handle%=0
��
�


� �consts
appdir$="<MailMerge$Dir>"
Icon_ToProc%=1
Icon_RecsProc%=2
Icon_Headings%=3
Icon_PrintAll%=4
Icon_CSV%=5
Icon_ToGo%=6
	Icon_Done%=7

Icon_Print%=8
Icon_document%=10
Icon_Next%=11

Icon_Edit%=12
Icon_DispHead%=13
Icon_StartMerge%=14
Icon_DropHere%=15

Window_Small%=236
Window_Big%=360

T_GetField%=0
T_GetData%=1
T_GetTimeDate%=2
T_Print%=3
T_Merge%=4
T_CloseDown%=7

Impulse_Command%=&200
Impulse_Request%=&201
Impulse_Reply%=&202
Impulse_SendData%=&203
 Impulse_ReceiveData%=&204
!Impulse_DeferredReply%=&205
"
#DDF_Type%=&D93
$CSV_Type%=&DFE
%
&Message_Quit%=0
'Message_DataSave%=1
(Message_DataLoad%=3
)Message_RAMFetch%=6
*Message_PreQuit%=8
+!Message_TaskCloseDown%=&400C3
, Message_WindowClosed%=&400CB
-Message_Impulse_1%=&80E18
.Message_Impulse_2%=&80E19
/Message_MM_Document%=&82140
0
1Char_Space%=32
2Char_Quote%=34
3Char_Comma%=44
4Char_LF%=10
5Char_CR%=13
6Char_Slash%=92
7Char_HardSpace%=160
8�
9
:� �readopsys
;%ș "OS_Byte",129,0,255 � ,RiscOS%
<-� RiscOS%<163 � RiscOS%=200 � RiscOS%=300
=�
>
�
00000000  0d 00 01 11 f4 20 3e 20  21 52 75 6e 49 6d 61 67  |..... > !RunImag|
00000010  65 0d 00 02 04 0d 00 03  21 ee 20 85 20 85 20 a2  |e.......!. . . .|
00000020  20 9f 2c f6 24 2b 22 20  61 74 20 6c 69 6e 65 20  | .,.$+" at line |
00000030  22 2b c3 28 9e 29 0d 00  04 04 0d 00 05 0b f2 63  |"+.(.).........c|
00000040  6f 6e 73 74 73 0d 00 06  16 68 6f 75 72 67 6c 61  |onsts....hourgla|
00000050  73 73 5f 63 6f 75 6e 74  25 3d 30 0d 00 07 11 f2  |ss_count%=0.....|
00000060  68 6f 75 72 67 6c 61 73  73 5f 6f 6e 0d 00 08 04  |hourglass_on....|
00000070  0d 00 09 36 f4 20 46 69  6e 64 20 6f 75 74 20 77  |...6. Find out w|
00000080  68 61 74 20 74 68 65 20  63 75 72 72 65 6e 74 6c  |hat the currentl|
00000090  79 20 73 65 6c 65 63 74  65 64 20 63 6f 75 6e 74  |y selected count|
000000a0  72 79 20 69 73 2e 0d 00  0a 14 de 20 63 6f 75 6e  |ry is...... coun|
000000b0  74 72 79 62 75 66 66 20  36 34 0d 00 0b 04 0d 00  |trybuff 64......|
000000c0  0c 0e f2 72 65 61 64 6f  70 73 79 73 0d 00 0d 25  |...readopsys...%|
000000d0  c8 99 20 22 4f 53 5f 42  79 74 65 22 2c 20 37 30  |.. "OS_Byte", 70|
000000e0  2c 20 31 32 37 20 b8 20  2c 63 6f 75 6e 74 72 79  |, 127 . ,country|
000000f0  25 0d 00 0e 4e c8 99 20  22 4f 53 5f 53 65 72 76  |%...N.. "OS_Serv|
00000100  69 63 65 43 61 6c 6c 22  2c 20 2c 20 26 34 33 2c  |iceCall", , &43,|
00000110  20 32 2c 20 63 6f 75 6e  74 72 79 25 20 2c 20 63  | 2, country% , c|
00000120  6f 75 6e 74 72 79 62 75  66 66 2c 20 32 35 36 20  |ountrybuff, 256 |
00000130  b8 20 2c 2c 2c 2c 2c 20  6c 65 6e 67 74 68 25 0d  |. ,,,,, length%.|
00000140  00 0f 1a 63 6f 75 6e 74  72 79 62 75 66 66 3f 6c  |...countrybuff?l|
00000150  65 6e 67 74 68 25 3d 31  33 0d 00 10 04 0d 00 11  |ength%=13.......|
00000160  2d f2 6d 73 67 5f 69 6e  69 74 69 61 6c 69 73 65  |-.msg_initialise|
00000170  28 61 70 70 64 69 72 24  2b 22 2e 22 2b 24 63 6f  |(appdir$+"."+$co|
00000180  75 6e 74 72 79 62 75 66  66 29 0d 00 12 22 f2 74  |untrybuff)...".t|
00000190  61 73 6b 5f 69 6e 69 74  69 61 6c 69 73 65 28 a4  |ask_initialise(.|
000001a0  6d 73 67 5f 30 28 22 49  44 22 29 29 0d 00 13 14  |msg_0("ID"))....|
000001b0  f2 69 63 6f 6e 5f 69 6e  69 74 69 61 6c 69 73 65  |.icon_initialise|
000001c0  0d 00 14 13 f2 77 69 6e  5f 69 6e 69 74 69 61 6c  |.....win_initial|
000001d0  69 73 65 0d 00 15 15 f2  65 72 72 6f 72 5f 69 6e  |ise.....error_in|
000001e0  69 74 69 61 6c 69 73 65  0d 00 16 0f f2 69 6e 69  |itialise.....ini|
000001f0  74 69 61 6c 69 73 65 0d  00 17 04 0d 00 18 2c e0  |tialise.......,.|
00000200  3d e0 2b 38 30 39 36 3a  f4 20 67 69 76 65 20 75  |=.+8096:. give u|
00000210  73 20 38 4b 20 6f 66 20  66 6c 6f 61 74 69 6e 67  |s 8K of floating|
00000220  20 6d 65 6d 6f 72 79 0d  00 19 2b 68 65 61 70 5f  | memory...+heap_|
00000230  65 6e 64 25 3d 93 3a f4  20 77 68 65 72 65 20 74  |end%=.:. where t|
00000240  68 65 20 6d 65 6d 6f 72  79 20 6e 6f 77 20 65 6e  |he memory now en|
00000250  64 73 0d 00 1a 0c d3 3d  e0 2b 38 30 39 36 0d 00  |ds.....=.+8096..|
00000260  1b 2d 68 65 61 70 5f 73  74 61 72 74 25 3d 93 3a  |.-heap_start%=.:|
00000270  f4 20 77 68 65 72 65 20  74 68 65 20 68 65 61 70  |. where the heap|
00000280  20 77 69 6c 6c 20 73 74  61 72 74 0d 00 1c 24 68  | will start...$h|
00000290  65 61 70 5f 73 69 7a 65  25 3d 68 65 61 70 5f 65  |eap_size%=heap_e|
000002a0  6e 64 25 2d 68 65 61 70  5f 73 74 61 72 74 25 0d  |nd%-heap_start%.|
000002b0  00 1d 27 c8 99 22 4f 53  5f 52 65 61 64 4d 65 6d  |..'.."OS_ReadMem|
000002c0  4d 61 70 49 6e 66 6f 22  20 b8 20 68 65 61 70 5f  |MapInfo" . heap_|
000002d0  70 73 69 7a 65 25 0d 00  1e 04 0d 00 1f 14 e7 68  |psize%.........h|
000002e0  65 61 70 5f 73 69 7a 65  25 3c 3e 30 20 8c 0d 00  |eap_size%<>0 ...|
000002f0  20 2a 20 c8 99 22 4f 53  5f 48 65 61 70 22 2c 30  | * .."OS_Heap",0|
00000300  2c 68 65 61 70 5f 73 74  61 72 74 25 2c 2c 68 65  |,heap_start%,,he|
00000310  61 70 5f 73 69 7a 65 25  0d 00 21 05 cc 0d 00 22  |ap_size%..!...."|
00000320  13 20 f2 68 65 61 70 5f  69 6e 63 72 65 61 73 65  |. .heap_increase|
00000330  0d 00 23 05 cd 0d 00 24  04 0d 00 25 12 f2 68 6f  |..#....$...%..ho|
00000340  75 72 67 6c 61 73 73 5f  6f 66 66 0d 00 26 0e ee  |urglass_off..&..|
00000350  20 85 20 f2 65 72 72 6f  72 0d 00 27 04 0d 00 28  | . .error..'...(|
00000360  05 f5 0d 00 29 38 20 c8  99 20 22 57 69 6d 70 5f  |....)8 .. "Wimp_|
00000370  50 6f 6c 6c 22 2c 74 61  73 6b 5f 6d 61 73 6b 25  |Poll",task_mask%|
00000380  2c 74 61 73 6b 5f 62 75  66 66 25 20 b8 20 74 61  |,task_buff% . ta|
00000390  73 6b 5f 61 63 74 69 6f  6e 25 0d 00 2a 78 20 c8  |sk_action%..*x .|
000003a0  99 20 22 49 6d 70 75 6c  73 65 5f 44 65 63 6f 64  |. "Impulse_Decod|
000003b0  65 22 2c 74 61 73 6b 5f  61 63 74 69 6f 6e 25 2c  |e",task_action%,|
000003c0  74 61 73 6b 5f 62 75 66  66 25 2c 2c 2c 2c 6d 65  |task_buff%,,,,me|
000003d0  74 68 6f 64 5f 74 61 62  6c 65 25 2c 74 61 73 6b  |thod_table%,task|
000003e0  5f 68 61 6e 64 6c 65 25  20 b8 20 74 61 73 6b 5f  |_handle% . task_|
000003f0  61 63 74 69 6f 6e 25 2c  2c 2c 2c 2c 74 6f 6b 65  |action%,,,,,toke|
00000400  6e 25 2c 70 61 72 61 6d  73 25 2c 6f 62 6a 65 63  |n%,params%,objec|
00000410  74 25 0d 00 2b 04 0d 00  2c 16 20 c8 8e 20 74 61  |t%..+...,. .. ta|
00000420  73 6b 5f 61 63 74 69 6f  6e 25 20 ca 0d 00 2d 12  |sk_action% ...-.|
00000430  20 20 20 c9 20 30 20 3a  20 f2 6e 75 6c 6c 0d 00  |   . 0 : .null..|
00000440  2e 2c 20 20 20 c9 20 32  20 3a 20 c8 99 22 57 69  |.,   . 2 : .."Wi|
00000450  6d 70 5f 4f 70 65 6e 57  69 6e 64 6f 77 22 2c 2c  |mp_OpenWindow",,|
00000460  74 61 73 6b 5f 62 75 66  66 25 0d 00 2f 1a 20 20  |task_buff%../.  |
00000470  20 c9 20 33 20 3a 20 e7  20 70 72 69 6e 74 69 6e  | . 3 : . printin|
00000480  67 25 20 8c 0d 00 30 22  20 20 20 20 20 20 20 20  |g% ...0"        |
00000490  20 20 20 20 20 20 70 65  6e 64 69 6e 67 5f 63 6c  |      pending_cl|
000004a0  6f 73 65 25 3d b9 0d 00  31 11 20 20 20 20 20 20  |ose%=...1.      |
000004b0  20 20 20 20 20 20 cc 0d  00 32 20 20 20 20 20 20  |      ...2      |
000004c0  20 20 20 20 20 20 20 20  20 f2 68 6f 73 74 5f 73  |         .host_s|
000004d0  68 75 74 64 6f 77 6e 0d  00 33 11 20 20 20 20 20  |hutdown..3.     |
000004e0  20 20 20 20 20 20 20 cd  0d 00 34 19 20 20 20 c9  |       ...4.   .|
000004f0  20 36 20 3a 20 f2 6d 6f  75 73 65 5f 63 6c 69 63  | 6 : .mouse_clic|
00000500  6b 0d 00 35 18 20 20 20  c9 20 39 20 3a 20 f2 6d  |k..5.   . 9 : .m|
00000510  65 6e 75 5f 63 6c 69 63  6b 0d 00 36 19 20 20 20  |enu_click..6.   |
00000520  c9 20 31 37 2c 31 38 20  3a 20 f2 72 65 63 65 69  |. 17,18 : .recei|
00000530  76 65 0d 00 37 2c 20 20  20 c9 20 49 6d 70 75 6c  |ve..7,   . Impul|
00000540  73 65 5f 43 6f 6d 6d 61  6e 64 25 2c 20 49 6d 70  |se_Command%, Imp|
00000550  75 6c 73 65 5f 52 65 71  75 65 73 74 25 3a 0d 00  |ulse_Request%:..|
00000560  38 29 20 20 20 20 20 f2  63 6f 6d 6d 61 6e 64 28  |8)     .command(|
00000570  74 6f 6b 65 6e 25 2c 70  61 72 61 6d 73 25 2c 6f  |token%,params%,o|
00000580  62 6a 65 63 74 25 29 0d  00 39 18 20 20 20 c9 20  |bject%)..9.   . |
00000590  49 6d 70 75 6c 73 65 5f  52 65 70 6c 79 25 3a 0d  |Impulse_Reply%:.|
000005a0  00 3a 17 20 20 20 20 20  f2 72 65 70 6c 79 28 74  |.:.     .reply(t|
000005b0  6f 6b 65 6e 25 29 0d 00  3b 1b 20 20 20 c9 20 49  |oken%)..;.   . I|
000005c0  6d 70 75 6c 73 65 5f 53  65 6e 64 44 61 74 61 25  |mpulse_SendData%|
000005d0  3a 0d 00 3c 2b 20 20 20  20 20 f2 73 65 6e 64 5f  |:..<+     .send_|
000005e0  64 61 74 61 28 74 6f 6b  65 6e 25 2c 70 61 72 61  |data(token%,para|
000005f0  6d 73 25 2c 6f 62 6a 65  63 74 25 29 0d 00 3d 06  |ms%,object%)..=.|
00000600  20 cb 0d 00 3e 04 0d 00  3f 07 fd 20 a3 0d 00 40  | ...>...?.. ...@|
00000610  05 e0 0d 00 41 04 0d 00  42 04 0d 00 43 04 0d 00  |....A...B...C...|
00000620  44 11 dd 20 f2 69 6e 69  74 69 61 6c 69 73 65 0d  |D.. .initialise.|
00000630  00 45 39 c8 99 22 49 6d  70 75 6c 73 65 5f 49 6e  |.E9.."Impulse_In|
00000640  69 74 69 61 6c 69 73 65  22 2c 30 2c 74 61 73 6b  |itialise",0,task|
00000650  5f 68 61 6e 64 6c 65 25  2c a4 6d 73 67 5f 30 28  |_handle%,.msg_0(|
00000660  22 49 44 22 29 2c 2d 31  0d 00 46 39 f2 77 69 6e  |"ID"),-1..F9.win|
00000670  5f 6c 6f 61 64 5f 63 72  65 61 74 65 28 61 70 70  |_load_create(app|
00000680  64 69 72 24 2b 22 2e 54  65 6d 70 6c 61 74 65 73  |dir$+".Templates|
00000690  22 2c 22 6d 61 69 6e 22  2c 31 2c 6d 61 69 6e 25  |","main",1,main%|
000006a0  29 0d 00 47 22 f2 69 63  6f 6e 5f 68 69 64 65 28  |)..G".icon_hide(|
000006b0  6d 61 69 6e 25 2c 49 63  6f 6e 5f 54 6f 50 72 6f  |main%,Icon_ToPro|
000006c0  63 25 29 0d 00 48 24 f2  69 63 6f 6e 5f 68 69 64  |c%)..H$.icon_hid|
000006d0  65 28 6d 61 69 6e 25 2c  49 63 6f 6e 5f 52 65 63  |e(main%,Icon_Rec|
000006e0  73 50 72 6f 63 25 29 0d  00 49 24 f2 69 63 6f 6e  |sProc%)..I$.icon|
000006f0  5f 68 69 64 65 28 6d 61  69 6e 25 2c 49 63 6f 6e  |_hide(main%,Icon|
00000700  5f 50 72 69 6e 74 41 6c  6c 25 29 0d 00 4a 20 f2  |_PrintAll%)..J .|
00000710  69 63 6f 6e 5f 68 69 64  65 28 6d 61 69 6e 25 2c  |icon_hide(main%,|
00000720  49 63 6f 6e 5f 54 6f 47  6f 25 29 0d 00 4b 20 f2  |Icon_ToGo%)..K .|
00000730  69 63 6f 6e 5f 68 69 64  65 28 6d 61 69 6e 25 2c  |icon_hide(main%,|
00000740  49 63 6f 6e 5f 44 6f 6e  65 25 29 0d 00 4c 21 f2  |Icon_Done%)..L!.|
00000750  69 63 6f 6e 5f 68 69 64  65 28 6d 61 69 6e 25 2c  |icon_hide(main%,|
00000760  49 63 6f 6e 5f 50 72 69  6e 74 25 29 0d 00 4d 20  |Icon_Print%)..M |
00000770  f2 69 63 6f 6e 5f 68 69  64 65 28 6d 61 69 6e 25  |.icon_hide(main%|
00000780  2c 49 63 6f 6e 5f 4e 65  78 74 25 29 0d 00 4e 20  |,Icon_Next%)..N |
00000790  f2 69 63 6f 6e 5f 68 69  64 65 28 6d 61 69 6e 25  |.icon_hide(main%|
000007a0  2c 49 63 6f 6e 5f 45 64  69 74 25 29 0d 00 4f 26  |,Icon_Edit%)..O&|
000007b0  f2 69 63 6f 6e 5f 68 69  64 65 28 6d 61 69 6e 25  |.icon_hide(main%|
000007c0  2c 49 63 6f 6e 5f 53 74  61 72 74 4d 65 72 67 65  |,Icon_StartMerge|
000007d0  25 29 0d 00 50 23 f2 69  63 6f 6e 5f 77 72 69 74  |%)..P#.icon_writ|
000007e0  65 28 6d 61 69 6e 25 2c  49 63 6f 6e 5f 43 53 56  |e(main%,Icon_CSV|
000007f0  25 2c 22 22 29 0d 00 51  28 f2 69 63 6f 6e 5f 77  |%,"")..Q(.icon_w|
00000800  72 69 74 65 28 6d 61 69  6e 25 2c 49 63 6f 6e 5f  |rite(main%,Icon_|
00000810  64 6f 63 75 6d 65 6e 74  25 2c 22 22 29 0d 00 52  |document%,"")..R|
00000820  25 f2 69 63 6f 6e 5f 73  68 61 64 65 28 6d 61 69  |%.icon_shade(mai|
00000830  6e 25 2c 49 63 6f 6e 5f  44 69 73 70 48 65 61 64  |n%,Icon_DispHead|
00000840  25 29 0d 00 53 37 21 77  69 6e 5f 62 75 66 66 25  |%)..S7!win_buff%|
00000850  3d 6d 61 69 6e 25 3a c8  99 22 57 69 6d 70 5f 47  |=main%:.."Wimp_G|
00000860  65 74 57 69 6e 64 6f 77  53 74 61 74 65 22 2c 2c  |etWindowState",,|
00000870  77 69 6e 5f 62 75 66 66  25 0d 00 54 2c 77 69 6e  |win_buff%..T,win|
00000880  5f 62 75 66 66 25 21 38  3d 77 69 6e 5f 62 75 66  |_buff%!8=win_buf|
00000890  66 25 21 31 36 20 2d 20  57 69 6e 64 6f 77 5f 53  |f%!16 - Window_S|
000008a0  6d 61 6c 6c 25 0d 00 55  22 c8 99 22 57 69 6d 70  |mall%..U".."Wimp|
000008b0  5f 4f 70 65 6e 57 69 6e  64 6f 77 22 2c 2c 77 69  |_OpenWindow",,wi|
000008c0  6e 5f 62 75 66 66 25 0d  00 56 04 0d 00 57 16 de  |n_buff%..V...W..|
000008d0  20 6d 65 74 68 6f 64 5f  74 61 62 6c 65 25 20 36  | method_table% 6|
000008e0  34 0d 00 58 14 50 25 3d  6d 65 74 68 6f 64 5f 74  |4..X.P%=method_t|
000008f0  61 62 6c 65 25 0d 00 59  0b 5b 20 4f 50 54 20 30  |able%..Y.[ OPT 0|
00000900  0d 00 5a 3d 20 20 20 45  51 55 44 20 30 20 20 20  |..Z=   EQUD 0   |
00000910  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000920  20 20 20 20 3b 20 6d 65  74 68 6f 64 20 73 74 72  |    ; method str|
00000930  75 63 74 75 72 65 20 66  6f 72 6d 61 74 0d 00 5b  |ucture format..[|
00000940  2b 20 20 20 45 51 55 44  20 30 20 20 20 20 20 20  |+   EQUD 0      |
00000950  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000960  20 3b 20 66 6c 61 67 73  0d 00 5c 25 20 20 20 45  | ; flags..\%   E|
00000970  51 55 44 20 54 5f 47 65  74 46 69 65 6c 64 25 20  |QUD T_GetField% |
00000980  20 20 20 20 20 20 3b 20  74 6f 6b 65 6e 0d 00 5d  |      ; token..]|
00000990  29 20 20 20 45 51 55 53  20 22 47 65 74 46 69 65  |)   EQUS "GetFie|
000009a0  6c 64 22 2b bd 30 20 20  20 20 20 20 20 20 3b 20  |ld"+.0        ; |
000009b0  6d 65 74 68 6f 64 0d 00  5e 29 20 20 20 45 51 55  |method..^)   EQU|
000009c0  53 20 bd 30 20 20 20 20  20 20 20 20 20 20 20 20  |S .0            |
000009d0  20 20 20 20 20 20 20 3b  20 73 79 6e 74 61 78 0d  |       ; syntax.|
000009e0  00 5f 0c 20 20 20 41 4c  49 47 4e 0d 00 60 04 0d  |._.   ALIGN..`..|
000009f0  00 61 04 0d 00 62 0d 20  20 20 45 51 55 44 20 30  |.a...b.   EQUD 0|
00000a00  0d 00 63 25 20 20 20 45  51 55 44 20 54 5f 43 6c  |..c%   EQUD T_Cl|
00000a10  6f 73 65 44 6f 77 6e 25  20 20 20 20 20 20 3b 20  |oseDown%      ; |
00000a20  74 6f 6b 65 6e 0d 00 64  29 20 20 20 45 51 55 53  |token..d)   EQUS|
00000a30  20 22 43 6c 6f 73 65 44  6f 77 6e 22 2b bd 30 20  | "CloseDown"+.0 |
00000a40  20 20 20 20 20 20 3b 20  6d 65 74 68 6f 64 0d 00  |      ; method..|
00000a50  65 29 20 20 20 45 51 55  53 20 bd 30 20 20 20 20  |e)   EQUS .0    |
00000a60  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00000a70  20 73 79 6e 74 61 78 0d  00 66 0c 20 20 20 41 4c  | syntax..f.   AL|
00000a80  49 47 4e 0d 00 67 05 5d  0d 00 68 05 f4 0d 00 69  |IGN..g.]..h....i|
00000a90  0b 6d 65 6e 75 25 3d 30  0d 00 6a 0c 6d 65 72 67  |.menu%=0..j.merg|
00000aa0  65 25 3d a3 0d 00 6b 0f  70 72 69 6e 74 69 6e 67  |e%=...k.printing|
00000ab0  25 3d a3 0d 00 6c 4d 64  69 65 70 6c 65 61 73 65  |%=...lMdieplease|
00000ac0  25 3d a3 20 20 20 20 20  20 3a 20 f4 20 54 52 55  |%=.      : . TRU|
00000ad0  45 20 69 66 20 49 6d 70  72 65 73 73 69 6f 6e 20  |E if Impression |
00000ae0  73 65 6e 64 73 20 75 73  20 61 20 77 69 6e 64 6f  |sends us a windo|
00000af0  77 20 63 6c 6f 73 65 64  20 6d 65 73 73 61 67 65  |w closed message|
00000b00  0d 00 6d 22 70 72 65 73  65 72 76 65 64 5f 73 74  |..m"preserved_st|
00000b10  61 72 74 5f 6f 66 5f 64  61 74 61 5f 70 74 72 25  |art_of_data_ptr%|
00000b20  3d 30 0d 00 6e 14 70 65  6e 64 69 6e 67 5f 63 6c  |=0..n.pending_cl|
00000b30  6f 73 65 25 3d a3 0d 00  6f 0f 74 72 61 6e 73 6d  |ose%=...o.transm|
00000b40  69 74 25 3d a3 0d 00 70  15 74 72 61 6e 73 6d 69  |it%=...p.transmi|
00000b50  74 5f 63 6f 75 6e 74 25  3d 30 0d 00 71 15 74 72  |t_count%=0..q.tr|
00000b60  61 6e 73 6d 69 74 5f 62  6c 6f 63 6b 25 3d 30 0d  |ansmit_block%=0.|
00000b70  00 72 04 0d 00 73 14 67  6f 74 70 72 69 6e 74 72  |.r...s.gotprintr|
00000b80  65 70 6c 79 25 3d a3 0d  00 74 0e f2 6d 65 72 67  |eply%=...t..merg|
00000b90  65 5f 6f 66 66 0d 00 75  05 e1 0d 00 76 04 0d 00  |e_off..u....v...|
00000ba0  77 04 0d 00 78 04 0d 00  79 04 0d 00 7a 0b dd 20  |w...x...y...z.. |
00000bb0  f2 6e 75 6c 6c 0d 00 7b  0d ea 20 72 65 73 75 6c  |.null..{.. resul|
00000bc0  74 25 0d 00 7c 42 f4 20  57 65 20 6e 65 65 64 20  |t%..|B. We need |
00000bd0  74 6f 20 77 69 6d 70 5f  70 6f 6c 6c 20 62 65 74  |to wimp_poll bet|
00000be0  77 65 65 6e 20 6d 65 72  67 65 5f 6e 65 78 74 5f  |ween merge_next_|
00000bf0  72 65 63 6f 72 64 20 61  6e 64 20 50 52 4f 43 73  |record and PROCs|
00000c00  65 6e 64 2e 0d 00 7d 2c  e7 20 28 28 70 72 69 6e  |end...},. ((prin|
00000c10  74 69 6e 67 25 3d b9 29  20 80 20 28 67 6f 74 70  |ting%=.) . (gotp|
00000c20  72 69 6e 74 72 65 70 6c  79 25 3d b9 29 29 20 8c  |rintreply%=.)) .|
00000c30  0d 00 7e 1c 20 20 20 20  20 20 20 20 67 6f 74 70  |..~.        gotp|
00000c40  72 69 6e 74 72 65 70 6c  79 25 3d a3 0d 00 7f 23  |rintreply%=....#|
00000c50  20 20 20 20 20 20 20 20  f2 73 65 6e 64 28 22 50  |        .send("P|
00000c60  72 69 6e 74 22 2c 54 5f  50 72 69 6e 74 25 29 0d  |rint",T_Print%).|
00000c70  00 80 05 cd 0d 00 81 05  e1 0d 00 82 04 0d 00 83  |................|
00000c80  04 0d 00 84 04 0d 00 85  04 0d 00 86 14 dd 20 f2  |.............. .|
00000c90  68 6f 73 74 5f 73 68 75  74 64 6f 77 6e 0d 00 87  |host_shutdown...|
00000ca0  29 e7 20 ac 20 64 69 65  70 6c 65 61 73 65 25 20  |). . dieplease% |
00000cb0  8c 20 f2 73 65 6e 64 28  22 4d 61 69 6c 44 69 65  |. .send("MailDie|
00000cc0  64 22 2c 2d 31 29 0d 00  88 04 0d 00 89 13 f2 63  |d",-1).........c|
00000cd0  6c 6f 73 65 5f 63 73 76  5f 66 69 6c 65 0d 00 8a  |lose_csv_file...|
00000ce0  17 c8 95 20 68 6f 75 72  67 6c 61 73 73 5f 63 6f  |... hourglass_co|
00000cf0  75 6e 74 25 0d 00 8b 13  20 f2 68 6f 75 72 67 6c  |unt%.... .hourgl|
00000d00  61 73 73 5f 6f 66 66 0d  00 8c 05 ce 0d 00 8d 16  |ass_off.........|
00000d10  e7 6d 65 72 67 65 25 20  f2 6d 65 72 67 65 5f 6f  |.merge% .merge_o|
00000d20  66 66 0d 00 8e 04 0d 00  8f 26 c8 99 22 49 6d 70  |ff.......&.."Imp|
00000d30  75 6c 73 65 5f 43 6c 6f  73 65 44 6f 77 6e 22 2c  |ulse_CloseDown",|
00000d40  74 61 73 6b 5f 68 61 6e  64 6c 65 25 0d 00 90 12  |task_handle%....|
00000d50  f2 74 61 73 6b 5f 73 68  75 74 64 6f 77 6e 0d 00  |.task_shutdown..|
00000d60  91 05 e1 0d 00 92 04 0d  00 93 0e dd 20 f2 72 65  |............ .re|
00000d70  63 65 69 76 65 0d 00 94  16 c8 8e 20 74 61 73 6b  |ceive...... task|
00000d80  5f 62 75 66 66 25 21 31  36 20 ca 0d 00 95 14 c9  |_buff%!16 ......|
00000d90  20 4d 65 73 73 61 67 65  5f 51 75 69 74 25 3a 0d  | Message_Quit%:.|
00000da0  00 96 14 20 20 f2 68 6f  73 74 5f 73 68 75 74 64  |...  .host_shutd|
00000db0  6f 77 6e 0d 00 97 18 c9  20 4d 65 73 73 61 67 65  |own..... Message|
00000dc0  5f 44 61 74 61 53 61 76  65 25 3a 0d 00 98 0f 20  |_DataSave%:.... |
00000dd0  20 f2 64 61 74 61 73 61  76 65 0d 00 99 18 c9 20  | .datasave..... |
00000de0  4d 65 73 73 61 67 65 5f  44 61 74 61 4c 6f 61 64  |Message_DataLoad|
00000df0  25 3a 0d 00 9a 0f 20 20  f2 64 61 74 61 6c 6f 61  |%:....  .dataloa|
00000e00  64 0d 00 9b 17 c9 20 4d  65 73 73 61 67 65 5f 50  |d..... Message_P|
00000e10  72 65 51 75 69 74 25 3a  0d 00 9c 0e 20 20 f2 70  |reQuit%:....  .p|
00000e20  72 65 71 75 69 74 0d 00  9d 1d c9 20 4d 65 73 73  |requit..... Mess|
00000e30  61 67 65 5f 54 61 73 6b  43 6c 6f 73 65 44 6f 77  |age_TaskCloseDow|
00000e40  6e 25 3a 0d 00 9e 3c 20  20 e7 64 6f 63 5f 66 69  |n%:...<  .doc_fi|
00000e50  6c 65 24 3c 3e 22 22 20  80 20 74 61 73 6b 5f 62  |le$<>"" . task_b|
00000e60  75 66 66 25 21 34 3d 64  6f 63 5f 74 61 73 6b 25  |uff%!4=doc_task%|
00000e70  20 f2 68 6f 73 74 5f 73  68 75 74 64 6f 77 6e 0d  | .host_shutdown.|
00000e80  00 9f 1c c9 20 4d 65 73  73 61 67 65 5f 57 69 6e  |.... Message_Win|
00000e90  64 6f 77 43 6c 6f 73 65  64 25 3a 0d 00 a0 2d f4  |dowClosed%:...-.|
00000ea0  20 20 49 46 64 6f 63 5f  66 69 6c 65 24 3c 3e 22  |  IFdoc_file$<>"|
00000eb0  22 20 54 48 45 4e 20 50  52 4f 43 68 6f 73 74 5f  |" THEN PROChost_|
00000ec0  73 68 75 74 64 6f 77 6e  0d 00 a1 1b c9 20 4d 65  |shutdown..... Me|
00000ed0  73 73 61 67 65 5f 4d 4d  5f 44 6f 63 75 6d 65 6e  |ssage_MM_Documen|
00000ee0  74 25 3a 0d 00 a2 24 20  20 e7 20 64 6f 63 5f 66  |t%:...$  . doc_f|
00000ef0  69 6c 65 24 3d 22 22 20  8c 20 f2 64 6f 63 5f 72  |ile$="" . .doc_r|
00000f00  65 63 65 69 76 65 64 0d  00 a3 05 cb 0d 00 a4 05  |eceived.........|
00000f10  e1 0d 00 a5 04 0d 00 a6  04 0d 00 a7 12 dd 20 f2  |.............. .|
00000f20  6d 6f 75 73 65 5f 63 6c  69 63 6b 0d 00 a8 22 ea  |mouse_click...".|
00000f30  20 6d 65 6e 75 70 74 72  25 2c 6d 61 78 78 25 2c  | menuptr%,maxx%,|
00000f40  69 25 2c 70 25 2c 69 78  25 2c 69 79 25 0d 00 a9  |i%,p%,ix%,iy%...|
00000f50  17 e7 20 74 61 73 6b 5f  62 75 66 66 25 21 38 3c  |.. task_buff%!8<|
00000f60  3e 34 20 e1 0d 00 aa 16  c8 8e 20 74 61 73 6b 5f  |>4 ....... task_|
00000f70  62 75 66 66 25 21 31 36  20 ca 0d 00 ab 17 20 20  |buff%!16 .....  |
00000f80  c9 20 49 63 6f 6e 5f 48  65 61 64 69 6e 67 73 25  |. Icon_Headings%|
00000f90  3a 0d 00 ac 04 0d 00 ad  19 20 20 20 20 e7 20 63  |:........    . c|
00000fa0  73 76 5f 66 69 6c 65 24  3c 3e 22 22 20 8c 0d 00  |sv_file$<>"" ...|
00000fb0  ae 2d 20 20 20 20 20 20  e7 20 a4 69 63 6f 6e 5f  |.-      . .icon_|
00000fc0  73 65 74 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 48  |set(main%,Icon_H|
00000fd0  65 61 64 69 6e 67 73 25  29 20 8c 0d 00 af 20 20  |eadings%) ....  |
00000fe0  20 20 20 20 20 20 20 f2  63 72 65 61 74 65 5f 63  |       .create_c|
00000ff0  73 76 5f 68 65 61 64 69  6e 67 73 0d 00 b0 1a 20  |sv_headings.... |
00001000  20 20 20 20 20 20 20 72  65 63 5f 74 6f 67 6f 25  |       rec_togo%|
00001010  20 2b 3d 20 31 0d 00 b1  0b 20 20 20 20 20 20 cc  | += 1....      .|
00001020  0d 00 b2 1d 20 20 20 20  20 20 20 20 f2 67 65 74  |....        .get|
00001030  5f 63 73 76 5f 68 65 61  64 69 6e 67 73 0d 00 b3  |_csv_headings...|
00001040  1a 20 20 20 20 20 20 20  20 72 65 63 5f 74 6f 67  |.        rec_tog|
00001050  6f 25 20 2d 3d 20 31 0d  00 b4 0b 20 20 20 20 20  |o% -= 1....     |
00001060  20 cd 0d 00 b5 09 20 20  20 20 cd 0d 00 b6 04 0d  | .....    ......|
00001070  00 b7 17 20 20 c9 20 49  63 6f 6e 5f 44 69 73 70  |...  . Icon_Disp|
00001080  48 65 61 64 25 3a 0d 00  b8 28 20 20 20 20 e7 20  |Head%:...(    . |
00001090  6d 65 6e 75 25 20 f2 68  65 61 70 5f 66 72 65 65  |menu% .heap_free|
000010a0  28 22 4d 45 4e 55 22 2c  6d 65 6e 75 25 29 0d 00  |("MENU",menu%)..|
000010b0  b9 32 20 20 20 20 6d 65  6e 75 25 3d a4 68 65 61  |.2    menu%=.hea|
000010c0  70 5f 63 6c 61 69 6d 28  22 4d 45 4e 55 22 2c 32  |p_claim("MENU",2|
000010d0  38 2b 63 73 76 5f 63 6f  75 6e 74 25 2a 32 34 29  |8+csv_count%*24)|
000010e0  0d 00 ba 1b 20 20 20 20  24 6d 65 6e 75 25 3d a4  |....    $menu%=.|
000010f0  6d 73 67 5f 30 28 22 4d  54 22 29 0d 00 bb 12 20  |msg_0("MT").... |
00001100  20 20 20 6d 65 6e 75 25  3f 31 32 3d 37 0d 00 bc  |   menu%?12=7...|
00001110  12 20 20 20 20 6d 65 6e  75 25 3f 31 33 3d 32 0d  |.    menu%?13=2.|
00001120  00 bd 12 20 20 20 20 6d  65 6e 75 25 3f 31 34 3d  |...    menu%?14=|
00001130  37 0d 00 be 12 20 20 20  20 6d 65 6e 75 25 3f 31  |7....    menu%?1|
00001140  35 3d 30 0d 00 bf 13 20  20 20 20 6d 65 6e 75 25  |5=0....    menu%|
00001150  21 32 30 3d 34 34 0d 00  c0 12 20 20 20 20 6d 65  |!20=44....    me|
00001160  6e 75 25 21 32 34 3d 30  0d 00 c1 19 20 20 20 20  |nu%!24=0....    |
00001170  6d 65 6e 75 70 74 72 25  3d 6d 65 6e 75 25 2b 32  |menuptr%=menu%+2|
00001180  38 0d 00 c2 1f 20 20 20  20 6d 61 78 78 25 3d a9  |8....    maxx%=.|
00001190  28 a4 6d 73 67 5f 30 28  22 4d 54 22 29 29 2d 33  |(.msg_0("MT"))-3|
000011a0  0d 00 c3 18 20 20 20 20  70 25 3d 63 73 76 5f 68  |....    p%=csv_h|
000011b0  65 61 64 69 6e 67 73 25  0d 00 c4 1a 20 20 20 20  |eadings%....    |
000011c0  e3 69 25 3d 31 20 b8 20  63 73 76 5f 63 6f 75 6e  |.i%=1 . csv_coun|
000011d0  74 25 0d 00 c5 34 20 20  20 20 20 20 e7 69 25 3d  |t%...4      .i%=|
000011e0  63 73 76 5f 63 6f 75 6e  74 25 20 21 6d 65 6e 75  |csv_count% !menu|
000011f0  70 74 72 25 3d 26 38 30  20 8b 20 21 6d 65 6e 75  |ptr%=&80 . !menu|
00001200  70 74 72 25 3d 30 0d 00  c6 17 20 20 20 20 20 20  |ptr%=0....      |
00001210  6d 65 6e 75 70 74 72 25  21 34 3d 2d 31 0d 00 c7  |menuptr%!4=-1...|
00001220  1e 20 20 20 20 20 20 6d  65 6e 75 70 74 72 25 21  |.      menuptr%!|
00001230  38 3d 26 30 37 30 30 30  31 32 31 0d 00 c8 1a 20  |8=&07000121.... |
00001240  20 20 20 20 20 6d 65 6e  75 70 74 72 25 21 31 32  |     menuptr%!12|
00001250  3d 70 25 2b 34 0d 00 c9  18 20 20 20 20 20 20 6d  |=p%+4....      m|
00001260  65 6e 75 70 74 72 25 21  31 36 3d 2d 31 0d 00 ca  |enuptr%!16=-1...|
00001270  22 20 20 20 20 20 20 6d  65 6e 75 70 74 72 25 21  |"      menuptr%!|
00001280  32 30 3d a9 28 24 28 70  25 2b 34 29 29 2b 31 0d  |20=.($(p%+4))+1.|
00001290  00 cb 16 20 20 20 20 20  20 6d 65 6e 75 70 74 72  |...      menuptr|
000012a0  25 2b 3d 32 34 0d 00 cc  2c 20 20 20 20 20 20 e7  |%+=24...,      .|
000012b0  a9 28 24 28 70 25 2b 34  29 29 3e 6d 61 78 78 25  |.($(p%+4))>maxx%|
000012c0  20 6d 61 78 78 25 3d a9  28 24 28 70 25 2b 34 29  | maxx%=.($(p%+4)|
000012d0  29 0d 00 cd 10 20 20 20  20 20 20 70 25 3d 21 70  |)....      p%=!p|
000012e0  25 0d 00 ce 09 20 20 20  20 ed 0d 00 cf 1e 20 20  |%....    .....  |
000012f0  20 20 6d 65 6e 75 25 21  31 36 3d 28 6d 61 78 78  |  menu%!16=(maxx|
00001300  25 2a 38 2b 36 29 2a 32  0d 00 d0 35 20 20 20 20  |%*8+6)*2...5    |
00001310  21 74 61 73 6b 5f 62 75  66 66 25 3d 6d 61 69 6e  |!task_buff%=main|
00001320  25 3a 74 61 73 6b 5f 62  75 66 66 25 21 34 3d 49  |%:task_buff%!4=I|
00001330  63 6f 6e 5f 44 69 73 70  48 65 61 64 25 0d 00 d1  |con_DispHead%...|
00001340  4d 20 20 20 20 c8 99 22  57 69 6d 70 5f 47 65 74  |M    .."Wimp_Get|
00001350  49 63 6f 6e 53 74 61 74  65 22 2c 2c 74 61 73 6b  |IconState",,task|
00001360  5f 62 75 66 66 25 3a 69  78 25 3d 74 61 73 6b 5f  |_buff%:ix%=task_|
00001370  62 75 66 66 25 21 31 36  3a 69 79 25 3d 74 61 73  |buff%!16:iy%=tas|
00001380  6b 5f 62 75 66 66 25 21  32 30 0d 00 d2 2b 20 20  |k_buff%!20...+  |
00001390  20 20 c8 99 22 57 69 6d  70 5f 47 65 74 57 69 6e  |  .."Wimp_GetWin|
000013a0  64 6f 77 53 74 61 74 65  22 2c 2c 74 61 73 6b 5f  |dowState",,task_|
000013b0  62 75 66 66 25 0d 00 d3  3a 20 20 20 20 64 69 73  |buff%...:    dis|
000013c0  70 6c 61 79 5f 6d 65 6e  75 5f 78 25 20 3d 20 74  |play_menu_x% = t|
000013d0  61 73 6b 5f 62 75 66 66  25 21 32 30 2b 74 61 73  |ask_buff%!20+tas|
000013e0  6b 5f 62 75 66 66 25 21  34 2b 69 78 25 2b 32 0d  |k_buff%!4+ix%+2.|
000013f0  00 d4 3b 20 20 20 20 64  69 73 70 6c 61 79 5f 6d  |..;    display_m|
00001400  65 6e 75 5f 79 25 20 3d  20 74 61 73 6b 5f 62 75  |enu_y% = task_bu|
00001410  66 66 25 21 32 34 2b 74  61 73 6b 5f 62 75 66 66  |ff%!24+task_buff|
00001420  25 21 31 36 2b 69 79 25  2d 32 0d 00 d5 42 20 20  |%!16+iy%-2...B  |
00001430  20 20 c8 99 22 57 69 6d  70 5f 43 72 65 61 74 65  |  .."Wimp_Create|
00001440  4d 65 6e 75 22 2c 2c 6d  65 6e 75 25 2c 64 69 73  |Menu",,menu%,dis|
00001450  70 6c 61 79 5f 6d 65 6e  75 5f 78 25 2c 64 69 73  |play_menu_x%,dis|
00001460  70 6c 61 79 5f 6d 65 6e  75 5f 79 25 0d 00 d6 19  |play_menu_y%....|
00001470  20 20 c9 20 49 63 6f 6e  5f 53 74 61 72 74 4d 65  |  . Icon_StartMe|
00001480  72 67 65 25 3a 0d 00 d7  15 20 20 20 20 f2 74 72  |rge%:....    .tr|
00001490  79 5f 6d 65 72 67 65 5f  6f 6e 0d 00 d8 13 20 20  |y_merge_on....  |
000014a0  c9 20 49 63 6f 6e 5f 4e  65 78 74 25 3a 0d 00 d9  |. Icon_Next%:...|
000014b0  1a 20 20 20 20 f2 6d 65  72 67 65 5f 6e 65 78 74  |.    .merge_next|
000014c0  5f 72 65 63 6f 72 64 0d  00 da 14 20 20 c9 20 49  |_record....  . I|
000014d0  63 6f 6e 5f 50 72 69 6e  74 25 3a 0d 00 db 1f 20  |con_Print%:.... |
000014e0  20 20 20 f2 73 65 6e 64  28 22 50 72 69 6e 74 22  |   .send("Print"|
000014f0  2c 54 5f 50 72 69 6e 74  25 29 0d 00 dc 13 20 20  |,T_Print%)....  |
00001500  20 20 70 72 69 6e 74 69  6e 67 25 3d b9 0d 00 dd  |  printing%=....|
00001510  20 20 20 20 20 f2 64 69  73 61 62 6c 65 5f 6d 65  |     .disable_me|
00001520  72 67 69 6e 67 5f 62 75  74 74 6f 6e 73 0d 00 de  |rging_buttons...|
00001530  13 20 20 c9 20 49 63 6f  6e 5f 45 64 69 74 25 3a  |.  . Icon_Edit%:|
00001540  0d 00 df 1e 20 20 20 20  f2 73 65 6e 64 28 22 43  |....    .send("C|
00001550  6c 65 61 72 4d 65 72 67  65 22 2c 2d 31 29 0d 00  |learMerge",-1)..|
00001560  e0 16 20 20 20 20 f2 68  6f 73 74 5f 73 68 75 74  |..    .host_shut|
00001570  64 6f 77 6e 0d 00 e1 05  cb 0d 00 e2 05 e1 0d 00  |down............|
00001580  e3 04 0d 00 e4 04 0d 00  e5 10 dd f2 6d 65 6e 75  |............menu|
00001590  5f 63 6c 69 63 6b 0d 00  e6 3f f4 20 73 65 6e 64  |_click...?. send|
000015a0  20 74 68 65 20 61 70 70  72 6f 70 72 69 61 74 65  | the appropriate|
000015b0  20 44 44 46 20 66 6f 72  20 74 68 65 20 73 65 6c  | DDF for the sel|
000015c0  65 63 74 65 64 20 66 69  65 6c 64 20 74 6f 20 74  |ected field to t|
000015d0  68 65 20 57 50 0d 00 e7  0e ea 20 63 25 2c 6c 25  |he WP..... c%,l%|
000015e0  2c 66 25 0d 00 e8 12 66  25 3d 21 74 61 73 6b 5f  |,f%....f%=!task_|
000015f0  62 75 66 66 25 0d 00 e9  2c c8 99 22 57 69 6d 70  |buff%...,.."Wimp|
00001600  5f 47 65 74 43 61 72 65  74 50 6f 73 69 74 69 6f  |_GetCaretPositio|
00001610  6e 22 2c 2c 74 61 73 6b  5f 62 75 66 66 25 2b 32  |n",,task_buff%+2|
00001620  30 0d 00 ea 39 e7 74 61  73 6b 5f 62 75 66 66 25  |0...9.task_buff%|
00001630  21 32 30 3c 3e 64 6f 63  5f 77 69 6e 64 6f 77 25  |!20<>doc_window%|
00001640  20 85 20 74 61 73 6b 5f  6f 6b 25 2c 20 a4 6d 73  | . task_ok%, .ms|
00001650  67 5f 30 28 22 4f 4b 35  22 29 0d 00 eb 14 6c 25  |g_0("OK5")....l%|
00001660  3d 63 73 76 5f 68 65 61  64 69 6e 67 73 25 0d 00  |=csv_headings%..|
00001670  ec 09 c8 95 20 66 25 0d  00 ed 0c 20 20 6c 25 3d  |.... f%....  l%=|
00001680  21 6c 25 0d 00 ee 0b 20  20 66 25 2d 3d 31 0d 00  |!l%....  f%-=1..|
00001690  ef 05 ce 0d 00 f0 16 63  25 3d ae 22 3c 57 69 6d  |.......c%=."<Wim|
000016a0  70 24 53 63 72 61 70 3e  22 0d 00 f1 04 0d 00 f2  |p$Scrap>".......|
000016b0  58 d5 23 63 25 2c 22 7b  20 6d 65 72 67 65 20 22  |X.#c%,"{ merge "|
000016c0  2b bd 43 68 61 72 5f 51  75 6f 74 65 25 2b 22 3a  |+.Char_Quote%+":|
000016d0  22 2b a4 6d 73 67 5f 30  28 22 49 44 22 29 2b 22  |"+.msg_0("ID")+"|
000016e0  20 47 65 74 46 69 65 6c  64 20 22 2b 24 28 6c 25  | GetField "+$(l%|
000016f0  2b 34 29 2b bd 43 68 61  72 5f 51 75 6f 74 65 25  |+4)+.Char_Quote%|
00001700  2b 22 7d 22 3b 0d 00 f3  04 0d 00 f4 0b 6c 25 3d  |+"}";........l%=|
00001710  a2 23 63 25 0d 00 f5 08  d9 23 63 25 0d 00 f6 2b  |.#c%.....#c%...+|
00001720  c8 99 22 4f 53 5f 46 69  6c 65 22 2c 31 38 2c 22  |.."OS_File",18,"|
00001730  3c 57 69 6d 70 24 53 63  72 61 70 3e 22 2c 44 44  |<Wimp$Scrap>",DD|
00001740  46 5f 54 79 70 65 25 0d  00 f7 12 21 74 61 73 6b  |F_Type%....!task|
00001750  5f 62 75 66 66 25 3d 36  30 0d 00 f8 13 74 61 73  |_buff%=60....tas|
00001760  6b 5f 62 75 66 66 25 21  31 32 3d 30 0d 00 f9 13  |k_buff%!12=0....|
00001770  74 61 73 6b 5f 62 75 66  66 25 21 31 36 3d 33 0d  |task_buff%!16=3.|
00001780  00 fa 24 74 61 73 6b 5f  62 75 66 66 25 21 32 34  |..$task_buff%!24|
00001790  3d 26 34 42 35 33 35 35  35 34 3a f4 20 22 54 55  |=&4B535554:. "TU|
000017a0  53 4b 22 0d 00 fb 14 74  61 73 6b 5f 62 75 66 66  |SK"....task_buff|
000017b0  25 21 33 36 3d 6c 25 0d  00 fc 1b 74 61 73 6b 5f  |%!36=l%....task_|
000017c0  62 75 66 66 25 21 34 30  3d 44 44 46 5f 54 79 70  |buff%!40=DDF_Typ|
000017d0  65 25 0d 00 fd 26 24 28  74 61 73 6b 5f 62 75 66  |e%...&$(task_buf|
000017e0  66 25 2b 34 34 29 3d 22  3c 57 69 6d 70 24 53 63  |f%+44)="<Wimp$Sc|
000017f0  72 61 70 3e 22 2b bd 30  0d 00 fe 30 c8 99 22 57  |rap>"+.0...0.."W|
00001800  69 6d 70 5f 53 65 6e 64  4d 65 73 73 61 67 65 22  |imp_SendMessage"|
00001810  2c 31 37 2c 74 61 73 6b  5f 62 75 66 66 25 2c 64  |,17,task_buff%,d|
00001820  6f 63 5f 74 61 73 6b 25  0d 00 ff 27 c8 99 22 57  |oc_task%...'.."W|
00001830  69 6d 70 5f 47 65 74 50  6f 69 6e 74 65 72 49 6e  |imp_GetPointerIn|
00001840  66 6f 22 2c 2c 74 61 73  6b 5f 62 75 66 66 25 0d  |fo",,task_buff%.|
00001850  01 00 52 e7 28 74 61 73  6b 5f 62 75 66 66 25 21  |..R.(task_buff%!|
00001860  38 20 80 20 31 29 20 c8  99 22 57 69 6d 70 5f 43  |8 . 1) .."Wimp_C|
00001870  72 65 61 74 65 4d 65 6e  75 22 2c 2c 6d 65 6e 75  |reateMenu",,menu|
00001880  25 2c 64 69 73 70 6c 61  79 5f 6d 65 6e 75 5f 78  |%,display_menu_x|
00001890  25 2c 64 69 73 70 6c 61  79 5f 6d 65 6e 75 5f 79  |%,display_menu_y|
000018a0  25 0d 01 01 05 e1 0d 01  02 04 0d 01 03 04 0d 01  |%...............|
000018b0  04 0f dd 20 f2 64 61 74  61 6c 6f 61 64 0d 01 05  |... .dataload...|
000018c0  1b f4 20 72 65 63 65 69  70 74 20 6f 66 20 61 20  |.. receipt of a |
000018d0  43 53 56 20 66 69 6c 65  0d 01 06 2e e7 74 61 73  |CSV file.....tas|
000018e0  6b 5f 62 75 66 66 25 21  34 30 3c 3e 43 53 56 5f  |k_buff%!40<>CSV_|
000018f0  54 79 70 65 25 20 84 20  64 6f 63 5f 66 69 6c 65  |Type% . doc_file|
00001900  24 3d 22 22 20 e1 0d 01  07 24 e7 6d 65 72 67 65  |$="" ....$.merge|
00001910  25 20 85 20 74 61 73 6b  5f 6f 6b 25 2c a4 6d 73  |% . task_ok%,.ms|
00001920  67 5f 30 28 22 4f 4b 31  22 29 0d 01 08 27 63 73  |g_0("OK1")...'cs|
00001930  76 5f 66 69 6c 65 24 3d  a4 74 61 73 6b 5f 72 74  |v_file$=.task_rt|
00001940  6f 7a 28 74 61 73 6b 5f  62 75 66 66 25 2b 34 34  |oz(task_buff%+44|
00001950  29 0d 01 09 1e 74 61 73  6b 5f 62 75 66 66 25 21  |)....task_buff%!|
00001960  31 32 3d 74 61 73 6b 5f  62 75 66 66 25 21 38 0d  |12=task_buff%!8.|
00001970  01 0a 13 74 61 73 6b 5f  62 75 66 66 25 21 31 36  |...task_buff%!16|
00001980  3d 34 0d 01 0b 33 c8 99  22 57 69 6d 70 5f 53 65  |=4...3.."Wimp_Se|
00001990  6e 64 4d 65 73 73 61 67  65 22 2c 31 37 2c 74 61  |ndMessage",17,ta|
000019a0  73 6b 5f 62 75 66 66 25  2c 74 61 73 6b 5f 62 75  |sk_buff%,task_bu|
000019b0  66 66 25 21 34 0d 01 0c  24 f2 69 63 6f 6e 5f 68  |ff%!4...$.icon_h|
000019c0  69 64 65 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 44  |ide(main%,Icon_D|
000019d0  72 6f 70 48 65 72 65 25  29 0d 01 0d 28 f2 69 63  |ropHere%)...(.ic|
000019e0  6f 6e 5f 75 6e 68 69 64  65 28 6d 61 69 6e 25 2c  |on_unhide(main%,|
000019f0  49 63 6f 6e 5f 53 74 61  72 74 4d 65 72 67 65 25  |Icon_StartMerge%|
00001a00  29 0d 01 0e 27 f2 69 63  6f 6e 5f 75 6e 73 68 61  |)...'.icon_unsha|
00001a10  64 65 28 6d 61 69 6e 25  2c 49 63 6f 6e 5f 44 69  |de(main%,Icon_Di|
00001a20  73 70 48 65 61 64 25 29  0d 01 0f 2a 63 73 76 5f  |spHead%)...*csv_|
00001a30  63 6f 75 6e 74 25 3d a4  64 65 74 65 72 6d 69 6e  |count%=.determin|
00001a40  65 5f 6e 75 6d 62 65 72  5f 6f 66 5f 66 69 65 6c  |e_number_of_fiel|
00001a50  64 73 0d 01 10 50 e7 20  ac 20 a4 69 63 6f 6e 5f  |ds...P. . .icon_|
00001a60  73 65 74 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 48  |set(main%,Icon_H|
00001a70  65 61 64 69 6e 67 73 25  29 20 f2 67 65 74 5f 63  |eadings%) .get_c|
00001a80  73 76 5f 68 65 61 64 69  6e 67 73 20 8b 20 f2 63  |sv_headings . .c|
00001a90  72 65 61 74 65 5f 63 73  76 5f 68 65 61 64 69 6e  |reate_csv_headin|
00001aa0  67 73 0d 01 11 2a 72 65  63 5f 74 6f 67 6f 25 3d  |gs...*rec_togo%=|
00001ab0  a4 64 65 74 65 72 6d 69  6e 65 5f 6e 75 6d 62 65  |.determine_numbe|
00001ac0  72 5f 6f 66 5f 72 65 63  6f 72 64 73 0d 01 12 31  |r_of_records...1|
00001ad0  f2 69 63 6f 6e 5f 77 72  69 74 65 28 6d 61 69 6e  |.icon_write(main|
00001ae0  25 2c 49 63 6f 6e 5f 43  53 56 25 2c a4 6c 65 61  |%,Icon_CSV%,.lea|
00001af0  66 28 63 73 76 5f 66 69  6c 65 24 29 29 0d 01 13  |f(csv_file$))...|
00001b00  05 e1 0d 01 14 04 0d 01  15 04 0d 01 16 45 dd 20  |.............E. |
00001b10  f2 63 6f 70 79 5f 66 69  65 6c 64 28 74 6f 25 2c  |.copy_field(to%,|
00001b20  20 f8 20 6c 61 73 74 5f  66 69 65 6c 64 25 2c 20  | . last_field%, |
00001b30  f8 20 66 69 65 6c 64 5f  6c 65 6e 67 74 68 25 2c  |. field_length%,|
00001b40  20 66 75 64 67 65 5f 73  70 61 63 65 73 25 29 0d  | fudge_spaces%).|
00001b50  01 17 50 f4 20 63 6f 70  69 65 73 20 74 68 65 20  |..P. copies the |
00001b60  6e 65 78 74 20 66 69 65  6c 64 20 66 72 6f 6d 20  |next field from |
00001b70  74 68 65 20 6f 70 65 6e  20 43 53 56 20 66 69 6c  |the open CSV fil|
00001b80  65 20 69 6e 74 6f 20 6d  65 6d 6f 72 79 2c 20 73  |e into memory, s|
00001b90  70 65 63 69 66 69 65 64  20 62 79 20 74 6f 25 0d  |pecified by to%.|
00001ba0  01 18 18 f4 20 77 68 69  63 68 20 43 41 4e 20 62  |.... which CAN b|
00001bb0  65 20 4e 55 4c 4c 2e 0d  01 19 3d f4 20 72 65 74  |e NULL....=. ret|
00001bc0  75 72 6e 73 20 6c 61 73  74 5f 66 69 65 6c 64 3d  |urns last_field=|
00001bd0  54 52 55 45 20 69 66 20  74 68 65 20 6c 61 73 74  |TRUE if the last|
00001be0  20 66 69 65 6c 64 20 69  6e 20 74 68 65 20 72 65  | field in the re|
00001bf0  63 6f 72 64 0d 01 1a 37  f4 20 72 65 74 75 72 6e  |cord...7. return|
00001c00  73 20 66 69 65 6c 64 5f  6c 65 6e 67 74 68 3d 74  |s field_length=t|
00001c10  68 65 20 72 65 61 6c 20  6c 65 6e 67 74 68 20 6f  |he real length o|
00001c20  66 20 74 68 65 20 66 69  65 6c 64 0d 01 1b 2b ea  |f the field...+.|
00001c30  20 67 6f 74 5f 71 75 6f  74 65 25 2c 20 67 6f 74  | got_quote%, got|
00001c40  5f 73 6c 61 73 68 25 2c  20 62 25 2c 20 66 69 6e  |_slash%, b%, fin|
00001c50  69 73 68 65 64 25 0d 01  1c 10 67 6f 74 5f 71 75  |ished%....got_qu|
00001c60  6f 74 65 25 3d a3 0d 01  1d 10 67 6f 74 5f 73 6c  |ote%=.....got_sl|
00001c70  61 73 68 25 3d a3 0d 01  1e 11 6c 61 73 74 5f 66  |ash%=.....last_f|
00001c80  69 65 6c 64 25 3d a3 0d  01 1f 13 66 69 65 6c 64  |ield%=.....field|
00001c90  5f 6c 65 6e 67 74 68 25  3d 30 0d 01 20 0f 66 69  |_length%=0.. .fi|
00001ca0  6e 69 73 68 65 64 25 3d  a3 0d 01 21 05 f5 0d 01  |nished%=...!....|
00001cb0  22 1a 20 62 25 3d 9a 23  63 73 76 5f 66 69 6c 65  |". b%=.#csv_file|
00001cc0  5f 68 61 6e 64 6c 65 25  0d 01 23 04 0d 01 24 0b  |_handle%..#...$.|
00001cd0  20 c8 8e 20 b9 20 ca 0d  01 25 04 0d 01 26 16 20  | .. . ...%...&. |
00001ce0  c9 20 62 25 3d 43 68 61  72 5f 51 75 6f 74 65 25  |. b%=Char_Quote%|
00001cf0  3a 0d 01 27 1d 20 20 67  6f 74 5f 71 75 6f 74 65  |:..'.  got_quote|
00001d00  25 3d ac 20 67 6f 74 5f  71 75 6f 74 65 25 0d 01  |%=. got_quote%..|
00001d10  28 04 0d 01 29 16 20 c9  20 62 25 3d 43 68 61 72  |(...). . b%=Char|
00001d20  5f 53 6c 61 73 68 25 3a  0d 01 2a 14 20 20 e7 20  |_Slash%:..*.  . |
00001d30  67 6f 74 5f 73 6c 61 73  68 25 20 8c 0d 01 2b 35  |got_slash% ...+5|
00001d40  20 20 20 f2 63 6f 70 79  5f 66 69 65 6c 64 5f 73  |   .copy_field_s|
00001d50  74 75 66 66 5f 63 68 61  72 28 74 6f 25 2c 97 22  |tuff_char(to%,."|
00001d60  5c 22 2c 66 69 65 6c 64  5f 6c 65 6e 67 74 68 25  |\",field_length%|
00001d70  29 0d 01 2c 13 20 20 20  67 6f 74 5f 73 6c 61 73  |)..,.   got_slas|
00001d80  68 25 3d a3 0d 01 2d 07  20 20 cc 0d 01 2e 13 20  |h%=...-.  ..... |
00001d90  20 20 67 6f 74 5f 73 6c  61 73 68 25 3d b9 0d 01  |  got_slash%=...|
00001da0  2f 07 20 20 cd 0d 01 30  04 0d 01 31 16 20 c9 20  |/.  ...0...1. . |
00001db0  62 25 3d 43 68 61 72 5f  53 70 61 63 65 25 3a 0d  |b%=Char_Space%:.|
00001dc0  01 32 17 20 20 e7 20 66  75 64 67 65 5f 73 70 61  |.2.  . fudge_spa|
00001dd0  63 65 73 25 20 8c 0d 01  33 40 20 20 20 f2 63 6f  |ces% ...3@   .co|
00001de0  70 79 5f 66 69 65 6c 64  5f 73 74 75 66 66 5f 63  |py_field_stuff_c|
00001df0  68 61 72 28 74 6f 25 2c  43 68 61 72 5f 48 61 72  |har(to%,Char_Har|
00001e00  64 53 70 61 63 65 25 2c  66 69 65 6c 64 5f 6c 65  |dSpace%,field_le|
00001e10  6e 67 74 68 25 29 0d 01  34 07 20 20 cc 0d 01 35  |ngth%)..4.  ...5|
00001e20  3c 20 20 20 f2 63 6f 70  79 5f 66 69 65 6c 64 5f  |<   .copy_field_|
00001e30  73 74 75 66 66 5f 63 68  61 72 28 74 6f 25 2c 43  |stuff_char(to%,C|
00001e40  68 61 72 5f 53 70 61 63  65 25 2c 66 69 65 6c 64  |har_Space%,field|
00001e50  5f 6c 65 6e 67 74 68 25  29 0d 01 36 07 20 20 cd  |_length%)..6.  .|
00001e60  0d 01 37 04 0d 01 38 16  20 c9 20 62 25 3d 43 68  |..7...8. . b%=Ch|
00001e70  61 72 5f 43 6f 6d 6d 61  25 3a 0d 01 39 4d 20 20  |ar_Comma%:..9M  |
00001e80  e7 20 67 6f 74 5f 71 75  6f 74 65 25 20 f2 63 6f  |. got_quote% .co|
00001e90  70 79 5f 66 69 65 6c 64  5f 73 74 75 66 66 5f 63  |py_field_stuff_c|
00001ea0  68 61 72 28 74 6f 25 2c  62 25 2c 66 69 65 6c 64  |har(to%,b%,field|
00001eb0  5f 6c 65 6e 67 74 68 25  29 20 8b 20 66 69 6e 69  |_length%) . fini|
00001ec0  73 68 65 64 25 3d b9 0d  01 3a 04 0d 01 3b 36 20  |shed%=...:...;6 |
00001ed0  c9 20 62 25 3d 43 68 61  72 5f 4c 46 25 20 84 20  |. b%=Char_LF% . |
00001ee0  62 25 3d 43 68 61 72 5f  43 52 25 20 84 20 c5 23  |b%=Char_CR% . .#|
00001ef0  63 73 76 5f 66 69 6c 65  5f 68 61 6e 64 6c 65 25  |csv_file_handle%|
00001f00  3a 0d 01 3c 13 20 20 6c  61 73 74 5f 66 69 65 6c  |:..<.  last_fiel|
00001f10  64 25 3d b9 0d 01 3d 11  20 20 66 69 6e 69 73 68  |d%=...=.  finish|
00001f20  65 64 25 3d b9 0d 01 3e  04 0d 01 3f 07 20 7f 3a  |ed%=...>...?. .:|
00001f30  0d 01 40 14 20 20 e7 20  67 6f 74 5f 73 6c 61 73  |..@.  . got_slas|
00001f40  68 25 20 8c 0d 01 41 0e  20 20 20 c8 8e 20 62 25  |h% ...A.   .. b%|
00001f50  20 ca 0d 01 42 40 20 20  20 20 20 20 20 20 c9 20  | ...B@        . |
00001f60  97 22 6e 22 3a 20 f2 63  6f 70 79 5f 66 69 65 6c  |."n": .copy_fiel|
00001f70  64 5f 73 74 75 66 66 5f  63 68 61 72 28 74 6f 25  |d_stuff_char(to%|
00001f80  2c 31 30 2c 66 69 65 6c  64 5f 6c 65 6e 67 74 68  |,10,field_length|
00001f90  25 29 0d 01 43 08 20 20  20 cb 0d 01 44 13 20 20  |%)..C.   ...D.  |
00001fa0  20 67 6f 74 5f 73 6c 61  73 68 25 3d a3 0d 01 45  | got_slash%=...E|
00001fb0  07 20 20 cc 0d 01 46 33  20 20 20 f2 63 6f 70 79  |.  ...F3   .copy|
00001fc0  5f 66 69 65 6c 64 5f 73  74 75 66 66 5f 63 68 61  |_field_stuff_cha|
00001fd0  72 28 74 6f 25 2c 62 25  2c 66 69 65 6c 64 5f 6c  |r(to%,b%,field_l|
00001fe0  65 6e 67 74 68 25 29 0d  01 47 07 20 20 cd 0d 01  |ength%)..G.  ...|
00001ff0  48 04 0d 01 49 06 20 cb  0d 01 4a 0f fd 20 66 69  |H...I. ...J.. fi|
00002000  6e 69 73 68 65 64 25 0d  01 4b 11 e7 20 74 6f 25  |nished%..K.. to%|
00002010  20 3f 74 6f 25 3d 31 33  0d 01 4c 05 e1 0d 01 4d  | ?to%=13..L....M|
00002020  04 0d 01 4e 04 0d 01 4f  34 dd f2 63 6f 70 79 5f  |...N...O4..copy_|
00002030  66 69 65 6c 64 5f 73 74  75 66 66 5f 63 68 61 72  |field_stuff_char|
00002040  28 f8 20 74 6f 25 2c 20  63 68 61 72 25 2c 20 f8  |(. to%, char%, .|
00002050  20 6c 65 6e 67 74 68 25  29 0d 01 50 0e 6c 65 6e  | length%)..P.len|
00002060  67 74 68 25 2b 3d 31 0d  01 51 1a e7 74 6f 25 20  |gth%+=1..Q..to% |
00002070  3f 74 6f 25 3d 63 68 61  72 25 3a 74 6f 25 2b 3d  |?to%=char%:to%+=|
00002080  31 0d 01 52 05 e1 0d 01  53 04 0d 01 54 04 0d 01  |1..R....S...T...|
00002090  55 21 dd 20 a4 64 65 74  65 72 6d 69 6e 65 5f 6e  |U!. .determine_n|
000020a0  75 6d 62 65 72 5f 6f 66  5f 66 69 65 6c 64 73 0d  |umber_of_fields.|
000020b0  01 56 22 ea 20 73 24 2c  63 6f 75 6e 74 25 2c 6c  |.V". s$,count%,l|
000020c0  61 73 74 5f 66 69 65 6c  64 25 2c 64 75 6d 6d 79  |ast_field%,dummy|
000020d0  25 0d 01 57 12 f2 6f 70  65 6e 5f 63 73 76 5f 66  |%..W..open_csv_f|
000020e0  69 6c 65 0d 01 58 4e e7  20 63 73 76 5f 66 69 6c  |ile..XN. csv_fil|
000020f0  65 5f 68 61 6e 64 6c 65  25 3d 30 20 73 24 3d 63  |e_handle%=0 s$=c|
00002100  73 76 5f 66 69 6c 65 24  3a 63 73 76 5f 66 69 6c  |sv_file$:csv_fil|
00002110  65 24 3d 22 22 3a 85 20  74 61 73 6b 5f 6f 6b 25  |e$="":. task_ok%|
00002120  2c a4 6d 73 67 5f 31 28  22 4f 4b 32 22 2c 73 24  |,.msg_1("OK2",s$|
00002130  29 0d 01 59 05 f5 0d 01  5a 28 20 f2 63 6f 70 79  |)..Y....Z( .copy|
00002140  5f 66 69 65 6c 64 28 30  2c 6c 61 73 74 5f 66 69  |_field(0,last_fi|
00002150  65 6c 64 25 2c 64 75 6d  6d 79 25 2c a3 29 0d 01  |eld%,dummy%,.)..|
00002160  5b 0e 20 63 6f 75 6e 74  25 2b 3d 31 0d 01 5c 11  |[. count%+=1..\.|
00002170  fd 20 6c 61 73 74 5f 66  69 65 6c 64 25 0d 01 5d  |. last_field%..]|
00002180  13 f2 63 6c 6f 73 65 5f  63 73 76 5f 66 69 6c 65  |..close_csv_file|
00002190  0d 01 5e 0b 3d 63 6f 75  6e 74 25 0d 01 5f 04 0d  |..^.=count%.._..|
000021a0  01 60 04 0d 01 61 04 0d  01 62 17 dd 20 f2 67 65  |.`...a...b.. .ge|
000021b0  74 5f 63 73 76 5f 68 65  61 64 69 6e 67 73 0d 01  |t_csv_headings..|
000021c0  63 23 ea 20 73 24 2c 69  25 2c 6c 61 73 74 5f 6e  |c#. s$,i%,last_n|
000021d0  6f 64 65 25 2c 6e 6f 64  65 25 2c 64 75 6d 6d 79  |ode%,node%,dummy|
000021e0  25 0d 01 64 14 c8 95 20  63 73 76 5f 68 65 61 64  |%..d... csv_head|
000021f0  69 6e 67 73 25 0d 01 65  19 20 6e 65 78 74 25 3d  |ings%..e. next%=|
00002200  21 63 73 76 5f 68 65 61  64 69 6e 67 73 25 0d 01  |!csv_headings%..|
00002210  66 25 20 f2 68 65 61 70  5f 66 72 65 65 28 22 43  |f% .heap_free("C|
00002220  53 56 48 22 2c 63 73 76  5f 68 65 61 64 69 6e 67  |SVH",csv_heading|
00002230  73 25 29 0d 01 67 18 20  63 73 76 5f 68 65 61 64  |s%)..g. csv_head|
00002240  69 6e 67 73 25 3d 6e 65  78 74 25 0d 01 68 05 ce  |ings%=next%..h..|
00002250  0d 01 69 12 f2 6f 70 65  6e 5f 63 73 76 5f 66 69  |..i..open_csv_fi|
00002260  6c 65 0d 01 6a 10 6c 61  73 74 5f 6e 6f 64 65 25  |le..j.last_node%|
00002270  3d 30 0d 01 6b 17 e3 20  69 25 3d 31 20 b8 20 63  |=0..k.. i%=1 . c|
00002280  73 76 5f 63 6f 75 6e 74  25 0d 01 6c 2c 20 f2 63  |sv_count%..l, .c|
00002290  6f 70 79 5f 66 69 65 6c  64 28 74 61 73 6b 5f 62  |opy_field(task_b|
000022a0  75 66 66 25 2c 64 75 6d  6d 79 25 2c 64 75 6d 6d  |uff%,dummy%,dumm|
000022b0  79 25 2c b9 29 0d 01 6d  13 20 73 24 3d 24 74 61  |y%,.)..m. s$=$ta|
000022c0  73 6b 5f 62 75 66 66 25  0d 01 6e 4f 20 e7 20 73  |sk_buff%..nO . s|
000022d0  24 3d 22 22 20 73 24 3d  a4 6d 73 67 5f 31 28 22  |$="" s$=.msg_1("|
000022e0  46 49 22 2c c3 28 69 25  29 29 3a f4 20 69 66 20  |FI",.(i%)):. if |
000022f0  61 20 6e 75 6c 6c 20 68  65 61 64 69 6e 67 2c 20  |a null heading, |
00002300  63 72 65 61 74 65 20 61  6e 20 61 72 62 69 74 72  |create an arbitr|
00002310  61 72 79 20 6f 6e 65 0d  01 6f 26 20 6e 6f 64 65  |ary one..o& node|
00002320  25 3d a4 68 65 61 70 5f  63 6c 61 69 6d 28 22 43  |%=.heap_claim("C|
00002330  53 56 48 22 2c a9 28 73  24 29 2b 35 29 0d 01 70  |SVH",.(s$)+5)..p|
00002340  0d 20 21 6e 6f 64 65 25  3d 30 0d 01 71 12 20 24  |. !node%=0..q. $|
00002350  28 6e 6f 64 65 25 2b 34  29 3d 73 24 0d 01 72 39  |(node%+4)=s$..r9|
00002360  20 e7 20 6c 61 73 74 5f  6e 6f 64 65 25 20 21 6c  | . last_node% !l|
00002370  61 73 74 5f 6e 6f 64 65  25 3d 6e 6f 64 65 25 20  |ast_node%=node% |
00002380  8b 20 63 73 76 5f 68 65  61 64 69 6e 67 73 25 3d  |. csv_headings%=|
00002390  6e 6f 64 65 25 0d 01 73  15 20 6c 61 73 74 5f 6e  |node%..s. last_n|
000023a0  6f 64 65 25 3d 6e 6f 64  65 25 0d 01 74 05 ed 0d  |ode%=node%..t...|
000023b0  01 75 24 63 73 76 5f 66  69 6c 65 5f 70 74 72 25  |.u$csv_file_ptr%|
000023c0  3d 8f 23 63 73 76 5f 66  69 6c 65 5f 68 61 6e 64  |=.#csv_file_hand|
000023d0  6c 65 25 0d 01 76 13 f2  63 6c 6f 73 65 5f 63 73  |le%..v..close_cs|
000023e0  76 5f 66 69 6c 65 0d 01  77 05 e1 0d 01 78 04 0d  |v_file..w....x..|
000023f0  01 79 04 0d 01 7a 04 0d  01 7b 1a dd 20 f2 63 72  |.y...z...{.. .cr|
00002400  65 61 74 65 5f 63 73 76  5f 68 65 61 64 69 6e 67  |eate_csv_heading|
00002410  73 0d 01 7c 17 ea 20 73  24 2c 69 25 2c 6c 61 73  |s..|.. s$,i%,las|
00002420  74 25 2c 6e 6f 64 65 25  0d 01 7d 14 c8 95 20 63  |t%,node%..}... c|
00002430  73 76 5f 68 65 61 64 69  6e 67 73 25 0d 01 7e 19  |sv_headings%..~.|
00002440  20 6e 6f 64 65 25 3d 21  63 73 76 5f 68 65 61 64  | node%=!csv_head|
00002450  69 6e 67 73 25 0d 01 7f  25 20 f2 68 65 61 70 5f  |ings%...% .heap_|
00002460  66 72 65 65 28 22 43 53  56 48 22 2c 63 73 76 5f  |free("CSVH",csv_|
00002470  68 65 61 64 69 6e 67 73  25 29 0d 01 80 18 20 63  |headings%).... c|
00002480  73 76 5f 68 65 61 64 69  6e 67 73 25 3d 6e 6f 64  |sv_headings%=nod|
00002490  65 25 0d 01 81 05 ce 0d  01 82 0b 6c 61 73 74 25  |e%.........last%|
000024a0  3d 30 0d 01 83 17 e3 20  69 25 3d 31 20 b8 20 63  |=0..... i%=1 . c|
000024b0  73 76 5f 63 6f 75 6e 74  25 0d 01 84 1a 20 73 24  |sv_count%.... s$|
000024c0  3d a4 6d 73 67 5f 31 28  22 46 49 22 2c c3 28 69  |=.msg_1("FI",.(i|
000024d0  25 29 29 0d 01 85 26 20  6e 6f 64 65 25 3d a4 68  |%))...& node%=.h|
000024e0  65 61 70 5f 63 6c 61 69  6d 28 22 43 53 56 48 22  |eap_claim("CSVH"|
000024f0  2c a9 28 73 24 29 2b 35  29 0d 01 86 0d 20 21 6e  |,.(s$)+5).... !n|
00002500  6f 64 65 25 3d 30 0d 01  87 12 20 24 28 6e 6f 64  |ode%=0.... $(nod|
00002510  65 25 2b 34 29 3d 73 24  0d 01 88 2f 20 e7 20 6c  |e%+4)=s$.../ . l|
00002520  61 73 74 25 20 21 6c 61  73 74 25 3d 6e 6f 64 65  |ast% !last%=node|
00002530  25 20 8b 20 63 73 76 5f  68 65 61 64 69 6e 67 73  |% . csv_headings|
00002540  25 3d 6e 6f 64 65 25 0d  01 89 10 20 6c 61 73 74  |%=node%.... last|
00002550  25 3d 6e 6f 64 65 25 0d  01 8a 05 ed 0d 01 8b 13  |%=node%.........|
00002560  63 73 76 5f 66 69 6c 65  5f 70 74 72 25 3d 30 0d  |csv_file_ptr%=0.|
00002570  01 8c 05 e1 0d 01 8d 04  0d 01 8e 04 0d 01 8f 04  |................|
00002580  0d 01 90 22 dd 20 a4 64  65 74 65 72 6d 69 6e 65  |...". .determine|
00002590  5f 6e 75 6d 62 65 72 5f  6f 66 5f 72 65 63 6f 72  |_number_of_recor|
000025a0  64 73 0d 01 91 19 ea 20  63 6f 75 6e 74 25 2c 62  |ds..... count%,b|
000025b0  25 2c 6e 65 77 5f 6c 69  6e 65 25 0d 01 92 0c 63  |%,new_line%....c|
000025c0  6f 75 6e 74 25 3d 30 0d  01 93 11 f2 68 6f 75 72  |ount%=0.....hour|
000025d0  67 6c 61 73 73 5f 6f 6e  0d 01 94 12 f2 6f 70 65  |glass_on.....ope|
000025e0  6e 5f 63 73 76 5f 66 69  6c 65 0d 01 95 3a cf 23  |n_csv_file...:.#|
000025f0  63 73 76 5f 66 69 6c 65  5f 68 61 6e 64 6c 65 25  |csv_file_handle%|
00002600  3d 63 73 76 5f 66 69 6c  65 5f 70 74 72 25 20 3a  |=csv_file_ptr% :|
00002610  f4 20 70 75 74 20 61 74  20 66 69 65 6c 64 20 73  |. put at field s|
00002620  74 61 72 74 0d 01 96 0f  6e 65 77 5f 6c 69 6e 65  |tart....new_line|
00002630  25 3d b9 0d 01 97 05 f5  0d 01 98 1a 20 62 25 3d  |%=.......... b%=|
00002640  9a 23 63 73 76 5f 66 69  6c 65 5f 68 61 6e 64 6c  |.#csv_file_handl|
00002650  65 25 0d 01 99 37 20 e7  20 62 25 3d 43 68 61 72  |e%...7 . b%=Char|
00002660  5f 43 52 25 20 84 20 62  25 3d 43 68 61 72 5f 4c  |_CR% . b%=Char_L|
00002670  46 25 20 84 20 c5 23 63  73 76 5f 66 69 6c 65 5f  |F% . .#csv_file_|
00002680  68 61 6e 64 6c 65 25 20  8c 0d 01 9a 1f 20 20 e7  |handle% .....  .|
00002690  20 ac 20 6e 65 77 5f 6c  69 6e 65 25 20 8c 20 63  | . new_line% . c|
000026a0  6f 75 6e 74 25 2b 3d 31  0d 01 9b 11 20 20 6e 65  |ount%+=1....  ne|
000026b0  77 5f 6c 69 6e 65 25 3d  b9 0d 01 9c 06 20 cc 0d  |w_line%=..... ..|
000026c0  01 9d 11 20 20 6e 65 77  5f 6c 69 6e 65 25 3d a3  |...  new_line%=.|
000026d0  0d 01 9e 06 20 cd 0d 01  9f 18 fd 20 c5 23 63 73  |.... ...... .#cs|
000026e0  76 5f 66 69 6c 65 5f 68  61 6e 64 6c 65 25 0d 01  |v_file_handle%..|
000026f0  a0 13 f2 63 6c 6f 73 65  5f 63 73 76 5f 66 69 6c  |...close_csv_fil|
00002700  65 0d 01 a1 12 f2 68 6f  75 72 67 6c 61 73 73 5f  |e.....hourglass_|
00002710  6f 66 66 0d 01 a2 0b 3d  63 6f 75 6e 74 25 0d 01  |off....=count%..|
00002720  a3 04 0d 01 a4 04 0d 01  a5 04 0d 01 a6 13 dd 20  |............... |
00002730  f2 64 6f 63 5f 72 65 63  65 69 76 65 64 0d 01 a7  |.doc_received...|
00002740  12 ea 20 6c 6f 6f 70 25  2c 20 74 65 6d 70 24 0d  |.. loop%, temp$.|
00002750  01 a8 04 0d 01 a9 14 e7  20 64 6f 63 5f 66 69 6c  |........ doc_fil|
00002760  65 24 3d 22 22 20 8c 0d  01 aa 1b 20 64 6f 63 5f  |e$="" ..... doc_|
00002770  74 61 73 6b 25 3d 74 61  73 6b 5f 62 75 66 66 25  |task%=task_buff%|
00002780  21 34 0d 01 ab 1e 20 64  6f 63 5f 77 69 6e 64 6f  |!4.... doc_windo|
00002790  77 25 3d 74 61 73 6b 5f  62 75 66 66 25 21 32 30  |w%=task_buff%!20|
000027a0  0d 01 ac 2f 20 64 6f 63  5f 66 69 6c 65 24 3d a4  |.../ doc_file$=.|
000027b0  6c 65 61 66 28 a4 74 61  73 6b 5f 72 74 6f 7a 28  |leaf(.task_rtoz(|
000027c0  74 61 73 6b 5f 62 75 66  66 25 2b 32 34 29 29 0d  |task_buff%+24)).|
000027d0  01 ad 05 cd 0d 01 ae 66  e7 64 6f 63 5f 74 61 73  |.......f.doc_tas|
000027e0  6b 25 3d 74 61 73 6b 5f  62 75 66 66 25 21 34 20  |k%=task_buff%!4 |
000027f0  80 20 64 6f 63 5f 77 69  6e 64 6f 77 25 3d 74 61  |. doc_window%=ta|
00002800  73 6b 5f 62 75 66 66 25  21 32 30 20 80 20 64 6f  |sk_buff%!20 . do|
00002810  63 5f 66 69 6c 65 24 3d  a4 6c 65 61 66 28 a4 74  |c_file$=.leaf(.t|
00002820  61 73 6b 5f 72 74 6f 7a  28 74 61 73 6b 5f 62 75  |ask_rtoz(task_bu|
00002830  66 66 25 2b 32 34 29 29  20 8c 0d 01 af 1f 20 74  |ff%+24)) ..... t|
00002840  61 73 6b 5f 62 75 66 66  25 21 31 32 3d 74 61 73  |ask_buff%!12=tas|
00002850  6b 5f 62 75 66 66 25 21  38 0d 01 b0 34 20 c8 99  |k_buff%!8...4 ..|
00002860  22 57 69 6d 70 5f 53 65  6e 64 4d 65 73 73 61 67  |"Wimp_SendMessag|
00002870  65 22 2c 31 39 2c 74 61  73 6b 5f 62 75 66 66 25  |e",19,task_buff%|
00002880  2c 74 61 73 6b 5f 62 75  66 66 25 21 34 0d 01 b1  |,task_buff%!4...|
00002890  38 20 21 77 69 6e 5f 62  75 66 66 25 3d 6d 61 69  |8 !win_buff%=mai|
000028a0  6e 25 3a c8 99 22 57 69  6d 70 5f 47 65 74 57 69  |n%:.."Wimp_GetWi|
000028b0  6e 64 6f 77 53 74 61 74  65 22 2c 2c 77 69 6e 5f  |ndowState",,win_|
000028c0  62 75 66 66 25 0d 01 b2  33 20 77 69 6e 5f 62 75  |buff%...3 win_bu|
000028d0  66 66 25 21 32 38 3d 2d  31 3a c8 99 22 57 69 6d  |ff%!28=-1:.."Wim|
000028e0  70 5f 4f 70 65 6e 57 69  6e 64 6f 77 22 2c 2c 77  |p_OpenWindow",,w|
000028f0  69 6e 5f 62 75 66 66 25  0d 01 b3 30 20 f2 69 63  |in_buff%...0 .ic|
00002900  6f 6e 5f 77 72 69 74 65  28 6d 61 69 6e 25 2c 49  |on_write(main%,I|
00002910  63 6f 6e 5f 64 6f 63 75  6d 65 6e 74 25 2c 64 6f  |con_document%,do|
00002920  63 5f 66 69 6c 65 24 29  0d 01 b4 05 cd 0d 01 b5  |c_file$)........|
00002930  04 0d 01 b6 13 f4 20 41  74 74 61 63 6b 20 73 74  |...... Attack st|
00002940  72 69 6e 67 0d 01 b7 0c  74 65 6d 70 24 3d 22 22  |ring....temp$=""|
00002950  0d 01 b8 1c e3 20 6c 6f  6f 70 25 3d 31 20 b8 20  |..... loop%=1 . |
00002960  a9 28 64 6f 63 5f 66 69  6c 65 24 29 0d 01 b9 3f  |.(doc_file$)...?|
00002970  e7 20 97 28 c1 64 6f 63  5f 66 69 6c 65 24 2c 20  |. .(.doc_file$, |
00002980  6c 6f 6f 70 25 2c 31 29  29 3e 33 32 20 8c 20 74  |loop%,1))>32 . t|
00002990  65 6d 70 24 2b 3d c1 64  6f 63 5f 66 69 6c 65 24  |emp$+=.doc_file$|
000029a0  2c 20 6c 6f 6f 70 25 2c  20 31 29 0d 01 ba 0b ed  |, loop%, 1).....|
000029b0  20 6c 6f 6f 70 25 0d 01  bb 13 64 6f 63 5f 66 69  | loop%....doc_fi|
000029c0  6c 65 24 3d 74 65 6d 70  24 0d 01 bc 05 e1 0d 01  |le$=temp$.......|
000029d0  bd 04 0d 01 be 04 0d 01  bf 04 0d 01 c0 0f dd 20  |............... |
000029e0  f2 64 61 74 61 73 61 76  65 0d 01 c1 12 ea 20 6c  |.datasave..... l|
000029f0  6f 6f 70 25 2c 20 62 79  74 65 25 0d 01 c2 04 0d  |oop%, byte%.....|
00002a00  01 c3 33 f4 20 72 65 63  65 69 70 74 20 6f 66 20  |..3. receipt of |
00002a10  43 53 56 20 66 69 6c 65  20 64 69 72 65 63 74 6c  |CSV file directl|
00002a20  79 20 66 72 6f 6d 20 61  70 70 6c 69 63 61 74 69  |y from applicati|
00002a30  6f 6e 0d 01 c4 04 0d 01  c5 1f e7 20 74 61 73 6b  |on......... task|
00002a40  5f 62 75 66 66 25 21 34  30 3d 43 53 56 5f 54 79  |_buff%!40=CSV_Ty|
00002a50  70 65 25 20 8c 0d 01 c6  15 20 74 61 73 6b 5f 62  |pe% ..... task_b|
00002a60  75 66 66 25 21 30 3d 32  35 36 0d 01 c7 1f 20 74  |uff%!0=256.... t|
00002a70  61 73 6b 5f 62 75 66 66  25 21 31 32 3d 74 61 73  |ask_buff%!12=tas|
00002a80  6b 5f 62 75 66 66 25 21  38 0d 01 c8 14 20 74 61  |k_buff%!8.... ta|
00002a90  73 6b 5f 62 75 66 66 25  21 31 36 3d 32 0d 01 c9  |sk_buff%!16=2...|
00002aa0  15 20 74 61 73 6b 5f 62  75 66 66 25 21 33 36 3d  |. task_buff%!36=|
00002ab0  2d 31 0d 01 ca 04 0d 01  cb 3d f4 20 43 6f 6e 76  |-1.......=. Conv|
00002ac0  65 72 74 20 74 65 72 6d  69 6e 61 74 65 64 20 73  |ert terminated s|
00002ad0  74 72 69 6e 67 20 74 6f  20 61 20 73 74 72 69 6e  |tring to a strin|
00002ae0  67 20 74 65 72 6d 69 6e  61 74 65 64 20 62 79 20  |g terminated by |
00002af0  31 33 2e 0d 01 cc 0c 6c  6f 6f 70 25 3d 34 34 0d  |13.....loop%=44.|
00002b00  01 cd 1c c8 95 20 28 74  61 73 6b 5f 62 75 66 66  |..... (task_buff|
00002b10  25 3f 6c 6f 6f 70 25 29  3e 33 31 0d 01 ce 12 20  |%?loop%)>31.... |
00002b20  20 20 20 20 20 6c 6f 6f  70 25 2b 3d 31 0d 01 cf  |     loop%+=1...|
00002b30  05 ce 0d 01 d0 17 74 61  73 6b 5f 62 75 66 66 25  |......task_buff%|
00002b40  3f 6c 6f 6f 70 25 3d 31  33 0d 01 d1 04 0d 01 d2  |?loop%=13.......|
00002b50  38 24 28 74 61 73 6b 5f  62 75 66 66 25 2b 34 34  |8$(task_buff%+44|
00002b60  29 3d 22 3c 57 69 6d 70  24 53 63 72 61 70 44 69  |)="<Wimp$ScrapDi|
00002b70  72 3e 2e 22 2b 24 28 74  61 73 6b 5f 62 75 66 66  |r>."+$(task_buff|
00002b80  25 2b 34 34 29 0d 01 d3  33 c8 99 22 57 69 6d 70  |%+44)...3.."Wimp|
00002b90  5f 53 65 6e 64 4d 65 73  73 61 67 65 22 2c 31 37  |_SendMessage",17|
00002ba0  2c 74 61 73 6b 5f 62 75  66 66 25 2c 74 61 73 6b  |,task_buff%,task|
00002bb0  5f 62 75 66 66 25 21 34  0d 01 d4 05 cd 0d 01 d5  |_buff%!4........|
00002bc0  05 e1 0d 01 d6 04 0d 01  d7 04 0d 01 d8 0f dd 20  |............... |
00002bd0  a4 6c 65 61 66 28 73 24  29 0d 01 d9 0f ea 20 64  |.leaf(s$)..... d|
00002be0  6f 74 69 6e 64 65 78 25  0d 01 da 0f 64 6f 74 69  |otindex%....doti|
00002bf0  6e 64 65 78 25 3d 30 0d  01 db 1b c8 95 20 a7 73  |ndex%=0...... .s|
00002c00  24 2c 22 2e 22 2c 64 6f  74 69 6e 64 65 78 25 2b  |$,".",dotindex%+|
00002c10  31 29 0d 01 dc 24 20 20  64 6f 74 69 6e 64 65 78  |1)...$  dotindex|
00002c20  25 3d a7 73 24 2c 22 2e  22 2c 64 6f 74 69 6e 64  |%=.s$,".",dotind|
00002c30  65 78 25 2b 31 29 0d 01  dd 05 ce 0d 01 de 15 3d  |ex%+1).........=|
00002c40  c1 73 24 2c 64 6f 74 69  6e 64 65 78 25 2b 31 29  |.s$,dotindex%+1)|
00002c50  0d 01 df 04 0d 01 e0 04  0d 01 e1 04 0d 01 e2 0e  |................|
00002c60  dd 20 f2 70 72 65 71 75  69 74 0d 01 e3 0d e7 6d  |. .prequit.....m|
00002c70  65 72 67 65 25 20 8c 0d  01 e4 3a 20 f4 20 2a 2a  |erge% ....: . **|
00002c80  2a 2a 2a 20 64 6f 20 73  6f 6d 65 20 70 72 6f 6d  |*** do some prom|
00002c90  70 74 69 6e 67 20 72 65  67 61 72 64 69 6e 67 20  |pting regarding |
00002ca0  6d 65 72 67 65 20 69 6e  20 70 72 6f 67 72 65 73  |merge in progres|
00002cb0  73 0d 01 e5 05 cd 0d 01  e6 05 e1 0d 01 e7 04 0d  |s...............|
00002cc0  01 e8 04 0d 01 e9 04 0d  01 ea 13 dd 20 f2 74 72  |............ .tr|
00002cd0  79 5f 6d 65 72 67 65 5f  6f 6e 0d 01 eb 25 f4 20  |y_merge_on...%. |
00002ce0  74 72 79 20 74 6f 20 64  69 73 70 6c 61 79 20 74  |try to display t|
00002cf0  68 65 20 66 69 72 73 74  20 72 65 63 6f 72 64 0d  |he first record.|
00002d00  01 ec 0c 6d 65 72 67 65  25 3d b9 0d 01 ed 2e 70  |...merge%=.....p|
00002d10  72 65 73 65 72 76 65 64  5f 73 74 61 72 74 5f 6f  |reserved_start_o|
00002d20  66 5f 64 61 74 61 5f 70  74 72 25 3d 63 73 76 5f  |f_data_ptr%=csv_|
00002d30  66 69 6c 65 5f 70 74 72  25 0d 01 ee 18 f2 73 65  |file_ptr%.....se|
00002d40  6e 64 28 22 45 64 69 74  20 4f 66 66 22 2c 2d 31  |nd("Edit Off",-1|
00002d50  29 0d 01 ef 16 f2 6d 65  72 67 65 5f 6e 65 78 74  |).....merge_next|
00002d60  5f 72 65 63 6f 72 64 0d  01 f0 05 e1 0d 01 f1 04  |_record.........|
00002d70  0d 01 f2 04 0d 01 f3 10  dd 20 f2 6d 65 72 67 65  |......... .merge|
00002d80  5f 6f 66 66 0d 01 f4 2c  f4 20 73 74 6f 70 20 6d  |_off...,. stop m|
00002d90  65 72 67 69 6e 67 20 61  6e 64 20 69 6e 69 74 69  |erging and initi|
00002da0  61 6c 69 73 65 20 65 76  65 72 79 74 68 69 6e 67  |alise everything|
00002db0  0d 01 f5 0b ea 20 6e 65  78 74 25 0d 01 f6 04 0d  |..... next%.....|
00002dc0  01 f7 20 e7 20 6d 65 72  67 65 25 20 f2 73 65 6e  |.. . merge% .sen|
00002dd0  64 28 22 45 64 69 74 20  4f 6e 22 2c 2d 31 29 0d  |d("Edit On",-1).|
00002de0  01 f8 0c 6d 65 72 67 65  25 3d a3 0d 01 f9 10 63  |...merge%=.....c|
00002df0  73 76 5f 66 69 6c 65 24  3d 22 22 0d 01 fa 16 63  |sv_file$=""....c|
00002e00  73 76 5f 66 69 6c 65 5f  68 61 6e 64 6c 65 25 3d  |sv_file_handle%=|
00002e10  30 0d 01 fb 10 63 73 76  5f 63 6f 75 6e 74 25 3d  |0....csv_count%=|
00002e20  30 0d 01 fc 13 63 73 76  5f 68 65 61 64 69 6e 67  |0....csv_heading|
00002e30  73 25 3d 30 0d 01 fd 15  63 73 76 5f 66 69 65 6c  |s%=0....csv_fiel|
00002e40  64 5f 70 74 72 73 25 3d  30 0d 01 fe 15 63 73 76  |d_ptrs%=0....csv|
00002e50  5f 66 69 65 6c 64 5f 6c  65 6e 73 25 3d 30 0d 01  |_field_lens%=0..|
00002e60  ff 13 63 73 76 5f 66 69  6c 65 5f 70 74 72 25 3d  |..csv_file_ptr%=|
00002e70  30 0d 02 00 10 64 6f 63  5f 66 69 6c 65 24 3d 22  |0....doc_file$="|
00002e80  22 0d 02 01 0f 64 6f 63  5f 74 61 73 6b 25 3d 30  |"....doc_task%=0|
00002e90  0d 02 02 11 64 6f 63 5f  77 69 6e 64 6f 77 25 3d  |....doc_window%=|
00002ea0  30 0d 02 03 12 66 69 65  6c 64 5f 63 6f 75 6e 74  |0....field_count|
00002eb0  25 3d 30 0d 02 04 0f 72  65 63 5f 74 6f 67 6f 25  |%=0....rec_togo%|
00002ec0  3d 30 0d 02 05 0f 72 65  63 5f 64 6f 6e 65 25 3d  |=0....rec_done%=|
00002ed0  30 0d 02 06 05 e1 0d 02  07 04 0d 02 08 04 0d 02  |0...............|
00002ee0  09 18 dd 20 f2 6d 65 72  67 65 5f 6e 65 78 74 5f  |... .merge_next_|
00002ef0  72 65 63 6f 72 64 0d 02  0a 14 e7 20 72 65 63 5f  |record..... rec_|
00002f00  74 6f 67 6f 25 3c 3e 30  20 8c 0d 02 0b 12 20 f2  |togo%<>0 ..... .|
00002f10  68 6f 75 72 67 6c 61 73  73 5f 6f 6e 0d 02 0c 11  |hourglass_on....|
00002f20  20 f2 6e 65 78 74 5f 72  65 63 6f 72 64 0d 02 0d  | .next_record...|
00002f30  1c 20 f2 73 65 6e 64 28  22 4d 65 72 67 65 22 2c  |. .send("Merge",|
00002f40  54 5f 4d 65 72 67 65 25  29 0d 02 0e 1d 20 f2 64  |T_Merge%).... .d|
00002f50  69 73 61 62 6c 65 5f 6d  65 72 67 69 6e 67 5f 62  |isable_merging_b|
00002f60  75 74 74 6f 6e 73 0d 02  0f 05 cc 0d 02 10 26 20  |uttons........& |
00002f70  24 28 65 72 72 6f 72 5f  62 75 66 66 25 2b 34 29  |$(error_buff%+4)|
00002f80  3d a4 6d 73 67 5f 30 28  22 4f 4b 36 22 29 2b bd  |=.msg_0("OK6")+.|
00002f90  30 0d 02 11 46 20 c8 99  22 57 69 6d 70 5f 52 65  |0...F .."Wimp_Re|
00002fa0  70 6f 72 74 45 72 72 6f  72 22 2c 65 72 72 6f 72  |portError",error|
00002fb0  5f 62 75 66 66 25 2c 25  31 30 30 30 31 2c a4 6d  |_buff%,%10001,.m|
00002fc0  73 67 5f 31 28 22 4d 53  22 2c a4 6d 73 67 5f 30  |sg_1("MS",.msg_0|
00002fd0  28 22 49 44 22 29 29 0d  02 12 13 20 f2 68 6f 73  |("ID")).... .hos|
00002fe0  74 5f 73 68 75 74 64 6f  77 6e 0d 02 13 05 cd 0d  |t_shutdown......|
00002ff0  02 14 05 e1 0d 02 15 04  0d 02 16 04 0d 02 17 12  |................|
00003000  dd 20 f2 6e 65 78 74 5f  72 65 63 6f 72 64 0d 02  |. .next_record..|
00003010  18 45 f4 20 63 61 6c 63  75 6c 61 74 65 73 20 70  |.E. calculates p|
00003020  6f 69 6e 74 65 72 73 20  74 6f 20 65 61 63 68 20  |ointers to each |
00003030  66 69 65 6c 64 2c 20 61  6e 64 20 74 68 65 20 6c  |field, and the l|
00003040  65 6e 67 74 68 20 6f 66  20 65 61 63 68 20 66 69  |ength of each fi|
00003050  65 6c 64 0d 02 19 28 ea  20 6c 65 6e 25 2c 69 25  |eld...(. len%,i%|
00003060  2c 64 75 6d 6d 79 25 2c  66 69 6e 69 73 68 65 64  |,dummy%,finished|
00003070  25 2c 74 68 69 73 5f 70  74 72 25 0d 02 1a 04 0d  |%,this_ptr%.....|
00003080  02 1b 37 f4 20 63 68 65  63 6b 20 61 6c 6c 20 72  |..7. check all r|
00003090  65 63 6f 72 64 73 20 68  61 76 65 20 69 64 65 6e  |ecords have iden|
000030a0  74 69 63 61 6c 20 6e 75  6d 62 65 72 20 6f 66 20  |tical number of |
000030b0  66 69 65 6c 64 73 0d 02  1c 10 ea 20 6e 75 6d 66  |fields..... numf|
000030c0  69 65 6c 64 73 25 0d 02  1d 10 6e 75 6d 66 69 65  |ields%....numfie|
000030d0  6c 64 73 25 3d 30 0d 02  1e 12 f2 6f 70 65 6e 5f  |lds%=0.....open_|
000030e0  63 73 76 5f 66 69 6c 65  0d 02 1f 3b e7 20 63 73  |csv_file...;. cs|
000030f0  76 5f 66 69 6c 65 5f 68  61 6e 64 6c 65 25 3d 30  |v_file_handle%=0|
00003100  20 85 20 74 61 73 6b 5f  6f 6b 25 2c a4 6d 73 67  | . task_ok%,.msg|
00003110  5f 31 28 22 4f 4b 32 22  2c 63 73 76 5f 66 69 6c  |_1("OK2",csv_fil|
00003120  65 24 29 0d 02 20 3a f4  20 66 72 65 65 20 75 70  |e$).. :. free up|
00003130  20 74 68 65 20 6d 65 6d  6f 72 79 20 6f 63 63 75  | the memory occu|
00003140  70 69 65 64 20 62 79 20  61 6e 79 20 65 78 69 73  |pied by any exis|
00003150  74 69 6e 67 20 70 6f 69  6e 74 65 72 73 0d 02 21  |ting pointers..!|
00003160  16 c8 95 20 63 73 76 5f  66 69 65 6c 64 5f 70 74  |... csv_field_pt|
00003170  72 73 25 0d 02 22 1b 20  6e 65 78 74 25 3d 21 63  |rs%..". next%=!c|
00003180  73 76 5f 66 69 65 6c 64  5f 70 74 72 73 25 0d 02  |sv_field_ptrs%..|
00003190  23 27 20 f2 68 65 61 70  5f 66 72 65 65 28 22 43  |#' .heap_free("C|
000031a0  53 56 50 22 2c 63 73 76  5f 66 69 65 6c 64 5f 70  |SVP",csv_field_p|
000031b0  74 72 73 25 29 0d 02 24  1a 20 63 73 76 5f 66 69  |trs%)..$. csv_fi|
000031c0  65 6c 64 5f 70 74 72 73  25 3d 6e 65 78 74 25 0d  |eld_ptrs%=next%.|
000031d0  02 25 05 ce 0d 02 26 16  c8 95 20 63 73 76 5f 66  |.%....&... csv_f|
000031e0  69 65 6c 64 5f 6c 65 6e  73 25 0d 02 27 1b 20 6e  |ield_lens%..'. n|
000031f0  65 78 74 25 3d 21 63 73  76 5f 66 69 65 6c 64 5f  |ext%=!csv_field_|
00003200  6c 65 6e 73 25 0d 02 28  27 20 f2 68 65 61 70 5f  |lens%..(' .heap_|
00003210  66 72 65 65 28 22 43 53  56 4c 22 2c 63 73 76 5f  |free("CSVL",csv_|
00003220  66 69 65 6c 64 5f 6c 65  6e 73 25 29 0d 02 29 1a  |field_lens%)..).|
00003230  20 63 73 76 5f 66 69 65  6c 64 5f 6c 65 6e 73 25  | csv_field_lens%|
00003240  3d 6e 65 78 74 25 0d 02  2a 05 ce 0d 02 2b 24 cf  |=next%..*....+$.|
00003250  23 63 73 76 5f 66 69 6c  65 5f 68 61 6e 64 6c 65  |#csv_file_handle|
00003260  25 3d 63 73 76 5f 66 69  6c 65 5f 70 74 72 25 0d  |%=csv_file_ptr%.|
00003270  02 2c 08 69 25 3d 30 0d  02 2d 05 f5 0d 02 2e 0b  |.,.i%=0..-......|
00003280  20 20 69 25 2b 3d 31 0d  02 2f 07 20 20 f5 0d 02  |  i%+=1../.  ...|
00003290  30 49 20 20 20 20 74 68  69 73 5f 70 74 72 25 3d  |0I    this_ptr%=|
000032a0  8f 23 63 73 76 5f 66 69  6c 65 5f 68 61 6e 64 6c  |.#csv_file_handl|
000032b0  65 25 20 20 20 20 3a f4  20 70 6f 69 6e 74 65 72  |e%    :. pointer|
000032c0  20 74 6f 20 72 65 61 6c  20 73 74 61 72 74 20 6f  | to real start o|
000032d0  66 20 66 69 65 6c 64 0d  02 31 24 20 20 20 20 f2  |f field..1$    .|
000032e0  63 6f 70 79 5f 66 69 65  6c 64 28 30 2c 64 75 6d  |copy_field(0,dum|
000032f0  6d 79 25 2c 6c 65 6e 25  2c a3 29 0d 02 32 13 20  |my%,len%,.)..2. |
00003300  20 20 20 66 69 6e 69 73  68 65 64 25 3d b9 0d 02  |   finished%=...|
00003310  33 45 20 20 20 20 e7 20  ac 20 c5 23 63 73 76 5f  |3E    . . .#csv_|
00003320  66 69 6c 65 5f 68 61 6e  64 6c 65 25 20 80 20 69  |file_handle% . i|
00003330  25 3d 31 20 80 20 6c 65  6e 25 3d 30 20 80 20 64  |%=1 . len%=0 . d|
00003340  75 6d 6d 79 25 20 8c 20  66 69 6e 69 73 68 65 64  |ummy% . finished|
00003350  25 3d a3 0d 02 34 11 20  20 fd 20 66 69 6e 69 73  |%=...4.  . finis|
00003360  68 65 64 25 0d 02 35 1f  20 20 f2 61 64 64 5f 66  |hed%..5.  .add_f|
00003370  69 65 6c 64 5f 70 74 72  28 74 68 69 73 5f 70 74  |ield_ptr(this_pt|
00003380  72 25 29 0d 02 36 1a 20  20 f2 61 64 64 5f 66 69  |r%)..6.  .add_fi|
00003390  65 6c 64 5f 6c 65 6e 28  6c 65 6e 25 29 0d 02 37  |eld_len(len%)..7|
000033a0  31 fd 20 69 25 3d 63 73  76 5f 63 6f 75 6e 74 25  |1. i%=csv_count%|
000033b0  20 84 20 64 75 6d 6d 79  25 20 84 20 c5 23 63 73  | . dummy% . .#cs|
000033c0  76 5f 66 69 6c 65 5f 68  61 6e 64 6c 65 25 0d 02  |v_file_handle%..|
000033d0  38 13 e7 20 ac 20 64 75  6d 6d 79 25 20 f2 65 6f  |8.. . dummy% .eo|
000033e0  6c 0d 02 39 15 e7 20 69  25 3c 63 73 76 5f 63 6f  |l..9.. i%<csv_co|
000033f0  75 6e 74 25 20 8c 0d 02  3a 16 20 20 c8 95 20 69  |unt% ...:.  .. i|
00003400  25 3c 63 73 76 5f 63 6f  75 6e 74 25 0d 02 3b 0c  |%<csv_count%..;.|
00003410  20 20 20 69 25 2b 3d 31  0d 02 3c 18 20 20 20 f2  |   i%+=1..<.   .|
00003420  61 64 64 5f 66 69 65 6c  64 5f 70 74 72 28 30 29  |add_field_ptr(0)|
00003430  0d 02 3d 18 20 20 20 f2  61 64 64 5f 66 69 65 6c  |..=.   .add_fiel|
00003440  64 5f 6c 65 6e 28 30 29  0d 02 3e 07 20 20 ce 0d  |d_len(0)..>.  ..|
00003450  02 3f 05 cd 0d 02 40 24  63 73 76 5f 66 69 6c 65  |.?....@$csv_file|
00003460  5f 70 74 72 25 3d 8f 23  63 73 76 5f 66 69 6c 65  |_ptr%=.#csv_file|
00003470  5f 68 61 6e 64 6c 65 25  0d 02 41 13 f2 63 6c 6f  |_handle%..A..clo|
00003480  73 65 5f 63 73 76 5f 66  69 6c 65 0d 02 42 05 e1  |se_csv_file..B..|
00003490  0d 02 43 04 0d 02 44 04  0d 02 45 0a dd 20 f2 65  |..C...D...E.. .e|
000034a0  6f 6c 0d 02 46 07 ea 20  78 0d 02 47 07 78 3d 30  |ol..F.. x..G.x=0|
000034b0  0d 02 48 05 f5 0d 02 49  32 20 e7 20 ac 20 c5 23  |..H....I2 . . .#|
000034c0  63 73 76 5f 66 69 6c 65  5f 68 61 6e 64 6c 65 25  |csv_file_handle%|
000034d0  20 8c 20 78 3d 9a 23 63  73 76 5f 66 69 6c 65 5f  | . x=.#csv_file_|
000034e0  68 61 6e 64 6c 65 25 0d  02 4a 32 fd 20 78 3d 43  |handle%..J2. x=C|
000034f0  68 61 72 5f 43 52 25 20  84 20 78 3d 43 68 61 72  |har_CR% . x=Char|
00003500  5f 4c 46 25 20 84 20 c5  23 63 73 76 5f 66 69 6c  |_LF% . .#csv_fil|
00003510  65 5f 68 61 6e 64 6c 65  25 0d 02 4b 05 e1 0d 02  |e_handle%..K....|
00003520  4c 04 0d 02 4d 04 0d 02  4e 04 0d 02 4f 1c dd 20  |L...M...N...O.. |
00003530  f2 61 64 64 5f 66 69 65  6c 64 5f 70 74 72 28 69  |.add_field_ptr(i|
00003540  6e 64 65 78 25 29 0d 02  50 11 ea 20 6e 6f 64 65  |ndex%)..P.. node|
00003550  25 2c 6c 61 73 74 25 0d  02 51 1f 6e 6f 64 65 25  |%,last%..Q.node%|
00003560  3d a4 68 65 61 70 5f 63  6c 61 69 6d 28 22 43 53  |=.heap_claim("CS|
00003570  56 50 22 2c 38 29 0d 02  52 0d 6e 6f 64 65 25 21  |VP",8)..R.node%!|
00003580  30 3d 30 0d 02 53 12 6e  6f 64 65 25 21 34 3d 69  |0=0..S.node%!4=i|
00003590  6e 64 65 78 25 0d 02 54  19 e7 20 63 73 76 5f 66  |ndex%..T.. csv_f|
000035a0  69 65 6c 64 5f 70 74 72  73 25 3d 30 20 8c 0d 02  |ield_ptrs%=0 ...|
000035b0  55 1a 20 63 73 76 5f 66  69 65 6c 64 5f 70 74 72  |U. csv_field_ptr|
000035c0  73 25 3d 6e 6f 64 65 25  0d 02 56 05 cc 0d 02 57  |s%=node%..V....W|
000035d0  1a 20 6c 61 73 74 25 3d  63 73 76 5f 66 69 65 6c  |. last%=csv_fiel|
000035e0  64 5f 70 74 72 73 25 0d  02 58 0e 20 c8 95 20 21  |d_ptrs%..X. .. !|
000035f0  6c 61 73 74 25 0d 02 59  12 20 20 6c 61 73 74 25  |last%..Y.  last%|
00003600  3d 21 6c 61 73 74 25 0d  02 5a 06 20 ce 0d 02 5b  |=!last%..Z. ...[|
00003610  11 20 21 6c 61 73 74 25  3d 6e 6f 64 65 25 0d 02  |. !last%=node%..|
00003620  5c 05 cd 0d 02 5d 05 e1  0d 02 5e 04 0d 02 5f 04  |\....]....^..._.|
00003630  0d 02 60 04 0d 02 61 1b  dd f2 61 64 64 5f 66 69  |..`...a...add_fi|
00003640  65 6c 64 5f 6c 65 6e 28  69 6e 64 65 78 25 29 0d  |eld_len(index%).|
00003650  02 62 11 ea 20 6e 6f 64  65 25 2c 6c 61 73 74 25  |.b.. node%,last%|
00003660  0d 02 63 1f 6e 6f 64 65  25 3d a4 68 65 61 70 5f  |..c.node%=.heap_|
00003670  63 6c 61 69 6d 28 22 43  53 56 4c 22 2c 38 29 0d  |claim("CSVL",8).|
00003680  02 64 0d 6e 6f 64 65 25  21 30 3d 30 0d 02 65 12  |.d.node%!0=0..e.|
00003690  6e 6f 64 65 25 21 34 3d  69 6e 64 65 78 25 0d 02  |node%!4=index%..|
000036a0  66 19 e7 20 63 73 76 5f  66 69 65 6c 64 5f 6c 65  |f.. csv_field_le|
000036b0  6e 73 25 3d 30 20 8c 0d  02 67 1a 20 63 73 76 5f  |ns%=0 ...g. csv_|
000036c0  66 69 65 6c 64 5f 6c 65  6e 73 25 3d 6e 6f 64 65  |field_lens%=node|
000036d0  25 0d 02 68 05 cc 0d 02  69 1a 20 6c 61 73 74 25  |%..h....i. last%|
000036e0  3d 63 73 76 5f 66 69 65  6c 64 5f 6c 65 6e 73 25  |=csv_field_lens%|
000036f0  0d 02 6a 0e 20 c8 95 20  21 6c 61 73 74 25 0d 02  |..j. .. !last%..|
00003700  6b 12 20 20 6c 61 73 74  25 3d 21 6c 61 73 74 25  |k.  last%=!last%|
00003710  0d 02 6c 06 20 ce 0d 02  6d 11 20 21 6c 61 73 74  |..l. ...m. !last|
00003720  25 3d 6e 6f 64 65 25 0d  02 6e 05 cd 0d 02 6f 05  |%=node%..n....o.|
00003730  e1 0d 02 70 04 0d 02 71  04 0d 02 72 04 0d 02 73  |...p...q...r...s|
00003740  18 dd 20 a4 66 69 65 6c  64 5f 70 74 72 28 69 6e  |.. .field_ptr(in|
00003750  64 65 78 25 29 0d 02 74  28 f4 20 72 65 74 75 72  |dex%)..t(. retur|
00003760  6e 20 74 68 65 20 6e 74  68 20 28 73 74 61 72 74  |n the nth (start|
00003770  69 6e 67 20 61 74 20 30  29 20 70 74 72 0d 02 75  |ing at 0) ptr..u|
00003780  0b ea 20 6e 6f 64 65 25  0d 02 76 19 6e 6f 64 65  |.. node%..v.node|
00003790  25 3d 63 73 76 5f 66 69  65 6c 64 5f 70 74 72 73  |%=csv_field_ptrs|
000037a0  25 0d 02 77 0d c8 95 20  69 6e 64 65 78 25 0d 02  |%..w... index%..|
000037b0  78 35 20 f4 20 74 68 69  73 20 69 73 20 73 61 66  |x5 . this is saf|
000037c0  65 20 27 63 6f 73 20 69  74 73 20 76 61 6c 69 64  |e 'cos its valid|
000037d0  61 74 65 64 20 62 65 66  6f 72 65 20 63 61 6c 6c  |ated before call|
000037e0  69 6e 67 0d 02 79 42 20  6e 6f 64 65 25 3d 21 6e  |ing..yB node%=!n|
000037f0  6f 64 65 25 3a e7 6e 6f  64 65 25 3d 30 20 85 20  |ode%:.node%=0 . |
00003800  74 61 73 6b 5f 66 61 74  61 6c 25 2c 22 42 61 64  |task_fatal%,"Bad|
00003810  20 66 69 65 6c 64 20 70  74 72 20 72 65 71 75 65  | field ptr reque|
00003820  73 74 65 64 22 0d 02 7a  0e 20 69 6e 64 65 78 25  |sted"..z. index%|
00003830  2d 3d 31 0d 02 7b 05 ce  0d 02 7c 0c 3d 6e 6f 64  |-=1..{....|.=nod|
00003840  65 25 21 34 0d 02 7d 04  0d 02 7e 04 0d 02 7f 04  |e%!4..}...~.....|
00003850  0d 02 80 18 dd 20 a4 66  69 65 6c 64 5f 6c 65 6e  |..... .field_len|
00003860  28 69 6e 64 65 78 25 29  0d 02 81 2b f4 20 72 65  |(index%)...+. re|
00003870  74 75 72 6e 20 74 68 65  20 6e 74 68 20 28 73 74  |turn the nth (st|
00003880  61 72 74 69 6e 67 20 61  74 20 30 29 20 6c 65 6e  |arting at 0) len|
00003890  67 74 68 0d 02 82 0b ea  20 6e 6f 64 65 25 0d 02  |gth..... node%..|
000038a0  83 19 6e 6f 64 65 25 3d  63 73 76 5f 66 69 65 6c  |..node%=csv_fiel|
000038b0  64 5f 6c 65 6e 73 25 0d  02 84 0d c8 95 20 69 6e  |d_lens%...... in|
000038c0  64 65 78 25 0d 02 85 35  20 f4 20 74 68 69 73 20  |dex%...5 . this |
000038d0  69 73 20 73 61 66 65 20  27 63 6f 73 20 69 74 73  |is safe 'cos its|
000038e0  20 76 61 6c 69 64 61 74  65 64 20 62 65 66 6f 72  | validated befor|
000038f0  65 20 63 61 6c 6c 69 6e  67 0d 02 86 42 20 6e 6f  |e calling...B no|
00003900  64 65 25 3d 21 6e 6f 64  65 25 3a e7 6e 6f 64 65  |de%=!node%:.node|
00003910  25 3d 30 20 85 20 74 61  73 6b 5f 66 61 74 61 6c  |%=0 . task_fatal|
00003920  25 2c 22 42 61 64 20 66  69 65 6c 64 20 6c 65 6e  |%,"Bad field len|
00003930  20 72 65 71 75 65 73 74  65 64 22 0d 02 87 0e 20  | requested".... |
00003940  69 6e 64 65 78 25 2d 3d  31 0d 02 88 05 ce 0d 02  |index%-=1.......|
00003950  89 0c 3d 6e 6f 64 65 25  21 34 0d 02 8a 04 0d 02  |..=node%!4......|
00003960  8b 04 0d 02 8c 04 0d 02  8d 21 dd 20 f2 73 65 6e  |.........!. .sen|
00003970  64 28 63 6f 6d 6d 61 6e  64 24 2c 72 65 70 6c 79  |d(command$,reply|
00003980  74 6f 6b 65 6e 25 29 0d  02 8e 0b ea 20 69 25 2c  |token%)..... i%,|
00003990  6d 24 0d 02 8f 16 e7 20  64 6f 63 5f 66 69 6c 65  |m$..... doc_file|
000039a0  24 3d 22 22 20 8c 20 e1  0d 02 90 3f e7 20 72 65  |$="" . ....?. re|
000039b0  70 6c 79 74 6f 6b 65 6e  25 3c 3e 2d 31 20 69 25  |plytoken%<>-1 i%|
000039c0  3d 49 6d 70 75 6c 73 65  5f 52 65 71 75 65 73 74  |=Impulse_Request|
000039d0  25 20 8b 20 69 25 3d 49  6d 70 75 6c 73 65 5f 43  |% . i%=Impulse_C|
000039e0  6f 6d 6d 61 6e 64 25 0d  02 91 32 6d 24 3d 22 3a  |ommand%...2m$=":|
000039f0  22 2b a4 6d 73 67 5f 30  28 22 53 56 22 29 2b 22  |"+.msg_0("SV")+"|
00003a00  2e 22 2b 64 6f 63 5f 66  69 6c 65 24 2b 22 20 22  |."+doc_file$+" "|
00003a10  2b 63 6f 6d 6d 61 6e 64  24 0d 02 92 42 c8 99 22  |+command$...B.."|
00003a20  49 6d 70 75 6c 73 65 5f  53 65 6e 64 4d 65 73 73  |Impulse_SendMess|
00003a30  61 67 65 22 2c 69 25 2c  6d 24 2c 30 2c 30 2c 30  |age",i%,m$,0,0,0|
00003a40  2c 72 65 70 6c 79 74 6f  6b 65 6e 25 2c 74 61 73  |,replytoken%,tas|
00003a50  6b 5f 68 61 6e 64 6c 65  25 2c 30 0d 02 93 05 e1  |k_handle%,0.....|
00003a60  0d 02 94 04 0d 02 95 04  0d 02 96 1d dd f2 64 69  |..............di|
00003a70  73 61 62 6c 65 5f 6d 65  72 67 69 6e 67 5f 62 75  |sable_merging_bu|
00003a80  74 74 6f 6e 73 0d 02 97  25 f2 69 63 6f 6e 5f 73  |ttons...%.icon_s|
00003a90  68 61 64 65 28 6d 61 69  6e 25 2c 49 63 6f 6e 5f  |hade(main%,Icon_|
00003aa0  50 72 69 6e 74 41 6c 6c  25 29 0d 02 98 22 f2 69  |PrintAll%)...".i|
00003ab0  63 6f 6e 5f 73 68 61 64  65 28 6d 61 69 6e 25 2c  |con_shade(main%,|
00003ac0  49 63 6f 6e 5f 50 72 69  6e 74 25 29 0d 02 99 21  |Icon_Print%)...!|
00003ad0  f2 69 63 6f 6e 5f 73 68  61 64 65 28 6d 61 69 6e  |.icon_shade(main|
00003ae0  25 2c 49 63 6f 6e 5f 4e  65 78 74 25 29 0d 02 9a  |%,Icon_Next%)...|
00003af0  21 f2 69 63 6f 6e 5f 73  68 61 64 65 28 6d 61 69  |!.icon_shade(mai|
00003b00  6e 25 2c 49 63 6f 6e 5f  45 64 69 74 25 29 0d 02  |n%,Icon_Edit%)..|
00003b10  9b 05 e1 0d 02 9c 04 0d  02 9d 04 0d 02 9e 1c dd  |................|
00003b20  f2 65 6e 61 62 6c 65 5f  6d 65 72 67 69 6e 67 5f  |.enable_merging_|
00003b30  62 75 74 74 6f 6e 73 0d  02 9f 27 f2 69 63 6f 6e  |buttons...'.icon|
00003b40  5f 75 6e 73 68 61 64 65  28 6d 61 69 6e 25 2c 49  |_unshade(main%,I|
00003b50  63 6f 6e 5f 50 72 69 6e  74 41 6c 6c 25 29 0d 02  |con_PrintAll%)..|
00003b60  a0 24 f2 69 63 6f 6e 5f  75 6e 73 68 61 64 65 28  |.$.icon_unshade(|
00003b70  6d 61 69 6e 25 2c 49 63  6f 6e 5f 50 72 69 6e 74  |main%,Icon_Print|
00003b80  25 29 0d 02 a1 23 f2 69  63 6f 6e 5f 75 6e 73 68  |%)...#.icon_unsh|
00003b90  61 64 65 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 4e  |ade(main%,Icon_N|
00003ba0  65 78 74 25 29 0d 02 a2  23 f2 69 63 6f 6e 5f 75  |ext%)...#.icon_u|
00003bb0  6e 73 68 61 64 65 28 6d  61 69 6e 25 2c 49 63 6f  |nshade(main%,Ico|
00003bc0  6e 5f 45 64 69 74 25 29  0d 02 a3 05 e1 0d 02 a4  |n_Edit%)........|
00003bd0  04 0d 02 a5 04 0d 02 a6  26 dd 20 f2 63 6f 6d 6d  |........&. .comm|
00003be0  61 6e 64 28 74 6f 6b 65  6e 25 2c 70 61 72 61 6d  |and(token%,param|
00003bf0  73 25 2c 6f 62 6a 65 63  74 25 29 0d 02 a7 0f c8  |s%,object%).....|
00003c00  8e 20 74 6f 6b 65 6e 25  20 ca 0d 02 a8 13 20 20  |. token% .....  |
00003c10  c9 20 54 5f 47 65 74 46  69 65 6c 64 25 0d 02 a9  |. T_GetField%...|
00003c20  25 20 20 20 20 20 20 f2  67 65 74 5f 66 69 65 6c  |%      .get_fiel|
00003c30  64 28 70 61 72 61 6d 73  25 2c 6f 62 6a 65 63 74  |d(params%,object|
00003c40  25 29 0d 02 aa 19 20 20  20 20 20 20 66 69 65 6c  |%)....      fiel|
00003c50  64 5f 63 6f 75 6e 74 25  2b 3d 31 0d 02 ab 14 20  |d_count%+=1.... |
00003c60  20 c9 20 54 5f 43 6c 6f  73 65 44 6f 77 6e 25 0d  | . T_CloseDown%.|
00003c70  02 ac 18 20 20 20 20 20  20 64 69 65 70 6c 65 61  |...      dieplea|
00003c80  73 65 25 20 3d 20 b9 0d  02 ad 18 20 20 20 20 20  |se% = .....     |
00003c90  20 f2 68 6f 73 74 5f 73  68 75 74 64 6f 77 6e 0d  | .host_shutdown.|
00003ca0  02 ae 05 cb 0d 02 af 05  e1 0d 02 b0 04 0d 02 b1  |................|
00003cb0  04 0d 02 b2 21 dd 20 f2  67 65 74 5f 66 69 65 6c  |....!. .get_fiel|
00003cc0  64 28 70 61 72 61 6d 73  25 2c 6f 62 6a 65 63 74  |d(params%,object|
00003cd0  25 29 0d 02 b3 32 f4 20  70 61 72 61 6d 73 25 20  |%)...2. params% |
00003ce0  70 6f 69 6e 74 73 20 74  6f 20 74 68 65 20 72 65  |points to the re|
00003cf0  73 75 6c 74 73 20 6f 66  20 4f 53 5f 52 65 61 64  |sults of OS_Read|
00003d00  41 72 67 73 0d 02 b4 30  ea 20 66 69 65 6c 64 5f  |Args...0. field_|
00003d10  69 6e 64 65 78 25 2c 20  66 69 65 6c 64 5f 6e 61  |index%, field_na|
00003d20  6d 65 24 2c 20 70 74 72  25 2c 20 66 69 6e 69 73  |me$, ptr%, finis|
00003d30  68 65 64 25 0d 02 b5 12  e7 20 70 61 72 61 6d 73  |hed%..... params|
00003d40  25 3d 2d 31 20 e1 0d 02  b6 23 66 69 65 6c 64 5f  |%=-1 ....#field_|
00003d50  6e 61 6d 65 24 3d a4 74  61 73 6b 5f 72 74 6f 7a  |name$=.task_rtoz|
00003d60  28 70 61 72 61 6d 73 25  29 0d 02 b7 12 66 69 65  |(params%)....fie|
00003d70  6c 64 5f 69 6e 64 65 78  25 3d 30 0d 02 b8 16 70  |ld_index%=0....p|
00003d80  74 72 25 3d 63 73 76 5f  68 65 61 64 69 6e 67 73  |tr%=csv_headings|
00003d90  25 0d 02 b9 0f 66 69 6e  69 73 68 65 64 25 3d a3  |%....finished%=.|
00003da0  0d 02 ba 05 f5 0d 02 bb  14 20 66 69 65 6c 64 5f  |......... field_|
00003db0  69 6e 64 65 78 25 2b 3d  31 0d 02 bc 1e 20 e7 20  |index%+=1.... . |
00003dc0  24 28 70 74 72 25 2b 34  29 3d 66 69 65 6c 64 5f  |$(ptr%+4)=field_|
00003dd0  6e 61 6d 65 24 20 8c 0d  02 bd 11 20 20 66 69 6e  |name$ .....  fin|
00003de0  69 73 68 65 64 25 3d b9  0d 02 be 06 20 cc 0d 02  |ished%=..... ...|
00003df0  bf 10 20 20 70 74 72 25  3d 21 70 74 72 25 0d 02  |..  ptr%=!ptr%..|
00003e00  c0 2c 20 20 e7 20 70 74  72 25 3d 30 20 8c 20 66  |.,  . ptr%=0 . f|
00003e10  69 6e 69 73 68 65 64 25  3d b9 3a 66 69 65 6c 64  |inished%=.:field|
00003e20  5f 69 6e 64 65 78 25 3d  2d 31 0d 02 c1 06 20 cd  |_index%=-1.... .|
00003e30  0d 02 c2 04 0d 02 c3 24  f4 20 21 21 21 21 21 21  |.......$. !!!!!!|
00003e40  21 21 21 21 21 21 21 21  21 21 21 21 21 21 21 21  |!!!!!!!!!!!!!!!!|
00003e50  21 21 21 21 21 21 21 21  0d 02 c4 3e f4 20 20 49  |!!!!!!!!...>.  I|
00003e60  46 20 70 74 72 25 3d 30  20 45 52 52 4f 52 20 74  |F ptr%=0 ERROR t|
00003e70  61 73 6b 5f 66 61 74 61  6c 25 2c 20 46 4e 6d 73  |ask_fatal%, FNms|
00003e80  67 5f 31 28 22 4f 4b 34  22 2c 66 69 65 6c 64 5f  |g_1("OK4",field_|
00003e90  6e 61 6d 65 24 29 0d 02  c5 10 20 20 e7 20 70 74  |name$)....  . pt|
00003ea0  72 25 3d 30 20 8c 0d 02  c6 33 20 20 20 20 24 28  |r%=0 ....3    $(|
00003eb0  65 72 72 6f 72 5f 62 75  66 66 25 2b 34 29 3d a4  |error_buff%+4)=.|
00003ec0  6d 73 67 5f 31 28 22 4f  4b 34 22 2c 20 66 69 65  |msg_1("OK4", fie|
00003ed0  6c 64 5f 6e 61 6d 65 24  29 0d 02 c7 4a 20 20 20  |ld_name$)...J   |
00003ee0  20 c8 99 20 22 57 69 6d  70 5f 52 65 70 6f 72 74  | .. "Wimp_Report|
00003ef0  45 72 72 6f 72 22 2c 65  72 72 6f 72 5f 62 75 66  |Error",error_buf|
00003f00  66 25 2c 25 31 30 30 30  31 2c a4 6d 73 67 5f 31  |f%,%10001,.msg_1|
00003f10  28 22 4d 53 22 2c a4 6d  73 67 5f 30 28 22 49 44  |("MS",.msg_0("ID|
00003f20  22 29 29 0d 02 c8 07 20  20 cd 0d 02 c9 25 f4 20  |"))....  ....%. |
00003f30  21 21 21 21 21 21 21 21  21 21 21 21 21 21 21 21  |!!!!!!!!!!!!!!!!|
00003f40  21 21 21 21 21 21 21 21  21 21 21 21 21 21 21 0d  |!!!!!!!!!!!!!!!.|
00003f50  02 ca 04 0d 02 cb 0f fd  20 66 69 6e 69 73 68 65  |........ finishe|
00003f60  64 25 0d 02 cc 30 e7 20  66 69 65 6c 64 5f 69 6e  |d%...0. field_in|
00003f70  64 65 78 25 3c 31 20 84  20 66 69 65 6c 64 5f 69  |dex%<1 . field_i|
00003f80  6e 64 65 78 25 3e 63 73  76 5f 63 6f 75 6e 74 25  |ndex%>csv_count%|
00003f90  20 8c 0d 02 cd 1d 20 20  f2 74 72 61 6e 73 5f 72  | .....  .trans_r|
00003fa0  65 70 6c 79 5f 62 6c 6f  63 6b 28 30 2c 30 29 0d  |eply_block(0,0).|
00003fb0  02 ce 05 cc 0d 02 cf 4f  20 20 f2 74 72 61 6e 73  |.......O  .trans|
00003fc0  5f 72 65 70 6c 79 5f 62  6c 6f 63 6b 28 a4 66 69  |_reply_block(.fi|
00003fd0  65 6c 64 5f 70 74 72 28  66 69 65 6c 64 5f 69 6e  |eld_ptr(field_in|
00003fe0  64 65 78 25 2d 31 29 2c  a4 66 69 65 6c 64 5f 6c  |dex%-1),.field_l|
00003ff0  65 6e 28 66 69 65 6c 64  5f 69 6e 64 65 78 25 2d  |en(field_index%-|
00004000  31 29 29 0d 02 d0 05 cd  0d 02 d1 05 e1 0d 02 d2  |1)).............|
00004010  04 0d 02 d3 04 0d 02 d4  22 dd f2 74 72 61 6e 73  |........"..trans|
00004020  5f 72 65 70 6c 79 5f 62  6c 6f 63 6b 28 70 74 72  |_reply_block(ptr|
00004030  25 2c 6c 65 6e 25 29 0d  02 d5 0c ea 20 64 75 6d  |%,len%)..... dum|
00004040  6d 79 25 0d 02 d6 0f 74  72 61 6e 73 6d 69 74 25  |my%....transmit%|
00004050  3d b9 0d 02 d7 13 74 72  61 6e 73 6d 69 74 5f 70  |=.....transmit_p|
00004060  74 72 25 3d 30 0d 02 d8  38 e7 20 74 72 61 6e 73  |tr%=0...8. trans|
00004070  6d 69 74 5f 62 6c 6f 63  6b 25 20 f2 68 65 61 70  |mit_block% .heap|
00004080  5f 66 72 65 65 28 22 42  4c 43 4b 22 2c 74 72 61  |_free("BLCK",tra|
00004090  6e 73 6d 69 74 5f 62 6c  6f 63 6b 25 29 0d 02 d9  |nsmit_block%)...|
000040a0  2e 74 72 61 6e 73 6d 69  74 5f 62 6c 6f 63 6b 25  |.transmit_block%|
000040b0  3d a4 68 65 61 70 5f 63  6c 61 69 6d 28 22 42 4c  |=.heap_claim("BL|
000040c0  43 4b 22 2c 6c 65 6e 25  2b 31 29 0d 02 da 0e e7  |CK",len%+1).....|
000040d0  20 6c 65 6e 25 3e 30 20  8c 0d 02 db 14 20 20 f2  | len%>0 .....  .|
000040e0  6f 70 65 6e 5f 63 73 76  5f 66 69 6c 65 0d 02 dc  |open_csv_file...|
000040f0  49 20 20 e7 20 63 73 76  5f 66 69 6c 65 5f 68 61  |I  . csv_file_ha|
00004100  6e 64 6c 65 25 3d 30 20  74 72 61 6e 73 6d 69 74  |ndle%=0 transmit|
00004110  25 3d a3 3a 85 20 74 61  73 6b 5f 6f 6b 25 2c a4  |%=.:. task_ok%,.|
00004120  6d 73 67 5f 32 28 22 4f  4b 32 22 2c 63 73 76 5f  |msg_2("OK2",csv_|
00004130  66 69 6c 65 24 29 0d 02  dd 1d 20 20 cf 23 63 73  |file$)....  .#cs|
00004140  76 5f 66 69 6c 65 5f 68  61 6e 64 6c 65 25 3d 70  |v_file_handle%=p|
00004150  74 72 25 0d 02 de 30 20  20 f2 63 6f 70 79 5f 66  |tr%...0  .copy_f|
00004160  69 65 6c 64 28 74 72 61  6e 73 6d 69 74 5f 62 6c  |ield(transmit_bl|
00004170  6f 63 6b 25 2c 64 75 6d  6d 79 25 2c 6c 65 6e 25  |ock%,dummy%,len%|
00004180  2c a3 29 0d 02 df 15 20  20 f2 63 6c 6f 73 65 5f  |,.)....  .close_|
00004190  63 73 76 5f 66 69 6c 65  0d 02 e0 05 cc 0d 02 e1  |csv_file........|
000041a0  19 20 20 24 74 72 61 6e  73 6d 69 74 5f 62 6c 6f  |.  $transmit_blo|
000041b0  63 6b 25 3d 22 22 0d 02  e2 05 cd 0d 02 e3 1f 74  |ck%="".........t|
000041c0  72 61 6e 73 6d 69 74 5f  74 6f 70 25 3d 28 6c 65  |ransmit_top%=(le|
000041d0  6e 25 2b 31 2b 33 29 80  ac 33 0d 02 e4 17 74 72  |n%+1+3)..3....tr|
000041e0  61 6e 73 6d 69 74 5f 73  69 7a 65 25 3d 6c 65 6e  |ansmit_size%=len|
000041f0  25 0d 02 e5 24 74 72 61  6e 73 6d 69 74 5f 74 61  |%...$transmit_ta|
00004200  67 25 3d a4 6e 65 78 74  5f 74 72 61 6e 73 6d 69  |g%=.next_transmi|
00004210  74 5f 74 61 67 0d 02 e6  73 c8 99 22 49 6d 70 75  |t_tag...s.."Impu|
00004220  6c 73 65 5f 53 65 6e 64  4d 65 73 73 61 67 65 22  |lse_SendMessage"|
00004230  2c 49 6d 70 75 6c 73 65  5f 52 65 70 6c 79 25 2c  |,Impulse_Reply%,|
00004240  22 44 75 6d 6d 79 20 74  65 78 74 22 2c 2d 31 2c  |"Dummy text",-1,|
00004250  2c 2c 74 72 61 6e 73 6d  69 74 5f 74 61 67 25 2c  |,,transmit_tag%,|
00004260  74 61 73 6b 5f 68 61 6e  64 6c 65 25 2c 74 72 61  |task_handle%,tra|
00004270  6e 73 6d 69 74 5f 74 6f  70 25 2d 74 72 61 6e 73  |nsmit_top%-trans|
00004280  6d 69 74 5f 70 74 72 25  0d 02 e7 05 e1 0d 02 e8  |mit_ptr%........|
00004290  04 0d 02 e9 04 0d 02 ea  17 dd a4 6e 65 78 74 5f  |...........next_|
000042a0  74 72 61 6e 73 6d 69 74  5f 74 61 67 0d 02 eb 16  |transmit_tag....|
000042b0  74 72 61 6e 73 6d 69 74  5f 63 6f 75 6e 74 25 2b  |transmit_count%+|
000042c0  3d 31 0d 02 ec 14 3d 74  72 61 6e 73 6d 69 74 5f  |=1....=transmit_|
000042d0  63 6f 75 6e 74 25 0d 02  ed 04 0d 02 ee 04 0d 02  |count%..........|
000042e0  ef 2b dd f2 73 65 6e 64  5f 64 61 74 61 28 74 6f  |.+..send_data(to|
000042f0  6b 65 6e 25 2c 62 75 66  66 65 72 25 2c 62 75 66  |ken%,buffer%,buf|
00004300  66 65 72 73 69 7a 65 25  29 0d 02 f0 0e ea 20 73  |fersize%)..... s|
00004310  69 7a 65 25 2c 69 25 0d  02 f1 04 0d 02 f2 43 e7  |ize%,i%.......C.|
00004320  ac 74 72 61 6e 73 6d 69  74 25 20 84 20 28 74 6f  |.transmit% . (to|
00004330  6b 65 6e 25 3c 3e 74 72  61 6e 73 6d 69 74 5f 74  |ken%<>transmit_t|
00004340  61 67 25 29 20 85 20 74  61 73 6b 5f 6f 6b 25 2c  |ag%) . task_ok%,|
00004350  20 a4 6d 73 67 5f 30 28  22 4f 4b 33 22 29 0d 02  | .msg_0("OK3")..|
00004360  f3 25 73 69 7a 65 25 3d  74 72 61 6e 73 6d 69 74  |.%size%=transmit|
00004370  5f 74 6f 70 25 2d 74 72  61 6e 73 6d 69 74 5f 70  |_top%-transmit_p|
00004380  74 72 25 0d 02 f4 2d e7  20 73 69 7a 65 25 3c 62  |tr%...-. size%<b|
00004390  75 66 66 65 72 73 69 7a  65 25 20 84 20 73 69 7a  |uffersize% . siz|
000043a0  65 25 3d 30 20 74 72 61  6e 73 6d 69 74 25 3d a3  |e%=0 transmit%=.|
000043b0  0d 02 f5 28 e7 20 73 69  7a 65 25 3e 62 75 66 66  |...(. size%>buff|
000043c0  65 72 73 69 7a 65 25 20  73 69 7a 65 3d 62 75 66  |ersize% size=buf|
000043d0  66 65 72 73 69 7a 65 25  0d 02 f6 35 3f 28 74 72  |fersize%...5?(tr|
000043e0  61 6e 73 6d 69 74 5f 70  74 72 25 2b 74 72 61 6e  |ansmit_ptr%+tran|
000043f0  73 6d 69 74 5f 62 6c 6f  63 6b 25 2b 74 72 61 6e  |smit_block%+tran|
00004400  73 6d 69 74 5f 73 69 7a  65 25 29 3d 30 0d 02 f7  |smit_size%)=0...|
00004410  51 c8 99 22 49 6d 70 75  6c 73 65 5f 54 72 61 6e  |Q.."Impulse_Tran|
00004420  73 6d 69 74 44 61 74 61  22 2c 74 72 61 6e 73 6d  |smitData",transm|
00004430  69 74 5f 70 74 72 25 2b  74 72 61 6e 73 6d 69 74  |it_ptr%+transmit|
00004440  5f 62 6c 6f 63 6b 25 2c  73 69 7a 65 25 2c 2c 2c  |_block%,size%,,,|
00004450  2c 2c 74 61 73 6b 5f 68  61 6e 64 6c 65 25 0d 02  |,,task_handle%..|
00004460  f8 18 74 72 61 6e 73 6d  69 74 5f 70 74 72 25 2b  |..transmit_ptr%+|
00004470  3d 73 69 7a 65 25 0d 02  f9 05 e1 0d 02 fa 04 0d  |=size%..........|
00004480  02 fb 04 0d 02 fc 14 dd  20 f2 72 65 70 6c 79 28  |........ .reply(|
00004490  74 6f 6b 65 6e 25 29 0d  02 fd 0f c8 8e 20 74 6f  |token%)...... to|
000044a0  6b 65 6e 25 20 ca 0d 02  fe 1e 20 20 c9 20 54 5f  |ken% .....  . T_|
000044b0  50 72 69 6e 74 25 3a 20  f2 72 65 70 6c 79 5f 70  |Print%: .reply_p|
000044c0  72 69 6e 74 0d 02 ff 1d  20 20 c9 20 54 5f 4d 65  |rint....  . T_Me|
000044d0  72 67 65 25 3a 20 f2 6d  65 72 67 65 5f 64 6f 6e  |rge%: .merge_don|
000044e0  65 0d 03 00 05 cb 0d 03  01 05 e1 0d 03 02 04 0d  |e...............|
000044f0  03 03 04 0d 03 04 11 dd  20 f2 6d 65 72 67 65 5f  |........ .merge_|
00004500  64 6f 6e 65 0d 03 05 12  e7 72 65 63 5f 64 6f 6e  |done.....rec_don|
00004510  65 25 3d 30 20 8c 0d 03  06 17 20 20 e7 66 69 65  |e%=0 .....  .fie|
00004520  6c 64 5f 63 6f 75 6e 74  25 3d 30 20 8c 0d 03 07  |ld_count%=0 ....|
00004530  1b 20 20 20 20 f2 73 65  6e 64 28 22 45 64 69 74  |.    .send("Edit|
00004540  20 4f 6e 22 2c 2d 31 29  0d 03 08 32 20 20 20 20  | On",-1)...2    |
00004550  63 73 76 5f 66 69 6c 65  5f 70 74 72 25 3d 70 72  |csv_file_ptr%=pr|
00004560  65 73 65 72 76 65 64 5f  73 74 61 72 74 5f 6f 66  |eserved_start_of|
00004570  5f 64 61 74 61 5f 70 74  72 25 0d 03 09 10 20 20  |_data_ptr%....  |
00004580  20 20 6d 65 72 67 65 25  3d a3 0d 03 0a 21 20 20  |  merge%=....!  |
00004590  20 20 85 20 74 61 73 6b  5f 6f 6b 25 2c 20 a4 6d  |  . task_ok%, .m|
000045a0  73 67 5f 30 28 22 4f 4b  37 22 29 0d 03 0b 07 20  |sg_0("OK7").... |
000045b0  20 cd 0d 03 0c 30 20 20  f2 69 63 6f 6e 5f 77 72  | ....0  .icon_wr|
000045c0  69 74 65 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 54  |ite(main%,Icon_T|
000045d0  6f 47 6f 25 2c c3 28 72  65 63 5f 74 6f 67 6f 25  |oGo%,.(rec_togo%|
000045e0  29 29 0d 03 0d 27 20 20  f2 69 63 6f 6e 5f 77 72  |))...'  .icon_wr|
000045f0  69 74 65 28 6d 61 69 6e  25 2c 49 63 6f 6e 5f 44  |ite(main%,Icon_D|
00004600  6f 6e 65 25 2c 22 31 22  29 0d 03 0e 26 20 20 f2  |one%,"1")...&  .|
00004610  69 63 6f 6e 5f 75 6e 68  69 64 65 28 6d 61 69 6e  |icon_unhide(main|
00004620  25 2c 49 63 6f 6e 5f 54  6f 50 72 6f 63 25 29 0d  |%,Icon_ToProc%).|
00004630  03 0f 28 20 20 f2 69 63  6f 6e 5f 75 6e 68 69 64  |..(  .icon_unhid|
00004640  65 28 6d 61 69 6e 25 2c  49 63 6f 6e 5f 52 65 63  |e(main%,Icon_Rec|
00004650  73 50 72 6f 63 25 29 0d  03 10 28 20 20 f2 69 63  |sProc%)...(  .ic|
00004660  6f 6e 5f 75 6e 68 69 64  65 28 6d 61 69 6e 25 2c  |on_unhide(main%,|
00004670  49 63 6f 6e 5f 50 72 69  6e 74 41 6c 6c 25 29 0d  |Icon_PrintAll%).|
00004680  03 11 24 20 20 f2 69 63  6f 6e 5f 75 6e 68 69 64  |..$  .icon_unhid|
00004690  65 28 6d 61 69 6e 25 2c  49 63 6f 6e 5f 54 6f 47  |e(main%,Icon_ToG|
000046a0  6f 25 29 0d 03 12 24 20  20 f2 69 63 6f 6e 5f 75  |o%)...$  .icon_u|
000046b0  6e 68 69 64 65 28 6d 61  69 6e 25 2c 49 63 6f 6e  |nhide(main%,Icon|
000046c0  5f 44 6f 6e 65 25 29 0d  03 13 25 20 20 f2 69 63  |_Done%)...%  .ic|
000046d0  6f 6e 5f 75 6e 68 69 64  65 28 6d 61 69 6e 25 2c  |on_unhide(main%,|
000046e0  49 63 6f 6e 5f 50 72 69  6e 74 25 29 0d 03 14 24  |Icon_Print%)...$|
000046f0  20 20 f2 69 63 6f 6e 5f  75 6e 68 69 64 65 28 6d  |  .icon_unhide(m|
00004700  61 69 6e 25 2c 49 63 6f  6e 5f 4e 65 78 74 25 29  |ain%,Icon_Next%)|
00004710  0d 03 15 24 20 20 f2 69  63 6f 6e 5f 75 6e 68 69  |...$  .icon_unhi|
00004720  64 65 28 6d 61 69 6e 25  2c 49 63 6f 6e 5f 45 64  |de(main%,Icon_Ed|
00004730  69 74 25 29 0d 03 16 26  20 20 f2 69 63 6f 6e 5f  |it%)...&  .icon_|
00004740  68 69 64 65 28 6d 61 69  6e 25 2c 49 63 6f 6e 5f  |hide(main%,Icon_|
00004750  48 65 61 64 69 6e 67 73  25 29 0d 03 17 26 20 20  |Headings%)...&  |
00004760  f2 69 63 6f 6e 5f 68 69  64 65 28 6d 61 69 6e 25  |.icon_hide(main%|
00004770  2c 49 63 6f 6e 5f 44 69  73 70 48 65 61 64 25 29  |,Icon_DispHead%)|
00004780  0d 03 18 28 20 20 f2 69  63 6f 6e 5f 68 69 64 65  |...(  .icon_hide|
00004790  28 6d 61 69 6e 25 2c 49  63 6f 6e 5f 53 74 61 72  |(main%,Icon_Star|
000047a0  74 4d 65 72 67 65 25 29  0d 03 19 39 20 20 21 77  |tMerge%)...9  !w|
000047b0  69 6e 5f 62 75 66 66 25  3d 6d 61 69 6e 25 3a c8  |in_buff%=main%:.|
000047c0  99 22 57 69 6d 70 5f 47  65 74 57 69 6e 64 6f 77  |."Wimp_GetWindow|
000047d0  53 74 61 74 65 22 2c 2c  77 69 6e 5f 62 75 66 66  |State",,win_buff|
000047e0  25 0d 03 1a 2c 20 20 77  69 6e 5f 62 75 66 66 25  |%...,  win_buff%|
000047f0  21 38 3d 77 69 6e 5f 62  75 66 66 25 21 31 36 20  |!8=win_buff%!16 |
00004800  2d 20 57 69 6e 64 6f 77  5f 42 69 67 25 0d 03 1b  |- Window_Big%...|
00004810  24 20 20 c8 99 22 57 69  6d 70 5f 4f 70 65 6e 57  |$  .."Wimp_OpenW|
00004820  69 6e 64 6f 77 22 2c 2c  77 69 6e 5f 62 75 66 66  |indow",,win_buff|
00004830  25 0d 03 1c 05 cd 0d 03  1d 10 f2 64 6f 6e 65 5f  |%..........done_|
00004840  72 65 63 6f 72 64 0d 03  1e 1b f2 65 6e 61 62 6c  |record.....enabl|
00004850  65 5f 6d 65 72 67 69 6e  67 5f 62 75 74 74 6f 6e  |e_merging_button|
00004860  73 0d 03 1f 12 f2 68 6f  75 72 67 6c 61 73 73 5f  |s.....hourglass_|
00004870  6f 66 66 0d 03 20 05 e1  0d 03 21 04 0d 03 22 04  |off.. ....!...".|
00004880  0d 03 23 11 dd f2 64 6f  6e 65 5f 72 65 63 6f 72  |..#...done_recor|
00004890  64 0d 03 24 10 72 65 63  5f 74 6f 67 6f 25 2d 3d  |d..$.rec_togo%-=|
000048a0  31 0d 03 25 10 72 65 63  5f 64 6f 6e 65 25 2b 3d  |1..%.rec_done%+=|
000048b0  31 0d 03 26 2e f2 69 63  6f 6e 5f 77 72 69 74 65  |1..&..icon_write|
000048c0  28 6d 61 69 6e 25 2c 49  63 6f 6e 5f 54 6f 47 6f  |(main%,Icon_ToGo|
000048d0  25 2c c3 28 72 65 63 5f  74 6f 67 6f 25 29 29 0d  |%,.(rec_togo%)).|
000048e0  03 27 2e f2 69 63 6f 6e  5f 77 72 69 74 65 28 6d  |.'..icon_write(m|
000048f0  61 69 6e 25 2c 49 63 6f  6e 5f 44 6f 6e 65 25 2c  |ain%,Icon_Done%,|
00004900  c3 28 72 65 63 5f 64 6f  6e 65 25 29 29 0d 03 28  |.(rec_done%))..(|
00004910  05 e1 0d 03 29 04 0d 03  2a 04 0d 03 2b 11 dd f2  |....)...*...+...|
00004920  72 65 70 6c 79 5f 70 72  69 6e 74 0d 03 2c 0e ea  |reply_print..,..|
00004930  20 63 6f 6d 6d 61 6e 64  24 0d 03 2d 28 20 20 63  | command$..-(  c|
00004940  6f 6d 6d 61 6e 64 24 3d  a4 74 61 73 6b 5f 72 74  |ommand$=.task_rt|
00004950  6f 7a 28 74 61 73 6b 5f  62 75 66 66 25 2b 33 36  |oz(task_buff%+36|
00004960  29 0d 03 2e 13 20 20 c8  8e 20 63 6f 6d 6d 61 6e  |)....  .. comman|
00004970  64 24 20 ca 0d 03 2f 23  20 20 20 20 c9 20 22 50  |d$ .../#    . "P|
00004980  72 69 6e 74 44 6f 6e 65  22 20 3a 20 f2 70 72 69  |rintDone" : .pri|
00004990  6e 74 5f 64 6f 6e 65 0d  03 30 24 20 20 20 20 c9  |nt_done..0$    .|
000049a0  20 22 50 72 69 6e 74 45  72 72 6f 72 22 3a 20 f2  | "PrintError": .|
000049b0  70 72 69 6e 74 5f 65 72  72 6f 72 0d 03 31 07 20  |print_error..1. |
000049c0  20 cb 0d 03 32 05 e1 0d  03 33 04 0d 03 34 04 0d  | ...2....3...4..|
000049d0  03 35 11 dd f2 70 72 69  6e 74 5f 65 72 72 6f 72  |.5...print_error|
000049e0  0d 03 36 45 f4 20 4e 6f  20 70 72 69 6e 74 65 72  |..6E. No printer|
000049f0  20 64 72 69 76 65 72 20  77 61 73 20 6c 6f 61 64  | driver was load|
00004a00  65 64 20 69 66 20 77 65  20 67 65 74 20 68 65 72  |ed if we get her|
00004a10  65 2e 20 20 49 66 20 77  65 20 61 72 65 20 64 6f  |e.  If we are do|
00004a20  69 6e 67 20 61 0d 03 37  3c f4 20 70 72 69 6e 74  |ing a..7<. print|
00004a30  20 61 6c 6c 20 72 65 63  6f 72 64 73 2c 20 74 68  | all records, th|
00004a40  65 6e 20 77 65 20 73 68  6f 75 6c 64 20 73 74 6f  |en we should sto|
00004a50  70 20 74 68 65 20 70 72  69 6e 74 20 68 65 72 65  |p the print here|
00004a60  2e 0d 03 38 11 20 20 70  72 69 6e 74 69 6e 67 25  |...8.  printing%|
00004a70  3d a3 0d 03 39 16 20 20  67 6f 74 70 72 69 6e 74  |=...9.  gotprint|
00004a80  72 65 70 6c 79 25 3d a3  0d 03 3a 04 0d 03 3b 24  |reply%=...:...;$|
00004a90  20 20 24 28 65 72 72 6f  72 5f 62 75 66 66 25 2b  |  $(error_buff%+|
00004aa0  34 29 3d a4 6d 73 67 5f  30 28 22 4f 4b 39 22 29  |4)=.msg_0("OK9")|
00004ab0  0d 03 3c 4b 20 20 c8 99  20 22 57 69 6d 70 5f 52  |..<K  .. "Wimp_R|
00004ac0  65 70 6f 72 74 45 72 72  6f 72 22 2c 20 65 72 72  |eportError", err|
00004ad0  6f 72 5f 62 75 66 66 25  2c 20 25 31 30 30 30 31  |or_buff%, %10001|
00004ae0  2c 20 a4 6d 73 67 5f 31  28 22 4d 53 22 2c a4 6d  |, .msg_1("MS",.m|
00004af0  73 67 5f 30 28 22 49 44  22 29 29 0d 03 3d 04 0d  |sg_0("ID"))..=..|
00004b00  03 3e 26 20 20 e7 70 65  6e 64 69 6e 67 5f 63 6c  |.>&  .pending_cl|
00004b10  6f 73 65 25 20 8c 20 f2  68 6f 73 74 5f 73 68 75  |ose% . .host_shu|
00004b20  74 64 6f 77 6e 0d 03 3f  1d 20 20 f2 65 6e 61 62  |tdown..?.  .enab|
00004b30  6c 65 5f 6d 65 72 67 69  6e 67 5f 62 75 74 74 6f  |le_merging_butto|
00004b40  6e 73 0d 03 40 29 20 20  f2 69 63 6f 6e 5f 75 6e  |ns..@)  .icon_un|
00004b50  68 69 64 65 28 6d 61 69  6e 25 2c 20 49 63 6f 6e  |hide(main%, Icon|
00004b60  5f 50 72 69 6e 74 41 6c  6c 25 29 0d 03 41 04 0d  |_PrintAll%)..A..|
00004b70  03 42 05 e1 0d 03 43 04  0d 03 44 04 0d 03 45 10  |.B....C...D...E.|
00004b80  dd f2 70 72 69 6e 74 5f  64 6f 6e 65 0d 03 46 22  |..print_done..F"|
00004b90  f4 20 50 72 69 6e 74 20  77 65 6e 74 20 4f 4b 20  |. Print went OK |
00004ba0  69 66 20 77 65 20 67 65  74 20 68 65 72 65 0d 03  |if we get here..|
00004bb0  47 0f 70 72 69 6e 74 69  6e 67 25 3d a3 0d 03 48  |G.printing%=...H|
00004bc0  15 e7 70 65 6e 64 69 6e  67 5f 63 6c 6f 73 65 25  |..pending_close%|
00004bd0  20 8c 0d 03 49 1a 20 20  20 20 20 20 20 20 f2 68  | ...I.        .h|
00004be0  6f 73 74 5f 73 68 75 74  64 6f 77 6e 0d 03 4a 05  |ost_shutdown..J.|
00004bf0  cc 0d 03 4b 2e 20 20 20  20 20 20 20 20 e7 a4 69  |...K.        ..i|
00004c00  63 6f 6e 5f 73 65 74 28  6d 61 69 6e 25 2c 49 63  |con_set(main%,Ic|
00004c10  6f 6e 5f 50 72 69 6e 74  41 6c 6c 25 29 20 8c 0d  |on_PrintAll%) ..|
00004c20  03 4c 25 20 20 20 20 20  20 20 20 20 20 20 20 20  |.L%             |
00004c30  20 20 20 f4 20 50 52 4f  43 64 6f 6e 65 5f 72 65  |   . PROCdone_re|
00004c40  63 6f 72 64 0d 03 4d 26  20 20 20 20 20 20 20 20  |cord..M&        |
00004c50  20 20 20 20 20 20 20 20  f2 6d 65 72 67 65 5f 6e  |        .merge_n|
00004c60  65 78 74 5f 72 65 63 6f  72 64 0d 03 4e 04 0d 03  |ext_record..N...|
00004c70  4f 26 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |O&              |
00004c80  20 20 f4 20 21 21 21 21  21 21 21 21 21 21 21 21  |  . !!!!!!!!!!!!|
00004c90  21 21 21 21 0d 03 50 2e  20 20 20 20 20 20 20 20  |!!!!..P.        |
00004ca0  20 20 20 20 20 20 20 20  f4 20 4e 6f 77 20 64 6f  |        . Now do|
00004cb0  6e 65 20 61 66 74 65 72  20 77 69 6d 70 5f 70 6f  |ne after wimp_po|
00004cc0  6c 6c 0d 03 51 31 20 20  20 20 20 20 20 20 20 20  |ll..Q1          |
00004cd0  20 20 20 20 20 20 f4 20  20 50 52 4f 43 73 65 6e  |      .  PROCsen|
00004ce0  64 28 22 50 72 69 6e 74  22 2c 54 5f 50 72 69 6e  |d("Print",T_Prin|
00004cf0  74 25 29 0d 03 52 0c 20  20 20 20 20 20 20 20 0d  |t%)..R.        .|
00004d00  03 53 2d 20 20 20 20 20  20 20 20 20 20 20 20 20  |.S-             |
00004d10  20 20 20 f4 20 53 65 74  20 72 65 70 6c 79 20 76  |   . Set reply v|
00004d20  61 72 69 61 62 6c 65 20  54 52 55 45 0d 03 54 24  |ariable TRUE..T$|
00004d30  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004d40  67 6f 74 70 72 69 6e 74  72 65 70 6c 79 25 3d b9  |gotprintreply%=.|
00004d50  0d 03 55 26 20 20 20 20  20 20 20 20 20 20 20 20  |..U&            |
00004d60  20 20 20 20 f4 20 21 21  21 21 21 21 21 21 21 21  |    . !!!!!!!!!!|
00004d70  21 21 21 21 21 21 0d 03  56 04 0d 03 57 1f 20 20  |!!!!!!..V...W.  |
00004d80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 70 72  |              pr|
00004d90  69 6e 74 69 6e 67 25 3d  b9 0d 03 58 0d 20 20 20  |inting%=...X.   |
00004da0  20 20 20 20 20 cc 0d 03  59 2b 20 20 20 20 20 20  |     ...Y+      |
00004db0  20 20 20 20 20 20 20 20  20 20 f2 65 6e 61 62 6c  |          .enabl|
00004dc0  65 5f 6d 65 72 67 69 6e  67 5f 62 75 74 74 6f 6e  |e_merging_button|
00004dd0  73 0d 03 5a 0d 20 20 20  20 20 20 20 20 cd 0d 03  |s..Z.        ...|
00004de0  5b 05 cd 0d 03 5c 05 e1  0d 03 5d 04 0d 03 5e 13  |[....\....]...^.|
00004df0  f4 20 45 72 72 6f 72 20  6c 69 62 72 61 72 79 0d  |. Error library.|
00004e00  03 5f 04 0d 03 60 16 dd  f2 65 72 72 6f 72 5f 69  |._...`...error_i|
00004e10  6e 69 74 69 61 6c 69 73  65 0d 03 61 15 de 20 65  |nitialise..a.. e|
00004e20  72 72 6f 72 5f 62 75 66  66 25 20 32 35 36 0d 03  |rror_buff% 256..|
00004e30  62 05 e1 0d 03 63 04 0d  03 64 0b dd f2 65 72 72  |b....c...d...err|
00004e40  6f 72 0d 03 65 0b ea 20  72 24 2c 72 25 0d 03 66  |or..e.. r$,r%..f|
00004e50  09 72 24 3d f6 24 0d 03  67 21 e7 9f 3d 74 61 73  |.r$=.$..g!..=tas|
00004e60  6b 5f 6f 6b 25 20 84 20  9f 3d 74 61 73 6b 5f 66  |k_ok% . .=task_f|
00004e70  61 74 61 6c 25 20 8c 0d  03 68 1f 20 72 25 3d a7  |atal% ...h. r%=.|
00004e80  72 24 2c 22 69 6e 20 22  2b bd 43 68 61 72 5f 51  |r$,"in "+.Char_Q|
00004e90  75 6f 74 65 25 29 0d 03  69 18 20 e7 72 25 3c 3e  |uote%)..i. .r%<>|
00004ea0  30 20 72 24 3d c0 72 24  2c 72 25 2d 31 29 0d 03  |0 r$=.r$,r%-1)..|
00004eb0  6a 05 cd 0d 03 6b 0a c8  8e 20 9f 20 ca 0d 03 6c  |j....k... . ...l|
00004ec0  23 c9 20 20 20 20 74 61  73 6b 5f 6f 6b 25 3a 20  |#.    task_ok%: |
00004ed0  f2 65 72 72 6f 72 5f 62  6f 78 28 72 24 2c 31 29  |.error_box(r$,1)|
00004ee0  0d 03 6d 23 c9 20 74 61  73 6b 5f 66 61 74 61 6c  |..m#. task_fatal|
00004ef0  25 3a 20 f2 65 72 72 6f  72 5f 62 6f 78 28 72 24  |%: .error_box(r$|
00004f00  2c 32 29 0d 03 6e 4c 20  20 20 20 20 20 20 7f 3a  |,2)..nL       .:|
00004f10  20 f2 65 72 72 6f 72 5f  62 6f 78 28 22 55 6e 65  | .error_box("Une|
00004f20  78 70 65 63 74 65 64 20  65 72 72 6f 72 20 3a 2d  |xpected error :-|
00004f30  20 22 2b 72 24 2b 22 20  28 22 2b c3 28 9f 29 2b  | "+r$+" ("+.(.)+|
00004f40  22 2f 22 2b c3 28 9e 29  2b 22 29 22 2c 33 29 0d  |"/"+.(.)+")",3).|
00004f50  03 6f 05 cb 0d 03 70 05  e1 0d 03 71 04 0d 03 72  |.o....p....q...r|
00004f60  1f dd f2 65 72 72 6f 72  5f 62 6f 78 28 72 24 2c  |...error_box(r$,|
00004f70  65 72 72 6f 72 5f 66 6c  61 67 25 29 0d 03 73 08  |error_flag%)..s.|
00004f80  ea 20 72 25 0d 03 74 1b  c8 99 22 57 69 6d 70 5f  |. r%..t..."Wimp_|
00004f90  43 72 65 61 74 65 4d 65  6e 75 22 2c 2c 2d 31 0d  |CreateMenu",,-1.|
00004fa0  03 75 29 21 65 72 72 6f  72 5f 62 75 66 66 25 3d  |.u)!error_buff%=|
00004fb0  9f 3a 24 28 65 72 72 6f  72 5f 62 75 66 66 25 2b  |.:$(error_buff%+|
00004fc0  34 29 3d 72 24 2b bd 30  0d 03 76 3f c8 99 22 57  |4)=r$+.0..v?.."W|
00004fd0  69 6d 70 5f 52 65 70 6f  72 74 45 72 72 6f 72 22  |imp_ReportError"|
00004fe0  2c 65 72 72 6f 72 5f 62  75 66 66 25 2c 65 72 72  |,error_buff%,err|
00004ff0  6f 72 5f 66 6c 61 67 25  2c 74 61 73 6b 5f 69 64  |or_flag%,task_id|
00005000  24 20 b8 20 2c 72 25 0d  03 77 20 e7 72 25 3d 32  |$ . ,r%..w .r%=2|
00005010  20 ee 20 85 20 87 3a f2  68 6f 73 74 5f 73 68 75  | . . .:.host_shu|
00005020  74 64 6f 77 6e 3a e0 0d  03 78 05 e1 0d 03 79 05  |tdown:...x....y.|
00005030  3a 0d 03 7a 12 f4 20 48  65 61 70 20 6c 69 62 72  |:..z.. Heap libr|
00005040  61 72 79 0d 03 7b 05 3a  0d 03 7c 1e dd f2 68 65  |ary..{.:..|...he|
00005050  61 70 5f 66 72 65 65 28  69 64 65 6e 74 24 2c 62  |ap_free(ident$,b|
00005060  6c 6f 63 6b 25 29 0d 03  7d 0c ea 20 72 30 25 2c  |lock%)..}.. r0%,|
00005070  66 25 0d 03 7e 10 e7 62  6c 6f 63 6b 25 3c 3e 30  |f%..~..block%<>0|
00005080  20 8c 0d 03 7f 0e 20 62  6c 6f 63 6b 25 2d 3d 34  | ..... block%-=4|
00005090  0d 03 80 45 20 f4 20 50  52 4f 43 74 72 61 63 65  |...E . PROCtrace|
000050a0  5f 30 28 22 22 2c 22 50  52 4f 43 68 65 61 70 5f  |_0("","PROCheap_|
000050b0  66 72 65 65 28 22 2b 69  64 65 6e 74 24 2b 22 2c  |free("+ident$+",|
000050c0  26 22 2b 53 54 52 24 7e  28 62 6c 6f 63 6b 25 29  |&"+STR$~(block%)|
000050d0  2b 22 29 22 29 0d 03 81  56 20 e7 21 62 6c 6f 63  |+")")...V .!bloc|
000050e0  6b 25 3c 3e a4 68 65 61  70 5f 69 64 65 6e 74 5f  |k%<>.heap_ident_|
000050f0  6e 75 6d 28 69 64 65 6e  74 24 29 20 85 20 74 61  |num(ident$) . ta|
00005100  73 6b 5f 6f 6b 25 2c 22  43 6f 72 72 75 70 74 20  |sk_ok%,"Corrupt |
00005110  22 2b 69 64 65 6e 74 24  2b 22 20 62 6c 6f 63 6b  |"+ident$+" block|
00005120  20 6e 6f 74 20 66 72 65  65 64 22 0d 03 82 2f 20  | not freed".../ |
00005130  c8 99 22 58 4f 53 5f 48  65 61 70 22 2c 33 2c 68  |.."XOS_Heap",3,h|
00005140  65 61 70 5f 73 74 61 72  74 25 2c 62 6c 6f 63 6b  |eap_start%,block|
00005150  25 20 b8 20 72 30 25 3b  66 25 0d 03 83 43 20 e7  |% . r0%;f%...C .|
00005160  28 66 25 20 80 20 31 29  20 85 20 74 61 73 6b 5f  |(f% . 1) . task_|
00005170  66 61 74 61 6c 25 2c 22  42 6c 6f 63 6b 20 22 2b  |fatal%,"Block "+|
00005180  69 64 65 6e 74 24 2b 22  3a 20 22 2b a4 74 61 73  |ident$+": "+.tas|
00005190  6b 5f 72 74 6f 7a 28 72  30 25 2b 34 29 0d 03 84  |k_rtoz(r0%+4)...|
000051a0  05 cd 0d 03 85 05 e1 0d  03 86 05 3a 0d 03 87 1e  |...........:....|
000051b0  dd a4 68 65 61 70 5f 63  6c 61 69 6d 28 69 64 65  |..heap_claim(ide|
000051c0  6e 74 24 2c 73 69 7a 65  25 29 0d 03 88 08 ea 20  |nt$,size%)..... |
000051d0  70 25 0d 03 89 37 f4 20  6e 65 65 64 20 74 6f 20  |p%...7. need to |
000051e0  61 64 64 20 34 20 65 78  74 72 61 20 62 79 74 65  |add 4 extra byte|
000051f0  73 20 27 63 6f 73 20 69  66 20 74 68 65 20 62 6c  |s 'cos if the bl|
00005200  6f 63 6b 20 6e 65 65 64  73 0d 03 8a 34 f4 20 65  |ock needs...4. e|
00005210  78 74 65 6e 64 69 6e 67  20 74 68 65 6e 20 74 68  |xtending then th|
00005220  65 20 66 69 72 73 74 20  77 6f 72 64 20 67 65 74  |e first word get|
00005230  73 20 74 72 61 6d 70 6c  65 64 20 6f 6e 0d 03 8b  |s trampled on...|
00005240  0c 73 69 7a 65 25 2b 3d  34 0d 03 8c 2e c8 95 20  |.size%+=4...... |
00005250  73 69 7a 65 25 3e 3d a4  68 65 61 70 5f 66 72 65  |size%>=.heap_fre|
00005260  65 73 70 61 63 65 20 f2  68 65 61 70 5f 69 6e 63  |espace .heap_inc|
00005270  72 65 61 73 65 3a ce 0d  03 8d 29 f4 20 63 6c 61  |rease:....). cla|
00005280  69 6d 20 74 68 65 20 62  6c 6f 63 6b 20 61 6e 64  |im the block and|
00005290  20 73 74 6f 72 65 20 74  68 65 20 69 64 65 6e 74  | store the ident|
000052a0  0d 03 8e 2b c8 99 22 4f  53 5f 48 65 61 70 22 2c  |...+.."OS_Heap",|
000052b0  32 2c 68 65 61 70 5f 73  74 61 72 74 25 2c 2c 73  |2,heap_start%,,s|
000052c0  69 7a 65 25 20 b8 20 2c  2c 70 25 0d 03 8f 1f 21  |ize% . ,,p%....!|
000052d0  70 25 3d a4 68 65 61 70  5f 69 64 65 6e 74 5f 6e  |p%=.heap_ident_n|
000052e0  75 6d 28 69 64 65 6e 74  24 29 0d 03 90 09 70 25  |um(ident$)....p%|
000052f0  2b 3d 34 0d 03 91 07 3d  70 25 0d 03 92 05 3a 0d  |+=4....=p%....:.|
00005300  03 93 13 dd f2 68 65 61  70 5f 69 6e 63 72 65 61  |.....heap_increa|
00005310  73 65 0d 03 94 0b ea 20  73 6c 6f 74 25 0d 03 95  |se..... slot%...|
00005320  23 c8 99 22 57 69 6d 70  5f 53 6c 6f 74 53 69 7a  |#.."Wimp_SlotSiz|
00005330  65 22 2c 2d 31 2c 2d 31  20 b8 20 73 6c 6f 74 25  |e",-1,-1 . slot%|
00005340  0d 03 96 2a c8 99 22 57  69 6d 70 5f 53 6c 6f 74  |...*.."Wimp_Slot|
00005350  53 69 7a 65 22 2c 73 6c  6f 74 25 2b 68 65 61 70  |Size",slot%+heap|
00005360  5f 70 73 69 7a 65 25 2c  2d 31 0d 03 97 13 e7 68  |_psize%,-1.....h|
00005370  65 61 70 5f 73 69 7a 65  25 3d 30 20 8c 0d 03 98  |eap_size%=0 ....|
00005380  2b 20 c8 99 22 4f 53 5f  48 65 61 70 22 2c 30 2c  |+ .."OS_Heap",0,|
00005390  68 65 61 70 5f 73 74 61  72 74 25 2c 2c 68 65 61  |heap_start%,,hea|
000053a0  70 5f 70 73 69 7a 65 25  0d 03 99 05 cc 0d 03 9a  |p_psize%........|
000053b0  2b 20 c8 99 22 4f 53 5f  48 65 61 70 22 2c 35 2c  |+ .."OS_Heap",5,|
000053c0  68 65 61 70 5f 73 74 61  72 74 25 2c 2c 68 65 61  |heap_start%,,hea|
000053d0  70 5f 70 73 69 7a 65 25  0d 03 9b 05 cd 0d 03 9c  |p_psize%........|
000053e0  1b 68 65 61 70 5f 73 69  7a 65 25 2b 3d 68 65 61  |.heap_size%+=hea|
000053f0  70 5f 70 73 69 7a 65 25  0d 03 9d 05 e1 0d 03 9e  |p_psize%........|
00005400  05 3a 0d 03 9f 18 dd a4  68 65 61 70 5f 69 64 65  |.:......heap_ide|
00005410  6e 74 5f 6e 75 6d 28 76  24 29 0d 03 a0 0b ea 20  |nt_num(v$)..... |
00005420  69 25 2c 6a 25 0d 03 a1  0d e3 69 25 3d 30 20 b8  |i%,j%.....i%=0 .|
00005430  20 33 0d 03 a2 23 20 6a  25 3d 6a 25 20 84 20 97  | 3...# j%=j% . .|
00005440  28 c1 76 24 2c 69 25 2b  31 2c 31 29 29 3c 3c 28  |(.v$,i%+1,1))<<(|
00005450  69 25 2a 38 29 0d 03 a3  05 ed 0d 03 a4 07 3d 6a  |i%*8).........=j|
00005460  25 0d 03 a5 05 3a 0d 03  a6 14 dd a4 68 65 61 70  |%....:......heap|
00005470  5f 66 72 65 65 73 70 61  63 65 0d 03 a7 08 ea 20  |_freespace..... |
00005480  66 25 0d 03 a8 16 e7 68  65 61 70 5f 73 69 7a 65  |f%.....heap_size|
00005490  25 3d 30 20 8c 20 3d 30  0d 03 a9 24 c8 99 22 4f  |%=0 . =0...$.."O|
000054a0  53 5f 48 65 61 70 22 2c  31 2c 68 65 61 70 5f 73  |S_Heap",1,heap_s|
000054b0  74 61 72 74 25 20 b8 20  2c 2c 66 25 0d 03 aa 07  |tart% . ,,f%....|
000054c0  3d 66 25 0d 03 ab 05 3a  0d 03 ac 14 f4 20 57 69  |=f%....:..... Wi|
000054d0  6e 64 6f 77 20 6c 69 62  72 61 72 79 0d 03 ad 05  |ndow library....|
000054e0  3a 0d 03 ae 14 dd f2 77  69 6e 5f 69 6e 69 74 69  |:......win_initi|
000054f0  61 6c 69 73 65 0d 03 af  14 de 20 77 69 6e 5f 62  |alise..... win_b|
00005500  75 66 66 25 20 32 30 34  38 0d 03 b0 14 77 69 6e  |uff% 2048....win|
00005510  5f 74 65 6d 70 6c 61 74  65 24 3d 22 22 0d 03 b1  |_template$=""...|
00005520  05 e1 0d 03 b2 05 3a 0d  03 b3 33 dd f2 77 69 6e  |......:...3..win|
00005530  5f 6c 6f 61 64 5f 63 72  65 61 74 65 28 66 24 2c  |_load_create(f$,|
00005540  6e 24 2c 73 70 72 69 74  65 5f 70 6f 6f 6c 25 2c  |n$,sprite_pool%,|
00005550  f8 20 68 61 6e 64 6c 65  25 29 0d 03 b4 23 f2 77  |. handle%)...#.w|
00005560  69 6e 5f 6c 6f 61 64 28  66 24 2c 6e 24 2c 77 69  |in_load(f$,n$,wi|
00005570  6e 5f 62 75 66 66 25 2c  32 30 34 38 29 0d 03 b5  |n_buff%,2048)...|
00005580  1d 77 69 6e 5f 62 75 66  66 25 21 36 34 3d 73 70  |.win_buff%!64=sp|
00005590  72 69 74 65 5f 70 6f 6f  6c 25 0d 03 b6 22 f2 77  |rite_pool%...".w|
000055a0  69 6e 5f 63 72 65 61 74  65 28 77 69 6e 5f 62 75  |in_create(win_bu|
000055b0  66 66 25 2c 68 61 6e 64  6c 65 25 29 0d 03 b7 05  |ff%,handle%)....|
000055c0  e1 0d 03 b8 05 3a 0d 03  b9 21 dd f2 77 69 6e 5f  |.....:...!..win_|
000055d0  6c 6f 61 64 28 66 24 2c  6e 24 2c 62 75 66 25 2c  |load(f$,n$,buf%,|
000055e0  6c 69 6d 69 74 25 29 0d  03 ba 26 f4 20 20 20 66  |limit%)...&.   f|
000055f0  24 20 2d 20 66 69 6c 65  6e 61 6d 65 20 6f 66 20  |$ - filename of |
00005600  74 65 6d 70 6c 61 74 65  20 66 69 6c 65 0d 03 bb  |template file...|
00005610  25 f4 20 20 20 6e 24 20  2d 20 6e 61 6d 65 20 6f  |%.   n$ - name o|
00005620  66 20 74 65 6d 70 6c 61  74 65 20 74 6f 20 6c 6f  |f template to lo|
00005630  61 64 0d 03 bc 4e f4 20  62 75 66 25 20 2d 20 62  |ad...N. buf% - b|
00005640  75 66 66 65 72 20 77 68  69 63 68 20 6e 65 65 64  |uffer which need|
00005650  73 20 74 6f 20 62 65 20  62 69 67 20 65 6e 6f 75  |s to be big enou|
00005660  67 68 20 74 6f 20 68 6f  6c 64 20 74 68 65 20 77  |gh to hold the w|
00005670  69 6e 64 6f 77 20 64 65  66 69 6e 69 74 69 6f 6e  |indow definition|
00005680  0d 03 bd 4d f4 20 20 20  20 20 20 20 20 41 4e 44  |...M.        AND|
00005690  20 74 68 65 20 69 6e 64  69 72 65 63 74 65 64 20  | the indirected |
000056a0  64 61 74 61 2c 20 64 75  65 20 74 6f 20 74 68 65  |data, due to the|
000056b0  20 77 61 79 20 57 69 6d  70 5f 4c 6f 61 64 54 65  | way Wimp_LoadTe|
000056c0  6d 70 6c 61 74 65 20 77  6f 72 6b 73 2e 0d 03 be  |mplate works....|
000056d0  05 f4 0d 03 bf 41 f4 20  50 52 4f 43 77 69 6e 5f  |.....A. PROCwin_|
000056e0  6c 6f 61 64 20 77 69 6c  6c 20 61 75 74 6f 6d 61  |load will automa|
000056f0  74 69 63 61 6c 6c 79 20  64 69 6d 65 6e 73 69 6f  |tically dimensio|
00005700  6e 20 65 6e 6f 75 67 68  20 6d 65 6d 6f 72 79 20  |n enough memory |
00005710  66 6f 72 0d 03 c0 1a f4  20 74 68 65 20 69 6e 64  |for..... the ind|
00005720  69 72 65 63 74 65 64 20  64 61 74 61 2e 0d 03 c1  |irected data....|
00005730  0d ea 20 77 73 5f 62 75  66 25 0d 03 c2 0b ea 20  |.. ws_buf%..... |
00005740  73 69 7a 65 25 0d 03 c3  0b ea 20 64 61 74 61 25  |size%..... data%|
00005750  0d 03 c4 0c ea 20 66 6f  75 6e 64 25 0d 03 c5 0b  |..... found%....|
00005760  ea 20 73 25 2c 66 25 0d  03 c6 0d e7 66 24 3c 3e  |. s%,f%.....f$<>|
00005770  22 22 20 8c 0d 03 c7 22  20 f2 77 69 6e 5f 73 69  |"" ...." .win_si|
00005780  7a 65 73 28 66 24 2c 6e  24 2c 73 69 7a 65 25 2c  |zes(f$,n$,size%,|
00005790  64 61 74 61 25 29 0d 03  c8 05 cc 0d 03 c9 2d 20  |data%)........- |
000057a0  f2 77 69 6e 5f 73 69 7a  65 73 28 77 69 6e 5f 74  |.win_sizes(win_t|
000057b0  65 6d 70 6c 61 74 65 24  2c 6e 24 2c 73 69 7a 65  |emplate$,n$,size|
000057c0  25 2c 64 61 74 61 25 29  0d 03 ca 05 cd 0d 03 cb  |%,data%)........|
000057d0  76 e7 6c 69 6d 69 74 25  3c 28 73 69 7a 65 25 2b  |v.limit%<(size%+|
000057e0  64 61 74 61 25 29 20 85  20 74 61 73 6b 5f 6f 6b  |data%) . task_ok|
000057f0  25 2c 22 42 75 66 66 65  72 20 6e 6f 74 20 62 69  |%,"Buffer not bi|
00005800  67 20 65 6e 6f 75 67 68  20 66 6f 72 20 27 22 2b  |g enough for '"+|
00005810  6e 24 2b 22 27 20 2d 20  22 2b c3 28 73 69 7a 65  |n$+"' - "+.(size|
00005820  25 29 2b 22 20 2b 20 22  2b c3 28 64 61 74 61 25  |%)+" + "+.(data%|
00005830  29 2b 22 20 62 79 74 65  73 20 72 65 71 75 69 72  |)+" bytes requir|
00005840  65 64 22 0d 03 cc 25 e7  66 24 3c 3e 22 22 20 c8  |ed"...%.f$<>"" .|
00005850  99 22 57 69 6d 70 5f 4f  70 65 6e 54 65 6d 70 6c  |."Wimp_OpenTempl|
00005860  61 74 65 22 2c 2c 66 24  0d 03 cd 10 e7 20 64 61  |ate",,f$..... da|
00005870  74 61 25 3c 3e 30 20 8c  0d 03 ce 14 20 de 20 77  |ta%<>0 ..... . w|
00005880  73 5f 62 75 66 25 20 64  61 74 61 25 0d 03 cf 53  |s_buf% data%...S|
00005890  20 c8 99 22 58 57 69 6d  70 5f 4c 6f 61 64 54 65  | .."XWimp_LoadTe|
000058a0  6d 70 6c 61 74 65 22 2c  2c 62 75 66 25 2c 77 73  |mplate",,buf%,ws|
000058b0  5f 62 75 66 25 2c 77 73  5f 62 75 66 25 2b 64 61  |_buf%,ws_buf%+da|
000058c0  74 61 25 2c 2d 31 2c 6e  24 2c 30 20 b8 20 73 25  |ta%,-1,n$,0 . s%|
000058d0  2c 2c 2c 2c 2c 2c 66 6f  75 6e 64 25 3b 66 25 0d  |,,,,,,found%;f%.|
000058e0  03 d0 05 cc 0d 03 d1 41  20 c8 99 22 58 57 69 6d  |.......A .."XWim|
000058f0  70 5f 4c 6f 61 64 54 65  6d 70 6c 61 74 65 22 2c  |p_LoadTemplate",|
00005900  2c 62 75 66 25 2c 30 2c  30 2c 2d 31 2c 6e 24 2c  |,buf%,0,0,-1,n$,|
00005910  30 20 b8 20 73 25 2c 2c  2c 2c 2c 2c 66 6f 75 6e  |0 . s%,,,,,,foun|
00005920  64 25 3b 66 25 0d 03 d2  05 cd 0d 03 d3 22 e7 66  |d%;f%........".f|
00005930  24 3c 3e 22 22 20 c8 99  22 57 69 6d 70 5f 43 6c  |$<>"" .."Wimp_Cl|
00005940  6f 73 65 54 65 6d 70 6c  61 74 65 22 0d 03 d4 2f  |oseTemplate".../|
00005950  e7 28 66 25 80 31 29 20  85 20 74 61 73 6b 5f 6f  |.(f%.1) . task_o|
00005960  6b 25 2c 6e 24 2b 22 3a  20 22 2b a4 74 61 73 6b  |k%,n$+": "+.task|
00005970  5f 72 74 6f 7a 28 73 25  2b 34 29 0d 03 d5 36 e7  |_rtoz(s%+4)...6.|
00005980  66 6f 75 6e 64 25 3d 30  20 85 20 74 61 73 6b 5f  |found%=0 . task_|
00005990  6f 6b 25 2c 22 54 65 6d  70 6c 61 74 65 20 27 22  |ok%,"Template '"|
000059a0  2b 6e 24 2b 22 27 20 6e  6f 74 20 66 6f 75 6e 64  |+n$+"' not found|
000059b0  22 0d 03 d6 05 e1 0d 03  d7 05 3a 0d 03 d8 20 dd  |".........:... .|
000059c0  f2 77 69 6e 5f 63 72 65  61 74 65 28 62 75 66 25  |.win_create(buf%|
000059d0  2c f8 20 68 61 6e 64 6c  65 25 29 0d 03 d9 34 f4  |,. handle%)...4.|
000059e0  20 20 20 20 62 75 66 25  20 2d 20 62 75 66 66 65  |    buf% - buffe|
000059f0  72 20 68 6f 6c 64 69 6e  67 20 74 68 65 20 77 69  |r holding the wi|
00005a00  6e 64 6f 77 20 64 65 66  69 6e 69 74 69 6f 6e 0d  |ndow definition.|
00005a10  03 da 2c f4 20 68 61 6e  64 6c 65 25 20 2d 20 68  |..,. handle% - h|
00005a20  61 6e 64 6c 65 20 6f 66  20 74 68 65 20 63 72 65  |andle of the cre|
00005a30  61 74 65 64 20 77 69 6e  64 6f 77 0d 03 db 29 c8  |ated window...).|
00005a40  99 22 57 69 6d 70 5f 43  72 65 61 74 65 57 69 6e  |."Wimp_CreateWin|
00005a50  64 6f 77 22 2c 2c 62 75  66 25 20 b8 20 68 61 6e  |dow",,buf% . han|
00005a60  64 6c 65 25 0d 03 dc 05  e1 0d 03 dd 05 3a 0d 03  |dle%.........:..|
00005a70  de 26 dd f2 77 69 6e 5f  73 69 7a 65 73 28 66 24  |.&..win_sizes(f$|
00005a80  2c 6e 24 2c f8 20 73 69  7a 65 25 2c f8 20 64 61  |,n$,. size%,. da|
00005a90  74 61 25 29 0d 03 df 08  ea 20 69 25 0d 03 e0 0b  |ta%)..... i%....|
00005aa0  ea 20 66 69 6c 65 25 0d  03 e1 0a ea 20 70 74 72  |. file%..... ptr|
00005ab0  25 0d 03 e2 0d ea 20 6f  66 66 73 65 74 25 0d 03  |%..... offset%..|
00005ac0  e3 0b ea 20 74 79 70 65  25 0d 03 e4 0c ea 20 69  |... type%..... i|
00005ad0  64 65 6e 74 24 0d 03 e5  10 ea 20 6e 75 6d 5f 69  |dent$..... num_i|
00005ae0  63 6f 6e 73 25 0d 03 e6  0f 66 69 6c 65 25 3d 8e  |cons%....file%=.|
00005af0  28 66 24 29 0d 03 e7 0b  73 69 7a 65 25 3d 30 0d  |(f$)....size%=0.|
00005b00  03 e8 0b 64 61 74 61 25  3d 30 0d 03 e9 0b 70 74  |...data%=0....pt|
00005b10  72 25 3d 31 36 0d 03 ea  05 f5 0d 03 eb 11 20 cf  |r%=16......... .|
00005b20  23 66 69 6c 65 25 3d 70  74 72 25 0d 03 ec 1d 20  |#file%=ptr%.... |
00005b30  6f 66 66 73 65 74 25 3d  a4 77 69 6e 5f 77 6f 72  |offset%=.win_wor|
00005b40  64 28 66 69 6c 65 25 29  0d 03 ed 13 20 e7 20 6f  |d(file%).... . o|
00005b50  66 66 73 65 74 25 3c 3e  30 20 8c 0d 03 ee 14 20  |ffset%<>0 ..... |
00005b60  20 cf 23 66 69 6c 65 25  3d 70 74 72 25 2b 38 0d  | .#file%=ptr%+8.|
00005b70  03 ef 1c 20 20 74 79 70  65 25 3d a4 77 69 6e 5f  |...  type%=.win_|
00005b80  77 6f 72 64 28 66 69 6c  65 25 29 0d 03 f0 1f 20  |word(file%).... |
00005b90  20 69 64 65 6e 74 24 3d  a4 77 69 6e 5f 73 74 72  | ident$=.win_str|
00005ba0  69 6e 67 28 66 69 6c 65  25 29 0d 03 f1 0e 20 20  |ing(file%)....  |
00005bb0  70 74 72 25 2b 3d 32 34  0d 03 f2 10 20 20 e7 74  |ptr%+=24....  .t|
00005bc0  79 70 65 25 3d 31 20 8c  0d 03 f3 13 20 20 20 e7  |ype%=1 .....   .|
00005bd0  69 64 65 6e 74 24 3d 6e  24 20 8c 0d 03 f4 1a 20  |ident$=n$ ..... |
00005be0  20 20 20 cf 23 66 69 6c  65 25 3d 6f 66 66 73 65  |   .#file%=offse|
00005bf0  74 25 2b 38 34 0d 03 f5  23 20 20 20 20 6e 75 6d  |t%+84...#    num|
00005c00  5f 69 63 6f 6e 73 25 3d  a4 77 69 6e 5f 77 6f 72  |_icons%=.win_wor|
00005c10  64 28 66 69 6c 65 25 29  0d 03 f6 27 20 20 20 20  |d(file%)...'    |
00005c20  64 61 74 61 25 3d a4 77  69 6e 5f 74 69 74 6c 65  |data%=.win_title|
00005c30  28 66 69 6c 65 25 2c 6f  66 66 73 65 74 25 29 0d  |(file%,offset%).|
00005c40  03 f7 41 20 20 20 20 e7  6e 75 6d 5f 69 63 6f 6e  |..A    .num_icon|
00005c50  73 25 3c 3e 30 20 64 61  74 61 25 2b 3d a4 77 69  |s%<>0 data%+=.wi|
00005c60  6e 5f 69 63 6f 6e 28 66  69 6c 65 25 2c 6e 75 6d  |n_icon(file%,num|
00005c70  5f 69 63 6f 6e 73 25 2c  6f 66 66 73 65 74 25 29  |_icons%,offset%)|
00005c80  0d 03 f8 20 20 20 20 20  73 69 7a 65 25 3d 38 38  |...     size%=88|
00005c90  2b 28 6e 75 6d 5f 69 63  6f 6e 73 25 2a 33 32 29  |+(num_icons%*32)|
00005ca0  0d 03 f9 2f 20 20 20 20  6f 66 66 73 65 74 25 3d  |.../    offset%=|
00005cb0  30 3a f4 20 6a 75 73 74  20 74 6f 20 67 65 74 20  |0:. just to get |
00005cc0  6f 75 74 20 6f 66 20 74  68 65 20 6c 6f 6f 70 0d  |out of the loop.|
00005cd0  03 fa 08 20 20 20 cd 0d  03 fb 07 20 20 cd 0d 03  |...   .....  ...|
00005ce0  fc 06 20 cd 0d 03 fd 0f  fd 20 6f 66 66 73 65 74  |.. ...... offset|
00005cf0  25 3d 30 0d 03 fe 0b d9  23 66 69 6c 65 25 0d 03  |%=0.....#file%..|
00005d00  ff 05 e1 0d 04 00 05 3a  0d 04 01 12 dd a4 77 69  |.......:......wi|
00005d10  6e 5f 77 6f 72 64 28 68  25 29 0d 04 02 2f 3d 9a  |n_word(h%).../=.|
00005d20  23 68 25 2b 28 9a 23 68  25 20 3c 3c 20 38 29 2b  |#h%+(.#h% << 8)+|
00005d30  28 9a 23 68 25 20 3c 3c  20 31 36 29 2b 28 9a 23  |(.#h% << 16)+(.#|
00005d40  68 25 20 3c 3c 20 32 34  29 0d 04 03 05 3a 0d 04  |h% << 24)....:..|
00005d50  04 14 dd a4 77 69 6e 5f  73 74 72 69 6e 67 28 68  |....win_string(h|
00005d60  25 29 0d 04 05 0b ea 20  73 24 2c 63 25 0d 04 06  |%)..... s$,c%...|
00005d70  05 f5 0d 04 07 0c 20 63  25 3d 9a 23 68 25 0d 04  |...... c%=.#h%..|
00005d80  08 15 20 e7 63 25 3e 33  31 20 73 24 2b 3d bd 28  |.. .c%>31 s$+=.(|
00005d90  63 25 29 0d 04 09 0b fd  20 63 25 3c 33 32 0d 04  |c%)..... c%<32..|
00005da0  0a 07 3d 73 24 0d 04 0b  05 3a 0d 04 0c 1e dd a4  |..=s$....:......|
00005db0  77 69 6e 5f 74 69 74 6c  65 28 66 69 6c 65 25 2c  |win_title(file%,|
00005dc0  6f 66 66 73 65 74 25 29  0d 04 0d 08 ea 20 76 25  |offset%)..... v%|
00005dd0  0d 04 0e 16 cf 23 66 69  6c 65 25 3d 6f 66 66 73  |.....#file%=offs|
00005de0  65 74 25 2b 32 38 0d 04  0f 17 76 25 3d a4 77 69  |et%+28....v%=.wi|
00005df0  6e 5f 77 6f 72 64 28 66  69 6c 65 25 29 0d 04 10  |n_word(file%)...|
00005e00  14 e7 20 28 76 25 20 80  20 31 3c 3c 33 31 29 20  |.. (v% . 1<<31) |
00005e10  8c 0d 04 11 15 20 e7 20  28 76 25 20 80 20 31 3c  |..... . (v% . 1<|
00005e20  3c 32 36 29 20 8c 0d 04  12 34 20 20 3d a4 77 69  |<26) ....4  =.wi|
00005e30  6e 5f 69 73 64 28 66 69  6c 65 25 2c 6f 66 66 73  |n_isd(file%,offs|
00005e40  65 74 25 2b 35 36 2c 6f  66 66 73 65 74 25 2b 37  |et%+56,offset%+7|
00005e50  32 2c 6f 66 66 73 65 74  25 29 0d 04 13 06 20 cd  |2,offset%).... .|
00005e60  0d 04 14 05 cc 0d 04 15  11 20 e7 20 28 76 25 20  |......... . (v% |
00005e70  80 20 31 29 20 8c 0d 04  16 34 20 20 3d a4 77 69  |. 1) ....4  =.wi|
00005e80  6e 5f 69 73 64 28 66 69  6c 65 25 2c 6f 66 66 73  |n_isd(file%,offs|
00005e90  65 74 25 2b 35 36 2c 6f  66 66 73 65 74 25 2b 37  |et%+56,offset%+7|
00005ea0  32 2c 6f 66 66 73 65 74  25 29 0d 04 17 06 20 cd  |2,offset%).... .|
00005eb0  0d 04 18 05 cd 0d 04 19  06 3d 30 0d 04 1a 05 3a  |.........=0....:|
00005ec0  0d 04 1b 22 dd a4 77 69  6e 5f 69 63 6f 6e 28 66  |..."..win_icon(f|
00005ed0  69 6c 65 25 2c 6e 75 6d  25 2c 6f 66 66 73 65 74  |ile%,num%,offset|
00005ee0  25 29 0d 04 1c 0b ea 20  69 25 2c 6a 25 0d 04 1d  |%)..... i%,j%...|
00005ef0  08 6a 25 3d 30 0d 04 1e  12 e3 69 25 3d 30 20 b8  |.j%=0.....i%=0 .|
00005f00  20 6e 75 6d 25 2d 31 0d  04 1f 48 20 6a 25 2b 3d  | num%-1...H j%+=|
00005f10  a4 77 69 6e 5f 69 73 64  28 66 69 6c 65 25 2c 6f  |.win_isd(file%,o|
00005f20  66 66 73 65 74 25 2b 38  38 2b 69 25 2a 33 32 2b  |ffset%+88+i%*32+|
00005f30  31 36 2c 6f 66 66 73 65  74 25 2b 38 38 2b 69 25  |16,offset%+88+i%|
00005f40  2a 33 32 2b 32 30 2c 6f  66 66 73 65 74 25 29 0d  |*32+20,offset%).|
00005f50  04 20 05 ed 0d 04 21 07  3d 6a 25 0d 04 22 05 3a  |. ....!.=j%..".:|
00005f60  0d 04 23 24 dd a4 77 69  6e 5f 69 73 64 28 66 69  |..#$..win_isd(fi|
00005f70  6c 65 25 2c 6f 31 25 2c  6f 32 25 2c 6f 66 66 73  |le%,o1%,o2%,offs|
00005f80  65 74 25 29 0d 04 24 16  ea 20 76 25 2c 69 73 74  |et%)..$.. v%,ist|
00005f90  25 2c 73 69 7a 65 25 2c  69 25 0d 04 25 0f cf 23  |%,size%,i%..%..#|
00005fa0  66 69 6c 65 25 3d 6f 31  25 0d 04 26 17 76 25 3d  |file%=o1%..&.v%=|
00005fb0  a4 77 69 6e 5f 77 6f 72  64 28 66 69 6c 65 25 29  |.win_word(file%)|
00005fc0  0d 04 27 2a f4 20 65 76  65 6e 20 69 66 20 61 6e  |..'*. even if an|
00005fd0  20 69 63 6f 6e 20 69 73  20 6d 61 72 6b 65 64 20  | icon is marked |
00005fe0  61 73 20 64 65 6c 65 74  65 64 0d 04 28 1d f4 20  |as deleted..(.. |
00005ff0  69 74 20 6d 75 73 74 20  62 65 20 61 6c 6c 6f 77  |it must be allow|
00006000  65 64 20 66 6f 72 21 0d  04 29 18 69 25 3d 28 76  |ed for!..).i%=(v|
00006010  25 20 80 20 25 31 30 30  30 30 30 30 30 30 29 0d  |% . %100000000).|
00006020  04 2a 1d 69 73 74 25 3d  28 76 25 20 80 20 33 29  |.*.ist%=(v% . 3)|
00006030  20 2b 20 28 69 25 20 3e  3e 20 36 29 0d 04 2b 0d  | + (i% >> 6)..+.|
00006040  c8 8e 20 69 73 74 25 20  ca 0d 04 2c 12 c9 20 20  |.. ist% ...,..  |
00006050  20 30 3a 20 73 69 7a 65  25 3d 30 0d 04 2d 12 c9  | 0: size%=0..-..|
00006060  20 20 20 31 3a 20 73 69  7a 65 25 3d 30 0d 04 2e  |   1: size%=0...|
00006070  12 c9 20 20 20 32 3a 20  73 69 7a 65 25 3d 30 0d  |..   2: size%=0.|
00006080  04 2f 12 c9 20 20 20 33  3a 20 73 69 7a 65 25 3d  |./..   3: size%=|
00006090  30 0d 04 30 12 c9 20 20  20 34 3a 20 73 69 7a 65  |0..0..   4: size|
000060a0  25 3d 30 0d 04 31 18 c9  20 35 2c 37 3a 20 cf 23  |%=0..1.. 5,7: .#|
000060b0  66 69 6c 65 25 3d 6f 32  25 2b 34 0d 04 32 21 20  |file%=o2%+4..2! |
000060c0  20 20 20 20 20 20 20 20  20 76 25 3d a4 77 69 6e  |         v%=.win|
000060d0  5f 77 6f 72 64 28 66 69  6c 65 25 29 0d 04 33 16  |_word(file%)..3.|
000060e0  20 20 20 20 20 20 20 20  20 20 e7 76 25 3d 2d 31  |          .v%=-1|
000060f0  20 8c 0d 04 34 16 20 20  20 20 20 20 20 20 20 20  | ...4.          |
00006100  20 73 69 7a 65 25 3d 30  0d 04 35 0f 20 20 20 20  | size%=0..5.    |
00006110  20 20 20 20 20 20 cc 0d  04 36 21 20 20 20 20 20  |      ...6!     |
00006120  20 20 20 20 20 20 cf 23  66 69 6c 65 25 3d 6f 66  |      .#file%=of|
00006130  66 73 65 74 25 2b 76 25  0d 04 37 2c 20 20 20 20  |fset%+v%..7,    |
00006140  20 20 20 20 20 20 20 73  69 7a 65 25 3d a9 28 a4  |       size%=.(.|
00006150  77 69 6e 5f 73 74 72 69  6e 67 28 66 69 6c 65 25  |win_string(file%|
00006160  29 29 2b 31 0d 04 38 0f  20 20 20 20 20 20 20 20  |))+1..8.        |
00006170  20 20 cd 0d 04 39 1b 20  20 20 20 20 20 20 20 20  |  ...9.         |
00006180  20 cf 23 66 69 6c 65 25  3d 6f 32 25 2b 38 0d 04  | .#file%=o2%+8..|
00006190  3a 25 20 20 20 20 20 20  20 20 20 20 73 69 7a 65  |:%          size|
000061a0  25 2b 3d a4 77 69 6e 5f  77 6f 72 64 28 66 69 6c  |%+=.win_word(fil|
000061b0  65 25 29 0d 04 3b 18 c9  20 20 20 36 3a 20 cf 23  |e%)..;..   6: .#|
000061c0  66 69 6c 65 25 3d 6f 32  25 2b 38 0d 04 3c 24 20  |file%=o2%+8..<$ |
000061d0  20 20 20 20 20 20 20 20  20 73 69 7a 65 25 3d a4  |         size%=.|
000061e0  77 69 6e 5f 77 6f 72 64  28 66 69 6c 65 25 29 0d  |win_word(file%).|
000061f0  04 3d 05 cb 0d 04 3e 0a  3d 73 69 7a 65 25 0d 04  |.=....>.=size%..|
00006200  3f 05 3a 0d 04 40 12 f4  20 49 63 6f 6e 20 6c 69  |?.:..@.. Icon li|
00006210  62 72 61 72 79 0d 04 41  05 3a 0d 04 42 15 dd f2  |brary..A.:..B...|
00006220  69 63 6f 6e 5f 69 6e 69  74 69 61 6c 69 73 65 0d  |icon_initialise.|
00006230  04 43 16 de 20 69 63 6f  6e 5f 62 75 66 66 65 72  |.C.. icon_buffer|
00006240  25 20 32 35 36 0d 04 44  05 e1 0d 04 45 05 3a 0d  |% 256..D....E.:.|
00006250  04 46 16 dd f2 69 63 6f  6e 5f 68 69 64 65 28 61  |.F...icon_hide(a|
00006260  25 2c 62 25 29 0d 04 47  14 21 69 63 6f 6e 5f 62  |%,b%)..G.!icon_b|
00006270  75 66 66 65 72 25 3d 61  25 0d 04 48 15 69 63 6f  |uffer%=a%..H.ico|
00006280  6e 5f 62 75 66 66 65 72  25 21 34 3d 62 25 0d 04  |n_buffer%!4=b%..|
00006290  49 21 69 63 6f 6e 5f 62  75 66 66 65 72 25 21 38  |I!icon_buffer%!8|
000062a0  3d 28 31 3c 3c 37 29 2b  28 31 3c 3c 32 33 29 0d  |=(1<<7)+(1<<23).|
000062b0  04 4a 22 69 63 6f 6e 5f  62 75 66 66 65 72 25 21  |.J"icon_buffer%!|
000062c0  31 32 3d 28 31 3c 3c 37  29 2b 28 31 3c 3c 32 33  |12=(1<<7)+(1<<23|
000062d0  29 0d 04 4b 27 c8 99 22  57 69 6d 70 5f 53 65 74  |)..K'.."Wimp_Set|
000062e0  49 63 6f 6e 53 74 61 74  65 22 2c 2c 69 63 6f 6e  |IconState",,icon|
000062f0  5f 62 75 66 66 65 72 25  0d 04 4c 05 e1 0d 04 4d  |_buffer%..L....M|
00006300  05 3a 0d 04 4e 1a dd f2  69 63 6f 6e 5f 77 72 69  |.:..N...icon_wri|
00006310  74 65 28 61 25 2c 62 25  2c 73 24 29 0d 04 4f 14  |te(a%,b%,s$)..O.|
00006320  21 69 63 6f 6e 5f 62 75  66 66 65 72 25 3d 61 25  |!icon_buffer%=a%|
00006330  0d 04 50 15 69 63 6f 6e  5f 62 75 66 66 65 72 25  |..P.icon_buffer%|
00006340  21 34 3d 62 25 0d 04 51  27 c8 99 22 57 69 6d 70  |!4=b%..Q'.."Wimp|
00006350  5f 47 65 74 49 63 6f 6e  53 74 61 74 65 22 2c 2c  |_GetIconState",,|
00006360  69 63 6f 6e 5f 62 75 66  66 65 72 25 0d 04 52 20  |icon_buffer%..R |
00006370  e7 28 a9 28 73 24 29 2b  31 29 3e 69 63 6f 6e 5f  |.(.(s$)+1)>icon_|
00006380  62 75 66 66 65 72 25 21  33 36 20 8c 0d 04 53 33  |buffer%!36 ...S3|
00006390  20 85 20 74 61 73 6b 5f  66 61 74 61 6c 25 2c 22  | . task_fatal%,"|
000063a0  27 22 2b 73 24 2b 22 27  20 77 6f 6e 27 74 20 66  |'"+s$+"' won't f|
000063b0  69 74 20 69 63 6f 6e 20  22 2b c3 28 62 25 29 0d  |it icon "+.(b%).|
000063c0  04 54 05 cd 0d 04 55 19  24 28 69 63 6f 6e 5f 62  |.T....U.$(icon_b|
000063d0  75 66 66 65 72 25 21 32  38 29 3d 73 24 0d 04 56  |uffer%!28)=s$..V|
000063e0  26 69 63 6f 6e 5f 62 75  66 66 65 72 25 21 38 3d  |&icon_buffer%!8=|
000063f0  30 3a 69 63 6f 6e 5f 62  75 66 66 65 72 25 21 31  |0:icon_buffer%!1|
00006400  32 3d 30 0d 04 57 27 c8  99 22 57 69 6d 70 5f 53  |2=0..W'.."Wimp_S|
00006410  65 74 49 63 6f 6e 53 74  61 74 65 22 2c 2c 69 63  |etIconState",,ic|
00006420  6f 6e 5f 62 75 66 66 65  72 25 0d 04 58 05 e1 0d  |on_buffer%..X...|
00006430  04 59 05 3a 0d 04 5a 17  dd f2 69 63 6f 6e 5f 73  |.Y.:..Z...icon_s|
00006440  68 61 64 65 28 61 25 2c  62 25 29 0d 04 5b 14 21  |hade(a%,b%)..[.!|
00006450  69 63 6f 6e 5f 62 75 66  66 65 72 25 3d 61 25 0d  |icon_buffer%=a%.|
00006460  04 5c 15 69 63 6f 6e 5f  62 75 66 66 65 72 25 21  |.\.icon_buffer%!|
00006470  34 3d 62 25 0d 04 5d 18  69 63 6f 6e 5f 62 75 66  |4=b%..].icon_buf|
00006480  66 65 72 25 21 38 3d 31  3c 3c 32 32 0d 04 5e 19  |fer%!8=1<<22..^.|
00006490  69 63 6f 6e 5f 62 75 66  66 65 72 25 21 31 32 3d  |icon_buffer%!12=|
000064a0  31 3c 3c 32 32 0d 04 5f  27 c8 99 22 57 69 6d 70  |1<<22.._'.."Wimp|
000064b0  5f 53 65 74 49 63 6f 6e  53 74 61 74 65 22 2c 2c  |_SetIconState",,|
000064c0  69 63 6f 6e 5f 62 75 66  66 65 72 25 0d 04 60 05  |icon_buffer%..`.|
000064d0  e1 0d 04 61 05 3a 0d 04  62 15 dd a4 69 63 6f 6e  |...a.:..b...icon|
000064e0  5f 73 65 74 28 61 25 2c  62 25 29 0d 04 63 14 21  |_set(a%,b%)..c.!|
000064f0  69 63 6f 6e 5f 62 75 66  66 65 72 25 3d 61 25 0d  |icon_buffer%=a%.|
00006500  04 64 15 69 63 6f 6e 5f  62 75 66 66 65 72 25 21  |.d.icon_buffer%!|
00006510  34 3d 62 25 0d 04 65 27  c8 99 22 57 69 6d 70 5f  |4=b%..e'.."Wimp_|
00006520  47 65 74 49 63 6f 6e 53  74 61 74 65 22 2c 2c 69  |GetIconState",,i|
00006530  63 6f 6e 5f 62 75 66 66  65 72 25 0d 04 66 25 3d  |con_buffer%..f%=|
00006540  28 28 69 63 6f 6e 5f 62  75 66 66 65 72 25 21 32  |((icon_buffer%!2|
00006550  34 20 80 20 28 31 3c 3c  32 31 29 29 3c 3e 30 29  |4 . (1<<21))<>0)|
00006560  0d 04 67 05 3a 0d 04 68  18 dd f2 69 63 6f 6e 5f  |..g.:..h...icon_|
00006570  75 6e 68 69 64 65 28 61  25 2c 62 25 29 0d 04 69  |unhide(a%,b%)..i|
00006580  14 21 69 63 6f 6e 5f 62  75 66 66 65 72 25 3d 61  |.!icon_buffer%=a|
00006590  25 0d 04 6a 15 69 63 6f  6e 5f 62 75 66 66 65 72  |%..j.icon_buffer|
000065a0  25 21 34 3d 62 25 0d 04  6b 14 69 63 6f 6e 5f 62  |%!4=b%..k.icon_b|
000065b0  75 66 66 65 72 25 21 38  3d 30 0d 04 6c 19 69 63  |uffer%!8=0..l.ic|
000065c0  6f 6e 5f 62 75 66 66 65  72 25 21 31 32 3d 31 3c  |on_buffer%!12=1<|
000065d0  3c 32 33 0d 04 6d 27 c8  99 22 57 69 6d 70 5f 53  |<23..m'.."Wimp_S|
000065e0  65 74 49 63 6f 6e 53 74  61 74 65 22 2c 2c 69 63  |etIconState",,ic|
000065f0  6f 6e 5f 62 75 66 66 65  72 25 0d 04 6e 05 e1 0d  |on_buffer%..n...|
00006600  04 6f 05 3a 0d 04 70 19  dd f2 69 63 6f 6e 5f 75  |.o.:..p...icon_u|
00006610  6e 73 68 61 64 65 28 61  25 2c 62 25 29 0d 04 71  |nshade(a%,b%)..q|
00006620  14 21 69 63 6f 6e 5f 62  75 66 66 65 72 25 3d 61  |.!icon_buffer%=a|
00006630  25 0d 04 72 15 69 63 6f  6e 5f 62 75 66 66 65 72  |%..r.icon_buffer|
00006640  25 21 34 3d 62 25 0d 04  73 14 69 63 6f 6e 5f 62  |%!4=b%..s.icon_b|
00006650  75 66 66 65 72 25 21 38  3d 30 0d 04 74 19 69 63  |uffer%!8=0..t.ic|
00006660  6f 6e 5f 62 75 66 66 65  72 25 21 31 32 3d 31 3c  |on_buffer%!12=1<|
00006670  3c 32 32 0d 04 75 27 c8  99 22 57 69 6d 70 5f 53  |<22..u'.."Wimp_S|
00006680  65 74 49 63 6f 6e 53 74  61 74 65 22 2c 2c 69 63  |etIconState",,ic|
00006690  6f 6e 5f 62 75 66 66 65  72 25 0d 04 76 05 e1 0d  |on_buffer%..v...|
000066a0  04 77 05 3a 0d 04 78 12  f4 20 54 61 73 6b 20 6c  |.w.:..x.. Task l|
000066b0  69 62 72 61 72 79 0d 04  79 05 3a 0d 04 7a 1a dd  |ibrary..y.:..z..|
000066c0  20 f2 74 61 73 6b 5f 69  6e 69 74 69 61 6c 69 73  | .task_initialis|
000066d0  65 28 6e 24 29 0d 04 7b  0f 74 61 73 6b 5f 69 64  |e(n$)..{.task_id|
000066e0  24 3d 6e 24 0d 04 7c 14  de 20 74 61 73 6b 5f 62  |$=n$..|.. task_b|
000066f0  75 66 66 25 20 32 35 36  0d 04 7d 14 e7 20 52 69  |uff% 256..}.. Ri|
00006700  73 63 4f 53 25 3e 3d 33  30 30 20 8c 0d 04 7e 27  |scOS%>=300 ...~'|
00006710  20 20 74 61 73 6b 5f 62  75 66 66 25 21 30 3d 4d  |  task_buff%!0=M|
00006720  65 73 73 61 67 65 5f 4d  4d 5f 44 6f 63 75 6d 65  |essage_MM_Docume|
00006730  6e 74 25 0d 04 7f 28 20  20 74 61 73 6b 5f 62 75  |nt%...(  task_bu|
00006740  66 66 25 21 34 3d 4d 65  73 73 61 67 65 5f 57 69  |ff%!4=Message_Wi|
00006750  6e 64 6f 77 43 6c 6f 73  65 64 25 0d 04 80 29 20  |ndowClosed%...) |
00006760  20 74 61 73 6b 5f 62 75  66 66 25 21 38 3d 4d 65  | task_buff%!8=Me|
00006770  73 73 61 67 65 5f 54 61  73 6b 43 6c 6f 73 65 44  |ssage_TaskCloseD|
00006780  6f 77 6e 25 0d 04 81 24  20 20 74 61 73 6b 5f 62  |own%...$  task_b|
00006790  75 66 66 25 21 31 32 3d  4d 65 73 73 61 67 65 5f  |uff%!12=Message_|
000067a0  50 72 65 51 75 69 74 25  0d 04 82 25 20 20 74 61  |PreQuit%...%  ta|
000067b0  73 6b 5f 62 75 66 66 25  21 31 36 3d 4d 65 73 73  |sk_buff%!16=Mess|
000067c0  61 67 65 5f 52 41 4d 46  65 74 63 68 25 0d 04 83  |age_RAMFetch%...|
000067d0  25 20 20 74 61 73 6b 5f  62 75 66 66 25 21 32 30  |%  task_buff%!20|
000067e0  3d 4d 65 73 73 61 67 65  5f 44 61 74 61 4c 6f 61  |=Message_DataLoa|
000067f0  64 25 0d 04 84 25 20 20  74 61 73 6b 5f 62 75 66  |d%...%  task_buf|
00006800  66 25 21 32 34 3d 4d 65  73 73 61 67 65 5f 44 61  |f%!24=Message_Da|
00006810  74 61 53 61 76 65 25 0d  04 85 26 20 20 74 61 73  |taSave%...&  tas|
00006820  6b 5f 62 75 66 66 25 21  32 38 3d 4d 65 73 73 61  |k_buff%!28=Messa|
00006830  67 65 5f 49 6d 70 75 6c  73 65 5f 31 25 0d 04 86  |ge_Impulse_1%...|
00006840  26 20 20 74 61 73 6b 5f  62 75 66 66 25 21 33 32  |&  task_buff%!32|
00006850  3d 4d 65 73 73 61 67 65  5f 49 6d 70 75 6c 73 65  |=Message_Impulse|
00006860  5f 32 25 0d 04 87 21 20  20 74 61 73 6b 5f 62 75  |_2%...!  task_bu|
00006870  66 66 25 21 33 36 3d 4d  65 73 73 61 67 65 5f 51  |ff%!36=Message_Q|
00006880  75 69 74 25 0d 04 88 55  20 20 c8 99 22 57 69 6d  |uit%...U  .."Wim|
00006890  70 5f 49 6e 69 74 69 61  6c 69 73 65 22 2c 33 31  |p_Initialise",31|
000068a0  30 2c 26 34 42 35 33 34  31 35 34 2c 6e 24 2c 74  |0,&4B534154,n$,t|
000068b0  61 73 6b 5f 62 75 66 66  25 2b 33 36 20 b8 20 77  |ask_buff%+36 . w|
000068c0  69 6d 70 5f 76 65 72 73  69 6f 6e 25 2c 74 61 73  |imp_version%,tas|
000068d0  6b 5f 68 61 6e 64 6c 65  25 0d 04 89 05 cc 0d 04  |k_handle%.......|
000068e0  8a 48 20 20 c8 99 20 22  57 69 6d 70 5f 49 6e 69  |.H  .. "Wimp_Ini|
000068f0  74 69 61 6c 69 73 65 22  2c 32 30 30 2c 26 34 42  |tialise",200,&4B|
00006900  35 33 34 31 35 34 2c 6e  24 20 b8 20 77 69 6d 70  |534154,n$ . wimp|
00006910  5f 76 65 72 73 69 6f 6e  25 2c 74 61 73 6b 5f 68  |_version%,task_h|
00006920  61 6e 64 6c 65 25 0d 04  8b 05 cd 0d 04 8c 23 ff  |andle%........#.|
00006930  28 22 53 65 74 20 4d 61  69 6c 4d 65 72 67 65 24  |("Set MailMerge$|
00006940  52 75 6e 6e 69 6e 67 20  54 52 55 45 22 29 0d 04  |Running TRUE")..|
00006950  8d 12 74 61 73 6b 5f 61  63 74 69 6f 6e 25 3d 30  |..task_action%=0|
00006960  0d 04 8e 04 0d 04 8f 2a  f4 20 21 21 21 21 21 21  |.......*. !!!!!!|
00006970  21 21 21 21 21 21 21 21  21 21 21 21 21 21 21 21  |!!!!!!!!!!!!!!!!|
00006980  21 21 21 21 21 21 21 21  21 21 21 21 21 21 0d 04  |!!!!!!!!!!!!!!..|
00006990  90 25 f4 20 74 61 73 6b  5f 6d 61 73 6b 25 3d 31  |.%. task_mask%=1|
000069a0  3a 52 45 4d 20 6e 6f 20  6e 75 6c 6c 20 65 76 65  |:REM no null eve|
000069b0  6e 74 73 0d 04 91 04 0d  04 92 35 74 61 73 6b 5f  |nts.......5task_|
000069c0  6d 61 73 6b 25 3d 30 20  20 20 20 20 20 20 20 20  |mask%=0         |
000069d0  20 20 3a 20 f4 20 49 20  77 61 6e 74 20 6d 79 20  |  : . I want my |
000069e0  6e 75 6c 6c 20 65 76 65  6e 74 73 21 0d 04 93 04  |null events!....|
000069f0  0d 04 94 2a f4 20 21 21  21 21 21 21 21 21 21 21  |...*. !!!!!!!!!!|
00006a00  21 21 21 21 21 21 21 21  21 21 21 21 21 21 21 21  |!!!!!!!!!!!!!!!!|
00006a10  21 21 21 21 21 21 21 21  21 21 0d 04 95 04 0d 04  |!!!!!!!!!!......|
00006a20  96 10 74 61 73 6b 5f 6f  6b 25 3d 32 35 34 0d 04  |..task_ok%=254..|
00006a30  97 04 0d 04 98 13 74 61  73 6b 5f 66 61 74 61 6c  |......task_fatal|
00006a40  25 3d 32 35 33 0d 04 99  05 e1 0d 04 9a 05 3a 0d  |%=253.........:.|
00006a50  04 9b 13 dd f2 74 61 73  6b 5f 73 68 75 74 64 6f  |.....task_shutdo|
00006a60  77 6e 0d 04 9c 16 c8 99  22 57 69 6d 70 5f 43 6c  |wn......"Wimp_Cl|
00006a70  6f 73 65 44 6f 77 6e 22  0d 04 9d 20 ff 28 22 55  |oseDown"... .("U|
00006a80  6e 53 65 74 20 4d 61 69  6c 4d 65 72 67 65 24 52  |nSet MailMerge$R|
00006a90  75 6e 6e 69 6e 67 22 29  0d 04 9e 05 e0 0d 04 9f  |unning")........|
00006aa0  05 e1 0d 04 a0 05 3a 0d  04 a1 13 dd a4 74 61 73  |......:......tas|
00006ab0  6b 5f 72 74 6f 7a 28 70  25 29 0d 04 a2 08 ea 20  |k_rtoz(p%)..... |
00006ac0  70 24 0d 04 a3 0d c8 95  20 3f 70 25 3c 3e 30 0d  |p$...... ?p%<>0.|
00006ad0  04 a4 0f 20 70 24 2b 3d  bd 28 3f 70 25 29 0d 04  |... p$+=.(?p%)..|
00006ae0  a5 0a 20 70 25 2b 3d 31  0d 04 a6 05 ce 0d 04 a7  |.. p%+=1........|
00006af0  07 3d 70 24 0d 04 a8 05  3a 0d 04 a9 15 f4 20 4d  |.=p$....:..... M|
00006b00  65 73 73 61 67 65 20 6c  69 62 72 61 72 79 0d 04  |essage library..|
00006b10  aa 05 3a 0d 04 ab 18 dd  f2 6d 73 67 5f 69 6e 69  |..:......msg_ini|
00006b20  74 69 61 6c 69 73 65 28  4e 24 29 0d 04 ac 0e ea  |tialise(N$).....|
00006b30  20 63 25 2c 63 24 2c 69  25 0d 04 ad 0c 63 25 3d  | c%,c$,i%....c%=|
00006b40  8e 28 4e 24 29 0d 04 ae  2a e7 63 25 3d 30 20 85  |.(N$)...*.c%=0 .|
00006b50  20 30 2c 20 22 43 61 6e  6e 6f 74 20 66 69 6e 64  | 0, "Cannot find|
00006b60  20 6d 65 73 73 61 67 65  73 20 66 69 6c 65 22 0d  | messages file".|
00006b70  04 af 0e 6d 73 5f 74 61  67 73 25 3d 30 0d 04 b0  |...ms_tags%=0...|
00006b80  11 f2 68 6f 75 72 67 6c  61 73 73 5f 6f 6e 0d 04  |..hourglass_on..|
00006b90  b1 0e c8 95 20 ac 28 c5  23 63 25 29 0d 04 b2 0c  |.... .(.#c%)....|
00006ba0  20 63 24 3d be 23 63 25  0d 04 b3 0e 20 e7 63 24  | c$=.#c%.... .c$|
00006bb0  3c 3e 22 22 20 8c 0d 04  b4 14 20 20 e7 c0 63 24  |<>"" .....  ..c$|
00006bc0  2c 31 29 3c 3e 22 23 22  20 8c 0d 04 b5 1f 20 20  |,1)<>"#" .....  |
00006bd0  20 e7 a7 63 24 2c 22 3a  22 29 3c 3e 30 20 6d 73  | ..c$,":")<>0 ms|
00006be0  5f 74 61 67 73 25 2b 3d  31 0d 04 b6 07 20 20 cd  |_tags%+=1....  .|
00006bf0  0d 04 b7 06 20 cd 0d 04  b8 05 ce 0d 04 b9 12 e7  |.... ...........|
00006c00  6d 73 5f 74 61 67 73 25  3c 3e 30 20 8c 0d 04 ba  |ms_tags%<>0 ....|
00006c10  30 20 de 20 6d 73 5f 74  65 78 74 24 28 6d 73 5f  |0 . ms_text$(ms_|
00006c20  74 61 67 73 25 2d 31 29  2c 6d 73 5f 74 61 67 73  |tags%-1),ms_tags|
00006c30  24 28 6d 73 5f 74 61 67  73 25 2d 31 29 0d 04 bb  |$(ms_tags%-1)...|
00006c40  0b 20 cf 23 63 25 3d 30  0d 04 bc 09 20 69 25 3d  |. .#c%=0.... i%=|
00006c50  30 0d 04 bd 0d 20 c8 95  20 ac c5 23 63 25 0d 04  |0.... .. ..#c%..|
00006c60  be 0d 20 20 63 24 3d be  23 63 25 0d 04 bf 0f 20  |..  c$=.#c%.... |
00006c70  20 e7 63 24 3c 3e 22 22  20 8c 0d 04 c0 15 20 20  | .c$<>"" .....  |
00006c80  20 e7 c0 63 24 2c 31 29  3c 3e 22 23 22 20 8c 0d  | ..c$,1)<>"#" ..|
00006c90  04 c1 24 20 20 20 20 6d  73 5f 74 61 67 73 24 28  |..$    ms_tags$(|
00006ca0  69 25 29 3d c0 63 24 2c  a7 63 24 2c 22 3a 22 29  |i%)=.c$,.c$,":")|
00006cb0  2d 31 29 0d 04 c2 24 20  20 20 20 6d 73 5f 74 65  |-1)...$    ms_te|
00006cc0  78 74 24 28 69 25 29 3d  c1 63 24 2c a7 63 24 2c  |xt$(i%)=.c$,.c$,|
00006cd0  22 3a 22 29 2b 31 29 0d  04 c3 0d 20 20 20 20 69  |":")+1)....    i|
00006ce0  25 2b 3d 31 0d 04 c4 08  20 20 20 cd 0d 04 c5 07  |%+=1....   .....|
00006cf0  20 20 cd 0d 04 c6 06 20  ce 0d 04 c7 05 cd 0d 04  |  ..... ........|
00006d00  c8 08 d9 23 63 25 0d 04  c9 12 f2 68 6f 75 72 67  |...#c%.....hourg|
00006d10  6c 61 73 73 5f 6f 66 66  0d 04 ca 05 e1 0d 04 cb  |lass_off........|
00006d20  05 3a 0d 04 cc 0f dd a4  6d 73 67 5f 30 28 54 24  |.:......msg_0(T$|
00006d30  29 0d 04 cd 1b 3d a4 6d  73 67 5f 34 28 54 24 2c  |)....=.msg_4(T$,|
00006d40  22 22 2c 22 22 2c 22 22  2c 22 22 29 0d 04 ce 05  |"","","","")....|
00006d50  3a 0d 04 cf 12 dd a4 6d  73 67 5f 31 28 54 24 2c  |:......msg_1(T$,|
00006d60  53 24 29 0d 04 d0 1b 3d  a4 6d 73 67 5f 34 28 54  |S$)....=.msg_4(T|
00006d70  24 2c 53 24 2c 22 22 2c  22 22 2c 22 22 29 0d 04  |$,S$,"","","")..|
00006d80  d1 05 3b 0d 04 d2 17 dd  a4 6d 73 67 5f 32 28 54  |..;......msg_2(T|
00006d90  24 2c 53 30 24 2c 53 31  24 29 0d 04 d3 1d 3d a4  |$,S0$,S1$)....=.|
00006da0  6d 73 67 5f 34 28 54 24  2c 53 30 24 2c 53 31 24  |msg_4(T$,S0$,S1$|
00006db0  2c 22 22 2c 22 22 29 0d  04 d4 05 3a 0d 04 d5 1f  |,"","")....:....|
00006dc0  dd a4 6d 73 67 5f 34 28  54 24 2c 53 30 24 2c 53  |..msg_4(T$,S0$,S|
00006dd0  31 24 2c 53 32 24 2c 53  33 24 29 0d 04 d6 0b ea  |1$,S2$,S3$).....|
00006de0  20 69 25 2c 66 25 0d 04  d7 11 e7 6d 73 5f 74 61  | i%,f%.....ms_ta|
00006df0  67 73 25 3d 30 20 8c 0d  04 d8 08 20 3d 54 24 0d  |gs%=0 ..... =T$.|
00006e00  04 d9 05 cc 0d 04 da 17  20 e3 69 25 3d 30 20 b8  |........ .i%=0 .|
00006e10  20 6d 73 5f 74 61 67 73  25 2d 31 0d 04 db 18 20  | ms_tags%-1.... |
00006e20  20 e7 54 24 3d 6d 73 5f  74 61 67 73 24 28 69 25  | .T$=ms_tags$(i%|
00006e30  29 20 8c 0d 04 dc 16 20  20 20 54 24 3d 6d 73 5f  |) .....   T$=ms_|
00006e40  74 65 78 74 24 28 69 25  29 0d 04 dd 13 20 20 20  |text$(i%)....   |
00006e50  66 25 3d a7 54 24 2c 22  25 30 22 29 0d 04 de 28  |f%=.T$,"%0")...(|
00006e60  20 20 20 e7 66 25 3c 3e  30 20 54 24 3d c0 54 24  |   .f%<>0 T$=.T$|
00006e70  2c 66 25 2d 31 29 2b 53  30 24 2b c1 54 24 2c 66  |,f%-1)+S0$+.T$,f|
00006e80  25 2b 32 29 0d 04 df 13  20 20 20 66 25 3d a7 54  |%+2)....   f%=.T|
00006e90  24 2c 22 25 31 22 29 0d  04 e0 28 20 20 20 e7 66  |$,"%1")...(   .f|
00006ea0  25 3c 3e 30 20 54 24 3d  c0 54 24 2c 66 25 2d 31  |%<>0 T$=.T$,f%-1|
00006eb0  29 2b 53 31 24 2b c1 54  24 2c 66 25 2b 32 29 0d  |)+S1$+.T$,f%+2).|
00006ec0  04 e1 13 20 20 20 66 25  3d a7 54 24 2c 22 25 32  |...   f%=.T$,"%2|
00006ed0  22 29 0d 04 e2 28 20 20  20 e7 66 25 3c 3e 30 20  |")...(   .f%<>0 |
00006ee0  54 24 3d c0 54 24 2c 66  25 2d 31 29 2b 53 32 24  |T$=.T$,f%-1)+S2$|
00006ef0  2b c1 54 24 2c 66 25 2b  32 29 0d 04 e3 13 20 20  |+.T$,f%+2)....  |
00006f00  20 66 25 3d a7 54 24 2c  22 25 33 22 29 0d 04 e4  | f%=.T$,"%3")...|
00006f10  28 20 20 20 e7 66 25 3c  3e 30 20 54 24 3d c0 54  |(   .f%<>0 T$=.T|
00006f20  24 2c 66 25 2d 31 29 2b  53 33 24 2b c1 54 24 2c  |$,f%-1)+S3$+.T$,|
00006f30  66 25 2b 32 29 0d 04 e5  12 20 20 20 69 25 3d 6d  |f%+2)....   i%=m|
00006f40  73 5f 74 61 67 73 25 0d  04 e6 07 20 20 cd 0d 04  |s_tags%....  ...|
00006f50  e7 06 20 ed 0d 04 e8 05  cd 0d 04 e9 07 3d 54 24  |.. ..........=T$|
00006f60  0d 04 ea 05 3a 0d 04 eb  12 dd f2 68 6f 75 72 67  |....:......hourg|
00006f70  6c 61 73 73 5f 6f 6e 0d  04 ec 14 c8 99 22 48 6f  |lass_on......"Ho|
00006f80  75 72 67 6c 61 73 73 5f  4f 6e 22 0d 04 ed 17 68  |urglass_On"....h|
00006f90  6f 75 72 67 6c 61 73 73  5f 63 6f 75 6e 74 25 2b  |ourglass_count%+|
00006fa0  3d 31 0d 04 ee 05 e1 0d  04 ef 05 3a 0d 04 f0 13  |=1.........:....|
00006fb0  dd f2 68 6f 75 72 67 6c  61 73 73 5f 6f 66 66 0d  |..hourglass_off.|
00006fc0  04 f1 15 c8 99 22 48 6f  75 72 67 6c 61 73 73 5f  |....."Hourglass_|
00006fd0  4f 66 66 22 0d 04 f2 17  68 6f 75 72 67 6c 61 73  |Off"....hourglas|
00006fe0  73 5f 63 6f 75 6e 74 25  2d 3d 31 0d 04 f3 05 e1  |s_count%-=1.....|
00006ff0  0d 04 f4 05 3a 0d 04 f5  13 dd f2 6f 70 65 6e 5f  |....:......open_|
00007000  63 73 76 5f 66 69 6c 65  0d 04 f6 14 e7 20 63 73  |csv_file..... cs|
00007010  76 5f 66 69 6c 65 24 3d  22 22 20 e1 0d 04 f7 21  |v_file$="" ....!|
00007020  63 73 76 5f 66 69 6c 65  5f 68 61 6e 64 6c 65 25  |csv_file_handle%|
00007030  3d 8e 28 63 73 76 5f 66  69 6c 65 24 29 0d 04 f8  |=.(csv_file$)...|
00007040  05 e1 0d 04 f9 05 3a 0d  04 fa 14 dd f2 63 6c 6f  |......:......clo|
00007050  73 65 5f 63 73 76 5f 66  69 6c 65 0d 04 fb 19 e7  |se_csv_file.....|
00007060  63 73 76 5f 66 69 6c 65  5f 68 61 6e 64 6c 65 25  |csv_file_handle%|
00007070  3d 30 20 e1 0d 04 fc 16  d9 23 63 73 76 5f 66 69  |=0 ......#csv_fi|
00007080  6c 65 5f 68 61 6e 64 6c  65 25 0d 04 fd 16 63 73  |le_handle%....cs|
00007090  76 5f 66 69 6c 65 5f 68  61 6e 64 6c 65 25 3d 30  |v_file_handle%=0|
000070a0  0d 04 fe 05 e1 0d 04 ff  04 0d 05 00 04 0d 05 01  |................|
000070b0  0d dd 20 f2 63 6f 6e 73  74 73 0d 05 02 1d 61 70  |.. .consts....ap|
000070c0  70 64 69 72 24 3d 22 3c  4d 61 69 6c 4d 65 72 67  |pdir$="<MailMerg|
000070d0  65 24 44 69 72 3e 22 0d  05 03 12 49 63 6f 6e 5f  |e$Dir>"....Icon_|
000070e0  54 6f 50 72 6f 63 25 3d  31 0d 05 04 14 49 63 6f  |ToProc%=1....Ico|
000070f0  6e 5f 52 65 63 73 50 72  6f 63 25 3d 32 0d 05 05  |n_RecsProc%=2...|
00007100  14 49 63 6f 6e 5f 48 65  61 64 69 6e 67 73 25 3d  |.Icon_Headings%=|
00007110  33 0d 05 06 14 49 63 6f  6e 5f 50 72 69 6e 74 41  |3....Icon_PrintA|
00007120  6c 6c 25 3d 34 0d 05 07  0f 49 63 6f 6e 5f 43 53  |ll%=4....Icon_CS|
00007130  56 25 3d 35 0d 05 08 10  49 63 6f 6e 5f 54 6f 47  |V%=5....Icon_ToG|
00007140  6f 25 3d 36 0d 05 09 10  49 63 6f 6e 5f 44 6f 6e  |o%=6....Icon_Don|
00007150  65 25 3d 37 0d 05 0a 11  49 63 6f 6e 5f 50 72 69  |e%=7....Icon_Pri|
00007160  6e 74 25 3d 38 0d 05 0b  15 49 63 6f 6e 5f 64 6f  |nt%=8....Icon_do|
00007170  63 75 6d 65 6e 74 25 3d  31 30 0d 05 0c 11 49 63  |cument%=10....Ic|
00007180  6f 6e 5f 4e 65 78 74 25  3d 31 31 0d 05 0d 11 49  |on_Next%=11....I|
00007190  63 6f 6e 5f 45 64 69 74  25 3d 31 32 0d 05 0e 15  |con_Edit%=12....|
000071a0  49 63 6f 6e 5f 44 69 73  70 48 65 61 64 25 3d 31  |Icon_DispHead%=1|
000071b0  33 0d 05 0f 17 49 63 6f  6e 5f 53 74 61 72 74 4d  |3....Icon_StartM|
000071c0  65 72 67 65 25 3d 31 34  0d 05 10 15 49 63 6f 6e  |erge%=14....Icon|
000071d0  5f 44 72 6f 70 48 65 72  65 25 3d 31 35 0d 05 11  |_DropHere%=15...|
000071e0  04 0d 05 12 15 57 69 6e  64 6f 77 5f 53 6d 61 6c  |.....Window_Smal|
000071f0  6c 25 3d 32 33 36 0d 05  13 13 57 69 6e 64 6f 77  |l%=236....Window|
00007200  5f 42 69 67 25 3d 33 36  30 0d 05 14 04 0d 05 15  |_Big%=360.......|
00007210  11 54 5f 47 65 74 46 69  65 6c 64 25 3d 30 0d 05  |.T_GetField%=0..|
00007220  16 10 54 5f 47 65 74 44  61 74 61 25 3d 31 0d 05  |..T_GetData%=1..|
00007230  17 14 54 5f 47 65 74 54  69 6d 65 44 61 74 65 25  |..T_GetTimeDate%|
00007240  3d 32 0d 05 18 0e 54 5f  50 72 69 6e 74 25 3d 33  |=2....T_Print%=3|
00007250  0d 05 19 0e 54 5f 4d 65  72 67 65 25 3d 34 0d 05  |....T_Merge%=4..|
00007260  1a 12 54 5f 43 6c 6f 73  65 44 6f 77 6e 25 3d 37  |..T_CloseDown%=7|
00007270  0d 05 1b 04 0d 05 1c 19  49 6d 70 75 6c 73 65 5f  |........Impulse_|
00007280  43 6f 6d 6d 61 6e 64 25  3d 26 32 30 30 0d 05 1d  |Command%=&200...|
00007290  19 49 6d 70 75 6c 73 65  5f 52 65 71 75 65 73 74  |.Impulse_Request|
000072a0  25 3d 26 32 30 31 0d 05  1e 17 49 6d 70 75 6c 73  |%=&201....Impuls|
000072b0  65 5f 52 65 70 6c 79 25  3d 26 32 30 32 0d 05 1f  |e_Reply%=&202...|
000072c0  1a 49 6d 70 75 6c 73 65  5f 53 65 6e 64 44 61 74  |.Impulse_SendDat|
000072d0  61 25 3d 26 32 30 33 0d  05 20 1d 49 6d 70 75 6c  |a%=&203.. .Impul|
000072e0  73 65 5f 52 65 63 65 69  76 65 44 61 74 61 25 3d  |se_ReceiveData%=|
000072f0  26 32 30 34 0d 05 21 1f  49 6d 70 75 6c 73 65 5f  |&204..!.Impulse_|
00007300  44 65 66 65 72 72 65 64  52 65 70 6c 79 25 3d 26  |DeferredReply%=&|
00007310  32 30 35 0d 05 22 04 0d  05 23 12 44 44 46 5f 54  |205.."...#.DDF_T|
00007320  79 70 65 25 3d 26 44 39  33 0d 05 24 12 43 53 56  |ype%=&D93..$.CSV|
00007330  5f 54 79 70 65 25 3d 26  44 46 45 0d 05 25 04 0d  |_Type%=&DFE..%..|
00007340  05 26 13 4d 65 73 73 61  67 65 5f 51 75 69 74 25  |.&.Message_Quit%|
00007350  3d 30 0d 05 27 17 4d 65  73 73 61 67 65 5f 44 61  |=0..'.Message_Da|
00007360  74 61 53 61 76 65 25 3d  31 0d 05 28 17 4d 65 73  |taSave%=1..(.Mes|
00007370  73 61 67 65 5f 44 61 74  61 4c 6f 61 64 25 3d 33  |sage_DataLoad%=3|
00007380  0d 05 29 17 4d 65 73 73  61 67 65 5f 52 41 4d 46  |..).Message_RAMF|
00007390  65 74 63 68 25 3d 36 0d  05 2a 16 4d 65 73 73 61  |etch%=6..*.Messa|
000073a0  67 65 5f 50 72 65 51 75  69 74 25 3d 38 0d 05 2b  |ge_PreQuit%=8..+|
000073b0  21 4d 65 73 73 61 67 65  5f 54 61 73 6b 43 6c 6f  |!Message_TaskClo|
000073c0  73 65 44 6f 77 6e 25 3d  26 34 30 30 43 33 0d 05  |seDown%=&400C3..|
000073d0  2c 20 4d 65 73 73 61 67  65 5f 57 69 6e 64 6f 77  |, Message_Window|
000073e0  43 6c 6f 73 65 64 25 3d  26 34 30 30 43 42 0d 05  |Closed%=&400CB..|
000073f0  2d 1d 4d 65 73 73 61 67  65 5f 49 6d 70 75 6c 73  |-.Message_Impuls|
00007400  65 5f 31 25 3d 26 38 30  45 31 38 0d 05 2e 1d 4d  |e_1%=&80E18....M|
00007410  65 73 73 61 67 65 5f 49  6d 70 75 6c 73 65 5f 32  |essage_Impulse_2|
00007420  25 3d 26 38 30 45 31 39  0d 05 2f 1f 4d 65 73 73  |%=&80E19../.Mess|
00007430  61 67 65 5f 4d 4d 5f 44  6f 63 75 6d 65 6e 74 25  |age_MM_Document%|
00007440  3d 26 38 32 31 34 30 0d  05 30 04 0d 05 31 12 43  |=&82140..0...1.C|
00007450  68 61 72 5f 53 70 61 63  65 25 3d 33 32 0d 05 32  |har_Space%=32..2|
00007460  12 43 68 61 72 5f 51 75  6f 74 65 25 3d 33 34 0d  |.Char_Quote%=34.|
00007470  05 33 12 43 68 61 72 5f  43 6f 6d 6d 61 25 3d 34  |.3.Char_Comma%=4|
00007480  34 0d 05 34 0f 43 68 61  72 5f 4c 46 25 3d 31 30  |4..4.Char_LF%=10|
00007490  0d 05 35 0f 43 68 61 72  5f 43 52 25 3d 31 33 0d  |..5.Char_CR%=13.|
000074a0  05 36 12 43 68 61 72 5f  53 6c 61 73 68 25 3d 39  |.6.Char_Slash%=9|
000074b0  32 0d 05 37 17 43 68 61  72 5f 48 61 72 64 53 70  |2..7.Char_HardSp|
000074c0  61 63 65 25 3d 31 36 30  0d 05 38 05 e1 0d 05 39  |ace%=160..8....9|
000074d0  04 0d 05 3a 10 dd 20 f2  72 65 61 64 6f 70 73 79  |...:.. .readopsy|
000074e0  73 0d 05 3b 25 c8 99 20  22 4f 53 5f 42 79 74 65  |s..;%.. "OS_Byte|
000074f0  22 2c 31 32 39 2c 30 2c  32 35 35 20 b8 20 2c 52  |",129,0,255 . ,R|
00007500  69 73 63 4f 53 25 0d 05  3c 2d e7 20 52 69 73 63  |iscOS%..<-. Risc|
00007510  4f 53 25 3c 31 36 33 20  8c 20 52 69 73 63 4f 53  |OS%<163 . RiscOS|
00007520  25 3d 32 30 30 20 8b 20  52 69 73 63 4f 53 25 3d  |%=200 . RiscOS%=|
00007530  33 30 30 0d 05 3d 05 e1  0d 05 3e 04 0d ff        |300..=....>...|
0000753e