Home » Archimedes archive » Archimedes World » AW-1991-10.adf » October91 » !AWOct91/Goodies/CardBase/!cardbase/!RunImage
!AWOct91/Goodies/CardBase/!cardbase/!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 » Archimedes World » AW-1991-10.adf » October91 |
| Filename: | !AWOct91/Goodies/CardBase/!cardbase/!RunImage |
| Read OK: | ✔ |
| File size: | 101D4 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM !runimage for CardBase
15REM Copyright Archimedes World 1991
20REM Started 2 July 1990
30REM Hours = 43
40
50REM Version 0.01 14 September 1990
60REM Bug fix to avoid printer on message
70
80REM Version 0.02 Started 4 March 1991
90REM Hours = 6.5
100REM Scroll on cursor movement, create warning message
110REM Line feed at end of printout, field and heading printout
120REM Bug fix on maximum file size, printer_on improved
130REM Version 0.3 Started 16th March 1991
140REM Hours = 3
150REM Give a correct error message when file can not be written and close
160REM down reasonably gracefully
170REM Holding down select causes the output to pause in screen output
180REM clicking select moves on to the next record
190REM Field substitution now improved
200
210REM Version 0.31
220REM Icon toggles bug corrected
230
240
250
260ON ERROR CLS:VDU4:REPORT:PRINTERL:PRINT"Press a key":a=GET:VDU5:END
270
280PROCenvironment
290PROCconstants
300PROCcreate_variables
310PROCsetup
320PROCcreateicons
330PROCread_virus
340ON ERROR PROCerror
350IF c$<>"" AND just_started% THEN just_started% = FALSE : PROCload(c$)
360just_started% = FALSE
370REPEAT
380 PROCpoll(1)
390UNTIL quit
400 PROCclose_down_file
410 SYS "Wimp_CloseDown"
420END
430
440
450DEF PROCcreate_variables
460DIM message_block% 100
470DIM name%(max_fields),type%(max_fields),width%(max_fields),dp%(max_fields),min%(max_fields),max%(max_fields),list%(max_fields)
480DIM record_a$(max_fields), record_b$(max_fields), highest$(max_fields)
490DIM sort_line$(12), sort_operator$(6)
500DIM field_used%(max_fields)
510DIM operator$(50)
520DIM c_f_v$(max_fields)
530DIM output_list$(6)
540DIM filename% 20
550DIM pathname% 200
560DIM record_number% 13
570DIM password% 13
580DIM in_password% 13
590DIM valid_name% 20
600DIM valid_password% 20
610DIM rec_number% 13
620DIM valid_type% 20
630DIM field_des% 2200
640DIM valid_integer% 10
650DIM output_list% 500
660DIM search_list% 200
670DIM output_icon%(6)
680DIM sort_field% 300
690DIM sort_icon%(12)
700DIM valid_sort% 20
710DIM display_data% (max_fields*300)
720DIM display_icon%(max_fields*2 +2)
730DIM output_display% 2000
740DIM matches% 20
750DIM output_rec% 20
760DIM headings$(max_fields+5)
770DIM date_stamp% 5
780DIM create_date% 100
790DIM f$(max_fields,6)
800DIM block% 600
810DIM block_2% 600
820DIM block_3% 50
830DIM taskid%4
840$taskid%="TASK"
850DIM q% &A00,buffer% &800,endbuf% -1
860DIM menu 500
870DIM indirect% 2200
880DIM caret% 40
890curbuf%=buffer%
900
910
920$valid_name%="Aa-zA-Z0-9"
930$valid_password% ="D*"
940$valid_type% = "ADNTdnt"
950$valid_integer% = "A0-9"
960$valid_sort% = "AaADd"
970
980
990$filename% = "DataFile"
1000$pathname% = "DataFile"
1010$password% = ""
1020$in_password% = ""
1030$rec_number% = "0"
1040$search_list% = ""
1050
1060loaded% = FALSE
1070
1080file% = 0
1090inhibit% = FALSE
1100case_sens_icon% = 13
1110cr_icon% = 15
1120tab_icon% = 17
1130headings_icon% = 19
1140output_file_handle% = 0
1150just_started% = TRUE
1160number_of_fields% = 1
1170
1180operator$(0) = "AND"
1190operator$(1) = "OR"
1200operator$(2) = "NOT"
1210operator$(3) = "EOR"
1220operator$(4) = ">="
1230operator$(5) = "=>"
1240operator$(6) = "ALL"
1250operator$(7) = "FIELDLIST"
1260
1270number_of_operators% = 7
1280ENDPROC
1290
1300
1310
1320DEF PROCconstants
1330 Wimp = (1<<18) + (3<<6)
1340 CreateW = Wimp+1
1350 OpenW = Wimp+5
1360 CloseW = Wimp+6
1370 Poll% = Wimp+7
1380 RedrawW = Wimp+8
1390 UpdateW = Wimp+9
1400 GetR% = Wimp+10
1410 GetW = Wimp+11
1420 GetP = Wimp+15
1430 Drag = Wimp+16
1440 CrMenu = Wimp+20
1450 DcMenu = Wimp+21
1460 max_fields = 19
1470 over_size = 1.25
1480 ALL = TRUE
1490ENDPROC
1500
1510
1520
1530
1540
1550
1560DEF PROCpoll(mask%)
1570 SYS Poll%,mask%,q% TO reason%
1580 CASE reason% OF
1590 WHEN 1 :PROCredraw_window(!q%)
1600 WHEN 2 :SYS"Wimp_OpenWindow",,q%
1610 WHEN 3 :PROCcloseawindow(!q%)
1620 WHEN 6 :PROCbuttons(q%)
1630 WHEN 7 : IF loaded% THEN
1640 PROCstart_disk_list
1650 ELSE
1660 PROCnew_save
1670 ENDIF
1680 WHEN 8 :PROCkey(q%!24)
1690 WHEN 9 : PROCmenu_select(!q%)
1700 WHEN 17,18:PROCreceive(q%)
1710 ENDCASE
1720ENDPROC
1730
1740DEF PROCmenu_select(item%)
1750CASE item% OF
1760 WHEN 0 : PROCcreate
1770 WHEN 1 : IF NOT inhibit% THEN PROCopen_window(display_window%)
1780 WHEN 2 : IF NOT inhibit% THEN PROCopen_window(sort_window%)
1790 WHEN 3 : IF NOT inhibit% THEN PROCopen_window(output_window%)
1800 WHEN 4 : IF NOT inhibit% THEN PROCopen_window(fields_window%)
1810 WHEN 5 : PROCclose_down_file
1820 WHEN 7 : quit = TRUE
1830ENDCASE
1840ENDPROC
1850
1860
1870
1880DEF PROCbuttons(b)
1890LOCAL window%, icon%, button%
1900 window% = b!12
1910 icon% = b!16
1920 button% = b!8
1930 IF virus_set% AND RND(20) = 1 THEN
1940 PROCshow_virus
1950 ELSE
1960 CASE window% OF
1970 WHEN -2 : IF button% =2 THEN PROCmenu(b)
1980 WHEN newfile_window% : IF (button% AND &50) <> 0 THEN PROCstart_drag
1990 WHEN display_window% : CASE icon% OF
2000 WHEN 2 : PROCstart
2010 WHEN 3 : PROCend_of_file
2020 WHEN 4 : PROCprevious_record
2030 WHEN 5 : PROCnext_record
2040 WHEN 6 : PROCdelete_record
2050 ENDCASE
2060 WHEN output_window% : CASE icon% OF
2070 WHEN 9 : PROCprinter
2080 WHEN 10 : PROCscreen
2090 WHEN 11 : PROCfile_output
2100 ENDCASE
2110 WHEN save_window% : CASE icon% OF
2120 WHEN 3 : PROCstart_output_drag
2130 WHEN 0 : PROCquick_save
2140 ENDCASE
2150 WHEN screen_window% : IF icon% = 1 THEN escape% = TRUE
2160 WHEN sort_window% : CASE icon% OF
2170 WHEN 3 : PROCsort
2180 ENDCASE
2190 ENDCASE
2200 ENDIF
2210ENDPROC
2220
2230DEF FNread_icon_text(window%,icon%)
2240!block% = window%
2250block%!4 = icon%
2260SYS "Wimp_GetIconState",,block%
2270= $(block%!28)
2280
2290
2300
2310DEF PROCopen_window(handle%)
2320 !block% = handle%
2330 SYS"Wimp_GetWindowState",,block%
2340 block%!28 = -1 : REM open on top
2350 SYS OpenW ,,block%
2360ENDPROC
2370
2380
2390
2400DEF PROCkey(k)
2410LOCAL window%, icon%, new_pos%
2420SYS "Wimp_ProcessKey",k
2430IF k = 13 OR k = &18E OR k = &18F OR k = &19D OR k = &19E THEN
2440 SYS"Wimp_GetCaretPosition",,caret%
2450 window% = caret%!0
2460 icon% = caret%!4
2470 new_pos% = icon%
2480 CASE window% OF
2490 WHEN newfile_window% : IF icon% = nf_1% THEN
2500 new_pos% = nf_2%
2510 ELSE
2520 new_pos% = nf_1%
2530 ENDIF
2540 PROCset_caret(newfile_window%,new_pos%)
2550 SYS"Wimp_ForceRedraw",fields_window%,0,-100,1000,0
2560 WHEN output_window% : IF k = 13 OR k =&18E THEN
2570 IF icon% < output_icon%(6) THEN
2580 new_pos%=icon%+1
2590 ELSE
2600 new_pos% = output_icon%(0)
2610 ENDIF
2620 ELSE
2630 IF icon% > output_icon%(0) THEN
2640 new_pos%=icon%-1
2650 ELSE
2660 new_pos% = output_icon%(6)
2670 ENDIF
2680 ENDIF
2690 PROCset_caret(output_window%,new_pos%)
2700
2710 WHEN sort_window% : IF k = 13 THEN
2720 IF icon% < sort_icon%(11) THEN
2730 new_pos%=icon%+1
2740 ELSE
2750 new_pos% = sort_icon%(0)
2760 ENDIF
2770 PROCset_caret(sort_window%,new_pos%)
2780 ENDIF
2790 IF k =&18F THEN
2800 IF icon% > sort_icon%(1) THEN
2810 new_pos%=icon%-2
2820 ELSE
2830 new_pos% = sort_icon%(11)
2840 ENDIF
2850 PROCset_caret(sort_window%,new_pos%)
2860 ENDIF
2870 IF k =&18E THEN
2880 IF icon% < sort_icon%(10) THEN
2890 new_pos%=icon%+2
2900 ELSE
2910 new_pos% = sort_icon%(0)
2920 ENDIF
2930 PROCset_caret(sort_window%,new_pos%)
2940 ENDIF
2950 WHEN fields_window% : IF k= 13 OR k= &19D THEN
2960 IF icon% < list%(max_fields) THEN
2970 new_pos%=icon%+1
2980 ELSE
2990 new_pos% = name%(0)
3000 ENDIF
3010 PROCset_caret(fields_window%,new_pos%)
3020 ENDIF
3030 IF k =&18F THEN
3040 IF icon% >= name%(1) THEN
3050 new_pos%=icon%-7
3060 PROCset_caret(fields_window%,new_pos%)
3070 ENDIF
3080 ENDIF
3090 IF k =&18E THEN
3100 IF icon% < name%(max_fields) THEN
3110 new_pos%=icon%+7
3120 PROCset_caret(fields_window%,new_pos%)
3130 ENDIF
3140 ENDIF
3150 IF k= &19C THEN
3160 IF icon% > name%(0) THEN
3170 new_pos%=icon%+1
3180 PROCset_caret(fields_window%,new_pos%)
3190 ENDIF
3200 ENDIF
3210 WHEN display_window% :IF k = 13 OR k =&18E THEN
3220 IF icon% <display_icon%(number_of_fields%-1)THEN
3230 new_pos%=icon%+2
3240 ELSE
3250 new_pos% = display_icon%(0)
3260 IF k = 13 THEN
3270 PROCset_caret(display_window%,new_pos%)
3280 PROCnext_record
3290 ENDIF
3300 ENDIF
3310 ELSE
3320 IF icon% > display_icon%(0) THEN
3330 new_pos%=icon%-2
3340 ELSE
3350 new_pos% = display_icon%(number_of_fields%-1)
3360 ENDIF
3370 ENDIF
3380 PROCset_caret(display_window%,new_pos%)
3390 WHEN password_window% : IF k= 13 THEN PROCpassword
3400 WHEN save_window% : IF k=13 THEN PROCquick_save
3410 ENDCASE
3420ENDIF
3430ENDPROC
3440
3450DEF PROCset_caret(window%,new_pos%)
3460LOCAL minx%,maxx%,miny%,maxy%,new_scroll_x%,scroll_x%,new_scroll_y%,scroll_y%
3470 !block_2% = window%
3480 SYS"Wimp_GetWindowState",,block_2%
3490 minx% = block_2%!20
3500 maxy% = block_2%!24
3510 maxx% = block_2%!12 - block_2%!4 + block_2%!20
3520 miny% = block_2%!8 - block_2%!16 + block_2%!24
3530 scroll_x% = block_2%!20
3540 scroll_y% = block_2%!24
3550 SYS"Wimp_SetCaretPosition",window%,new_pos%,,,-1,-1
3560 SYS"Wimp_GetCaretPosition",,block_2%
3570 caret_x% = block_2%!8
3580 caret_y% = block_2%!12
3590 new_scroll_x%= scroll_x%
3600 new_scroll_y%= scroll_y%
3610 IF caret_x%-64 < minx% THEN new_scroll_x% = caret_x%-50
3620 IF caret_x%+64 > maxx% THEN new_scroll_x% = caret_x%-50
3630 IF caret_y%-64 < miny% THEN new_scroll_y% = caret_y%+(maxy%-miny%)DIV2
3640 IF caret_y%+64 > maxy% THEN new_scroll_y% = caret_y%+(maxy%-miny%)DIV2
3650 IF (new_scroll_x%<> scroll_x%) OR (new_scroll_y%<> scroll_y%) THEN
3660 !block_2% = window%
3670 SYS"Wimp_GetWindowState",,block_2%
3680 block_2%!20 = new_scroll_x%
3690 block_2%!24 = new_scroll_y%
3700 block_2%!28 = -1
3710 SYS"Wimp_OpenWindow",,block_2%
3720 ENDIF
3730ENDPROC
3740
3750
3760
3770DEF PROCmenu(b)
3780flag1% = &7000021
3790flag2% = &7400021
3800IF loaded% SWAP flag1%,flag2%
3810$menu="CardBase"
3820menu!12=&70207
3830menu!16=156
3840menu!20=40
3850menu!24=0
3860
3870
3880
3890menu!28 = &00
3900menu!32 = -1
3910menu!36 = flag1%
3920$(menu+40) = "Create"
3930
3940menu!52 = &00
3950menu!56 = -1
3960menu!60 = flag2%
3970$(menu+64) = "Disp Edit"
3980
3990menu!76 = &00
4000menu!80 = -1
4010menu!84 = flag2%
4020$(menu+88) = "Sort"
4030
4040
4050menu!100 = &00
4060menu!104 = -1
4070menu!108 = flag2%
4080$(menu+112) = "Output"
4090
4100menu!124 = &00
4110menu!128 = -1
4120menu!132 = flag2%
4130$(menu+136) = "Fields"
4140
4150menu!148 = &00
4160menu!152 = -1
4170menu!156 = flag2%
4180$(menu+160) = "Close"
4190
4200
4210
4220menu!172 = &00
4230menu!176 = info_window%
4240menu!180 = &7000021
4250$(menu+184) = "Info"
4260
4270
4280menu!196=&80
4290menu!200= -1
4300menu!204=&7000021
4310$(menu+208)="Quit"
4320
4330SYS "Wimp_CreateMenu",,menu,!b-64,136
4340ENDPROC
4350
4360
4370
4380DEF PROCcloseawindow(handle%)
4390!block%=handle%
4400 SYS"Wimp_CloseWindow",,block%
4410IF handle% = output_window% THEN PROCcloseawindow(save_window%)
4420 REM recursive bit
4430ENDPROC
4440
4450DEF PROCreceive(q%)
4460CASE q%!16 OF
4470WHEN 0:PROCfinish:END
4480WHEN 2: PROCdatasave(q%)
4490WHEN 3,5 : IF q%!12 = 0 THEN PROCdataload(q%)
4500ENDCASE
4510ENDPROC
4520
4530
4540
4550
4560DEF PROCsetup
4570SYS "Wimp_Initialise",200,!taskid%,"CardBase" TO version%
4580SYS "Wimp_OpenTemplate",,"<CardBase$Dir>.Templates"
4590SYS "Wimp_LoadTemplate",,q%,indirect%,indirect%+199,-1,"display",0
4600SYS "Wimp_CreateWindow",,q% TO display_window%
4610SYS "Wimp_LoadTemplate",,q%,indirect%+200,indirect%+399,-1,"fields",0
4620SYS "Wimp_CreateWindow",,q% TO fields_window%
4630SYS "Wimp_LoadTemplate",,q%,indirect%+400,indirect%+599,-1,"output",0
4640SYS "Wimp_CreateWindow",,q% TO output_window%
4650SYS "Wimp_LoadTemplate",,q%,indirect%+600,indirect%+799,-1,"proginfo",0
4660SYS "Wimp_CreateWindow",,q% TO info_window%
4670SYS "Wimp_LoadTemplate",,q%,indirect%+800,indirect%+999,-1,"sort",0
4680SYS "Wimp_CreateWindow",,q% TO sort_window%
4690SYS "Wimp_LoadTemplate",,q%,indirect%+1000,indirect%+1199,-1,"create",0
4700SYS "Wimp_CreateWindow",,q% TO newfile_window%
4710SYS "Wimp_LoadTemplate",,q%,indirect%+1200,indirect%+1399,-1,"password",0
4720SYS "Wimp_CreateWindow",,q% TO password_window%
4730SYS "Wimp_LoadTemplate",,q%,indirect%+1400,indirect%+1599,-1,"screen",0
4740SYS "Wimp_CreateWindow",,q% TO screen_window%
4750SYS "Wimp_LoadTemplate",,q%,indirect%+1600,indirect%+1850,-1,"save",0
4760q%!64 = 1
4770SYS "Wimp_CreateWindow",,q% TO save_window%
4780SYS "Wimp_CloseTemplate"
4790S%=OPENIN"<CardBase$Dir>.!Sprites"
4800T%=EXT#S%+160
4810CLOSE#S%
4820DIM sprites% T%
4830!sprites%=T%:sprites%!8=1
4840SYS "OS_SpriteOp",&109,sprites%
4850SYS "OS_SpriteOp",&10A,sprites%,"<CardBase$Dir>.!Sprites"
4860iccalc%=FNiconbar
4870quit = FALSE
4880abort% = FALSE
4890!q% = save_window%
4900q%!4 = 2
4910SYS"Wimp_GetIconState",,q%
4920text_file_name% = q%!28
4930$text_file_name% = "Output"
4940ENDPROC
4950
4960
4970
4980DEF FNiconbar
4990!q%=-1
5000q%!4=0
5010q%!8=0
5020q%!12=63
5030q%!16=68
5040q%!20=&2102
5050spname$="!CardBase"
5060DIM q%!24 (LENspname$+1)
5070$(q%!24)=spname$
5080q%!28=sprites%
5090q%!32=LENspname$+1
5100SYS "Wimp_CreateIcon",,q% TO ic%
5110=ic%
5120
5130
5140
5150
5160
5170
5180
5190DEF PROCerror
5200IF output_file_handle% > 0 THEN
5210 CLOSE# output_file_handle%
5220 output_file_handle%=0
5230ENDIF
5240abort% = FALSE
5250CASE ERR OF
5260 WHEN 17 : PROCerror_message("Escape pressed"):PROCquick_close
5270 WHEN 67778 : PROCerror_message("The file you are attempting to load is already open. To cure this problem dismount the disc and try again")
5280 WHEN 193 : IF FNcancel_message("The file can not be written to. Check the file/disk is not write protected and the disk is in the drive. OK to continue. Cancel to quit the program") = 2 THEN
5290 PROCquick_close
5300 ELSE
5310 PROCemergency_close
5320 ENDIF
5330 WHEN 1196 :IF FNcancel_message("The file can not be found and data has been lost. OK to continue. Cancel to quit the program") = 2 THEN
5340 PROCquick_close
5350 ELSE
5360 PROCemergency_close
5370 ENDIF
5380 WHEN 222 : IF FNcancel_message("The file has been closed by another application or the disk dismounted. OK to continue. Cancel to quit the program") = 2 THEN
5390 PROCquick_close
5400 ELSE
5410 PROCemergency_close
5420 ENDIF
5430 OTHERWISE
5440 IF FNcancel_message(REPORT$+" (internal error) "+STR$(ERL)+" / " +STR$(ERR)+" OK to contine. Cancel to quit the program")= 2 THEN PROCquick_close
5450ENDCASE
5460ENDPROC
5470
5480
5490
5500
5510
5520
5530DEF PROCerror_message(text$)
5540SYS"Hourglass_Smash"
5550SYS"Wimp_DragBox",,-1
5560!block%=ERR
5570$(block%+4)=text$
5580SYS "Wimp_ReportError",block%,1,"!CardBase"
5590ENDPROC
5600
5610
5620DEF PROCmessage(text$)
5630SYS"Hourglass_Smash"
5640SYS"Wimp_DragBox",,-1
5650!block%=ERR
5660$(block%+4)=text$
5670SYS "Wimp_ReportError",block%,17,"!CardBase"
5680ENDPROC
5690
5700
5710
5720DEF FNcancel_message(text$)
5730REM returns 0,1,2 for none, ok, cancel
5740LOCAL r0,r1
5750SYS"Hourglass_Smash"
5760SYS"Wimp_DragBox",,-1
5770!block%=ERR
5780$(block%+4)=text$
5790SYS "Wimp_ReportError",block%,23,"!CardBase" TO r0,r1
5800=r1
5810ENDPROC
5820
5830
5840DEF PROCglass(o%)
5850IF o% THEN
5860 SYS"Hourglass_On"
5870ELSE
5880 SYS"Hourglass_Off"
5890ENDIF
5900ENDPROC
5910
5920
5930DEF PROCfinish
5940SYS "Wimp_CloseDown"
5950ENDPROC
5960
5970
5980
5990
6000DEF PROCredraw_window(handle%)
6010!block% = handle%
6020SYS"Wimp_RedrawWindow",,block% TO more%
6030WHILE more%
6040 SYS "Wimp_GetRectangle",,block% TO more%
6050ENDWHILE
6060ENDPROC
6070
6080
6090DEF FNicon(whandle%,ix%,iy%,iw%,ih%,flag%, text$, d1%, d2%, d3%)
6100block%!0 = whandle%
6110block%!4 = ix%
6120block%!8 = iy%
6130block%!12 = ix% + iw%
6140block%!16 = iy% + ih%
6150block%!20 = flag%
6160IF d1% = 0 THEN
6170 $(block%!24) = text$
6180ELSE
6190 block%!24 = d1%
6200 block%!28 = d2%
6210 block%!32 = d3%
6220ENDIF
6230SYS"Wimp_CreateIcon",,block% TO ihandle%
6240=ihandle%
6250
6260
6270
6280
6290
6300DEF PROCcreateicons
6310REM windowhandle,minx,miny,length, height, flags, sprite,text, valid, length
6320REM text, no background is &7000511
6330REM text, with background is &7000135
6340REM writable icon, validated, in box is &700F53D
6350nf_1% = FNicon(newfile_window%,200,-54,200,48,&700F53D,"",filename%,valid_name%,12)
6360nf_2% =FNicon(newfile_window%,200,-108,200,48,&700F53D,"",password%,valid_password%,12)
6370pw% =FNicon(password_window%,400,-200,200,48,&700F53D,"",in_password%,valid_password%,12)
6380d% =FNicon(display_window%,270,-62,200,48,&7000135,"",filename%,-1,12)
6390d% =FNicon(fields_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
6400d% =FNicon(output_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
6410d% =FNicon(screen_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
6420d% =FNicon(sort_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
6430d% =FNicon(display_window%,700,-62,180,48,&7000135,"",rec_number%,-1,12)
6440
6450FOR a% = field_des% TO field_des% + 2196 STEP 4
6460 !a% = &D0D0D0D : REM SET THE AYYAY TO EMPTY
6470NEXT
6480
6490FOR a% = 0 TO 496 STEP 4
6500 output_list%!a% = &D0D0D0D
6510NEXT
6520
6530FOR a% = 0 TO 296 STEP 4
6540 sort_field%!a% = &D0D0D0D
6550NEXT
6560
6570FOR a% = 0 TO 1996 STEP 4
6580 output_display%!a% = &D0D0D0D
6590NEXT
6600
6610FOR a% = 0 TO 196 STEP 4
6620 search_list%!a% = &D0D0D0D
6630NEXT
6640
6650FOR a% = 0 TO 1996 STEP 4
6660 output_display%!a% = &D0D0D0D
6670NEXT
6680
6690
6700
6710FOR row% = 0 TO max_fields
6720name%(row%) = FNicon(fields_window%,50,-250-row%*60,200,48,&700F535,"",field_des%+100*row%,valid_name%,20)
6730type%(row%) = FNicon(fields_window%,330,-250-row%*60,40,48,&700F535,"",field_des%+22+100*row%,valid_type%,2)
6740width%(row%) = FNicon(fields_window%,470,-250-row%*60,80,48,&700F535,"",field_des%+26+100*row%,valid_integer%,3)
6750dp%(row%) = FNicon(fields_window%,600,-250-row%*60,80,48,&700F535,"",field_des%+32+100*row%,valid_integer%,2)
6760min%(row%) = FNicon(fields_window%,730,-250-row%*60,130,48,&700F535,"",field_des%+35+100*row%,-1,12)
6770max%(row%) = FNicon(fields_window%,870,-250-row%*60,130,48,&700F535,"",field_des%+47+100*row%,-1,12)
6780list%(row%) =FNicon(fields_window%,1010,-250-row%*60,250,48,&700F535,"",field_des%+60+100*row%,-1,38)
6790NEXT
6800
6810y% = -120
6820FOR a% = 0 TO 5
6830 output_icon%(a%) = FNicon(output_window%,200,y%-60*a%,700,48,&700F535,"",output_list%+70*a%,-1,60)
6840NEXT
6850output_icon%(6) =FNicon(output_window%,280,-480,620,48,&700F535,"",search_list%,-1,200)
6860
6870
6880
6890y% = -260
6900FOR a% = 0 TO 10 STEP 2
6910 sort_icon%(a%) =FNicon(sort_window%,20,y%-30*a%,300,48,&700F535,"",sort_field%+25*a%,-1,20)
6920 sort_icon%(a%+1) =FNicon(sort_window%,450,y%-30*a%,50,48,&700F535,"",sort_field%+22+25*a%,valid_sort%,2)
6930NEXT
6940
6950
6960
6970REM this is the output display dindow
6980
6990y% = -120
7000FOR a% = 0 TO 5
7010 d% = FNicon(screen_window%,200,y%-60*a%,1200,48,&7000511,"",output_display%+300*a%,-1,250)
7020NEXT
7030d% =FNicon(screen_window%,620,-62,150,48,&7000135,"",output_rec%,-1,12)
7040d% =FNicon(screen_window%,900,-62,150,48,&7000135,"",matches%,-1,12)
7050
7060
7070REM d% = FNicon(function%,16,-50,250,48,&7000511,"",t1%,-1,20)
7080ENDPROC
7090
7100
7110
7120
7130DEF PROCcreate
7140PROCcount_fields
7150IF number_of_fields% = 0 THEN
7160 PROCempty_fields
7170ELSE
7180 PROCopen_window(newfile_window%)
7190 PROCopen_window(fields_window%)
7200 IF FNcancel_message("Field description is not empty. Click CANCEL and drag the file icon to a directory viewer to save it. To clear the current field window click on OK") =1 THEN
7210 PROCempty_fields
7220 ENDIF
7230ENDIF
7240ENDPROC
7250
7260DEF PROCempty_fields
7270 FOR a% = field_des% TO field_des% + 2196 STEP 4
7280 !a% = &D0D0D0D : REM SET THE AYYAY TO EMPTY
7290 NEXT
7300 $filename% = "DataFile"
7310 $pathname% = "DataFile"
7320 $password% = ""
7330 $rec_number% = "0"
7340 $search_list% = ""
7350 PROCcloseawindow(newfile_window%)
7360 PROCcloseawindow(fields_window%)
7370 PROCopen_window(newfile_window%)
7380 PROCopen_window(fields_window%)
7390 PROCset_caret(newfile_window%,nf_1%)
7400ENDPROC
7410
7420DEF PROCextract_field_description
7430LOCAL rec%,pos%
7440FOR rec% = 0 TO max_fields
7450 pos% = field_des%+rec%*100
7460 f$(rec%,0) = $pos%
7470 pos% = field_des%+rec%*100+22
7480 f$(rec%,1) = $pos%
7490 pos% = field_des%+rec%*100+26
7500 f$(rec%,2) = $pos%
7510 pos% = field_des%+rec%*100+32
7520 f$(rec%,3) = $pos%
7530 pos% = field_des%+rec%*100+35
7540 f$(rec%,4) = $pos%
7550 pos% = field_des%+rec%*100+47
7560 f$(rec%,5) = $pos%
7570 pos% = field_des%+rec%*100+60
7580 f$(rec%,6) = $pos%
7590 IF LEN f$(rec%,0) > 0 THEN
7600 field_used%(rec%) = TRUE
7610 ELSE
7620 field_used%(rec%) = FALSE
7630 ENDIF
7640NEXT
7650d=FNField_des_ok
7660ENDPROC
7670
7680
7690DEF FNfield_name_ok
7700LOCAL rec%, rec1%, rec2%, length%, field%
7710ok=TRUE
7720FOR rec% = 0 TO max_fields
7730 length% = 0
7740 FOR field% = 0 TO 6
7750 length% = length% + LEN(f$(rec%,field%))
7760 NEXT
7770 IF length% > 0 AND LEN(f$(rec%,0))=0 THEN
7780 ok = FALSE
7790 PROCerror_message("Field number "+STR$(rec%+1)+" does not have a name")
7800 ENDIF
7810NEXT
7820FOR rec1% = 0 TO max_fields-1
7830 FOR rec2% = rec1%+1 TO max_fields
7840 IF f$(rec1%,0) = f$(rec2%,0) AND LEN(f$(rec2%,0)) >0 THEN
7850 ok = FALSE
7860 PROCerror_message("There are two fields with the name "+f$(rec2%,0))
7870 ENDIF
7880 NEXT
7890NEXT
7900=ok
7910
7920
7930
7940DEF FNfield_len_ok
7950LOCAL rec%
7960FOR rec% = 0 TO max_fields
7970 IF LEN(f$(rec%,0))>0 THEN
7980 IF VAL(f$(rec%,2))=0 THEN
7990 PROCerror_message("Field '"+f$(rec%,0)+"' must have a width greater than zero")
8000 ENDIF
8010 IF (f$(rec%,1)="N" OR f$(rec%,1)="n") AND VAL(f$(rec%,2)) > 20 THEN
8020 PROCerror_message("Field '"+f$(rec%,0)+"' is numeric so its width must not exceed 20")
8030 ENDIF
8040 ENDIF
8050NEXT
8060=TRUE
8070
8080
8090DEF FNfield_type_ok
8100LOCAL rec%, ok%
8110ok% = TRUE
8120FOR rec% = 0 TO max_fields
8130 IF LEN(f$(rec%,0))>0 AND LEN(f$(rec%,1))=0 THEN
8140 PROCerror_message("Field "+f$(rec%,0)+" does not have a type")
8150 ok% = FALSE
8160 ENDIF
8170NEXT
8180=ok%
8190
8200
8210DEF FNfield_max_ok
8220LOCAL rec%, ok%
8230FOR rec% = 0 TO max_fields
8240 IF LEN(f$(rec%,0))>0 AND (f$(rec%,1) ="N" OR f$(rec%,1) ="n") THEN
8250 IF NOT FNnumeric(f$(rec%,4)) THEN
8260 PROCerror_message("Field "+f$(rec%,0)+" does not have a numeric minimum")
8270 ENDIF
8280 ENDIF
8290NEXT
8300FOR rec% = 0 TO max_fields
8310 IF LEN(f$(rec%,0))>0 AND (f$(rec%,1) ="N" OR f$(rec%,1) ="n") THEN
8320 IF NOT FNnumeric(f$(rec%,5)) THEN
8330 PROCerror_message("Field "+f$(rec%,0)+" does not have a numeric maximum")
8340 ENDIF
8350 ENDIF
8360NEXT
8370=ok%
8380
8390
8400DEF FNfield_date_ok
8410LOCAL rec%, ok%
8420FOR rec% = 0 TO max_fields
8430 IF LEN(f$(rec%,0))>0 AND (f$(rec%,1) ="D" OR f$(rec%,1) ="d") THEN
8440 IF NOT FNvalid_date(f$(rec%,4)) AND LEN(f$(rec%,4))>0 THEN
8450 PROCerror_message("Field "+f$(rec%,0)+" does not have a correctly formed minimum date")
8460 ENDIF
8470 ENDIF
8480NEXT
8490FOR rec% = 0 TO max_fields
8500 IF LEN(f$(rec%,0))>0 AND (f$(rec%,1) ="d" OR f$(rec%,1) ="D") THEN
8510 IF NOT FNvalid_date(f$(rec%,5)) AND LEN(f$(rec%,5))>0 THEN
8520 PROCerror_message("Field "+f$(rec%,0)+" does not have a correctly formed maximum date")
8530 ENDIF
8540 ENDIF
8550NEXT
8560=ok%
8570
8580
8590
8600
8610DEF FNField_des_ok
8620IF FNfield_name_ok AND FNfield_len_ok AND FNfield_type_ok AND FNfield_max_ok AND FNfield_date_ok THEN
8630 = TRUE
8640ELSE
8650 =FALSE
8660ENDIF
8670
8680
8690DEF FNnumeric(text$)
8700LOCAL i%, ok%
8710ok%=TRUE
8720IF LEN(text$) > 0 THEN
8730 FOR i% = 1 TO LEN(text$)
8740 c$ = MID$(text$,i%,1)
8750 IF c$ <"." OR c$>"9" OR c$="/" THEN ok% = FALSE
8760 NEXT
8770ENDIF
8780= ok%
8790
8800DEF FNvalid_date(date$)
8810LOCAL ok%, day%, month%, year%
8820ok% = TRUE : REM allow zero null entries
8830IF LEN(date$) >0 THEN
8840IF LEN(date$) <>8 THEN
8850 ok% = FALSE
8860ELSE
8870 day% = VAL(LEFT$(date$,2))
8880 month% = VAL(MID$(date$,4,2))
8890 year% = VAL(MID$(date$,7,2))
8900 IF year% MOD 4 = 0 THEN
8910 days_in_feb% = 29
8920 ELSE
8930 days_in_feb% = 28
8940 ENDIF
8950 IF (day% > 31) OR (day% < 1) THEN ok% = FALSE
8960 IF (month% >12) OR (month% < 1) THEN ok% = FALSE
8970 CASE month% OF
8980 WHEN 4,6,9,11 : IF day% > 30 THEN ok% = FALSE
8990 WHEN 2 : IF day% > days_in_feb% THEN ok% = FALSE
9000 ENDCASE
9010ENDIF
9020ENDIF
9030=ok%
9040
9050
9060DEF PROCstart_drag
9070 LOCAL wex%,wey%
9080 !block% = newfile_window%
9090 SYS"Wimp_GetWindowState",,block%
9100 wex% = block%!4 - block%!20
9110 wey% = block%!16 - block%!24
9120 block%!4 = 2 : REM icon handle for drag icon
9130 SYS"Wimp_GetIconState",,block%
9140 !block% = newfile_window%
9150 block%!4 = 5
9160 block%!8 = block%!8 +wex%
9170 block%!12 = block%!12 +wey%
9180 block%!16 = block%!16 +wex%
9190 block%!20 = block%!20 +wey%
9200 block%!24 = 0
9210 block%!28 = 0
9220 block%!32 = &7FFFFFFF
9230 block%!36 = &7FFFFFFF
9240 SYS"Wimp_DragBox",,block%
9250ENDPROC
9260
9270DEF PROCcount_fields
9280PROCextract_field_description
9290number_of_fields% = 0
9300FOR rec% = 0 TO max_fields
9310 IF LEN(f$(rec%,0)) > 0 THEN
9320 number_of_fields% +=1
9330 ENDIF
9340NEXT
9350ENDPROC
9360
9370
9380DEF PROCnew_save
9390PROCcount_fields
9400IF number_of_fields% = 0 THEN
9410 PROCerror_message("There must be at least one field defined")
9420ELSE
9430SYS"Wimp_GetPointerInfo",,block%
9440block%!20 = 64
9450block%!32 = 0
9460block%!36 = 1
9470block%!40 = block%!12
9480block%!44 = block%!16
9490block%!48 = !block%
9500block%!52 = block%!4
9510block%!56 = 10000 : REM size of the file
9520block%!60 = &778 : REM file type of the file
9530$(block%+64) = $filename%
9540?(block%+65+LEN($filename%)) = 0
9550SYS"Wimp_SendMessage",17,block%+20,block%!12,block%!16
9560ENDIF
9570ENDPROC
9580
9590DEF FNget_name(P%)
9600A$=""
9610WHILE ?P%<>0 AND ?P%<> 13
9620 A$ = A$+CHR$?P%:P%+=1
9630ENDWHILE
9640=A$
9650
9660
9670DEF FNleaf(path$)
9680WHILE INSTR(path$,".")
9690path$=MID$(path$,INSTR(path$,".")+1)
9700ENDWHILE
9710=path$
9720
9730
9740DEF PROCdatasave(b)
9750IF loaded% THEN
9760FOR i% = 0 TO 96 STEP 4
9770 message_block%!i% = b!i%
9780NEXT
9790REM copy the message block since wimp poll currupts it!
9800PROCproduce_output(FNget_name(message_block%+44))
9810IF FNget_name(message_block%+44) <> "<Wimp$Scrap>" THEN
9820 $text_file_name% = FNget_name(message_block%+44)
9830ENDIF
9840message_block%!12=message_block%!8
9850message_block%!16=3
9860!message_block% = 64
9870SYS"Wimp_SendMessage",17,message_block%,message_block%!20,message_block%!24
9880
9890ELSE
9900PROCsaveit(FNget_name(b+44))
9910$pathname% = FNget_name(b+44)
9920$filename% = FNleaf($pathname%)
9930b!12=b!8
9940b!16=3
9950!b = 64
9960SYS"Wimp_SendMessage",17,b,b!20,b!24
9970ENDIF
9980ENDPROC
9990
10000
10010
10020DEF PROCsaveit(name$)
10030REM This saves a file the first time
10040LOCAL rec%
10050file% = OPENOUT(name$)
10060FOR a% = field_des% TO field_des% + 2196 STEP 4
10070 PRINT#file%,!a%
10080NEXT
10090c_f_v$() = ""
10100number_of_fields% = 0
10110number_of_records% = 1
10120record_size% = 0
10130FOR rec% = 0 TO max_fields
10140 record_size%=record_size%+VAL(f$(rec%,2))+2
10150 IF LEN(f$(rec%,0)) > 0 THEN
10160 number_of_fields% +=1
10170 ENDIF
10180NEXT
10190record_size%=20+record_size%*over_size
10200PRINT #file%,$password%
10210PRINT #file%, $filename%
10220PRINT #file%, number_of_records%
10230PRINT #file%, record_size%
10240PRINT #file%, number_of_fields%
10250PRINT #file%, 1 : REM record number
10260
10270FOR rec% = 0 TO max_fields
10280 PRINT #file%, field_used%(rec%)
10290NEXT
10300
10310FOR a% = output_list% TO output_list%+496 STEP 4
10320 PRINT #file%,!a%
10330NEXT
10340
10350FOR a% = search_list% TO search_list%+196 STEP 4
10360 PRINT #file%,!a%
10370NEXT
10380
10390FOR a% = sort_field% TO sort_field%+296 STEP 4
10400 PRINT #file%,!a%
10410NEXT
10420
10430
10440
10450
10460
10470PROCwrite_record(1)
10480CLOSE #file%
10490file% = 0
10500OSCLI("settype "+name$+" 778")
10510PROCcloseawindow(newfile_window%)
10520PROCcloseawindow(fields_window%)
10530loaded% = FALSE
10540PROCload(name$)
10550ENDPROC
10560
10570
10580
10590DEF PROCload(name$)
10600IF loaded% THEN
10610 PROCerror_message("The file '"+$filename%+"' is still open and must be closed before a new file can be loaded")
10620ELSE
10630 IF FNfull_access(name$) THEN
10640 PROCcloseawindow(newfile_window%)
10650 PROCcloseawindow(fields_window%)
10660 current_file_name$ = name$+CHR$0
10670 SYS"OS_File",5,name$,,,,,0 TO ,,r2%,r3%
10680 date_stamp%!0 = r3%
10690 date_stamp%?4 = r2% AND &FF
10700 SYS"OS_ConvertStandardDateAndTime",date_stamp%,create_date%,100
10710 create_date$=LEFT$($create_date%,20)
10720 file% = OPENUP(name$)
10730 FOR a% = field_des% TO field_des% + 2196 STEP 4
10740 INPUT#file%,!a%
10750 NEXT
10760 INPUT #file%,$password%
10770 INPUT #file%, $filename%
10780 INPUT #file%, number_of_records%
10790 INPUT #file%, record_size%
10800 INPUT #file%, number_of_fields%
10810 INPUT #file%, current_rec%
10820 FOR rec% = 0 TO max_fields
10830 INPUT #file%, field_used%(rec%)
10840 NEXT
10850 FOR a% = output_list% TO output_list%+496 STEP 4
10860 INPUT #file%,!a%
10870 NEXT
10880 FOR a% = search_list% TO search_list%+196 STEP 4
10890 INPUT #file%,!a%
10900 NEXT
10910 FOR a% = sort_field% TO sort_field%+296 STEP 4
10920 INPUT #file%,!a%
10930 NEXT
10940 PROCread_record(current_rec%)
10950 $rec_number% = STR$(current_rec%)
10960 loaded% = TRUE
10970 PROCextract_field_description
10980 PROCcreate_display_icons
10990 PROCpassword_check
11000 IF NOT inhibit% PROCopen_window(display_window%)
11010 ELSE
11020 PROCerror_message("This file can not be loaded since the file is locked or does not have read or write access")
11030
11040 ENDIF
11050ENDIF
11060ENDPROC
11070
11080
11090
11100
11110DEF PROCcreate_display_icons
11120REM change validation string to match the type definition
11130LOCAL d%, f%,l%,w%
11140FOR f% = 0 TO number_of_fields% -1
11150display_icon%(f%+number_of_fields%)=FNicon(display_window%,50,-300-f%*60,300,48,&7000511,"",field_des%+100*f%,-1,20)
11160l% = VAL(f$(f%,2)) : REM set length of box to a suitable value
11170w% = l%*16 +48
11180IF w%>400 THEN w%=400
11190display_icon%(f%) = FNicon(display_window%,400,-300-f%*60,w%,48,&700F535,"",display_data%+300*f%,-1,l%+1)
11200NEXT
11210ENDPROC
11220
11230DEF PROCdestroy_display_icons
11240FOR f% = 2*number_of_fields% -1 TO 0 STEP -1
11250 IF display_icon%(f%) > 0 THEN
11260 !block% = display_window%
11270 block%!4 = display_icon%(f%)
11280 SYS"Wimp_DeleteIcon",,block%
11290 ENDIF
11300NEXT
11310ENDPROC
11320
11330
11340
11350DEF PROCenvironment
11360SYS "OS_GetEnv" TO c$
11370c$=RIGHT$(c$,LENc$-20)
11380WHILE LEFT$(c$,1) <>" " AND LENc$ <>0
11390 c$=RIGHT$(c$,LENc$-1)
11400ENDWHILE
11410IF c$ = " " THEN c$ =""
11420ENDPROC
11430
11440
11450
11460
11470DEF PROCackload(b)
11480b!12=b!8
11490b!16 = 4
11500!b = 64
11510SYS"Wimp_SendMessage",17,b,b!4
11520ENDPROC
11530
11540DEF PROCdataload(b)
11550IF b!40 = &778 THEN
11560 PROCload(FNget_name(b+44))
11570 PROCackload(b)
11580ENDIF
11590ENDPROC
11600
11610
11620
11630
11640
11650
11660DEF PROCextract_record_data
11670REM This takes the data from the icons and puts them into an array
11680LOCAL f%
11690FOR f% = 0 TO number_of_fields%-1
11700 p% =display_data%+f%*300
11710 c_f_v$(f%) = $p%
11720NEXT
11730ENDPROC
11740
11750DEF PROCclear_record
11760LOCAL f%
11770FOR f% = 0 TO number_of_fields%-1
11780 p% =display_data%+f%*300
11790 $p% = ""
11800NEXT
11810ENDPROC
11820
11830
11840DEF FNdate(date$)
11850 =VAL(LEFT$(date$,2))+100*VAL(MID$(date$,4,2))+10000*VAL(RIGHT$(date$,2))
11860
11870
11880
11890DEF FNvalid_min(value$,type$,min$)
11900LOCAL ok%
11910ok% = TRUE
11920IF LEN min$ >0 AND LEN value$ > 0 THEN
11930CASE type$ OF
11940 WHEN "t","T" : IF value$ < min$ THEN ok% = FALSE
11950 WHEN "N","n" : IF VAL(value$) < VAL(min$) THEN ok% = FALSE
11960 WHEN "D","d" : IF FNdate(value$) < FNdate(min$) THEN ok% = FALSE
11970ENDCASE
11980ENDIF
11990=ok%
12000
12010DEF FNvalid_max(value$,type$,max$)
12020LOCAL ok%
12030ok% = TRUE
12040IF LEN max$ >0 AND LEN value$ > 0 THEN
12050CASE type$ OF
12060 WHEN "t","T" : IF value$ > max$ THEN ok% = FALSE
12070 WHEN "N","n" : IF VAL(value$) > VAL(max$) THEN ok% = FALSE
12080 WHEN "D","d" : IF FNdate(value$) > FNdate(max$) THEN ok% = FALSE
12090ENDCASE
12100ENDIF
12110=ok%
12120
12130DEF FNvalid_list(value$,type$,list$)
12140LOCAL ok%
12150ok% = TRUE
12160IF LEN list$ >0 THEN
12170 IF INSTR(list$,value$) = 0 THEN ok% = FALSE
12180ENDIF
12190=ok%
12200
12210
12220DEF FNvalid_record
12230ok% = TRUE
12240f% = -1
12250WHILE ok% AND f% < max_fields
12260 f%+=1
12270 IF field_used%(f%) THEN
12280 IF (f$(f%,1) ="d" OR f$(f%,1) ="D")AND NOT FNvalid_date(c_f_v$(f%)) THEN
12290 ok% = FALSE
12300 PROCerror_message("'"+f$(f%,0)+"' has an invalid date")
12310 ELSE
12320 IF NOT FNvalid_min(c_f_v$(f%),f$(f%,1),f$(f%,4)) THEN
12330 ok%=FALSE
12340 PROCerror_message("'"+f$(f%,0)+"' has a value which is too low" )
12350 ELSE
12360 IF NOT FNvalid_max(c_f_v$(f%),f$(f%,1),f$(f%,5)) THEN
12370 ok%=FALSE
12380 PROCerror_message("'"+f$(f%,0)+"' has a value which is too high" )
12390 ELSE
12400 IF NOT FNvalid_list(c_f_v$(f%),f$(f%,1),f$(f%,6)) THEN
12410 ok%=FALSE
12420 PROCerror_message("'"+f$(f%,0)+"' has a value which is not in the list")
12430 ELSE
12440 IF f$(f%,1) = "N" OR f$(f%,1)="n" AND VAL(f$(f%,3)) > 0 THEN
12450 A% = @%
12460 @% =&0102000A + VAL(f$(f%,3))*&100
12470 IF LENc_f_v$(f%) >0 THEN
12480 c_f_v$(f%) = STR$(VAL(c_f_v$(f%)))
12490 ENDIF
12500 @%=A%
12510 IF RIGHT$(c_f_v$(f%),1) ="." THEN
12520 c_f_v$(f%)= LEFT$(c_f_v$(f%))
12530 ENDIF
12540 ENDIF
12550 ENDIF
12560 ENDIF
12570 ENDIF
12580 ENDIF
12590 ENDIF
12600ENDWHILE
12610=ok%
12620
12630DEF FNrecord_space
12640LOCAL total%
12650total% = 0
12660FOR f% = 0 TO max_fields
12670 total% = total% + LENc_f_v$(f%)
12680NEXT
12690=total%
12700
12710
12720DEF PROCnext_record
12730PROCextract_record_data
12740IF FNvalid_record THEN
12750 IF NOT(FNrecord_space = 0 AND VAL($rec_number%) = number_of_records%) THEN
12760 PROCwrite_record(VAL($rec_number%))
12770 $rec_number% = STR$(VAL($rec_number%)+1)
12780 IF VAL($rec_number%) > number_of_records% THEN
12790 number_of_records%+=1
12800 PROCclear_record
12810 ELSE
12820 PROCread_record(VAL($rec_number%))
12830 ENDIF
12840 ENDIF
12850ENDIF
12860PROCupdate_display
12870ENDPROC
12880
12890DEF PROCprevious_record
12900PROCextract_record_data
12910IF FNvalid_record THEN
12920 PROCwrite_record(VAL($rec_number%))
12930 IF VAL($rec_number%) > 1 THEN
12940 $rec_number% = STR$(VAL($rec_number%)-1)
12950 PROCread_record(VAL($rec_number%))
12960 ELSE
12970 VDU7
12980 ENDIF
12990ENDIF
13000PROCupdate_display
13010ENDPROC
13020
13030DEF PROCstart
13040PROCextract_record_data
13050IF FNvalid_record THEN
13060 PROCwrite_record(VAL($rec_number%))
13070 IF VAL($rec_number%) > 1 THEN
13080 $rec_number% = STR$(1)
13090 PROCread_record(VAL($rec_number%))
13100 ELSE
13110 VDU7
13120 ENDIF
13130ENDIF
13140PROCupdate_display
13150ENDPROC
13160
13170
13180
13190
13200DEF PROCend_of_file
13210PROCextract_record_data
13220IF FNvalid_record THEN
13230 PROCwrite_record(VAL($rec_number%))
13240 IF VAL($rec_number%) < number_of_records% THEN
13250 $rec_number% = STR$( number_of_records%)
13260 PROCread_record(VAL($rec_number%))
13270 ELSE
13280 VDU7
13290 ENDIF
13300ENDIF
13310PROCupdate_display
13320ENDPROC
13330
13340DEF PROCupdate_display
13350 SYS"Wimp_ForceRedraw",display_window%,0,-1000,1000,0
13360 SYS"Wimp_GetCaretPosition",,caret%
13370 window% = caret%!0
13380 icon% = caret%!4
13390REM PROCset_caret(window%,icon%)
13400ENDPROC
13410
13420
13430
13440DEF PROCread_record(position%)
13450LOCAL p%, pointer%, f%
13460c_f_v$() = ""
13470pointer% = 5000+position%*record_size%
13480PTR#file% = pointer%
13490bad_field% = FALSE
13500LOCAL ERROR
13510f% = 0
13520WHILE f% <(number_of_fields% ) AND NOT bad_field%
13530 ON ERROR LOCAL bad_field% = TRUE
13540 IF NOT bad_field% THEN
13550 INPUT #file%, c_f_v$(f%)
13560 p% =display_data%+f%*300
13570 $p% =c_f_v$(f%)
13580 f% +=1
13590 ENDIF
13600ENDWHILE
13610RESTORE ERROR
13620ENDPROC
13630
13640
13650DEF PROCwrite_record(position%)
13660LOCAL p%, pointer%
13670pointer% = 5000+position%*record_size%
13680PTR#file% = pointer%
13690FOR f% = 0 TO number_of_fields%-1
13700 PRINT #file%, c_f_v$(f%)
13710NEXT
13720ENDPROC
13730
13740
13750
13760DEF PROCemergency_close
13770 file% = 0
13780 loaded% = FALSE
13790 inhibit% = FALSE
13800 PROCcloseawindow(display_window%)
13810 PROCcloseawindow(sort_window%)
13820 PROCcloseawindow(output_window%)
13830 PROCcloseawindow(fields_window%)
13840 PROCcloseawindow(password_window%)
13850 PROCcloseawindow(screen_window%)
13860 PROCcloseawindow(save_window%)
13870 PROCdestroy_display_icons
13880 PROCempty_fields
13890 PROCcloseawindow(newfile_window%)
13900 PROCcloseawindow(fields_window%)
13910ENDPROC
13920
13930
13940
13950DEF PROCclose_down_file
13960IF file% <> 0 THEN
13970 PTR#file% = 0
13980 number_of_fields% = 0
13990 FOR rec% = 0 TO max_fields
14000 IF LEN(f$(rec%,0)) > 0 THEN
14010 number_of_fields% +=1
14020 ENDIF
14030 NEXT
14040 IF FNfield_length_ok THEN
14050 FOR a% = field_des% TO field_des% + 2196 STEP 4
14060 PRINT#file%,!a%
14070 NEXT
14080 PRINT #file%,$password%
14090 PRINT #file%, $filename%
14100 PRINT #file%, number_of_records%
14110 PRINT #file%, record_size%
14120 PRINT #file%, number_of_fields%
14130 PRINT #file%, VAL($rec_number%)
14140 FOR rec% = 0 TO max_fields
14150 PRINT #file%, field_used%(rec%)
14160 NEXT
14170
14180 FOR a% = output_list% TO output_list%+496 STEP 4
14190 PRINT #file%,!a%
14200 NEXT
14210 FOR a% = search_list% TO search_list%+196 STEP 4
14220 PRINT #file%,!a%
14230 NEXT
14240 FOR a% = sort_field% TO sort_field%+296 STEP 4
14250 PRINT #file%,!a%
14260 NEXT
14270 PROCextract_record_data
14280 PROCwrite_record(VAL($rec_number%))
14290 CLOSE #file%
14300 file% = 0
14310 loaded% = FALSE
14320 inhibit% = FALSE
14330 PROCcloseawindow(display_window%)
14340 PROCcloseawindow(sort_window%)
14350 PROCcloseawindow(output_window%)
14360 PROCcloseawindow(fields_window%)
14370 PROCcloseawindow(password_window%)
14380 PROCcloseawindow(screen_window%)
14390 PROCcloseawindow(save_window%)
14400 PROCdestroy_display_icons
14410 PROCempty_fields
14420 PROCcloseawindow(newfile_window%)
14430 PROCcloseawindow(fields_window%)
14440 ELSE
14450 PROCerror_message("The field descriptor has been changed and is now too long. Either reduce the number of fields or reduce their length")
14460 quit% = FALSE
14470 ENDIF
14480ENDIF
14490ENDPROC
14500
14510
14520
14530
14540DEF FNfield_length_ok
14550PROCextract_field_description
14560total% = 0
14570control% = 0
14580FOR f% = 0 TO max_fields
14590 total% = total% + VAL(f$(f%,2))
14600 IF LEN(f$(f%,0)) > 0 THEN control%+=2
14610NEXT
14620IF total% > record_size% - control% THEN
14630=FALSE
14640ELSE
14650=TRUE
14660
14670
14680DEF PROCpassword_check
14690 IF $password% <> "" THEN
14700 $in_password% = ""
14710 PROCopen_window(password_window%)
14720 inhibit% = TRUE
14730 ENDIF
14740ENDPROC
14750
14760
14770
14780DEF PROCpassword
14790 PROCcloseawindow(password_window%)
14800 IF LEFT$($password%,4) = LEFT$($in_password%,4) THEN
14810 inhibit% = FALSE
14820 PROCopen_window(display_window%)
14830 ELSE
14840 PROCerror_message("Incorrect password. File closing")
14850 PROCclose_down_file
14860 ENDIF
14870ENDPROC
14880
14890
14900DEF FNupper(text$)
14910LOCAL result$,i%,c$
14920result$=""
14930FOR i% = 1 TO LENtext$
14940 c$=MID$(text$,i%,1)
14950 IF c$>="a" AND c$<="z" THEN c$=CHR$(ASC(c$)AND&DF)
14960 result$=result$+c$
14970NEXT
14980=result$
14990
15000DEF FNreplace(object$,target$,by$)
15010LOCAL start%, position%
15020start% = INSTR(object$,target$)
15030WHILE start%
15040position% = LEN(object$)-LEN(target$)-start%+1
15050object$ = LEFT$(object$,start%-1)+by$+RIGHT$(object$,position%)
15060start% = INSTR(object$,target$,start%+LEN(by$))
15070ENDWHILE
15080=object$
15090
15100DEF FNoutput_upper(text$)
15110LOCAL result$,i%,c$
15120quote% = FALSE
15130result$=""
15140FOR i% = 1 TO LENtext$
15150 c$=MID$(text$,i%,1)
15160 IF c$ = CHR$34 THEN quote% = NOT quote%
15170 IF c$="," THEN c$ = "+"
15180 IF c$=";" AND i% < LENtext$ AND i% > 1 THEN c$="+"+CHR$34+" "+CHR$34+"+"
15190 IF NOT quote% THEN
15200 IF c$>="a" AND c$<="z" THEN c$=CHR$(ASC(c$)AND&DF)
15210 ENDIF
15220 result$=result$+c$
15230NEXT
15240=result$
15250
15260
15270
15280
15290
15300DEF PROCcreate_field_output
15310LOCAL field%, i%
15320headings$() = ""
15330headings$(0)= "Field Name Type Width Decimals Minimum Maximum List"
15340FOR field% = 0 TO number_of_fields%
15350 headings$(field%+2)=FNpad(STR$(field%+1),9)+FNpad(f$(field%,0),20)+FNpad(f$(field%,1),5)+FNpad(f$(field%,2),7)+FNpad(f$(field%,3),9)+FNpad(f$(field%,4),8)+FNpad(f$(field%,5),8)+f$(field%,6)
15360NEXT
15370ENDPROC
15380
15390DEF FNpad(string$,length%)
15400string$+=STRING$(length%," ")
15410string$ = LEFT$(string$,length%)
15420=string$
15430
15440
15450
15460
15470
15480
15490DEF PROCinsert_date
15500LOCAL l$,r$,position%
15510position% = INSTR(search_string$,FNupper(f$(f%,0)))
15520WHILE position% > 0
15530 position% = position% + LEN f$(f%,0)
15540 WHILE (MID$(search_string$,position%,1) <"0" OR MID$(search_string$,position%,1) >"1") AND position% < LENsearch_string$
15550 position% = position% +1
15560 ENDWHILE
15570 search_string$ = LEFT$(search_string$,position%-1)+"FNdate("+CHR$34+MID$(search_string$,position%,8)+CHR$34+")"+RIGHT$(search_string$,LENsearch_string$-position%-8)
15580l$ = LEFT$(search_string$,position%)
15590r$ = RIGHT$(search_string$,LEN(search_string$)-position%)
15600l$= FNreplace(l$,FNupper(f$(f%,0)),"FNdate(c_f_v$("+STR$(f%)+"))")
15610search_string$ = l$ + r$
15620position% = INSTR(search_string$,FNupper(f$(f%,0)))
15630ENDWHILE
15640ENDPROC
15650
15660
15670
15680
15690
15700DEF FNvalid_search_criteria
15710LOCAL total%, ok%, list%, d, FIELDLIST
15720ok% = TRUE
15730FIELDLIST = TRUE
15740IF LEN search_string$ = 0 THEN
15750 PROCerror_message("A search string must be entered. Use ALL to list all records")
15760ok%=FALSE
15770ENDIF
15780total% = 0
15790 FOR list% = 0 TO 5
15800 total% = total% + LEN (output_list$(list%))
15810 NEXT
15820IF total% = 0 THEN
15830ok%=FALSE
15840 PROCerror_message("At least one of the output lines must contain a field name.")
15850ENDIF
15860LOCAL ERROR
15870ON ERROR LOCAL ok% = FALSE :PROCerror_message("The search string contains a syntax error")
15880IF ok% THEN d=EVAL(search_string$)
15890RESTORE ERROR
15900=ok%
15910
15920DEF PROCscreen
15930error% = FALSE
15940PROCextract_record_data
15950IF FNvalid_record THEN
15960 PROCwrite_record(VAL($rec_number%)) : REM save the latest record
15970 IF FNextract_output_list_ok THEN
15980 IF FNcreate_search_string_ok THEN
15990 IF FNvalid_search_criteria THEN
16000 FOR list% = 0 TO 5
16010 pointer% = output_display%+list%*300
16020 $pointer% = ""
16030 NEXT
16040 PROCopen_window(screen_window%)
16050 rec% = 1
16060 match% = 0
16070 $output_rec% = STR$rec%
16080 $matches% = STR$match%
16090 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
16100 escape% = FALSE
16110 PROCpoll(0)
16120 WHILE rec% <= number_of_records% AND NOT escape%
16130 PROCread_record(rec%)
16140 IF NOT FNicon_set(output_window%,case_sens_icon%) THEN PROCconvert_record_case
16150 IF EVAL(search_string$) THEN
16160 PROCread_record(rec%) : REM because the case may be changed
16170 IF FNicon_set(output_window%,tab_icon%) THEN PROCtabulate
16180 match% +=1
16190 $output_rec% = STR$rec%
16200 $matches% = STR$match%
16210 FOR list% = 0 TO 5
16220 pointer% = output_display%+list%*300
16230 IF LEN(output_list$(list%)) >0 THEN
16240 PROCdo_list
16250 ELSE
16260 $pointer% = ""
16270 ENDIF
16280 NEXT
16290 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
16300 REPEAT
16310 PROCglass(TRUE)
16320 MOUSE x,y,b
16330 UNTIL b = 0 OR b = 5
16340 PROCglass(FALSE)
16350 ELSE
16360 $output_rec% = STR$rec%
16370 SYS"Wimp_ForceRedraw",screen_window%,620,-62,770,-14
16380 ENDIF
16390 rec% +=1
16400 PROCpoll(0)
16410
16420 ENDWHILE
16430 PROCread_record(VAL($rec_number%)) : REM reload the latest record
16440 IF NOT error% THEN
16450 IF escape% THEN
16460 PROCmessage("Stop selected. Search incomplete. "+STR$(match%)+" matches have been found so far")
16470 ELSE
16480 PROCmessage("Search complete. "+STR$(match%)+" matches have been found")
16490 ENDIF
16500 ENDIF
16510 ENDIF
16520 PROCcloseawindow(screen_window%)
16530ENDIF
16540ENDIF
16550ENDIF
16560PROCcloseawindow(save_window%)
16570ENDPROC
16580
16590
16600DEF PROCbuild_headings
16610LOCAL i%,pointer%, print_time$
16620 !date_stamp%= 3
16630 SYS"OS_Word",14,date_stamp%
16640 SYS"OS_ConvertStandardDateAndTime",date_stamp%,create_date%,100
16650 print_time$ =LEFT$($create_date%,20)
16660 headings$() = ""
16670 headings$(0)= "Cardbase Printout"
16680 headings$(2)= "Filename : "+$filename%
16690 headings$(3)= "Time created : "+create_date$
16700 headings$(4)= "Time printed : "+print_time$
16710 headings$(5)= "File size : "+STR$(number_of_records%)+" records"
16720 IF FNicon_set(output_window%,case_sens_icon%) THEN
16730 headings$(6) = "Case sensitive : ON"
16740 ELSE
16750 headings$(6) = "Case sensitive : OFF"
16760 ENDIF
16770 IF FNicon_set(output_window%,tab_icon%) THEN
16780 headings$(7) = "Tabulation : ON"
16790 ELSE
16800 headings$(7) = "Tabulation : OFF"
16810 ENDIF
16820 headings$(8) = "Search string : "+$search_list%
16830 FOR i% = 0 TO 5
16840 pointer% = output_list%+i%*70
16850 headings$(9+i%) = "Line x : "+$pointer%
16860 MID$(headings$(9+i%),6,1)= STR$(i%+1)
16870 NEXT
16880ENDPROC
16890
16900DEF PROCprinter
16910LOCAL i%
16920error% = FALSE
16930IF FNprinter_on THEN
16940 IF LEFT$($search_list%,9) ="fieldlist" THEN
16950 PROCwrite_field_list_to_printer
16960 ELSE
16970 PROCextract_record_data
16980 IF FNvalid_record THEN
16990 PROCwrite_record(VAL($rec_number%)) : REM save the latest record
17000 IF FNextract_output_list_ok THEN
17010 IF FNcreate_search_string_ok THEN
17020 IF FNvalid_search_criteria THEN
17030 FOR list% = 0 TO 5
17040 pointer% = output_display%+list%*300
17050 $pointer% = ""
17060 NEXT
17070 IF FNicon_set(output_window%,headings_icon%) THEN
17080 PROCbuild_headings
17090 FOR i% = 0 TO 15
17100 PROCprint(headings$(i%))
17110 NEXT
17120 ENDIF
17130 PROCopen_window(screen_window%)
17140 rec% = 1
17150 match% = 0
17160 $output_rec% = STR$rec%
17170 $matches% = STR$match%
17180 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
17190 escape% = FALSE
17200 PROCpoll(0)
17210 WHILE rec% <= number_of_records% AND NOT escape%
17220 PROCread_record(rec%)
17230 IF NOT FNicon_set(output_window%,case_sens_icon%) THEN PROCconvert_record_case
17240 IF EVAL(search_string$) THEN
17250 PROCread_record(rec%) : REM because the case may be changed
17260 IF FNicon_set(output_window%,tab_icon%) THEN PROCtabulate
17270 match% +=1
17280 $output_rec% = STR$rec%
17290 $matches% = STR$match%
17300 FOR list% = 0 TO 5
17310 pointer% = output_display%+list%*300
17320 IF LEN(output_list$(list%)) >0 THEN
17330 PROCdo_list
17340 PROCprint($pointer%)
17350 ELSE
17360 $pointer% = ""
17370 ENDIF
17380 NEXT
17390 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
17400 ELSE
17410 $output_rec% = STR$rec%
17420 SYS"Wimp_ForceRedraw",screen_window%,620,-62,770,-14
17430 ENDIF
17440 rec% +=1
17450 PROCpoll(0)
17460 ENDWHILE
17470 PROCread_record(VAL($rec_number%)) : REM reload the latest record
17480 IF NOT error% THEN
17490 IF escape% THEN
17500 PROCmessage("Stop selected. Search incomplete. "+STR$(match%)+" matches have been found so far")
17510 ELSE
17520 PROCmessage("Search complete. "+STR$(match%)+" matches have been found")
17530 ENDIF
17540 ENDIF
17550 PROCcloseawindow(screen_window%)
17560 ENDIF
17570 ENDIF
17580 ENDIF
17590 ENDIF
17600 ENDIF
17610ENDIF
17620PROCcloseawindow(save_window%)
17630ENDPROC
17640
17650
17660
17670
17680DEF PROCdo_list
17690 LOCAL ERROR
17700 ON ERROR LOCAL error% =TRUE
17710 IF NOT error% THEN
17720 $pointer% = EVAL(output_list$(list%))
17730 ELSE
17740 PROCcloseawindow(screen_window%)
17750 PROCerror_message("Line "+STR$(list%+1)+" contains an unknown field name or a syntax error")
17760 escape% = TRUE
17770 ENDIF
17780 RESTORE ERROR
17790ENDPROC
17800
17810
17820
17830
17840
17850DEF PROCfile_output
17860 PROCopen_window(save_window%)
17870 SYS"Wimp_SetCaretPosition",save_window%,2,,,-1,-1
17880ENDPROC
17890
17900
17910DEF PROCprint(text$)
17920LOCAL i%
17930VDU2
17940FOR i%= 1 TO LENtext$
17950 VDU1,ASC(MID$(text$,i%,1))
17960NEXT
17970VDU1,13,1,10
17980VDU3
17990ENDPROC
18000
18010
18020
18030DEF FNprinter_on
18040LOCAL ok%, cancelled%
18050cancelled% = FALSE
18060ok% = FALSE
18070REPEAT
18080 SYS"OS_Byte",21,3
18090 VDU 2,1,65,1,127,3
18100 SYS"OS_Byte",152,3 TO ;flags%
18110 flags% = flags% AND 2
18120 IF flags% <> 0 THEN
18130 ok%=TRUE
18140 ELSE
18150 IF FNcancel_message("Printer is not responding. Click on OK to try again. Click on cancel to abandon printing") = 2 THEN
18160 cancelled%=TRUE
18170 ENDIF
18180 ENDIF
18190UNTIL cancelled% OR ok%
18200=ok%
18210
18220
18230
18240
18250
18260
18270DEF PROCconvert_record_case
18280LOCAL f%
18290FOR f% = 0 TO number_of_fields%
18300 c_f_v$(f%) = FNupper(c_f_v$(f%))
18310NEXT
18320ENDPROC
18330
18340
18350DEF PROCstart_output_drag
18360 LOCAL wex%,wey%
18370 IF (button% AND &50) <> 0 THEN
18380 !block% = save_window%
18390 SYS"Wimp_GetWindowState",,block%
18400 wex% = block%!4 - block%!20
18410 wey% = block%!16 - block%!24
18420 block%!4 = 3 : REM icon handle for drag icon
18430 SYS"Wimp_GetIconState",,block%
18440 !block% = save_window%
18450 block%!4 = 5
18460 block%!8 = block%!8 +wex%
18470 block%!12 = block%!12 +wey%
18480 block%!16 = block%!16 +wex%
18490 block%!20 = block%!20 +wey%
18500 block%!24 = 0
18510 block%!28 = 0
18520 block%!32 = &7FFFFFFF
18530 block%!36 = &7FFFFFFF
18540 SYS"Wimp_DragBox",,block%
18550 ENDIF
18560ENDPROC
18570
18580
18590DEF PROCstart_disk_list
18600SYS"Wimp_GetPointerInfo",,block%
18610block%!20 = 64
18620block%!32 = 0
18630block%!36 = 1
18640block%!40 = block%!12
18650block%!44 = block%!16
18660block%!48 = !block%
18670block%!52 = block%!4
18680block%!56 = 10000 : REM size of the file
18690block%!60 = &FFF : REM file type of the file
18700$(block%+64) = FNleaf($text_file_name%)
18710?(block%+65+LENFNleaf($text_file_name%)) = 0
18720SYS"Wimp_SendMessage",17,block%+20,block%!12,block%!16
18730ENDPROC
18740
18750
18760
18770DEF PROCproduce_output(filename$)
18780LOCAL i%
18790error% = FALSE
18800IF LEFT$($search_list%,9) ="fieldlist" THEN
18810 PROCcloseawindow(save_window%)
18820 PROCwrite_field_list_to_disc
18830ELSE
18840 PROCextract_record_data
18850 IF FNvalid_record AND FNoverwrite_ok(filename$) THEN
18860 PROCwrite_record(VAL($rec_number%)) : REM save the latest record
18870 IF FNextract_output_list_ok THEN
18880 IF FNcreate_search_string_ok THEN
18890 IF FNvalid_search_criteria THEN
18900 FOR list% = 0 TO 5
18910 pointer% = output_display%+list%*300
18920 $pointer% = ""
18930 NEXT
18940 output_file_handle% = OPENOUT(filename$)
18950 IF FNicon_set(output_window%,headings_icon%) THEN
18960 PROCbuild_headings
18970 FOR i% = 0 TO 15
18980 PROCprint_to_the_disk(headings$(i%))
18990 NEXT
19000 ENDIF
19010 PROCopen_window(screen_window%)
19020 rec% = 1
19030 match% = 0
19040 $output_rec% = STR$rec%
19050 $matches% = STR$match%
19060 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
19070 escape% = FALSE
19080 PROCpoll(0)
19090 WHILE rec% <= number_of_records% AND NOT escape%
19100 PROCread_record(rec%)
19110 IF NOT FNicon_set(output_window%,case_sens_icon%) THEN PROCconvert_record_case
19120 IF EVAL(search_string$) THEN
19130 PROCread_record(rec%) : REM because the case may be changed
19140 IF FNicon_set(output_window%,tab_icon%) THEN PROCtabulate
19150 match% +=1
19160 $output_rec% = STR$rec%
19170 $matches% = STR$match%
19180 FOR list% = 0 TO 5
19190 pointer% = output_display%+list%*300
19200 IF LEN(output_list$(list%)) >0 THEN
19210 PROCdo_list
19220 PROCprint_to_the_disk($pointer%)
19230 ELSE
19240 $pointer% = ""
19250 ENDIF
19260 NEXT
19270 SYS"Wimp_ForceRedraw",screen_window%,0,-500,4000,0
19280 ELSE
19290 $output_rec% = STR$rec%
19300 SYS"Wimp_ForceRedraw",screen_window%,620,-62,770,-14
19310 ENDIF
19320 rec% +=1
19330 PROCpoll(0)
19340 ENDWHILE
19350 PROCread_record(VAL($rec_number%)) : REM reload the latest record
19360 IF NOT error% THEN
19370 IF escape% THEN
19380 PROCmessage("Stop selected. Search incomplete. "+STR$(match%)+" matches have been found so far")
19390 ELSE
19400 PROCmessage("Search complete. "+STR$(match%)+" matches have been found")
19410 ENDIF
19420 ENDIF
19430 PROCcloseawindow(screen_window%)
19440 PROCcloseawindow(save_window%)
19450 CLOSE# output_file_handle%
19460 OSCLI("settype "+filename$+" text")
19470 ENDIF
19480 PROCcloseawindow(save_window%)
19490 ENDIF
19500 ENDIF
19510 ENDIF
19520ENDIF
19530ENDPROC
19540
19550
19560
19570DEF PROCwrite_field_list_to_disc
19580IF FNoverwrite_ok(filename$) THEN
19590 output_file_handle% = OPENOUT(filename$)
19600 PROCcreate_field_output
19610 FOR i% = 0 TO 15
19620 PROCprint_to_the_disk(headings$(i%))
19630 NEXT
19640 CLOSE# output_file_handle%
19650 OSCLI("settype "+filename$+" text")
19660ENDIF
19670ENDPROC
19680
19690
19700DEF PROCwrite_field_list_to_printer
19710 PROCcreate_field_output
19720 FOR i% = 0 TO 15
19730 PROCprint(headings$(i%))
19740 NEXT
19750ENDPROC
19760
19770
19780DEF PROCprint_to_the_disk(text$)
19790LOCAL i%
19800IF LENtext$ > 0 THEN
19810FOR i%= 1 TO LENtext$
19820 BPUT#output_file_handle%,ASC(MID$(text$,i%,1))
19830NEXT
19840ENDIF
19850 IF FNicon_set(output_window%,cr_icon%) THEN BPUT #output_file_handle%,13
19860 BPUT #output_file_handle%,10
19870ENDPROC
19880
19890
19900DEF PROCquick_save
19910 IF INSTR($text_file_name%,".") = 0 THEN
19920 PROCerror_message("To save, drag the icon to a directory viewer.")
19930 ELSE
19940 PROCproduce_output($text_file_name%)
19950 ENDIF
19960ENDPROC
19970
19980
19990
20000DEF FNoverwrite_ok(filename$)
20010LOCAL name$, type%
20020name$ = filename$ + CHR$0
20030SYS"OS_File",5,name$,,,,,0 TO type%
20040CASE type% OF
20050 WHEN 0 : = TRUE
20060 WHEN 1 : result% = FNcancel_message("A file of this name exists. Click on OK to replace it. Click on CANCEL to abort search")
20070 IF result% = 1 THEN
20080 = TRUE
20090 ELSE
20100 = FALSE
20110 ENDIF
20120 WHEN 2 : PROCerror_message("This is a directory name"):= FALSE
20130ENDCASE
20140
20150DEF FNfile_size
20160LOCAL r0,r1,r2
20170SYS"OS_Args",2,file% TO r0,r1,r2
20180=r2
20190
20200DEF PROCdelete_record
20210LOCAL present%
20220IF number_of_records% = 1 THEN
20230 PROCerror_message("The file contains only one record. This can not be deleted")
20240ELSE
20250 present% = VAL($rec_number%)
20260 IF present% = number_of_records% THEN
20270 number_of_records%=number_of_records%-1
20280 $rec_number% = STR$(number_of_records%)
20290 PROCread_record(VAL($rec_number%))
20300 PROCupdate_display
20310 ELSE
20320 proceed% = FALSE
20330 IF number_of_records% - present% < 500 THEN
20340 proceed% = TRUE
20350 ELSE
20360 IF FNcancel_message("This may take some time. Select OK to continue") = 1 THEN
20370 proceed% = TRUE
20380 ENDIF
20390 ENDIF
20400 IF proceed% THEN
20410 PROCglass(TRUE)
20420 total% = number_of_records% - present%
20430
20440 done% = 0
20450 FOR i% = present% TO number_of_records% -1
20460 PROCread_record(i%+1)
20470 PROCwrite_record(i%)
20480 SYS"Hourglass_Percentage", done%/total% * 100
20490 done% +=1
20500 NEXT
20510 PROCglass(FALSE)
20520 number_of_records%=number_of_records%-1
20530 PROCread_record(present%)
20540 PROCupdate_display
20550 ENDIF
20560ENDIF
20570ENDIF
20580ENDPROC
20590
20600DEF PROCtabulate
20610LOCAL f%
20620FOR f% = 0 TO number_of_fields%
20630 c_f_v$(f%)=c_f_v$(f%)+STRING$(VALf$(f%,2)," ")
20640 c_f_v$(f%)=LEFT$( c_f_v$(f%),VALf$(f%,2))
20650NEXT
20660ENDPROC
20670
20680
20690
20700DEF PROCsort
20710LOCAL memory%
20720memory_sort% = TRUE
20730IF FNextract_sort_condition THEN
20740 PROCextract_record_data
20750 PROCwrite_record(VAL($rec_number%))
20760 size% = FNfile_size + 5000
20770
20780 LOCAL ERROR
20790 ON ERROR LOCAL memory_sort% = FALSE
20800 IF memory_sort% THEN
20810 SYS"OS_Module",6,,,size% TO r0,r1,memory%
20820 RESTORE ERROR
20830 PROCload_file_to_memory
20840
20850 PROCmemory_sort
20860
20870 PROCsave_file_from_memory
20880 SYS"OS_Module",7,,memory%
20890 ELSE
20900 RESTORE ERROR
20910 VDU7
20920 PROCdiscsort
20930 ENDIF
20940 PROCread_record(VAL($rec_number%))
20950 PROCupdate_display
20960ENDIF
20970ENDPROC
20980
20990
21000DEF PROCmemory_sort
21010PROCglass(TRUE)
21020max = number_of_records%
21030FOR current = 1 TO max-1
21040 PROCrecall_from_memory_a(current)
21050 highest = current :REM record_b is highest so far
21060 PROCrecall_from_memory_b(current)
21070 FOR i = current +1 TO max
21080 PROCrecall_from_memory_a(i)
21090 IF FNcompare THEN
21100 highest = i
21110 PROCrecall_from_memory_b(highest)
21120 ENDIF
21130 NEXT
21140 PROCrecall_from_memory_a(current)
21150 PROCstore_in_memory_a(highest)
21160 PROCstore_in_memory_b(current)
21170 REM SWAP r(current),r(highest)
21180 SYS"Hourglass_Percentage", current/max * 100
21190 PROCpoll(0)
21200NEXT
21210PROCglass(FALSE)
21220ENDPROC
21230
21240
21250
21260DEF PROCdiscsort
21270max = number_of_records%
21280PROCglass(TRUE)
21290FOR current = 1 TO max-1
21300 PROCread_record_a(current)
21310 highest = current :REM record_b is highest so far
21320 PROCread_record_b(current)
21330 FOR i = current +1 TO max
21340 PROCread_record_a(i)
21350 IF FNcompare THEN
21360 highest = i
21370 PROCread_record_b(highest)
21380 ENDIF
21390 NEXT
21400 PROCread_record_a(current)
21410 PROCwrite_record_a(highest)
21420 PROCwrite_record_b(current)
21430 REM SWAP r(current),r(highest)
21440 SYS"Hourglass_Percentage", current/max * 100
21450 PROCpoll(0)
21460NEXT
21470PROCglass(FALSE)
21480ENDPROC
21490
21500
21510
21520
21530
21540
21550
21560
21570
21580DEF PROCread_record_a(position%)
21590LOCAL pointer%, f%
21600record_a$()=""
21610pointer% = 5000+position%*record_size%
21620PTR#file% = pointer%
21630bad_field% = FALSE
21640LOCAL ERROR
21650f% = 0
21660WHILE f% <(number_of_fields% ) AND NOT bad_field%
21670 ON ERROR LOCAL bad_field% = TRUE
21680 IF NOT bad_field% THEN
21690 INPUT #file%, record_a$(f%)
21700 f% +=1
21710 ENDIF
21720ENDWHILE
21730RESTORE ERROR
21740ENDPROC
21750
21760
21770DEF PROCwrite_record_a(position%)
21780LOCAL pointer%
21790pointer% = 5000+position%*record_size%
21800PTR#file% = pointer%
21810FOR f% = 0 TO number_of_fields%-1
21820 PRINT #file%, record_a$(f%)
21830NEXT
21840ENDPROC
21850
21860DEF PROCread_record_b(position%)
21870LOCAL pointer%, f%
21880record_b$() = ""
21890pointer% = 5000+position%*record_size%
21900PTR#file% = pointer%
21910bad_field% = FALSE
21920LOCAL ERROR
21930f% = 0
21940WHILE f% <(number_of_fields% ) AND NOT bad_field%
21950 ON ERROR LOCAL bad_field% = TRUE
21960 IF NOT bad_field% THEN
21970 INPUT #file%, record_b$(f%)
21980 f% +=1
21990 ENDIF
22000ENDWHILE
22010RESTORE ERROR
22020ENDPROC
22030
22040
22050DEF PROCwrite_record_b(position%)
22060LOCAL pointer%
22070pointer% = 5000+position%*record_size%
22080PTR#file% = pointer%
22090FOR f% = 0 TO number_of_fields%-1
22100 PRINT #file%, record_b$(f%)
22110NEXT
22120ENDPROC
22130
22140
22150
22160DEF FNextract_sort_condition
22170LOCAL a%, left$, right$, f%
22180ok% = TRUE
22190FOR a% = 0 TO 5
22200 sort_line$(a%) = FNupper($(sort_field%+50*a%))
22210 pointer% = sort_field%+50*a%+22
22220 CASE $pointer% OF
22230 WHEN "A","a" : sort_operator$(a%) = "<"
22240 WHEN "D","d" : sort_operator$(a%) = ">"
22250 OTHERWISE
22260 sort_operator$(a%) = "TRUE"
22270 ENDCASE
22280 IF LEN sort_line$(a%) >0 THEN
22290 IF LEN $pointer% = 0 THEN
22300 PROCerror_message("Line "+STR$(a%+1)+" has a field name but the direction of the sort has not been specified.")
22310 ok% = FALSE
22320 ELSE
22330 f% = 0
22340 WHILE sort_line$(a%) <> FNupper(f$(f%,0)) AND f% < number_of_fields%
22350 f%+=1
22360 ENDWHILE
22370 IF sort_line$(a%) <> FNupper(f$(f%,0)) THEN
22380 PROCerror_message("Line "+STR$(a%+1)+" has a field called "+sort_line$(a%)+" this field does not exist")
22390 ok% = FALSE
22400 ENDIF
22410 left$ = sort_line$(a%)
22420 right$ = sort_line$(a%)
22430 CASE f$(f%,1) OF
22440 WHEN "D","d" : left$ = "FNdate(record_a$("+STR$f%+"))"
22450 right$= "FNdate(record_b$("+STR$f%+"))"
22460 WHEN "N","n" : left$ = "VAL(record_a$("+STR$f%+"))"
22470 : right$= "VAL(record_b$("+STR$f%+"))"
22480 WHEN "T","t" : IF FNicon_set(sort_window%,4) THEN
22490 left$ = "record_a$("+STR$f%+")"
22500 right$= "record_b$("+STR$f%+")"
22510 ELSE
22520 left$ = "FNupper(record_a$("+STR$f%+"))"
22530 right$= "FNupper(record_b$("+STR$f%+"))"
22540 ENDIF
22550 ENDCASE
22560 IF sort_operator$(a%) = "TRUE" THEN
22570 sort_line$(a%)="TRUE"
22580 ELSE
22590 sort_line$(a%) = left$+sort_operator$(a%)+right$
22600 sort_line$(a%+6) = left$+"="+right$
22610 ENDIF
22620 ENDIF
22630 ELSE
22640 sort_line$(a%)="TRUE"
22650 sort_line$(a%+6)="TRUE"
22660 ENDIF
22670NEXT
22680=ok%
22690
22700
22710
22720DEF FNcompare
22730LOCAL result%
22740result% = FALSE
22750IF EVALsort_line$(0) THEN
22760 result% = TRUE
22770ELSE
22780 IF EVALsort_line$(6) THEN
22790
22800 IF EVALsort_line$(1) THEN
22810 result% = TRUE
22820 ELSE
22830 IF EVALsort_line$(7) THEN
22840
22850 IF EVALsort_line$(2) THEN
22860 result% = TRUE
22870 ELSE
22880 IF EVALsort_line$(8) THEN
22890
22900 IF EVALsort_line$(3) THEN
22910 result% = TRUE
22920 ELSE
22930 IF EVALsort_line$(9) THEN
22940
22950 IF EVALsort_line$(4) THEN
22960 result% = TRUE
22970 ELSE
22980 IF EVALsort_line$(10) THEN
22990
23000 IF EVALsort_line$(5) THEN
23010 result% = TRUE
23020 ELSE
23030 IF EVALsort_line$(11) THEN
23040
23050 ENDIF
23060 ENDIF
23070
23080 ENDIF
23090 ENDIF
23100
23110 ENDIF
23120 ENDIF
23130
23140 ENDIF
23150 ENDIF
23160
23170 ENDIF
23180 ENDIF
23190
23200 ENDIF
23210ENDIF
23220=result%
23230
23240DEF PROCload_file_to_memory
23250FOR rec% = 1 TO number_of_records%
23260 PROCread_record_a(rec%)
23270 PROCstore_in_memory_a(rec%)
23280NEXT
23290ENDPROC
23300
23310DEF PROCsave_file_from_memory
23320FOR rec% = 1 TO number_of_records%
23330 PROCrecall_from_memory_a(rec%)
23340 PROCwrite_record_a(rec%)
23350NEXT
23360ENDPROC
23370
23380
23390DEF PROCstore_in_memory_a(rec%)
23400pointer% = rec%*record_size%+memory%
23410FOR f% = 0 TO number_of_fields% -1
23420 $pointer% = record_a$(f%)
23430 pointer% = pointer% + LENrecord_a$(f%)+1
23440NEXT
23450ENDPROC
23460
23470DEF PROCstore_in_memory_b(rec%)
23480pointer% = rec%*record_size%+memory%
23490FOR f% = 0 TO number_of_fields% -1
23500 $pointer% = record_b$(f%)
23510 pointer% = pointer% + LENrecord_b$(f%)+1
23520NEXT
23530ENDPROC
23540
23550
23560DEF PROCrecall_from_memory_a(rec%)
23570pointer% = rec%*record_size%+memory%
23580FOR f% = 0 TO number_of_fields% -1
23590 record_a$(f%) = $pointer%
23600 pointer% = pointer% + LENrecord_a$(f%)+1
23610NEXT
23620ENDPROC
23630
23640DEF PROCrecall_from_memory_b(rec%)
23650pointer% = rec%*record_size%+memory%
23660FOR f% = 0 TO number_of_fields% -1
23670 record_b$(f%) = $pointer%
23680 pointer% = pointer% + LENrecord_b$(f%)+1
23690NEXT
23700ENDPROC
23710
23720
23730DEF PROCread_virus
23740LOCAL f%
23750f% = OPENIN("<CardBase$Dir>.date")
23760IF f% > 0 THEN
23770 virus_set% = TRUE
23780 DIM virus$(12)
23790 count% = -1
23800 REPEAT
23810 count% +=1
23820 no_more% = FNread_virus_line
23830 UNTIL count% = 10 OR no_more%
23840 CLOSE #f%
23850 IF LEFT$(virus$(0),6) <> MID$(TIME$,5,6) THEN
23860 virus_set% = FALSE
23870 ELSE
23880 no_of_vir_mess% = 0
23890 FOR j% = 1 TO 10
23900 IF LENvirus$(j%) > 0 THEN no_of_vir_mess%+=1
23910 NEXT
23920 current_vir_mess% = 1
23930 IF no_of_vir_mess% = 0 THEN virus_set% = FALSE
23940 ENDIF
23950ELSE
23960 virus_set% = FALSE
23970ENDIF
23980ENDPROC
23990
24000
24010DEF FNread_virus_line
24020 PROCget_a_line
24030 WHILE LEFT$(line$,1) ="|" AND NOT EOF#f%
24040 PROCget_a_line
24050 ENDWHILE
24060 virus$(count%) = line$
24070= EOF #f%
24080
24090
24100DEF PROCget_a_line
24110 line$ =""
24120 c% = BGET#f%
24130 WHILE c% <> 10
24140 line$ = line$+CHR$c%
24150 c% = BGET#f%
24160 ENDWHILE
24170ENDPROC
24180
24190
24200
24210DEF PROCshow_virus
24220PROCmessage(virus$(current_vir_mess%))
24230current_vir_mess% +=1
24240IF current_vir_mess% > no_of_vir_mess% THEN
24250 current_vir_mess% =1
24260ENDIF
24270ENDPROC
24280
24290
24300
24310
24320DEF FNextract_output_list_ok
24330LOCAL error%, list%
24340list% = -1
24350WHILE list% < 5 AND NOT error%
24360 list% += 1
24370 pointer% = output_list% + list% * 70
24380 output_list$(list%) = $pointer%
24390 output_list$(list%) = FNoutput_upper(output_list$(list%))
24400 PROCoutput_string_convert(output_list$(list%),error%)
24410ENDWHILE
24420=NOT error%
24430
24440
24450
24460
24470
24480DEF FNcreate_search_string_ok
24490LOCAL search%, error%
24500 search% = TRUE
24510 search_string$ = $search_list%
24520 IF FNicon_set(output_window%,case_sens_icon%) THEN
24530 search_string$ =FNoutput_upper(search_string$)
24540 ELSE
24550 search_string$ =FNupper(search_string$)
24560 ENDIF
24570 PROCsearch_string_convert(search_string$,error%)
24580=NOT error%
24590
24600
24610DEF PROCoutput_string_convert(RETURN string$, RETURN error%)
24620LOCAL result$
24630result$ = ""
24640WHILE string$<>""
24650 PROCstrip_leading_space(string$)
24660 PROCoutput_next_element(item$,string$, error%)
24670 result$ = result$+item$+" "
24680ENDWHILE
24690string$ = result$
24700ENDPROC
24710
24720
24730
24740
24750DEF PROCoutput_next_element(RETURN item$, RETURN s$, RETURN error%)
24760item$ = ""
24770IF LEFT$(s$,1) = CHR$34 THEN
24780 item$= CHR$34
24790 REPEAT
24800 s$ = RIGHT$(s$,LEN(s$)-1)
24810 item$ += LEFT$(s$,1)
24820 UNTIL LEFT$(s$,1)=CHR$34 OR s$=""
24830 s$ = RIGHT$(s$,LEN(s$)-1)
24840 IF LENitem$ = 1 OR RIGHT$(item$,1)<> CHR$34 THEN
24850 error% = TRUE
24860 PROCerror_message("Output line "+STR$(list%+1)+" contains an unmatched quote")
24870 ENDIF
24880ELSE
24890 t$ = LEFT$(s$,1)
24900 IF INSTR(",;+",t$) >0 THEN
24910 item$ = t$
24920 s$ = RIGHT$(s$,LEN(s$)-1)
24930 ELSE
24940 t$ = LEFT$(s$,1)
24950 WHILE t$ <>"" AND INSTR(" ,;+"+CHR$34,t$)=0
24960 item$=item$ +t$
24970 s$ = RIGHT$(s$,LEN(s$)-1)
24980 t$ = LEFT$(s$,1)
24990 ENDWHILE
25000 REM do substitution here
25010 PROCoutput_substitute(item$, error%)
25020 ENDIF
25030ENDIF
25040ENDPROC
25050
25060
25070DEF PROCstrip_leading_space(RETURN s$)
25080WHILE LEFT$(s$,1) = " "
25090 s$ = RIGHT$(s$,LEN(s$)-1)
25100ENDWHILE
25110ENDPROC
25120
25130
25140
25150DEF PROCoutput_substitute(RETURN text$, RETURN error%)
25160LOCAL f%, found%
25170found% = FALSE
25180f% = -1
25190WHILE f% < number_of_fields% AND NOT found%
25200 f% +=1
25210 IF text$ = FNupper(f$(f%,0)) THEN
25220 found% = TRUE
25230 text$="c_f_v$("+STR$(f%)+")"
25240 ENDIF
25250ENDWHILE
25260IF NOT found% THEN
25270 PROCerror_message("The field "+text$+" used in the output line "+STR$(list%+1)+" does not exist")
25280 error% = TRUE
25290ENDIF
25300ENDPROC
25310
25320
25330DEF PROCsearch_string_convert(RETURN string$, RETURN error%)
25340LOCAL result$
25350error% = FALSE
25360result$ = ""
25370WHILE string$<>"" AND NOT error%
25380 PROCstrip_leading_space(string$)
25390 PROCsearch_next_element(item$,string$, error%)
25400 result$ = result$+item$+" "
25410ENDWHILE
25420string$ = result$
25430ENDPROC
25440
25450
25460
25470
25480DEF PROCsearch_next_element(RETURN item$, RETURN s$, RETURN error%)
25490error% = FALSE
25500item$ = ""
25510IF LEFT$(s$,1) = CHR$34 THEN
25520 item$= CHR$34
25530 REPEAT
25540 s$ = RIGHT$(s$,LEN(s$)-1)
25550 item$ += LEFT$(s$,1)
25560 UNTIL LEFT$(s$,1)=CHR$34 OR s$=""
25570 s$ = RIGHT$(s$,LEN(s$)-1)
25580 IF LENitem$ = 1 OR RIGHT$(item$,1)<> CHR$34 THEN
25590 error% = TRUE
25600 PROCerror_message("The search string contains an unmatched quote")
25610 ENDIF
25620ELSE
25630 t$ = LEFT$(s$,2)
25640 IF t$="<>" OR t$=">=" OR t$="<=" THEN
25650 item$ = t$
25660 s$ = RIGHT$(s$,LEN(s$)-2)
25670 ELSE
25680 t$ = LEFT$(s$,1)
25690 IF INSTR("=,;+-()/*><",t$) >0 THEN
25700 item$ = t$
25710 s$ = RIGHT$(s$,LEN(s$)-1)
25720 ELSE
25730 t$ = LEFT$(s$,1)
25740 IF t$ = "[" THEN
25750 WHILE t$ <>"" AND INSTR("]",t$)=0
25760 item$=item$ +t$
25770 s$ = RIGHT$(s$,LEN(s$)-1)
25780 t$ = LEFT$(s$,1)
25790 ENDWHILE
25800 s$ = RIGHT$(s$,LEN(s$)-1)
25810 item$ = MID$(item$,2,LEN(item$)-1)
25820 IF LEN item$ <> 8 OR t$ <>"]" THEN
25830 error% = TRUE
25840 PROCerror_message("The search string contains a date with an unmatched bracket. Dates must be enclosed within [] and contain 8 characters"+CHR$13+"eg [03 11 92]")
25850 ENDIF
25860 REM do date substitution here
25870 item$ = "FNdate("+CHR$34+item$+CHR$34+")"
25880 ELSE
25890 WHILE t$ <>"" AND INSTR(" ,;+=<>()*/"+CHR$34,t$)=0
25900 item$=item$ +t$
25910 s$ = RIGHT$(s$,LEN(s$)-1)
25920 t$ = LEFT$(s$,1)
25930 ENDWHILE
25940 REM do substitution here
25950 PROCsearch_substitute(item$,error%)
25960 ENDIF
25970 ENDIF
25980 ENDIF
25990ENDIF
26000ENDPROC
26010
26020
26030
26040
26050
26060DEF PROCsearch_substitute(RETURN text$, RETURN error%)
26070LOCAL f%, found%
26080found% = FALSE
26090f% = -1
26100WHILE f% < number_of_fields% AND NOT found%
26110 f% +=1
26120 IF text$ = FNupper(f$(f%,0)) THEN
26130 found% = TRUE
26140 IF FNupper(f$(f%,1)) = "T" THEN
26150 text$="c_f_v$("+STR$(f%)+")"
26160 ENDIF
26170 IF FNupper(f$(f%,1)) = "N" THEN
26180 text$="VALc_f_v$("+STR$(f%)+")"
26190 ENDIF
26200 IF FNupper(f$(f%,1)) = "D" THEN
26210 text$="FNdate(c_f_v$("+STR$(f%)+"))"
26220 ENDIF
26230 ENDIF
26240ENDWHILE
26250i% = -1
26260WHILE i% < number_of_operators% AND NOT found%
26270 i% +=1
26280 IF text$ = operator$(i%) THEN
26290 found% = TRUE
26300 ENDIF
26310ENDWHILE
26320IF NOT found% THEN
26330 found% = FNits_a_number(text$)
26340ENDIF
26350
26360IF NOT found% THEN
26370 error% = TRUE
26380 PROCerror_message("The field "+text$+" used in the search string does not exist")
26390ENDIF
26400ENDPROC
26410
26420DEF FNits_a_number(n$)
26430LOCAL ok%, i%
26440ok% = TRUE
26450FOR i% = 1 TO LENn$
26460 IF INSTR("0123456789-+.E", MID$(n$,i%,1)) = 0 THEN
26470 ok% = FALSE
26480 ENDIF
26490NEXT
26500=ok%
26510
26520DEFFNicon_set(window%,icon%)
26530!block_3%=window%
26540block_3%!4=icon%
26550SYS"Wimp_GetIconState",,block_3%
26560=((block_3%!24 AND 1<<21)<>0)
26570:
26580
26590DEF PROCquick_close
26600 SYS "Wimp_CloseDown"
26610ENDPROC
26620
26630
26640DEF FNfull_access(name$)
26650LOCAL state%, r5%
26660 SYS"OS_File",5,name$,,,,,0 TO ,,,,,r5%
26670 state% = r5% AND %1011
26680 = state% = 3
26690
26700
26710
26720REM dummy
26730
26740
26750dummy
� !runimage for CardBase
(� Copyright Archimedes World 1991
� Started 2 July 1990
� Hours = 43
(
2'� Version 0.01 14 September 1990
<,� Bug fix to avoid printer on message
F
P*� Version 0.02 Started 4 March 1991
Z� Hours = 6.5
d:� Scroll on cursor movement, create warning message
nA� Line feed at end of printout, field and heading printout
x:� Bug fix on maximum file size, printer_on improved
�,� Version 0.3 Started 16th March 1991
�� Hours = 3
�L� Give a correct error message when file can not be written and close
�#� down reasonably gracefully
�H� Holding down select causes the output to pause in screen output
�4� clicking select moves on to the next record
�(� Field substitution now improved
�
�� Version 0.31
�#� Icon toggles bug corrected
�
�
�
)� � �:�4:�:�:�"Press a key":a=�:�5:�
�environment
"�constants
,�create_variables
6
�setup
@�createicons
J�read_virus
T� � �error
^<� c$<>"" � just_started% � just_started% = � : �load(c$)
hjust_started% = �
r�
| �poll(1)
�
� quit
� �close_down_file
� ș "Wimp_CloseDown"
��
�
�
�� �create_variables
�� message_block% 100
ր� name%(max_fields),type%(max_fields),width%(max_fields),dp%(max_fields),min%(max_fields),max%(max_fields),list%(max_fields)
�H� record_a$(max_fields), record_b$(max_fields), highest$(max_fields)
�'� sort_line$(12), sort_operator$(6)
�� field_used%(max_fields)
�� operator$(50)
� c_f_v$(max_fields)
� output_list$(6)
� filename% 20
&� pathname% 200
0� record_number% 13
:� password% 13
D� in_password% 13
N� valid_name% 20
X� valid_password% 20
b� rec_number% 13
l� valid_type% 20
v� field_des% 2200
�� valid_integer% 10
�� output_list% 500
�� search_list% 200
�� output_icon%(6)
�� sort_field% 300
�� sort_icon%(12)
�� valid_sort% 20
�$� display_data% (max_fields*300)
�$� display_icon%(max_fields*2 +2)
�� output_display% 2000
�� matches% 20
�� output_rec% 20
�� headings$(max_fields+5)
� date_stamp% 5
� create_date% 100
� f$(max_fields,6)
� block% 600
*� block_2% 600
4� block_3% 50
>� taskid%4
H$taskid%="TASK"
R%� q% &A00,buffer% &800,endbuf% -1
\� menu 500
f� indirect% 2200
p� caret% 40
zcurbuf%=buffer%
�
�
�$valid_name%="Aa-zA-Z0-9"
�$valid_password% ="D*"
�$valid_type% = "ADNTdnt"
�$valid_integer% = "A0-9"
�$valid_sort% = "AaADd"
�
�
�$filename% = "DataFile"
�$pathname% = "DataFile"
�$password% = ""
�$in_password% = ""
$rec_number% = "0"
$search_list% = ""
$loaded% = �
.
8file% = 0
Binhibit% = �
Lcase_sens_icon% = 13
Vcr_icon% = 15
`tab_icon% = 17
jheadings_icon% = 19
toutput_file_handle% = 0
~just_started% = �
�number_of_fields% = 1
�
�operator$(0) = "AND"
�operator$(1) = "OR"
�operator$(2) = "NOT"
�operator$(3) = "EOR"
�operator$(4) = ">="
�operator$(5) = "=>"
�operator$(6) = "ALL"
�!operator$(7) = "FIELDLIST"
�
�number_of_operators% = 7
�
(� �constants
2 Wimp = (1<<18) + (3<<6)
< CreateW = Wimp+1
F OpenW = Wimp+5
P CloseW = Wimp+6
Z Poll% = Wimp+7
d RedrawW = Wimp+8
n UpdateW = Wimp+9
x GetR% = Wimp+10
� GetW = Wimp+11
� GetP = Wimp+15
� Drag = Wimp+16
� CrMenu = Wimp+20
� DcMenu = Wimp+21
� max_fields = 19
� over_size = 1.25
� ALL = �
��
�
�
�
�
� �poll(mask%)
"! ș Poll%,mask%,q% � reason%
, Ȏ reason% �
6 � 1 :�redraw_window(!q%)
@" � 2 :ș"Wimp_OpenWindow",,q%
J � 3 :�closeawindow(!q%)
T � 6 :�buttons(q%)
^ � 7 : � loaded% �
h" �start_disk_list
r �
| �new_save
� �
� � 8 :�key(q%!24)
� � 9 : �menu_select(!q%)
� � 17,18:�receive(q%)
� �
��
�
�� �menu_select(item%)
�Ȏ item% �
� � 0 : �create
�8 � 1 : � � inhibit% � �open_window(display_window%)
�5 � 2 : � � inhibit% � �open_window(sort_window%)
�7 � 3 : � � inhibit% � �open_window(output_window%)
7 � 4 : � � inhibit% � �open_window(fields_window%)
� 5 : �close_down_file
� 7 : quit = �
&�
0�
:
D
N
X� �buttons(b)
b� window%, icon%, button%
l window% = b!12
v icon% = b!16
� button% = b!8
� � virus_set% � �(20) = 1 �
� �show_virus
� �
� Ȏ window% �
�' � -2 : � button% =2 � �menu(b)
�> � newfile_window% : � (button% � &50) <> 0 � �start_drag
�$ � display_window% : Ȏ icon% �
�, � 2 : �start
�2 � 3 : �end_of_file
�6 � 4 : �previous_record
�2 � 5 : �next_record
�4 � 6 : �delete_record
�
$ � output_window% : Ȏ icon% �
/ � 9 : �printer
. � 10 : �screen
*3 � 11 : �file_output
4 �
>$ � save_window% : Ȏ icon% �
H9 � 3 : �start_output_drag
R2 � 0 : �quick_save
\ �
f4 � screen_window% : � icon% = 1 � escape% = �
p% � sort_window% : Ȏ icon% �
z+ � 3 : �sort
� �
� �
� �
��
�
�$� �read_icon_text(window%,icon%)
�!block% = window%
�block%!4 = icon%
�"ș "Wimp_GetIconState",,block%
�= $(block%!28)
�
�
�
� �open_window(handle%)
!block% = handle%
$ È™"Wimp_GetWindowState",,block%
$# block%!28 = -1 : � open on top
. È™ OpenW ,,block%
8�
B
L
V
`
� �key(k)
j� window%, icon%, new_pos%
tÈ™ "Wimp_ProcessKey",k
~;� k = 13 � k = &18E � k = &18F � k = &19D � k = &19E �
�( ș"Wimp_GetCaretPosition",,caret%
� window% = caret%!0
� icon% = caret%!4
� new_pos% = icon%
� Ȏ window% �
�, � newfile_window% : � icon% = nf_1% �
�1 new_pos% = nf_2%
� �
�1 new_pos% = nf_1%
� �
�C �set_caret(newfile_window%,new_pos%)
�P ș"Wimp_ForceRedraw",fields_window%,0,-100,1000,0
/ � output_window% : � k = 13 � k =&18E �
< � icon% < output_icon%(6) �
3 new_pos%=icon%+1
" �
(= new_pos% = output_icon%(0)
2" �
< �
F< � icon% > output_icon%(0) �
P3 new_pos%=icon%-1
Z" �
d= new_pos% = output_icon%(6)
n" �
x �
�B �set_caret(output_window%,new_pos%)
�
�' � sort_window% : � k = 13 �
�; � icon% < sort_icon%(11) �
�3 new_pos%=icon%+1
�" �
�; new_pos% = sort_icon%(0)
�" �
�B �set_caret(sort_window%,new_pos%)
� �
�* � k =&18F �
�: � icon% > sort_icon%(1) �
�3 new_pos%=icon%-2
" �
< new_pos% = sort_icon%(11)
" �
"B �set_caret(sort_window%,new_pos%)
, �
6* � k =&18E �
@; � icon% < sort_icon%(10) �
J3 new_pos%=icon%+2
T" �
^; new_pos% = sort_icon%(0)
h" �
rB �set_caret(sort_window%,new_pos%)
| �
�0 � fields_window% : � k= 13 � k= &19D �
�> � icon% < list%(max_fields) �
�3 new_pos%=icon%+1
�# �
�6 new_pos% = name%(0)
�# �
�E �set_caret(fields_window%,new_pos%)
�! �
�+ � k =&18F �
�6 � icon% >= name%(1) �
�3 new_pos%=icon%-7
�D �set_caret(fields_window%,new_pos%)
�" �
�
* � k =&18E �
> � icon% < name%(max_fields) �
&3 new_pos%=icon%+7
0D �set_caret(fields_window%,new_pos%)
:" �
D �
N* � k= &19C �
X5 � icon% > name%(0) �
b3 new_pos%=icon%+1
lE �set_caret(fields_window%,new_pos%)
v! �
�! �
�1 � display_window% :� k = 13 � k =&18E �
�M � icon% <display_icon%(number_of_fields%-1)�
�3 new_pos%=icon%+2
�" �
�> new_pos% = display_icon%(0)
�- � k = 13 �
�I �set_caret(display_window%,new_pos%)
�1 �next_record
�$ �
�" �
� �
�= � icon% > display_icon%(0) �
3 new_pos%=icon%-2
" �
P new_pos% = display_icon%(number_of_fields%-1)
" �
* �
4C �set_caret(display_window%,new_pos%)
>0 � password_window% : � k= 13 � �password
H1 � save_window% : � k=13 � �quick_save
R �
\�
f�
p
z"� �set_caret(window%,new_pos%)
�M� minx%,maxx%,miny%,maxy%,new_scroll_x%,scroll_x%,new_scroll_y%,scroll_y%
� !block_2% = window%
�) ș"Wimp_GetWindowState",,block_2%
� minx% = block_2%!20
� maxy% = block_2%!24
�8 maxx% = block_2%!12 - block_2%!4 + block_2%!20
�8 miny% = block_2%!8 - block_2%!16 + block_2%!24
� scroll_x% = block_2%!20
� scroll_y% = block_2%!24
�: ș"Wimp_SetCaretPosition",window%,new_pos%,,,-1,-1
�+ ș"Wimp_GetCaretPosition",,block_2%
� caret_x% = block_2%!8
� caret_y% = block_2%!12
new_scroll_x%= scroll_x%
new_scroll_y%= scroll_y%
; � caret_x%-64 < minx% � new_scroll_x% = caret_x%-50
$; � caret_x%+64 > maxx% � new_scroll_x% = caret_x%-50
.H � caret_y%-64 < miny% � new_scroll_y% = caret_y%+(maxy%-miny%)�2
8H � caret_y%+64 > maxy% � new_scroll_y% = caret_y%+(maxy%-miny%)�2
BE � (new_scroll_x%<> scroll_x%) � (new_scroll_y%<> scroll_y%) �
L !block_2% = window%
V, È™"Wimp_GetWindowState",,block_2%
`& block_2%!20 = new_scroll_x%
j& block_2%!24 = new_scroll_y%
t block_2%!28 = -1
~( È™"Wimp_OpenWindow",,block_2%
� �
��
�
�
�
�� �menu(b)
�flag1% = &7000021
�flag2% = &7400021
�� loaded% Ȕ flag1%,flag2%
�$menu="CardBase"
�menu!12=&70207
�menu!16=156
menu!20=40
menu!24=0
(
2menu!28 = &00
<menu!32 = -1
Fmenu!36 = flag1%
P$(menu+40) = "Create"
Z
dmenu!52 = &00
nmenu!56 = -1
xmenu!60 = flag2%
�$(menu+64) = "Disp Edit"
�
�menu!76 = &00
�menu!80 = -1
�menu!84 = flag2%
�$(menu+88) = "Sort"
�
�
�menu!100 = &00
�menu!104 = -1
�menu!108 = flag2%
�$(menu+112) = "Output"
�
menu!124 = &00
menu!128 = -1
menu!132 = flag2%
"$(menu+136) = "Fields"
,
6menu!148 = &00
@menu!152 = -1
Jmenu!156 = flag2%
T$(menu+160) = "Close"
^
h
r
|menu!172 = &00
�menu!176 = info_window%
�menu!180 = &7000021
�$(menu+184) = "Info"
�
�
�menu!196=&80
�menu!200= -1
�menu!204=&7000021
�$(menu+208)="Quit"
�
�(ș "Wimp_CreateMenu",,menu,!b-64,136
��
�
� �closeawindow(handle%)
&!block%=handle%
0! È™"Wimp_CloseWindow",,block%
:<� handle% = output_window% � �closeawindow(save_window%)
D � recursive bit
N�
X
b� �receive(q%)
lȎ q%!16 �
v� 0:�finish:�
�� 2: �datasave(q%)
�'� 3,5 : � q%!12 = 0 � �dataload(q%)
��
��
�
�
�
�
�� �setup
�;ș "Wimp_Initialise",200,!taskid%,"CardBase" � version%
�6ș "Wimp_OpenTemplate",,"<CardBase$Dir>.Templates"
�Eș "Wimp_LoadTemplate",,q%,indirect%,indirect%+199,-1,"display",0
�0ș "Wimp_CreateWindow",,q% � display_window%
HÈ™ "Wimp_LoadTemplate",,q%,indirect%+200,indirect%+399,-1,"fields",0
/ș "Wimp_CreateWindow",,q% � fields_window%
HÈ™ "Wimp_LoadTemplate",,q%,indirect%+400,indirect%+599,-1,"output",0
/ș "Wimp_CreateWindow",,q% � output_window%
*JÈ™ "Wimp_LoadTemplate",,q%,indirect%+600,indirect%+799,-1,"proginfo",0
4-ș "Wimp_CreateWindow",,q% � info_window%
>FÈ™ "Wimp_LoadTemplate",,q%,indirect%+800,indirect%+999,-1,"sort",0
H-ș "Wimp_CreateWindow",,q% � sort_window%
RJÈ™ "Wimp_LoadTemplate",,q%,indirect%+1000,indirect%+1199,-1,"create",0
\0ș "Wimp_CreateWindow",,q% � newfile_window%
fLÈ™ "Wimp_LoadTemplate",,q%,indirect%+1200,indirect%+1399,-1,"password",0
p1ș "Wimp_CreateWindow",,q% � password_window%
zJÈ™ "Wimp_LoadTemplate",,q%,indirect%+1400,indirect%+1599,-1,"screen",0
�/ș "Wimp_CreateWindow",,q% � screen_window%
�Hș "Wimp_LoadTemplate",,q%,indirect%+1600,indirect%+1850,-1,"save",0
�
q%!64 = 1
�-ș "Wimp_CreateWindow",,q% � save_window%
�ș "Wimp_CloseTemplate"
�!S%=�"<CardBase$Dir>.!Sprites"
�T%=�#S%+160
��#S%
�� sprites% T%
�!sprites%=T%:sprites%!8=1
�"ș "OS_SpriteOp",&109,sprites%
�<ș "OS_SpriteOp",&10A,sprites%,"<CardBase$Dir>.!Sprites"
�iccalc%=�iconbar
quit = �
abort% = �
!q% = save_window%
$q%!4 = 2
.È™"Wimp_GetIconState",,q%
8text_file_name% = q%!28
B$text_file_name% = "Output"
L�
V
`
j
t� �iconbar
~
!q%=-1
�
q%!4=0
�
q%!8=0
�q%!12=63
�q%!16=68
�q%!20=&2102
�spname$="!CardBase"
�� q%!24 (�spname$+1)
�$(q%!24)=spname$
�q%!28=sprites%
�q%!32=�spname$+1
�"ș "Wimp_CreateIcon",,q% � ic%
�=ic%
(
2
<
F� �error
P� output_file_handle% > 0 �
Z �# output_file_handle%
d output_file_handle%=0
n�
xabort% = �
�
Ȏ � �
�: � 17 : �error_message("Escape pressed"):�quick_close
�� � 67778 : �error_message("The file you are attempting to load is already open. To cure this problem dismount the disc and try again")
�� � 193 : � �cancel_message("The file can not be written to. Check the file/disk is not write protected and the disk is in the drive. OK to continue. Cancel to quit the program") = 2 �
� �quick_close
� �
�$ �emergency_close
� �
҇ � 1196 :� �cancel_message("The file can not be found and data has been lost. OK to continue. Cancel to quit the program") = 2 �
� �quick_close
� �
�$ �emergency_close
� �
� � 222 : � �cancel_message("The file has been closed by another application or the disk dismounted. OK to continue. Cancel to quit the program") = 2 �
�quick_close
�
"$ �emergency_close
, �
6
@� � �cancel_message(�$+" (internal error) "+�(�)+" / " +�(�)+" OK to contine. Cancel to quit the program")= 2 � �quick_close
J�
T�
^
h
r
|
�
�
�� �error_message(text$)
�ș"Hourglass_Smash"
�ș"Wimp_DragBox",,-1
�
!block%=�
�$(block%+4)=text$
�.ș "Wimp_ReportError",block%,1,"!CardBase"
��
�
�
�� �message(text$)
�ș"Hourglass_Smash"
È™"Wimp_DragBox",,-1
!block%=�
$(block%+4)=text$
&/È™ "Wimp_ReportError",block%,17,"!CardBase"
0�
:
D
N
X� �cancel_message(text$)
b(� returns 0,1,2 for none, ok, cancel
l� r0,r1
vÈ™"Hourglass_Smash"
�ș"Wimp_DragBox",,-1
�
!block%=�
�$(block%+4)=text$
�7ș "Wimp_ReportError",block%,23,"!CardBase" � r0,r1
�=r1
��
�
�
�� �glass(o%)
�
� o% �
� ș"Hourglass_On"
��
� ș"Hourglass_Off"
�
�
*
� �finish
4È™ "Wimp_CloseDown"
>�
H
R
\
f
p� �redraw_window(handle%)
z!block% = handle%
�)ș"Wimp_RedrawWindow",,block% � more%
�ȕ more%
�, ș "Wimp_GetRectangle",,block% � more%
��
��
�
�
�A� �icon(whandle%,ix%,iy%,iw%,ih%,flag%, text$, d1%, d2%, d3%)
�block%!0 = whandle%
�block%!4 = ix%
�block%!8 = iy%
�block%!12 = ix% + iw%
�block%!16 = iy% + ih%
block%!20 = flag%
� d1% = 0 �
$(block%!24) = text$
$�
. block%!24 = d1%
8 block%!28 = d2%
B block%!32 = d3%
L�
V*ș"Wimp_CreateIcon",,block% � ihandle%
`
=ihandle%
j
t
~
�
�
�� �createicons
�N� windowhandle,minx,miny,length, height, flags, sprite,text, valid, length
�%� text, no background is &7000511
�'� text, with background is &7000135
�2� writable icon, validated, in box is &700F53D
�Vnf_1% = �icon(newfile_window%,200,-54,200,48,&700F53D,"",filename%,valid_name%,12)
�Znf_2% =�icon(newfile_window%,200,-108,200,48,&700F53D,"",password%,valid_password%,12)
�\pw% =�icon(password_window%,400,-200,200,48,&700F53D,"",in_password%,valid_password%,12)
�Id% =�icon(display_window%,270,-62,200,48,&7000135,"",filename%,-1,12)
�Hd% =�icon(fields_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
Hd% =�icon(output_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
Hd% =�icon(screen_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
Fd% =�icon(sort_window%,280,-62,200,48,&7000135,"",filename%,-1,12)
Kd% =�icon(display_window%,700,-62,180,48,&7000135,"",rec_number%,-1,12)
(
2-� a% = field_des% � field_des% + 2196 � 4
<2 !a% = &D0D0D0D : � SET THE AYYAY TO EMPTY
F�
P
Z� a% = 0 � 496 � 4
d output_list%!a% = &D0D0D0D
n�
x
�� a% = 0 � 296 � 4
� sort_field%!a% = &D0D0D0D
��
�
�� a% = 0 � 1996 � 4
�# output_display%!a% = &D0D0D0D
��
�
�� a% = 0 � 196 � 4
� search_list%!a% = &D0D0D0D
��
�
�� a% = 0 � 1996 � 4
# output_display%!a% = &D0D0D0D
�
"
,
6� row% = 0 � max_fields
@mname%(row%) = �icon(fields_window%,50,-250-row%*60,200,48,&700F535,"",field_des%+100*row%,valid_name%,20)
Jotype%(row%) = �icon(fields_window%,330,-250-row%*60,40,48,&700F535,"",field_des%+22+100*row%,valid_type%,2)
Tswidth%(row%) = �icon(fields_window%,470,-250-row%*60,80,48,&700F535,"",field_des%+26+100*row%,valid_integer%,3)
^pdp%(row%) = �icon(fields_window%,600,-250-row%*60,80,48,&700F535,"",field_des%+32+100*row%,valid_integer%,2)
hgmin%(row%) = �icon(fields_window%,730,-250-row%*60,130,48,&700F535,"",field_des%+35+100*row%,-1,12)
rgmax%(row%) = �icon(fields_window%,870,-250-row%*60,130,48,&700F535,"",field_des%+47+100*row%,-1,12)
|hlist%(row%) =�icon(fields_window%,1010,-250-row%*60,250,48,&700F535,"",field_des%+60+100*row%,-1,38)
��
�
�
y% = -120
�� a% = 0 � 5
�h output_icon%(a%) = �icon(output_window%,200,y%-60*a%,700,48,&700F535,"",output_list%+70*a%,-1,60)
��
�Zoutput_icon%(6) =�icon(output_window%,280,-480,620,48,&700F535,"",search_list%,-1,200)
�
�
�
�
y% = -260
�� a% = 0 � 10 � 2
�` sort_icon%(a%) =�icon(sort_window%,20,y%-30*a%,300,48,&700F535,"",sort_field%+25*a%,-1,20)
l sort_icon%(a%+1) =�icon(sort_window%,450,y%-30*a%,50,48,&700F535,"",sort_field%+22+25*a%,valid_sort%,2)
�
&
0
:'� this is the output display dindow
D
N
y% = -120
X� a% = 0 � 5
b_ d% = �icon(screen_window%,200,y%-60*a%,1200,48,&7000511,"",output_display%+300*a%,-1,250)
l�
vJd% =�icon(screen_window%,620,-62,150,48,&7000135,"",output_rec%,-1,12)
�Gd% =�icon(screen_window%,900,-62,150,48,&7000135,"",matches%,-1,12)
�
�
�@� d% = FNicon(function%,16,-50,250,48,&7000511,"",t1%,-1,20)
��
�
�
�
�
�
� �create
��count_fields
�� number_of_fields% = 0 �
� �empty_fields
�
$ �open_window(newfile_window%)
# �open_window(fields_window%)
� � �cancel_message("Field description is not empty. Click CANCEL and drag the file icon to a directory viewer to save it. To clear the current field window click on OK") =1 �
* �empty_fields
4 �
>�
H�
R
\� �empty_fields
f0 � a% = field_des% � field_des% + 2196 � 4
p5 !a% = &D0D0D0D : � SET THE AYYAY TO EMPTY
z �
� $filename% = "DataFile"
� $pathname% = "DataFile"
� $password% = ""
� $rec_number% = "0"
� $search_list% = ""
�% �closeawindow(newfile_window%)
�$ �closeawindow(fields_window%)
�$ �open_window(newfile_window%)
�# �open_window(fields_window%)
�( �set_caret(newfile_window%,nf_1%)
��
�
� � �extract_field_description
� rec%,pos%
� rec% = 0 � max_fields
pos% = field_des%+rec%*100
$ f$(rec%,0) = $pos%
.# pos% = field_des%+rec%*100+22
8 f$(rec%,1) = $pos%
B# pos% = field_des%+rec%*100+26
L f$(rec%,2) = $pos%
V# pos% = field_des%+rec%*100+32
` f$(rec%,3) = $pos%
j# pos% = field_des%+rec%*100+35
t f$(rec%,4) = $pos%
~# pos% = field_des%+rec%*100+47
� f$(rec%,5) = $pos%
�# pos% = field_des%+rec%*100+60
� f$(rec%,6) = $pos%
� � � f$(rec%,0) > 0 �
� field_used%(rec%) = �
� �
� field_used%(rec%) = �
� �
��
�d=�Field_des_ok
��
�
� �field_name_ok
)� rec%, rec1%, rec2%, length%, field%
ok=�
(� rec% = 0 � max_fields
2 length% = 0
< � field% = 0 � 6
F/ length% = length% + �(f$(rec%,field%))
P �
Z( � length% > 0 � �(f$(rec%,0))=0 �
d ok = �
nK �error_message("Field number "+�(rec%+1)+" does not have a name")
x �
��
�� rec1% = 0 � max_fields-1
�% � rec2% = rec1%+1 � max_fields
�: � f$(rec1%,0) = f$(rec2%,0) � �(f$(rec2%,0)) >0 �
� ok = �
�L �error_message("There are two fields with the name "+f$(rec2%,0))
�
�
� �
��
�=ok
�
�
�
� �field_len_ok
� rec%
� rec% = 0 � max_fields
" � �(f$(rec%,0))>0 �
, � �(f$(rec%,2))=0 �
6V �error_message("Field '"+f$(rec%,0)+"' must have a width greater than zero")
@ �
JA � (f$(rec%,1)="N" � f$(rec%,1)="n") � �(f$(rec%,2)) > 20 �
T] �error_message("Field '"+f$(rec%,0)+"' is numeric so its width must not exceed 20")
^ �
h �
r�
|=�
�
�
�� �field_type_ok
�� rec%, ok%
�ok% = �
�� rec% = 0 � max_fields
�, � �(f$(rec%,0))>0 � �(f$(rec%,1))=0 �
�E �error_message("Field "+f$(rec%,0)+" does not have a type")
� ok% = �
� �
��
�=ok%
�
� �field_max_ok
� rec%, ok%
&� rec% = 0 � max_fields
0> � �(f$(rec%,0))>0 � (f$(rec%,1) ="N" � f$(rec%,1) ="n") �
: � � �numeric(f$(rec%,4)) �
DN �error_message("Field "+f$(rec%,0)+" does not have a numeric minimum")
N �
X �
b�
l� rec% = 0 � max_fields
v> � �(f$(rec%,0))>0 � (f$(rec%,1) ="N" � f$(rec%,1) ="n") �
� � � �numeric(f$(rec%,5)) �
�N �error_message("Field "+f$(rec%,0)+" does not have a numeric maximum")
� �
� �
��
�=ok%
�
�
�� �field_date_ok
�� rec%, ok%
�� rec% = 0 � max_fields
�? � �(f$(rec%,0))>0 � (f$(rec%,1) ="D" � f$(rec%,1) ="d") �
�6 � � �valid_date(f$(rec%,4)) � �(f$(rec%,4))>0 �
!\ �error_message("Field "+f$(rec%,0)+" does not have a correctly formed minimum date")
! �
! �
! �
!*� rec% = 0 � max_fields
!4> � �(f$(rec%,0))>0 � (f$(rec%,1) ="d" � f$(rec%,1) ="D") �
!>5 � � �valid_date(f$(rec%,5)) � �(f$(rec%,5))>0 �
!H\ �error_message("Field "+f$(rec%,0)+" does not have a correctly formed maximum date")
!R �
!\ �
!f�
!p=ok%
!z
!�
!�
!�
!�� �Field_des_ok
!�[� �field_name_ok � �field_len_ok � �field_type_ok � �field_max_ok � �field_date_ok �
!� = �
!��
!� =�
!��
!�
!�
!�� �numeric(text$)
!�
� i%, ok%
" ok%=�
"� �(text$) > 0 �
" � i% = 1 � �(text$)
"$ c$ = �text$,i%,1)
".- � c$ <"." � c$>"9" � c$="/" � ok% = �
"8 �
"B�
"L = ok%
"V
"`� �valid_date(date$)
"j� ok%, day%, month%, year%
"t5ok% = � : � allow zero null entries
"~� �(date$) >0 �
"�� �(date$) <>8 �
"� ok% = �
"��
"� day% = �(�date$,2))
"� month% = �(�date$,4,2))
"� year% = �(�date$,7,2))
"� � year% � 4 = 0 �
"� days_in_feb% = 29
"� �
"� days_in_feb% = 28
"� �
"�* � (day% > 31) � (day% < 1) � ok% = �
# - � (month% >12) � (month% < 1) � ok% = �
#
Ȏ month% �
#* � 4,6,9,11 : � day% > 30 � ok% = �
#4 � 2 : � day% > days_in_feb% � ok% = �
#( �
#2�
#<�
#F=ok%
#P
#Z
#d� �start_drag
#n � wex%,wey%
#x !block% = newfile_window%
#�% ș"Wimp_GetWindowState",,block%
#�! wex% = block%!4 - block%!20
#�" wey% = block%!16 - block%!24
#�0 block%!4 = 2 : � icon handle for drag icon
#�# ș"Wimp_GetIconState",,block%
#� !block% = newfile_window%
#� block%!4 = 5
#� block%!8 = block%!8 +wex%
#�! block%!12 = block%!12 +wey%
#�! block%!16 = block%!16 +wex%
#�! block%!20 = block%!20 +wey%
#� block%!24 = 0
#� block%!28 = 0
$ block%!32 = &7FFFFFFF
$ block%!36 = &7FFFFFFF
$ È™"Wimp_DragBox",,block%
$"�
$,
$6� �count_fields
$@�extract_field_description
$Jnumber_of_fields% = 0
$T� rec% = 0 � max_fields
$^ � �(f$(rec%,0)) > 0 �
$h number_of_fields% +=1
$r �
$|�
$��
$�
$�
$�� �new_save
$��count_fields
$�� number_of_fields% = 0 �
$�A �error_message("There must be at least one field defined")
$��
$�#ș"Wimp_GetPointerInfo",,block%
$�block%!20 = 64
$�block%!32 = 0
$�block%!36 = 1
$�block%!40 = block%!12
%block%!44 = block%!16
%block%!48 = !block%
%block%!52 = block%!4
%&*block%!56 = 10000 : � size of the file
%0/block%!60 = &778 : � file type of the file
%:$(block%+64) = $filename%
%D"?(block%+65+�($filename%)) = 0
%N9È™"Wimp_SendMessage",17,block%+20,block%!12,block%!16
%X�
%b�
%l
%v� �get_name(P%)
%� A$=""
%�ȕ ?P%<>0 � ?P%<> 13
%� A$ = A$+�?P%:P%+=1
%��
%�=A$
%�
%�
%�� �leaf(path$)
%�ȕ �path$,".")
%�path$=�path$,�path$,".")+1)
%��
%�
=path$
%�
&
&� �datasave(b)
&� loaded% �
& � i% = 0 � 96 � 4
&* message_block%!i% = b!i%
&4�
&>9� copy the message block since wimp poll currupts it!
&H1�produce_output(�get_name(message_block%+44))
&R6� �get_name(message_block%+44) <> "<Wimp$Scrap>" �
&\6 $text_file_name% = �get_name(message_block%+44)
&f�
&p&message_block%!12=message_block%!8
&zmessage_block%!16=3
&�!message_block% = 64
&�Nș"Wimp_SendMessage",17,message_block%,message_block%!20,message_block%!24
&�
&��
&��saveit(�get_name(b+44))
&� $pathname% = �get_name(b+44)
&�"$filename% = �leaf($pathname%)
&�b!12=b!8
&�
b!16=3
&�!b = 64
&�'ș"Wimp_SendMessage",17,b,b!20,b!24
&��
&��
'
'
'
'$� �saveit(name$)
'.&� This saves a file the first time
'8� rec%
'Bfile% = �(name$)
'L-� a% = field_des% � field_des% + 2196 � 4
'V �#file%,!a%
'`�
'jc_f_v$() = ""
'tnumber_of_fields% = 0
'~number_of_records% = 1
'�record_size% = 0
'�� rec% = 0 � max_fields
'�/ record_size%=record_size%+�(f$(rec%,2))+2
'� � �(f$(rec%,0)) > 0 �
'� number_of_fields% +=1
'� �
'��
'�*record_size%=20+record_size%*over_size
'�� #file%,$password%
'�� #file%, $filename%
'� � #file%, number_of_records%
'�� #file%, record_size%
( � #file%, number_of_fields%
(
!� #file%, 1 : � record number
(
(� rec% = 0 � max_fields
((! � #file%, field_used%(rec%)
(2�
(<
(F.� a% = output_list% � output_list%+496 � 4
(P � #file%,!a%
(Z�
(d
(n.� a% = search_list% � search_list%+196 � 4
(x � #file%,!a%
(��
(�
(�,� a% = sort_field% � sort_field%+296 � 4
(� � #file%,!a%
(��
(�
(�
(�
(�
(�
(��write_record(1)
(�� #file%
(�
file% = 0
)�("settype "+name$+" 778")
)"�closeawindow(newfile_window%)
)!�closeawindow(fields_window%)
)"loaded% = �
),�load(name$)
)6�
)@
)J
)T
)^� �load(name$)
)h� loaded% �
)rs �error_message("The file '"+$filename%+"' is still open and must be closed before a new file can be loaded")
)|�
)� � �full_access(name$) �
)�' �closeawindow(newfile_window%)
)�& �closeawindow(fields_window%)
)�& current_file_name$ = name$+�0
)�. ș"OS_File",5,name$,,,,,0 � ,,r2%,r3%
)� date_stamp%!0 = r3%
)�" date_stamp%?4 = r2% � &FF
)�G ș"OS_ConvertStandardDateAndTime",date_stamp%,create_date%,100
)�( create_date$=�$create_date%,20)
)� file% = �(name$)
)�2 � a% = field_des% � field_des% + 2196 � 4
)� �#file%,!a%
)�
�
* � #file%,$password%
* � #file%, $filename%
*% � #file%, number_of_records%
*& � #file%, record_size%
*0$ � #file%, number_of_fields%
*: � #file%, current_rec%
*D � rec% = 0 � max_fields
*N' � #file%, field_used%(rec%)
*X
�
*b3 � a% = output_list% � output_list%+496 � 4
*l � #file%,!a%
*v
�
*�3 � a% = search_list% � search_list%+196 � 4
*� � #file%,!a%
*�
�
*�1 � a% = sort_field% � sort_field%+296 � 4
*� � #file%,!a%
*�
�
*�# �read_record(current_rec%)
*�' $rec_number% = �(current_rec%)
*� loaded% = �
*�# �extract_field_description
*� �create_display_icons
*� �password_check
*�3 � � inhibit% �open_window(display_window%)
+ �
+x �error_message("This file can not be loaded since the file is locked or does not have read or write access")
+
+ �
+*�
+4�
+>
+H
+R
+\
+f� �create_display_icons
+p;� change validation string to match the type definition
+z� d%, f%,l%,w%
+�#� f% = 0 � number_of_fields% -1
+�wdisplay_icon%(f%+number_of_fields%)=�icon(display_window%,50,-300-f%*60,300,48,&7000511,"",field_des%+100*f%,-1,20)
+�Dl% = �(f$(f%,2)) : � set length of box to a suitable value
+�w% = l%*16 +48
+�� w%>400 � w%=400
+�ldisplay_icon%(f%) = �icon(display_window%,400,-300-f%*60,w%,48,&700F535,"",display_data%+300*f%,-1,l%+1)
+��
+��
+�
+�� �destroy_display_icons
+�*� f% = 2*number_of_fields% -1 � 0 � -1
+� � display_icon%(f%) > 0 �
+�! !block% = display_window%
,$ block%!4 = display_icon%(f%)
,# È™"Wimp_DeleteIcon",,block%
, �
,$�
,.�
,8
,B
,L
,V� �environment
,`ș "OS_GetEnv" � c$
,jc$=�c$,�c$-20)
,tȕ �c$,1) <>" " � �c$ <>0
,~ c$=�c$,�c$-1)
,��
,�� c$ = " " � c$ =""
,��
,�
,�
,�
,�
,�� �ackload(b)
,�b!12=b!8
,�b!16 = 4
,�!b = 64
,�!ș"Wimp_SendMessage",17,b,b!4
- �
-
-� �dataload(b)
-� b!40 = &778 �
-( �load(�get_name(b+44))
-2 �ackload(b)
-<�
-F�
-P
-Z
-d
-n
-x
-�
-�� �extract_record_data
-�D� This takes the data from the icons and puts them into an array
-�� f%
-�"� f% = 0 � number_of_fields%-1
-� p% =display_data%+f%*300
-� c_f_v$(f%) = $p%
-��
-��
-�
-�� �clear_record
-�� f%
-�"� f% = 0 � number_of_fields%-1
. p% =display_data%+f%*300
. $p% = ""
.�
."�
.,
.6
.@� �date(date$)
.J9 =�(�date$,2))+100*�(�date$,4,2))+10000*�(�date$,2))
.T
.^
.h
.r#� �valid_min(value$,type$,min$)
.| � ok%
.�ok% = �
.� � � min$ >0 � � value$ > 0 �
.�Ȏ type$ �
.�+ � "t","T" : � value$ < min$ � ok% = �
.�1 � "N","n" : � �(value$) < �(min$) � ok% = �
.�9 � "D","d" : � �date(value$) < �date(min$) � ok% = �
.��
.��
.�=ok%
.�
.�#� �valid_max(value$,type$,max$)
.� � ok%
.�ok% = �
/ � � max$ >0 � � value$ > 0 �
/Ȏ type$ �
/+ � "t","T" : � value$ > max$ � ok% = �
/&1 � "N","n" : � �(value$) > �(max$) � ok% = �
/09 � "D","d" : � �date(value$) > �date(max$) � ok% = �
/:�
/D�
/N=ok%
/X
/b%� �valid_list(value$,type$,list$)
/l � ok%
/vok% = �
/�� � list$ >0 �
/�$ � �list$,value$) = 0 � ok% = �
/��
/�=ok%
/�
/�
/�� �valid_record
/�ok% = �
/�f% = -1
/�ȕ ok% � f% < max_fields
/� f%+=1
/� � field_used%(f%) �
/�G � (f$(f%,1) ="d" � f$(f%,1) ="D")� � �valid_date(c_f_v$(f%)) �
0 ok% = �
0? �error_message("'"+f$(f%,0)+"' has an invalid date")
0
�
0 7 � � �valid_min(c_f_v$(f%),f$(f%,1),f$(f%,4)) �
0* ok%=�
04I �error_message("'"+f$(f%,0)+"' has a value which is too low" )
0>
�
0H7 � � �valid_max(c_f_v$(f%),f$(f%,1),f$(f%,5)) �
0R ok%=�
0\J �error_message("'"+f$(f%,0)+"' has a value which is too high" )
0f
�
0p8 � � �valid_list(c_f_v$(f%),f$(f%,1),f$(f%,6)) �
0z ok%=�
0�N �error_message("'"+f$(f%,0)+"' has a value which is not in the list")
0�
�
0�> � f$(f%,1) = "N" � f$(f%,1)="n" � �(f$(f%,3)) > 0 �
0� A% = @%
0�/ @% =&0102000A + �(f$(f%,3))*&100
0�! � �c_f_v$(f%) >0 �
0�. c_f_v$(f%) = �(�(c_f_v$(f%)))
0� �
0� @%=A%
0�& � �c_f_v$(f%),1) ="." �
0�) c_f_v$(f%)= �c_f_v$(f%))
0� �
0�
�
1 �
1
�
1 �
1$ �
1.
�
18�
1B=ok%
1L
1V� �record_space
1`� total%
1jtotal% = 0
1t� f% = 0 � max_fields
1~# total% = total% + �c_f_v$(f%)
1��
1�=total%
1�
1�
1�� �next_record
1��extract_record_data
1�� �valid_record �
1�D � �(�record_space = 0 � �($rec_number%) = number_of_records%) �
1�$ �write_record(�($rec_number%))
1�) $rec_number% = �(�($rec_number%)+1)
1�. � �($rec_number%) > number_of_records% �
1� number_of_records%+=1
2 �clear_record
2
�
2& �read_record(�($rec_number%))
2 �
2( �
22�
2<�update_display
2F�
2P
2Z� �previous_record
2d�extract_record_data
2n� �valid_record �
2x$ �write_record(�($rec_number%))
2� � �($rec_number%) > 1 �
2�) $rec_number% = �(�($rec_number%)-1)
2�# �read_record(�($rec_number%))
2� �
2�
�7
2� �
2��
2��update_display
2��
2�
2�� �start
2��extract_record_data
2�� �valid_record �
3$ �write_record(�($rec_number%))
3 � �($rec_number%) > 1 �
3 $rec_number% = �(1)
3"# �read_record(�($rec_number%))
3, �
36
�7
3@ �
3J�
3T�update_display
3^�
3h
3r
3|
3�
3�� �end_of_file
3��extract_record_data
3�� �valid_record �
3�$ �write_record(�($rec_number%))
3�/ � �($rec_number%) < number_of_records% �
3�+ $rec_number% = �( number_of_records%)
3�# �read_record(�($rec_number%))
3� �
3�
�7
3� �
3��
3��update_display
4�
4
4� �update_display
4&: È™"Wimp_ForceRedraw",display_window%,0,-1000,1000,0
40( È™"Wimp_GetCaretPosition",,caret%
4: window% = caret%!0
4D icon% = caret%!4
4N$� PROCset_caret(window%,icon%)
4X�
4b
4l
4v
4�� �read_record(position%)
4�� p%, pointer%, f%
4�c_f_v$() = ""
4�*pointer% = 5000+position%*record_size%
4��#file% = pointer%
4�bad_field% = �
4�� �
4�
f% = 0
4�0ȕ f% <(number_of_fields% ) � � bad_field%
4� � � � bad_field% = �
4� � � bad_field% �
4� � #file%, c_f_v$(f%)
4� p% =display_data%+f%*300
5 $p% =c_f_v$(f%)
5 f% +=1
5 �
5 �
5*� �
54�
5>
5H
5R� �write_record(position%)
5\� p%, pointer%
5f*pointer% = 5000+position%*record_size%
5p�#file% = pointer%
5z"� f% = 0 � number_of_fields%-1
5� � #file%, c_f_v$(f%)
5��
5��
5�
5�
5�
5�� �emergency_close
5� file% = 0
5� loaded% = �
5� inhibit% = �
5�& �closeawindow(display_window%)
5�# �closeawindow(sort_window%)
5�% �closeawindow(output_window%)
6% �closeawindow(fields_window%)
6' �closeawindow(password_window%)
6% �closeawindow(screen_window%)
6$# �closeawindow(save_window%)
6. �destroy_display_icons
68 �empty_fields
6B& �closeawindow(newfile_window%)
6L% �closeawindow(fields_window%)
6V�
6`
6j
6t
6~� �close_down_file
6�� file% <> 0 �
6� �#file% = 0
6� number_of_fields% = 0
6� � rec% = 0 � max_fields
6� � �(f$(rec%,0)) > 0 �
6� number_of_fields% +=1
6� �
6� �
6� � �field_length_ok �
6�1 � a% = field_des% � field_des% + 2196 � 4
6� �#file%,!a%
6� �
7 � #file%,$password%
7
� #file%, $filename%
7$ � #file%, number_of_records%
7 � #file%, record_size%
7(# � #file%, number_of_fields%
72! � #file%, �($rec_number%)
7< � rec% = 0 � max_fields
7F% � #file%, field_used%(rec%)
7P �
7Z
7d2 � a% = output_list% � output_list%+496 � 4
7n � #file%,!a%
7x �
7�2 � a% = search_list% � search_list%+196 � 4
7� � #file%,!a%
7� �
7�0 � a% = sort_field% � sort_field%+296 � 4
7� � #file%,!a%
7� �
7� �extract_record_data
7�& �write_record(�($rec_number%))
7� � #file%
7� file% = 0
7� loaded% = �
7� inhibit% = �
7�& �closeawindow(display_window%)
8# �closeawindow(sort_window%)
8% �closeawindow(output_window%)
8% �closeawindow(fields_window%)
8"' �closeawindow(password_window%)
8,% �closeawindow(screen_window%)
86# �closeawindow(save_window%)
8@ �destroy_display_icons
8J �empty_fields
8T& �closeawindow(newfile_window%)
8^% �closeawindow(fields_window%)
8h �
8r� �error_message("The field descriptor has been changed and is now too long. Either reduce the number of fields or reduce their length")
8| quit% = �
8� �
8��
8��
8�
8�
8�
8�
8�� �field_length_ok
8��extract_field_description
8�total% = 0
8�control% = 0
8�� f% = 0 � max_fields
8�$ total% = total% + �(f$(f%,2))
9& � �(f$(f%,0)) > 0 � control%+=2
9�
9(� total% > record_size% - control% �
9&=�
90�
9:=�
9D
9N
9X� �password_check
9b � $password% <> "" �
9l $in_password% = ""
9v& �open_window(password_window%)
9� inhibit% = �
9� �
9��
9�
9�
9�
9�� �password
9�% �closeawindow(password_window%)
9�, � �$password%,4) = �$in_password%,4) �
9� inhibit% = �
9�% �open_window(display_window%)
9� �
9�: �error_message("Incorrect password. File closing")
: �close_down_file
: �
:�
:
:*
:4� �upper(text$)
:>� result$,i%,c$
:Hresult$=""
:R� i% = 1 � �text$
:\ c$=�text$,i%,1)
:f* � c$>="a" � c$<="z" � c$=�(�(c$)�&DF)
:p result$=result$+c$
:z�
:�=result$
:�
:�#� �replace(object$,target$,by$)
:�� start%, position%
:�start% = �object$,target$)
:�
È• start%
:�.position% = �(object$)-�(target$)-start%+1
:�8object$ = �object$,start%-1)+by$+�object$,position%)
:�,start% = �object$,target$,start%+�(by$))
:��
:�=object$
:�
:�� �output_upper(text$)
;� result$,i%,c$
;quote% = �
;result$=""
;$� i% = 1 � �text$
;. c$=�text$,i%,1)
;8# � c$ = �34 � quote% = � quote%
;B � c$="," � c$ = "+"
;L= � c$=";" � i% < �text$ � i% > 1 � c$="+"+�34+" "+�34+"+"
;V � � quote% �
;`- � c$>="a" � c$<="z" � c$=�(�(c$)�&DF)
;j �
;t result$=result$+c$
;~�
;�=result$
;�
;�
;�
;�
;�
;�� �create_field_output
;�� field%, i%
;�headings$() = ""
;�Yheadings$(0)= "Field Name Type Width Decimals Minimum Maximum List"
;�$� field% = 0 � number_of_fields%
;�� headings$(field%+2)=�pad(�(field%+1),9)+�pad(f$(field%,0),20)+�pad(f$(field%,1),5)+�pad(f$(field%,2),7)+�pad(f$(field%,3),9)+�pad(f$(field%,4),8)+�pad(f$(field%,5),8)+f$(field%,6)
<