applesoft constants

This commit is contained in:
Denis Molony 2021-01-05 13:24:23 +10:00
parent 0ffff61265
commit d801e85736
4 changed files with 56 additions and 41 deletions

View File

@ -18,13 +18,17 @@ public class ApplesoftBasicProgram extends BasicProgram
private final List<SourceLine> sourceLines = new ArrayList<> (); private final List<SourceLine> sourceLines = new ArrayList<> ();
private final int endPtr; private final int endPtr;
final Map<Integer, List<Integer>> gotoLines = new TreeMap<> (); private final Map<Integer, List<Integer>> gotoLines = new TreeMap<> ();
final Map<Integer, List<Integer>> gosubLines = new TreeMap<> (); private final Map<Integer, List<Integer>> gosubLines = new TreeMap<> ();
final Map<String, List<Integer>> callLines = new TreeMap<> (); private final Map<Integer, List<Integer>> constants = new TreeMap<> ();
private final Map<String, List<Integer>> callLines = new TreeMap<> ();
private final Map<String, List<Integer>> symbolLines = new TreeMap<> (); private final Map<String, List<Integer>> symbolLines = new TreeMap<> ();
private final Map<String, List<Integer>> functionLines = new TreeMap<> (); private final Map<String, List<Integer>> functionLines = new TreeMap<> ();
private final Map<String, List<Integer>> arrayLines = new TreeMap<> (); private final Map<String, List<Integer>> arrayLines = new TreeMap<> ();
private final Map<String, List<String>> uniqueSymbols = new TreeMap<> (); private final Map<String, List<String>> uniqueSymbols = new TreeMap<> ();
private final Map<String, List<String>> uniqueArrays = new TreeMap<> ();
final List<Integer> stringsLine = new ArrayList<> (); final List<Integer> stringsLine = new ArrayList<> ();
final List<String> stringsText = new ArrayList<> (); final List<String> stringsText = new ArrayList<> ();
@ -53,15 +57,17 @@ public class ApplesoftBasicProgram extends BasicProgram
for (SubLine subline : line.sublines) for (SubLine subline : line.sublines)
{ {
for (String symbol : subline.getSymbols ()) for (String symbol : subline.getSymbols ())
checkVar (symbol, line.lineNumber); checkVar (symbol, line.lineNumber, symbolLines, uniqueSymbols);
for (String symbol : subline.getArrays ()) for (String symbol : subline.getArrays ())
checkArray (symbol, line.lineNumber); checkVar (symbol, line.lineNumber, arrayLines, uniqueArrays);
for (String symbol : subline.getFunctions ()) for (String symbol : subline.getFunctions ())
checkFunction (symbol, line.lineNumber); checkFunction (symbol, line.lineNumber);
for (int targetLine : subline.getGosubLines ()) for (int targetLine : subline.getGosubLines ())
addXref (line.lineNumber, targetLine, gosubLines); addXref (line.lineNumber, targetLine, gosubLines);
for (int targetLine : subline.getGotoLines ()) for (int targetLine : subline.getGotoLines ())
addXref (line.lineNumber, targetLine, gotoLines); addXref (line.lineNumber, targetLine, gotoLines);
for (int targetLine : subline.getConstants ())
addXref (line.lineNumber, targetLine, constants);
if (subline.callTarget != null) if (subline.callTarget != null)
addXref (line.lineNumber, subline.callTarget, callLines); addXref (line.lineNumber, subline.callTarget, callLines);
} }
@ -70,14 +76,15 @@ public class ApplesoftBasicProgram extends BasicProgram
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
void checkVar (String var, int lineNumber) void checkVar (String var, int lineNumber, Map<String, List<Integer>> map,
Map<String, List<String>> unique)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
{ {
List<Integer> lines = symbolLines.get (var); List<Integer> lines = map.get (var);
if (lines == null) if (lines == null)
{ {
lines = new ArrayList<> (); lines = new ArrayList<> ();
symbolLines.put (var, lines); map.put (var, lines);
} }
if (lines.size () == 0) if (lines.size () == 0)
@ -89,30 +96,7 @@ public class ApplesoftBasicProgram extends BasicProgram
lines.add (lineNumber); lines.add (lineNumber);
} }
checkUniqueName (var); checkUniqueName (var, unique);
}
// ---------------------------------------------------------------------------------//
void checkArray (String var, int lineNumber)
// ---------------------------------------------------------------------------------//
{
List<Integer> lines = arrayLines.get (var);
if (lines == null)
{
lines = new ArrayList<> ();
arrayLines.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);
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
@ -353,6 +337,9 @@ public class ApplesoftBasicProgram extends BasicProgram
if (basicPreferences.showFunctions && !functionLines.isEmpty ()) if (basicPreferences.showFunctions && !functionLines.isEmpty ())
showSymbols (fullText, functionLines, "Fnction"); showSymbols (fullText, functionLines, "Fnction");
if (basicPreferences.showConstants && !constants.isEmpty ())
showIntegerLines (fullText, constants, " Const");
if (basicPreferences.showDuplicateSymbols && !uniqueSymbols.isEmpty ()) if (basicPreferences.showDuplicateSymbols && !uniqueSymbols.isEmpty ())
{ {
boolean headingShown = false; boolean headingShown = false;
@ -422,9 +409,16 @@ public class ApplesoftBasicProgram extends BasicProgram
for (Integer line : lines.keySet ()) for (Integer line : lines.keySet ())
{ {
String lineText = line + "";
String list = lines.get (line).toString (); String list = lines.get (line).toString ();
list = list.substring (1, list.length () - 1); list = list.substring (1, list.length () - 1);
fullText.append (String.format (" %6s %s%n", line, list)); // fullText.append (String.format (" %6s %s%n", line, list));
for (String s : splitXref (list, 90, ' '))
{
fullText.append (String.format (" %6s %s%n", lineText, s));
lineText = "";
}
} }
} }
@ -902,16 +896,16 @@ public class ApplesoftBasicProgram extends BasicProgram
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private void checkUniqueName (String symbol) private void checkUniqueName (String symbol, Map<String, List<String>> map)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
{ {
String uniqueName = getUniqueName (symbol); String uniqueName = getUniqueName (symbol);
List<String> usage = uniqueSymbols.get (uniqueName); List<String> usage = map.get (uniqueName);
if (usage == null) if (usage == null)
{ {
usage = new ArrayList<> (); usage = new ArrayList<> ();
uniqueSymbols.put (uniqueName, usage); map.put (uniqueName, usage);
} }
if (!usage.contains (symbol)) if (!usage.contains (symbol))
@ -924,8 +918,8 @@ public class ApplesoftBasicProgram extends BasicProgram
{ {
int ptr = symbol.length () - 1; int ptr = symbol.length () - 1;
if (symbol.charAt (ptr) == Utility.ASCII_LEFT_BRACKET) // array // if (symbol.charAt (ptr) == Utility.ASCII_LEFT_BRACKET) // array
ptr--; // ptr--;
if (symbol.charAt (ptr) == Utility.ASCII_DOLLAR // string if (symbol.charAt (ptr) == Utility.ASCII_DOLLAR // string
|| symbol.charAt (ptr) == Utility.ASCII_PERCENT) // integer || symbol.charAt (ptr) == Utility.ASCII_PERCENT) // integer

View File

@ -27,6 +27,7 @@ public class SubLine
private final List<String> symbols = new ArrayList<> (); private final List<String> symbols = new ArrayList<> ();
private final List<String> functions = new ArrayList<> (); private final List<String> functions = new ArrayList<> ();
private final List<String> arrays = new ArrayList<> (); private final List<String> arrays = new ArrayList<> ();
private final List<Integer> constants = new ArrayList<> ();
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
SubLine (SourceLine parent, int startPtr, int length) SubLine (SourceLine parent, int startPtr, int length)
@ -135,19 +136,23 @@ public class SubLine
return; return;
if (!Utility.isLetter ((byte) var.charAt (0))) if (!Utility.isLetter ((byte) var.charAt (0)))
{
if (!constants.contains (var))
constants.add (Integer.parseInt (var));
return; return;
}
if (isDefine && (var.equals (functionName) || var.equals (functionArgument))) if (isDefine && (var.equals (functionName) || var.equals (functionArgument)))
return; return;
if (terminator == Utility.ASCII_LEFT_BRACKET) if (terminator == Utility.ASCII_LEFT_BRACKET)
{ {
// var += "(";
if (!arrays.contains (var)) if (!arrays.contains (var))
arrays.add (var); arrays.add (var);
return;
} }
else if (!symbols.contains (var))
if (!symbols.contains (var))
symbols.add (var); symbols.add (var);
} }
@ -186,6 +191,13 @@ public class SubLine
return gosubLines; return gosubLines;
} }
// ---------------------------------------------------------------------------------//
List<Integer> getConstants ()
// ---------------------------------------------------------------------------------//
{
return constants;
}
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private void doToken (byte b) private void doToken (byte b)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//

View File

@ -18,6 +18,7 @@ public class BasicPreferences
public boolean showXref = false; public boolean showXref = false;
public boolean showCalls = false; public boolean showCalls = false;
public boolean showSymbols = false; public boolean showSymbols = false;
public boolean showConstants = false;
public boolean showFunctions = false; public boolean showFunctions = false;
public boolean showDuplicateSymbols = false; public boolean showDuplicateSymbols = false;
public boolean splitDim = false; public boolean splitDim = false;
@ -43,6 +44,7 @@ public class BasicPreferences
text.append (String.format ("Show Xref ................ %s%n", showXref)); text.append (String.format ("Show Xref ................ %s%n", showXref));
text.append (String.format ("Show CALL ................ %s%n", showCalls)); text.append (String.format ("Show CALL ................ %s%n", showCalls));
text.append (String.format ("Show symbols ............. %s%n", showSymbols)); text.append (String.format ("Show symbols ............. %s%n", showSymbols));
text.append (String.format ("Show constants ........... %s%n", showConstants));
text.append (String.format ("Show functions ........... %s%n", showFunctions)); text.append (String.format ("Show functions ........... %s%n", showFunctions));
text.append (String.format ("Show duplicate symbols ... %s%n", showDuplicateSymbols)); text.append (String.format ("Show duplicate symbols ... %s%n", showDuplicateSymbols));
text.append (String.format ("List strings ............. %s%n", listStrings)); text.append (String.format ("List strings ............. %s%n", listStrings));

View File

@ -53,6 +53,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
private static final String PREFS_SHOW_XREF = "showXref"; private static final String PREFS_SHOW_XREF = "showXref";
private static final String PREFS_SHOW_CALLS = "showCalls"; private static final String PREFS_SHOW_CALLS = "showCalls";
private static final String PREFS_SHOW_SYMBOLS = "showSymbols"; private static final String PREFS_SHOW_SYMBOLS = "showSymbols";
private static final String PREFS_SHOW_CONSTANTS = "showConstants";
private static final String PREFS_SHOW_FUNCTIONS = "showFunctions"; private static final String PREFS_SHOW_FUNCTIONS = "showFunctions";
private static final String PREFS_SHOW_DUPLICATE_SYMBOLS = "showDuplicateSymbols"; private static final String PREFS_SHOW_DUPLICATE_SYMBOLS = "showDuplicateSymbols";
private static final String PREFS_LIST_STRINGS = "listStrings"; private static final String PREFS_LIST_STRINGS = "listStrings";
@ -148,6 +149,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
final JMenuItem showCallsItem = new JCheckBoxMenuItem ("List CALLs"); final JMenuItem showCallsItem = new JCheckBoxMenuItem ("List CALLs");
final JMenuItem showSymbolsItem = new JCheckBoxMenuItem ("List variables"); final JMenuItem showSymbolsItem = new JCheckBoxMenuItem ("List variables");
final JMenuItem showFunctionsItem = new JCheckBoxMenuItem ("List functions"); final JMenuItem showFunctionsItem = new JCheckBoxMenuItem ("List functions");
final JMenuItem showConstantsItem = new JCheckBoxMenuItem ("List constants");
final JMenuItem showDuplicateSymbolsItem = final JMenuItem showDuplicateSymbolsItem =
new JCheckBoxMenuItem ("List duplicate variables"); new JCheckBoxMenuItem ("List duplicate variables");
final JMenuItem listStringsItem = new JCheckBoxMenuItem ("List strings"); final JMenuItem listStringsItem = new JCheckBoxMenuItem ("List strings");
@ -259,6 +261,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
applesoftMenu.add (showCallsItem); applesoftMenu.add (showCallsItem);
applesoftMenu.add (showSymbolsItem); applesoftMenu.add (showSymbolsItem);
applesoftMenu.add (showFunctionsItem); applesoftMenu.add (showFunctionsItem);
applesoftMenu.add (showConstantsItem);
applesoftMenu.add (showDuplicateSymbolsItem); applesoftMenu.add (showDuplicateSymbolsItem);
applesoftMenu.add (listStringsItem); applesoftMenu.add (listStringsItem);
@ -323,6 +326,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
showCallsItem.addActionListener (basicPreferencesAction); showCallsItem.addActionListener (basicPreferencesAction);
showSymbolsItem.addActionListener (basicPreferencesAction); showSymbolsItem.addActionListener (basicPreferencesAction);
showFunctionsItem.addActionListener (basicPreferencesAction); showFunctionsItem.addActionListener (basicPreferencesAction);
showConstantsItem.addActionListener (basicPreferencesAction);
showDuplicateSymbolsItem.addActionListener (basicPreferencesAction); showDuplicateSymbolsItem.addActionListener (basicPreferencesAction);
listStringsItem.addActionListener (basicPreferencesAction); listStringsItem.addActionListener (basicPreferencesAction);
blankAfterReturn.addActionListener (basicPreferencesAction); blankAfterReturn.addActionListener (basicPreferencesAction);
@ -376,6 +380,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
basicPreferences.showCalls = showCallsItem.isSelected (); basicPreferences.showCalls = showCallsItem.isSelected ();
basicPreferences.showSymbols = showSymbolsItem.isSelected (); basicPreferences.showSymbols = showSymbolsItem.isSelected ();
basicPreferences.showFunctions = showFunctionsItem.isSelected (); basicPreferences.showFunctions = showFunctionsItem.isSelected ();
basicPreferences.showConstants = showConstantsItem.isSelected ();
basicPreferences.showDuplicateSymbols = showDuplicateSymbolsItem.isSelected (); basicPreferences.showDuplicateSymbols = showDuplicateSymbolsItem.isSelected ();
basicPreferences.listStrings = listStringsItem.isSelected (); basicPreferences.listStrings = listStringsItem.isSelected ();
basicPreferences.blankAfterReturn = blankAfterReturn.isSelected (); basicPreferences.blankAfterReturn = blankAfterReturn.isSelected ();
@ -539,6 +544,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
prefs.putBoolean (PREFS_SHOW_CALLS, showCallsItem.isSelected ()); prefs.putBoolean (PREFS_SHOW_CALLS, showCallsItem.isSelected ());
prefs.putBoolean (PREFS_SHOW_SYMBOLS, showSymbolsItem.isSelected ()); prefs.putBoolean (PREFS_SHOW_SYMBOLS, showSymbolsItem.isSelected ());
prefs.putBoolean (PREFS_SHOW_FUNCTIONS, showFunctionsItem.isSelected ()); prefs.putBoolean (PREFS_SHOW_FUNCTIONS, showFunctionsItem.isSelected ());
prefs.putBoolean (PREFS_SHOW_CONSTANTS, showConstantsItem.isSelected ());
prefs.putBoolean (PREFS_SHOW_DUPLICATE_SYMBOLS, prefs.putBoolean (PREFS_SHOW_DUPLICATE_SYMBOLS,
showDuplicateSymbolsItem.isSelected ()); showDuplicateSymbolsItem.isSelected ());
prefs.putBoolean (PREFS_LIST_STRINGS, listStringsItem.isSelected ()); prefs.putBoolean (PREFS_LIST_STRINGS, listStringsItem.isSelected ());
@ -596,6 +602,7 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
showCallsItem.setSelected (prefs.getBoolean (PREFS_SHOW_CALLS, false)); showCallsItem.setSelected (prefs.getBoolean (PREFS_SHOW_CALLS, false));
showSymbolsItem.setSelected (prefs.getBoolean (PREFS_SHOW_SYMBOLS, false)); showSymbolsItem.setSelected (prefs.getBoolean (PREFS_SHOW_SYMBOLS, false));
showFunctionsItem.setSelected (prefs.getBoolean (PREFS_SHOW_FUNCTIONS, false)); showFunctionsItem.setSelected (prefs.getBoolean (PREFS_SHOW_FUNCTIONS, false));
showConstantsItem.setSelected (prefs.getBoolean (PREFS_SHOW_CONSTANTS, false));
showDuplicateSymbolsItem showDuplicateSymbolsItem
.setSelected (prefs.getBoolean (PREFS_SHOW_DUPLICATE_SYMBOLS, false)); .setSelected (prefs.getBoolean (PREFS_SHOW_DUPLICATE_SYMBOLS, false));
listStringsItem.setSelected (prefs.getBoolean (PREFS_LIST_STRINGS, false)); listStringsItem.setSelected (prefs.getBoolean (PREFS_LIST_STRINGS, false));