diff --git a/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java b/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java index 31fe996..70bd288 100644 --- a/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java +++ b/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java @@ -65,35 +65,13 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons break; SourceLine line = new SourceLine (this, buffer, ptr); + sourceLines.add (line); + checkXref (line); ptr += line.length; currentAddress = nextAddress; - - for (SubLine subline : line.sublines) - { - for (String symbol : subline.getSymbols ()) - checkVar (symbol, line.lineNumber, symbolLines, uniqueSymbols); - for (String symbol : subline.getArrays ()) - checkVar (symbol, line.lineNumber, arrayLines, uniqueArrays); - for (String symbol : subline.getFunctions ()) - checkFunction (symbol, line.lineNumber); - for (int targetLine : subline.getGosubLines ()) - addNumberInt (line.lineNumber, targetLine, gosubLines); - for (int targetLine : subline.getGotoLines ()) - addNumberInt (line.lineNumber, targetLine, gotoLines); - for (int num : subline.getConstantsInt ()) - addNumberInt (line.lineNumber, num, constantsInt); - for (float num : subline.getConstantsFloat ()) - addNumberFloat (line.lineNumber, num, constantsFloat); - if (subline.callTarget != null) - addString (line.lineNumber, subline.callTarget, callLines); - for (String s : subline.getStringsText ()) - { - stringsText.add (s); - stringsLine.add (line.lineNumber); - } - } } + endPtr = ptr; longestVarName = getLongestName (); @@ -106,90 +84,6 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons formatLineNumber = "%" + maxDigits + "d "; } - // ---------------------------------------------------------------------------------// - void checkVar (String var, int lineNumber, Map> map, - Map> unique) - // ---------------------------------------------------------------------------------// - { - List lines = map.get (var); - if (lines == null) - { - lines = new ArrayList<> (); - map.put (var, lines); - } - - if (lines.size () == 0) - lines.add (lineNumber); - else - { - int lastLine = lines.get (lines.size () - 1); - if (lastLine != lineNumber) - lines.add (lineNumber); - } - - checkUniqueName (var, unique); - } - - // ---------------------------------------------------------------------------------// - void checkFunction (String var, int lineNumber) - // ---------------------------------------------------------------------------------// - { - List lines = functionLines.get (var); - if (lines == null) - { - lines = new ArrayList<> (); - functionLines.put (var, lines); - } - - if (lines.size () == 0) - lines.add (lineNumber); - else - { - int lastLine = lines.get (lines.size () - 1); - if (lastLine != lineNumber) - lines.add (lineNumber); - } - } - - // ---------------------------------------------------------------------------------// - private void addNumberInt (int sourceLine, Integer key, Map> map) - // ---------------------------------------------------------------------------------// - { - List lines = map.get (key); - if (lines == null) - { - lines = new ArrayList<> (); - map.put (key, lines); - } - lines.add (sourceLine); - } - - // ---------------------------------------------------------------------------------// - private void addNumberFloat (int sourceLine, Float key, Map> map) - // ---------------------------------------------------------------------------------// - { - List lines = map.get (key); - if (lines == null) - { - lines = new ArrayList<> (); - map.put (key, lines); - } - lines.add (sourceLine); - } - - // ---------------------------------------------------------------------------------// - private void addString (int sourceLine, String key, Map> map) - // ---------------------------------------------------------------------------------// - { - List lines = map.get (key); - if (lines == null) - { - lines = new ArrayList<> (); - map.put (key, lines); - } - lines.add (sourceLine); - } - // ---------------------------------------------------------------------------------// @Override public String getText () @@ -210,9 +104,9 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons } if (basicPreferences.formatApplesoft) - userFormat (text); + getUserFormat (text); else - appleFormat (text); + getAppleFormat (text); if (basicPreferences.showAllXref) addXref (text); @@ -221,7 +115,7 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons } // ---------------------------------------------------------------------------------// - private void appleFormat (StringBuilder text) + private void getAppleFormat (StringBuilder text) // ---------------------------------------------------------------------------------// { int loadAddress = getLoadAddress (); @@ -264,7 +158,7 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons } // ---------------------------------------------------------------------------------// - private void userFormat (StringBuilder fullText) + private void getUserFormat (StringBuilder fullText) // ---------------------------------------------------------------------------------// { int indentSize = 2; @@ -1079,4 +973,128 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons return (ptr <= 1) ? symbol : symbol.substring (0, 2) + symbol.substring (ptr + 1); } + + // ---------------------------------------------------------------------------------// + private void checkXref (SourceLine line) + // ---------------------------------------------------------------------------------// + { + for (SubLine subline : line.sublines) + { + for (String symbol : subline.getSymbols ()) + checkVar (symbol, line.lineNumber, symbolLines, uniqueSymbols); + for (String symbol : subline.getArrays ()) + checkVar (symbol, line.lineNumber, arrayLines, uniqueArrays); + for (String symbol : subline.getFunctions ()) + checkFunction (line.lineNumber, symbol); + for (int targetLine : subline.getGosubLines ()) + addNumberInt (line.lineNumber, targetLine, gosubLines); + for (int targetLine : subline.getGotoLines ()) + addNumberInt (line.lineNumber, targetLine, gotoLines); + for (int num : subline.getConstantsInt ()) + addNumberInt (line.lineNumber, num, constantsInt); + for (float num : subline.getConstantsFloat ()) + addNumberFloat (line.lineNumber, num, constantsFloat); + if (subline.callTarget != null) + addString (line.lineNumber, subline.callTarget, callLines); + for (String s : subline.getStringsText ()) + { + stringsText.add (s); + stringsLine.add (line.lineNumber); + } + } + } + + // ---------------------------------------------------------------------------------// + void checkVar (String var, int lineNumber, Map> map, + Map> unique) + // ---------------------------------------------------------------------------------// + { + List lines = map.get (var); + if (lines == null) + { + lines = new ArrayList<> (); + map.put (var, lines); + } + + if (lines.size () == 0) + lines.add (lineNumber); + else + { + int lastLine = lines.get (lines.size () - 1); + if (lastLine != lineNumber) + lines.add (lineNumber); + } + + checkUniqueName (var, unique); + } + + // ---------------------------------------------------------------------------------// + void checkFunction (int sourceLine, String var) + // ---------------------------------------------------------------------------------// + { + List lines = functionLines.get (var); + if (lines == null) + { + lines = new ArrayList<> (); + functionLines.put (var, lines); + } + + addLine (lines, sourceLine); + } + + // ---------------------------------------------------------------------------------// + private void addNumberInt (int sourceLine, Integer key, Map> map) + // ---------------------------------------------------------------------------------// + { + List lines = map.get (key); + if (lines == null) + { + lines = new ArrayList<> (); + map.put (key, lines); + } + + addLine (lines, sourceLine); + } + + // ---------------------------------------------------------------------------------// + private void addNumberFloat (int sourceLine, Float key, Map> map) + // ---------------------------------------------------------------------------------// + { + List lines = map.get (key); + if (lines == null) + { + lines = new ArrayList<> (); + map.put (key, lines); + } + + addLine (lines, sourceLine); + } + + // ---------------------------------------------------------------------------------// + private void addString (int sourceLine, String key, Map> map) + // ---------------------------------------------------------------------------------// + { + List lines = map.get (key); + if (lines == null) + { + lines = new ArrayList<> (); + map.put (key, lines); + } + + addLine (lines, sourceLine); + } + + // ---------------------------------------------------------------------------------// + private void addLine (List lines, int lineNumber) + // ---------------------------------------------------------------------------------// + { + if (lines.size () == 0) + lines.add (lineNumber); + else + { + int lastLine = lines.get (lines.size () - 1); + if (lastLine != lineNumber) + lines.add (lineNumber); + } + } } \ No newline at end of file