REM Magic The Gathering Card List Database Importer REM by Andrew Gregory REM 22-Nov-1998 REM Version 1.0 PROC main: GLOBAL makelog% LOCAL dbname$( 128 ), clname$( 128 ) LOCAL start&, end& makelog% = 0 IF makelog% LOPEN "B:\OPD\MAGIC.LOG" ENDIF dbname$ = "B:\DAT\MAGIC.DBF" TRAP DELETE dbname$ clname$ = DIR$( "B:\OPD\*.TXT" ) start& = DATETOSECS( YEAR, MONTH, DAY, HOUR, MINUTE, SECOND ) WHILE clname$ <> "" ImpFile:( dbname$, clname$ ) clname$ = DIR$( "" ) ENDWH end& = DATETOSECS( YEAR, MONTH, DAY, HOUR, MINUTE, SECOND ) IF makelog% LCLOSE ENDIF PRINT "*** Done!!! (";end& - start&;" seconds) ***" GET ENDP REM Set the labels in an open database file. Existing setup information used by the Data REM application is lost, including: Tab size, Status window, Labels visible, Zoom, REM Printer setup (type, header, footer), Diamond list, Search preferences, List view REM preferences, and Sorting preferences. REM The database file must already be open (via OPEN or CREATE), and you must pass REM the logical name for it as a number (A=1,B=2,C=3,D=4). The labels must be specified REM as a single, comma-separated string. REM Example: REM OPEN "\DAT\MYDB.DBF", A, f1$, f2$, f3$ REM setlbls%:( 1, "Field 1:,Field 2:,Field 3:" ) REM CLOSE PROC setlbls%:( ln%, labels$ ) LOCAL info%( 4 ), ax%, bx%, cx%, dx%, si%, di% ODBINFO info%() REM trash current record ax% = $0300 :REM DbfTrash bx% = PEEKW( info%( ln% ) ) IF OS( $d8, ADDR( ax% ) ) AND 1 RETURN ax% OR $ff00 ENDIF REM Build descriptive record with labels sub-record (this will replace all other REM sub-records) REM NOTE: unused registers dx%, si%, di% are used as working storage ax% = $1800 :REM DbfDescRecordWrite REM set total record length (add 6 for 2 record headers, zero terminator, length byte) cx% = LEN( labels$ ) + 6 REM set sub-record type ($4) and length (add 2 for zero terminator, length byte) dx% = UADD( PEEKW( UADD( info%( ln% ), 8 ) ), 2 ) POKEW dx%, $4000 OR ( LEN( labels$ ) + 2 ) REM copy labels into DBF record dx% = UADD( dx%, 2 ) POKE$ dx%, labels$ + CHR$( 0 ) :REM zero-terminate labels REM replace commas and leading string length byte with individual label lengths si% = 1 DO di% = PEEKB( UADD( dx%, si% ) ) IF di% = 44 OR di% = 0 :REM comma or zero-terminator POKEB dx%, si% - 1 dx% = UADD( dx%, si% ) si% = 0 ENDIF si% = si% + 1 UNTIL di% = 0 REM write out record IF OS( $d8, ADDR( ax% ) ) AND 1 RETURN ax% OR $ff00 ENDIF REM trash current record ax% = $0300 :REM DbfTrash bx% = PEEKW( info%( ln% ) ) IF OS( $d8, ADDR( ax% ) ) AND 1 RETURN ax% OR $ff00 ENDIF RETURN 0 ENDP REM Strip leading and trailing spaces from the string. PROC strip$:( in$ ) LOCAL out$( 255 ), i% out$ = in$ WHILE LEFT$( out$, 1 ) = " " OR LEFT$( out$, 1 ) = CHR$( 9 ) out$ = MID$( out$, 2, 255 ) ENDWH WHILE RIGHT$( out$, 1 ) = " " OR RIGHT$( out$, 1 ) = CHR$( 13 ) OR RIGHT$( out$, 1 ) = CHR$( 10 ) out$ = LEFT$( out$, LEN( out$ ) - 1 ) ENDWH RETURN out$ ENDP REM Locate the end of b$ in a$. Returns zero if b$ is not in a$. PROC locend%:( a$, b$ ) LOCAL p% p% = LOC( a$, b$ ) IF p% <> 0 p% = p% + LEN( b$ ) ENDIF RETURN p% ENDP REM Import text card list file clname$ into database dbname$ REM mode% = 1 : Searching for set name REM 2 : Searching for card information REM submode% = 0 : Not handling for multi-line entries REM 1 : Handling multi-line Card Text REM 2 : Handling multi-line Flavour Text REM 3 : Handling multi-line Artists PROC ImpFile:( dbname$, clname$ ) LOCAL h%, ret%, line$( 255 ), mode%, submode%, count% TRAP OPEN dbname$, A, set$, title$, type$, cost$, pwrtgh$, text$, flavour$, artist$, rarity$, exp$ IF ERR <> 0 CREATE dbname$, A, set$, title$, type$, cost$, pwrtgh$, text$, flavour$, artist$, rarity$, exp$ setlbls%:( 1, "Card Set:,Card Title:,Type & Class:,Casting Cost:,Pwr/Tgh:,Card Text:,Flavour Text:,Artist:,Rarity:,Released:" ) ENDIF ret% = IOOPEN( h%, clname$, $0420 ) count% = 0 mode% = 1 submode% = 0 A.title$ = "" WHILE 1 REM read a line ret% = IOREAD( h%, UADD( ADDR( line$ ), 1 ), 255 ) IF ret% < 0 BREAK ELSE POKEB ADDR( line$ ), ret% line$ = strip$:( line$ ) ENDIF IF mode% = 1 REM check for set name IF RIGHT$( line$, 10 ) = " Card List" OR RIGHT$( line$, 10 ) = " Checklist" A.set$ = LEFT$( line$, LEN( line$ ) - 10 ) REM as an optimisation, remove " Edition" from set name ret% = LOC( A.set$, " Edition" ) IF ret% A.set$ = strip$:( LEFT$( A.set$, ret% - 1 ) + MID$( A.set$, ret% + 8, 255 ) ) ENDIF mode% = 2 PRINT A.set$; IF makelog% LPRINT "*** Importing ";A.set$;" ***" ENDIF CONTINUE ENDIF ENDIF IF mode% = 2 REM check for card data ret% = locend%:( line$, "Card Title:" ) IF ret% IF A.title$ <> "" count% = count% + 1 giPRINT GEN$( count%, 3 ) APPEND A.type$ = "" :A.cost$ = "" A.pwrtgh$ = "" :A.text$ = "" :A.flavour$ = "" A.artist$ = "" :A.rarity$ = "" :A.exp$ = "" ENDIF A.title$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF REM parse colour lines, but don't include in database ret% = locend%:( line$, "Color:" ) IF ret% submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Type:" ) IF ret% A.type$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Type & Class:" ) IF ret% A.type$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Cost:" ) IF ret% A.cost$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Pow/Tgh:" ) IF ret% A.pwrtgh$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 1 CONTINUE ENDIF ret% = locend%:( line$, "Pwr/Tgh:" ) IF ret% A.pwrtgh$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 1 CONTINUE ENDIF ret% = locend%:( line$, "Card Text:" ) IF ret% A.text$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 1 CONTINUE ENDIF ret% = locend%:( line$, "Flavor Text:" ) IF ret% A.flavour$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 2 CONTINUE ENDIF ret% = locend%:( line$, "Artist:" ) IF ret% A.artist$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 3 CONTINUE ENDIF ret% = locend%:( line$, "Artists:" ) IF ret% A.artist$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 3 CONTINUE ENDIF ret% = locend%:( line$, "Rarity:" ) IF ret% A.rarity$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Expansion:" ) IF ret% A.exp$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Book:" ) IF ret% A.exp$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Released:" ) IF ret% A.exp$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF ret% = locend%:( line$, "Relased:" ) IF ret% A.exp$ = strip$:( MID$( line$, ret%, 255 ) ) submode% = 0 CONTINUE ENDIF IF submode% = 1 A.text$ = strip$:( A.text$ + LEFT$( " " + line$, 255 - LEN( A.text$ ) ) ) CONTINUE ENDIF IF submode% = 2 A.flavour$ = strip$:( A.flavour$ + LEFT$( " " + line$, 255 - LEN( A.flavour$ ) ) ) CONTINUE ENDIF IF submode% = 3 A.artist$ = strip$:( A.artist$ + LEFT$( " " + line$, 255 - LEN( A.artist$ ) ) ) CONTINUE ENDIF IF makelog% AND line$ <> "" LPRINT line$ ENDIF ENDIF ENDWH IF A.title$ <> "" count% = count% + 1 giPRINT GEN$( count%, 3 ) APPEND ENDIF IOCLOSE( h% ) CLOSE giPRINT "" PRINT GEN$( count%, -4 ) + " cards added." IF makelog% LPRINT "*** Done ***" ENDIF ENDP