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) <