' Source code for Mainframe Mania - version 2.4 May 1, 1991 DEFINT A-Z DIM BEG.COL(200),LEN.FIELD(200),NUM.DECIMALS(200),NEG.COUNT(200) DIM WRDS$(10),LastIn$(200),LastOut$(200) '2.4 ' -------------[ Subprograms ]-------------- SUB TRAILSIGN (FIELD.TO.EDIT$,TRAIL.SIGN) STATIC TRAIL.SIGN = 0 TRAILING.SIGN$ = RIGHT$(FIELD.TO.EDIT$,1) K = INSTR(" +-",TRAILING.SIGN$) '092987 IF K < 1 THEN EXIT SUB X$ = "X" + FIELD.TO.EDIT$ L = LEN(FIELD.TO.EDIT$) J = L WHILE INSTR("0123456789",MID$(X$,J,1)) <> 0 J = J - 1 WEND IF J = L THEN EXIT SUB TRAIL.SIGN = -1 MID$(FIELD.TO.EDIT$,J+1) = MID$(FIELD.TO.EDIT$,J) MID$(FIELD.TO.EDIT$,J,1) = MID$(" -",K,1) '092987 END SUB SUB OVERSTRIKE (FLD$,SIGN.OF.NUM,WHETHER.CONVERTED) STATIC ' locate 20,1:print "overstrike got: ";fld$ WHETHER.CONVERTED = 0 SIGN.OF.NUM = 1 LAST.CHAR$ = RIGHT$(FLD$,1) IF INSTR("0123456789",LAST.CHAR$) > 0 THEN _ EXIT SUB WHETHER.CONVERTED = -1 X = INSTR("{ABCDEFGHI}JKLMNOPQR:",LAST.CHAR$) + 1 IF X > 11 THEN SIGN.OF.NUM = -1 LAST.CHAR$ = MID$("0012345678901234567890",X,1) MID$(FLD$,LEN(FLD$),1) = LAST.CHAR$ END SUB SUB FIRSTNB (STRNG$,BEG%,WHEREIS%) STATIC REM PASS STRNG$ - A STRING TO BE SEARCHED REM BEG% - POSITION TO BEGIN SEARCH REM GET WHEREIS% - POSITION IN STRNG$ OF FIRST NON-BLANK AT REM BEG% OR LATER. RETURNS 0 IF NO NON-BLANK. REM LOCATE 24,70:PRINT "FIRSTNB "; X$ = STRNG$+"!" WHEREIS% = BEG% IF WHEREIS% < 1 THEN WHEREIS% = 1 WHILE MID$(X$,WHEREIS%,1) = " " WHEREIS% = WHEREIS% + 1 WEND IF WHEREIS% > LEN(STRNG$) THEN WHEREIS% = 0 END SUB SUB LASTNB (STRNG$,BEG%,WHEREIS%) STATIC REM PASS STRNG$ - A STRING TO BE SEARCHED REM BEG% - POSITION TO BEGIN SEARCH REM GET WHEREIS% - LAST POSITION IN STRNG$ OF ANY WORD BEGINNING AT REM BEG% OR LATER. RETURNS BEG%-1 IF NO WORD AT BEG%. REM LOCATE 24,70:PRINT "LASTNB "; B = BEG IF B < 1 THEN B = 1 IF B > LEN(STRNG$) THEN_ X$ = " " _ ELSE_ X$ = MID$(STRNG$,B)+" " WHEREIS% = INSTR(X$," ") - 1 + B - 1 END SUB SUB BRKWORDS (STRNG$,WORDS$(1)) STATIC REM PASS STRNG$ - A STRING TO BE BROKEN INTO WORDS (SPACE REM DELIMITED STRINGS) REM WORDS$ - AN ARRAY TO PUT WORDS IN ONE = 1 LST = LEN(STRNG$) X$ = STRNG$ + " !" CALL FIRSTNB(X$,ONE,BS) NPARMS = 0 MAXPARMS = 10 ' UBOUND(WORDS$) WHILE BS <= LST NPARMS = NPARMS + 1 CALL LASTNB (X$,BS,ES) IF NPARMS > MAXPARMS THEN _ BS = LST+1_ ELSE_ WORDS$(NPARMS) = MID$(X$,BS,ES-BS+1):_ BS = ES+1:_ CALL FIRSTNB(X$,BS,BS) WEND 'for i=1 to nparms:print "<";words$(i);">":next I = 1 WHILE I <= NPARMS IF INSTR(WORDS$(I),"/") > 0 THEN _ FOR J = I TO NPARMS-1 : _ WORDS$(J) = WORDS$(J+1): _ NEXT : _ WORDS$(NPARMS) = "" : _ NPARMS = NPARMS - 1 _ ELSE _ I = I + 1 WEND 'print "/: ";:for i=1 to nparms: print "<";words$(i);">":next 'INPUT XX$ END SUB SUB TRIMLEFT (STRNG$) STATIC WHILE LEFT$(STRNG$,1)=" " STRNG$=MID$(STRNG$,2) WEND END SUB SUB CONVSCI (STRNG$) STATIC J = INSTR(STRNG$,"E") IF J < 1 THEN EXIT SUB IF J = LEN(STRNG$) THEN EXIT SUB Y$ = LEFT$(STRNG$,J-1) MOVE.DEC = VAL(MID$(STRNG$,J+1)) IF MOVE.DEC = 0 THEN STRNG$ = Y$ : EXIT SUB CALL TRIMLEFT (Y$) IF LEFT$(Y$,1) = "-" THEN SIGN.FIELD$ = "-" Y$ = MID$(Y$,2) ELSE SIGN.FIELD$ = "" END IF K = INSTR(Y$,".") IF K = 0 THEN K = LEN(Y$)+1 : Y$ = Y$+"." CHAR.RIGHT = LEN(Y$) - K CHAR.RIGHT$ = RIGHT$(Y$,CHAR.RIGHT) CHAR.LEFT = LEN(Y$) - 1 - CHAR.RIGHT CHAR.LEFT$ = LEFT$(Y$,CHAR.LEFT) ' PRINT "<";CHAR.LEFT$;"-";CHAR.RIGHT$;">" ' input xxx$ IF MOVE.DEC > 0 THEN IF CHAR.RIGHT < MOVE.DEC THEN CHAR.RIGHT$ = CHAR.RIGHT$ + STRING$(MOVE.DEC-CHAR.RIGHT,"0") END IF CHAR.RIGHT$ = LEFT$(CHAR.RIGHT$,MOVE.DEC) + "." + RIGHT$(CHAR.RIGHT$,LEN(CHAR.RIGHT$)-MOVE.DEC) ELSE IF CHAR.LEFT < -MOVE.DEC THEN CHAR.LEFT$ = STRING$(-MOVE.DEC-CHAR.LEFT,"0") + CHAR.LEFT$ END IF CHAR.LEFT$ = LEFT$(CHAR.LEFT$,LEN(CHAR.LEFT$)+MOVE.DEC) + "." + RIGHT$(CHAR.LEFT$,-MOVE.DEC) END IF ' LOCATE 17,1:PRINT "<";STRNG$;"> converted to <";sign.field$;char.left$;char.right$;"> "; ' input xxx$ STRNG$ = SIGN.FIELD$ + CHAR.LEFT$ + CHAR.RIGHT$ K = INSTR(STRNG$,".") ' 2.3 I = LEN(STRNG$) ' 2.3 WHILE I > K AND RIGHT$(STRNG$,1) = "0" ' 2.3 I = I - 1 ' 2.3 STRNG$ = LEFT$(STRNG$,I) ' 2.3 WEND ' 2.3 END SUB ' ---------------[ main program ]--------------- ON ERROR GOTO 1010 X$ = COMMAND$ I = (INSTR(X$,"/B") > 0) J = (INSTR(X$,"/b") > 0) RUN.BATCH = (I OR J) I = (INSTR(X$,"/T") > 0) J = (INSTR(X$,"/t") > 0) SINGLE.STEP = (I OR J) AND NOT RUN.BATCH ' SINGLE.STEP = -1 CALL BRKWORDS (X$,WRDS$()) IF WRDS$(1) <> "" THEN _ FILE.TO.EDIT$ = WRDS$(1)_ ELSE_ FILE.TO.EDIT$ = "MM.ZON" IF WRDS$(2) <> "" THEN_ FILE.TO.OUTPUT$ = WRDS$(2)_ ELSE_ FILE.TO.OUTPUT$ = "MM.DMZ" IF WRDS$(3) <> "" THEN_ FILE.OF.CONV$ = WRDS$(3)_ ELSE_ FILE.OF.CONV$ = "CONV.TBL" 100 CLS LOCATE 1,2 PRINT "Mainframe Mania 2.4 (05-01-91) QB - A Conversion Utility for Mainframe Data" '2.2 LOCATE 2,22 ' 2.2 PRINT "(c) 1987-91 by Ken Goosens" ' 2.4 LOCATE 4,10 PRINT "Format: MM[/B/T] " LOCATE 6,6 PRINT "File to convert: ";FILE.TO.EDIT$ LOCATE 6,43 PRINT "Output to: ";FILE.TO.OUTPUT$ LOCATE 8,20 PRINT "Using conversion table: ";FILE.OF.CONV$ LOCATE 18,20 IF NOT RUN.BATCH THEN INPUT "ancel or un? [ENTER = R] ",ANS$ IF ANS$ <> "" THEN _ IF INSTR("Rr",LEFT$(ANS$,1)) < 1 THEN END ST# = TIMER LOCATE 18,1:PRINT SPACE$(79); ON ERROR GOTO 900 OPEN FILE.OF.CONV$ FOR INPUT AS #1 ON ERROR GOTO 950 INPUT #1,DATA.LEN,REC.DELIMITOR$ ' print "data len=";data.len;" len delimiter=";len(rec.delimitor$) LEN.REC.DELIMITOR = LEN(REC.DELIMITOR$) ' 2.3 REC.LEN = DATA.LEN + LEN.REC.DELIMITOR ' 2.3 FIELDS.TO.CONVERT = 0 WHILE NOT EOF(1) FIELDS.TO.CONVERT = FIELDS.TO.CONVERT + 1 INPUT #1,BEG.COL(FIELDS.TO.CONVERT),_ LEN.FIELD(FIELDS.TO.CONVERT),_ NUM.DECIMALS(FIELDS.TO.CONVERT) WEND ' for i=1 to fields.to.convert:print beg.col(i),len.field(i),num.decimals(i):next CLOSE 1 ON ERROR GOTO 1000 OPEN FILE.TO.EDIT$ FOR INPUT AS #1 ON ERROR GOTO 1010 CLOSE 1 OPEN "R",1,FILE.TO.EDIT$,REC.LEN NUM.RECS# = LOF(1) NUM.RECS = INT(NUM.RECS#/REC.LEN) FIELD 1, DATA.LEN AS A$, _ ' 2.3 LEN.REC.DELIMITOR AS A.DELIMITOR$ ' 2.3 IF FILE.TO.OUTPUT$ = FILE.TO.EDIT$ THEN _ FILE.TO.OUTPUT$ = "MM.($)" OPEN FILE.TO.OUTPUT$ FOR OUTPUT AS #2 LINE.READ = 0 LOCATE 11,20 PRINT "# records to process:";NUM.RECS; LOCATE 14,20 PRINT "Processing record #"; IF SINGLE.STEP THEN _ LOCATE 15,20 : _ PRINT "Processing field: "; : _ LOCATE 16,20 : _ PRINT " Converted to: "; FOR LINES.READ = 1 TO NUM.RECS GET 1,LINES.READ IF A.DELIMITOR$ <> REC.DELIMITOR$ THEN ' 2.3 IF LINES.READ < NUM.RECS THEN ' 2.3 LOCATE 15,10 ' 2.3 PRINT "Improper record delimitor encountered on record";LINES.READ; '2.3 LOCATE 16,10 ' 2.3 PRINT "Aborting. Bad record is"; ' 2.3 LOCATE 17,1 ' 2.3 PRINT A$ ' 2.3 END ' 2.3 END IF ' 2.3 END IF ' 2.3 LOCATE 14,40 PRINT LINES.READ; NEXT.COL = 1 FOR I = 1 TO FIELDS.TO.CONVERT IF NEXT.COL < BEG.COL(I) THEN _ PRINT #2,MID$(A$,NEXT.COL,BEG.COL(I)-NEXT.COL); NEXT.COL = BEG.COL(I) + LEN.FIELD(I) FIELD.TO.EDIT$ = MID$(A$,BEG.COL(I),LEN.FIELD(I)) FIELD.SAVE$ = FIELD.TO.EDIT$ IF SINGLE.STEP THEN '2.2 LOCATE 15,38 '2.2 LFS = LEN(FIELD.SAVE$) '2.2 NSPACES = (LFS - PLFS)*(LFS < PLFS) '2.2 PRINT FIELD.SAVE$;SPACE$(NSPACES) '2.2 END IF IF FIELD.SAVE$ = LastIn$(I) THEN '2.4 X$ = LastOut$(I) '2.4 GOTO GotConversion '2.4 END IF '2.4 PLFS = LEN(FIELD.SAVE$) CALL TRAILSIGN (FIELD.TO.EDIT$,TRAIL.SIGN) CALL OVERSTRIKE (FIELD.TO.EDIT$,LEAD.SIGN,WHETHER.CONVERTED) IF WHETHER.CONVERTED OR TRAIL.SIGN THEN NEG.COUNT(I) = NEG.COUNT(I) + 1 ' print i;" ";field.to.edit$;" lftoed=";len(field.to.edit$);" ";NUM.DECIMALS(i) : input xx$ END IF FIELD.TO.EDIT$ = LEFT$(FIELD.TO.EDIT$,LEN(FIELD.TO.EDIT$)-_ NUM.DECIMALS(I))+"."+_ RIGHT$(FIELD.TO.EDIT$,NUM.DECIMALS(I)) X$ = STR$(LEAD.SIGN * VAL(FIELD.TO.EDIT$)) CALL CONVSCI (X$) ' 2.1 CALL TRIMLEFT (X$) ' 2.2 IF LEN(X$) > LEN.FIELD(I)+2 THEN ' 2.2 X$ = LEFT$(X$,LEN.FIELD(I)+2) ' 2.2 END IF ' 2.1 X$ = SPACE$(LEN.FIELD(I) + 2 - LEN(X$)) + X$ LastIn$(I) = FIELD.SAVE$ ' 2.4 LastOut$(I) = X$ ' 2.4 GotConversion: ' 2.4 PRINT #2,X$; IF SINGLE.STEP THEN _ LOCATE 16,38 : _ PRINT X$;" "; : _ ' 2.2 LOCATE 17,18 : _ INPUT " A)bort, N)on-stop, [ENTER] to continue ",ANS$ : _ IF ANS$ <> "" THEN _ ANS$ = LEFT$(ANS$,1) : _ J = INSTR ("AaNn",ANS$) : _ IF J > 0 THEN _ LOCATE 15,20 : _ PRINT SPACE$(58); : _ LOCATE 16,20 : _ PRINT SPACE$(58); : _ LOCATE 17,18 : _ PRINT SPACE$(60); : _ IF J < 3 THEN _ END _ ELSE _ SINGLE.STEP = 0 ' print "<";FIELD.SAVE$;"> converted to <";X$;">" NEXT IF NEXT.COL <= LEN(A$) THEN _ PRINT #2,MID$(A$,NEXT.COL)_ ELSE_ PRINT #2, ' print "lines.read = ";lines.read;" num.recs ";num.recs NEXT CLOSE IF FILE.TO.OUTPUT$ = "MM.($)" THEN _ KILL FILE.TO.EDIT$ : _ X$ = ":" + FILE.TO.EDIT$ : _ J = LEN(X$) : _ WHILE INSTR(":\",MID$(X$,J,1)) = 0 : _ J = J-1 : _ WEND : _ NAME FILE.TO.OUTPUT$ AS MID$(FILE.TO.EDIT$,J) LOCATE 16,1 PRINT TAB(24);"Conversion Report" TOT.CT = 0 FOR I = 1 TO FIELDS.TO.CONVERT TOT.CT = TOT.CT + NEG.COUNT(I) IF NEG.COUNT(I) > 0 THEN PRINT " FIELD ";I; " converted ";NEG.COUNT(I); NEXT IF TOT.CT = 0 THEN _ PRINT TAB(22);"- no fields changed -" PRINT FIN# = TIMER PRINT TAB(15);"Processing time:";FIN#-ST#;" seconds" END 900 CLS LOCATE 10,10 PRINT "Unable to find conversion table ";FILE.OF.CONV$ LOCATE 12,10 INPUT "Enter correct name ([ENTER] aborts) ",FILE.OF.CONV$ IF FILE.TO.EDIT$ = "" THEN _ LOCATE 14,10 : _ PRINT "Please create one with an editor.": _ END RESUME 100 950 CLS LOCATE 10,10 PRINT "Conversion table ";FILE.OF.CONV$;" not in proper format." LOCATE 12,10 PRINT "Error ";ERR;". Aborting." END 1000 CLS LOCATE 10,10 PRINT "Unable to find data file ";FILE.TO.EDIT$;" Error ";ERR LOCATE 12,10 INPUT "Enter correct name ([ENTER] aborts) ",FILE.TO.EDIT$ IF FILE.TO.EDIT$ = "" THEN END RESUME 100 1010 LOCATE 18,10 PRINT "Untrapped error ";ERR;". Aborting." END