wrap variable xref lines

This commit is contained in:
Denis Molony 2020-12-31 19:50:53 +10:00
parent dcecfb1399
commit 16c677b83d
4 changed files with 66 additions and 26 deletions

View File

@ -17,10 +17,12 @@ 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<> (); final Map<Integer, List<Integer>> gotoLines = new TreeMap<> ();
final Map<Integer, List<Integer>> gosubLines = new TreeMap<> (); final Map<Integer, List<Integer>> gosubLines = new TreeMap<> ();
final Map<String, List<Integer>> symbolLines = new TreeMap<> (); final Map<String, List<Integer>> symbolLines = new TreeMap<> ();
final Map<String, List<String>> uniqueSymbols = new TreeMap<> (); final Map<String, List<String>> uniqueSymbols = 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<> ();
@ -31,19 +33,19 @@ public class ApplesoftBasicProgram extends BasicProgram
super (name, buffer); super (name, buffer);
int ptr = 0; int ptr = 0;
int prevOffset = 0; int currentAddress = 0;
int max = buffer.length - 6; // need at least 6 bytes to make a SourceLine int max = buffer.length - 6; // need at least 6 bytes to make a SourceLine
while (ptr <= max) while (ptr <= max)
{ {
int nextAddress = Utility.unsignedShort (buffer, ptr); int nextAddress = Utility.unsignedShort (buffer, ptr);
if (nextAddress <= prevOffset) // usually zero if (nextAddress <= currentAddress) // usually zero when finished
break; break;
SourceLine line = new SourceLine (this, buffer, ptr); SourceLine line = new SourceLine (this, buffer, ptr);
sourceLines.add (line); sourceLines.add (line);
ptr += line.length; ptr += line.length;
prevOffset = nextAddress; currentAddress = nextAddress;
} }
endPtr = ptr; endPtr = ptr;
} }
@ -181,8 +183,8 @@ public class ApplesoftBasicProgram extends BasicProgram
if (basicPreferences.wrapPrintAt > 0 // if (basicPreferences.wrapPrintAt > 0 //
&& (subline.is (ApplesoftConstants.TOKEN_PRINT) && (subline.is (ApplesoftConstants.TOKEN_PRINT)
|| subline.is (ApplesoftConstants.TOKEN_INPUT)) || subline.is (ApplesoftConstants.TOKEN_INPUT))
&& countChars (text, Utility.ASCII_QUOTE) == 2 // just start and end quotes && countChars (text, Utility.ASCII_QUOTE) == 2 // just start and end quotes
&& countChars (text, Utility.ASCII_CARET) == 0) // no control characters && countChars (text, Utility.ASCII_CARET) == 0) // no control characters
// && countChars (text, ASCII_SEMI_COLON) == 0) // && countChars (text, ASCII_SEMI_COLON) == 0)
{ {
if (true) // new method if (true) // new method
@ -279,7 +281,15 @@ public class ApplesoftBasicProgram extends BasicProgram
String format = longestVarName > 6 ? "%" + longestVarName + "s %s%n" : "%6s %s%n"; String format = longestVarName > 6 ? "%" + longestVarName + "s %s%n" : "%6s %s%n";
for (String symbol : symbolLines.keySet ()) for (String symbol : symbolLines.keySet ())
fullText.append (String.format (format, symbol, symbolLines.get (symbol))); {
String line = symbolLines.get (symbol).toString ();
line = line.substring (1, line.length () - 2);
for (String s : splitXref (line, 90, ' '))
{
fullText.append (String.format (format, symbol, s));
symbol = "";
}
}
} }
if (basicPreferences.showDuplicateSymbols && !uniqueSymbols.isEmpty ()) if (basicPreferences.showDuplicateSymbols && !uniqueSymbols.isEmpty ())
@ -397,6 +407,7 @@ public class ApplesoftBasicProgram extends BasicProgram
int firstSpace = 0; int firstSpace = 0;
while (firstSpace < line.length () && line.charAt (firstSpace) != ' ') while (firstSpace < line.length () && line.charAt (firstSpace) != ' ')
++firstSpace; ++firstSpace;
System.out.println (line);
List<String> lines = new ArrayList<> (); List<String> lines = new ArrayList<> ();
while (line.length () > wrapLength) while (line.length () > wrapLength)
@ -414,6 +425,26 @@ public class ApplesoftBasicProgram extends BasicProgram
return lines; return lines;
} }
// ---------------------------------------------------------------------------------//
private List<String> splitXref (String line, int wrapLength, char breakChar)
// ---------------------------------------------------------------------------------//
{
List<String> lines = new ArrayList<> ();
while (line.length () > wrapLength)
{
int max = Math.min (wrapLength, line.length () - 1);
while (max > 0 && line.charAt (max) != breakChar)
--max;
if (max == 0)
break;
lines.add (line.substring (0, max + 1));
line = line.substring (max + 1);
}
lines.add (line);
return lines;
}
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private List<String> splitDim (String line) private List<String> splitDim (String line)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//

View File

@ -9,12 +9,12 @@ import com.bytezone.diskbrowser.utilities.Utility;
public class SourceLine public class SourceLine
// -----------------------------------------------------------------------------------// // -----------------------------------------------------------------------------------//
{ {
ApplesoftBasicProgram parent;
List<SubLine> sublines = new ArrayList<> (); List<SubLine> sublines = new ArrayList<> ();
int lineNumber; int lineNumber;
int linePtr; int linePtr;
int length; int length;
byte[] buffer; byte[] buffer;
ApplesoftBasicProgram parent;
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
SourceLine (ApplesoftBasicProgram parent, byte[] buffer, int ptr) SourceLine (ApplesoftBasicProgram parent, byte[] buffer, int ptr)
@ -77,7 +77,6 @@ public class SourceLine
if (ptr != startPtr + 1) // REM appears mid-line (should follow a colon) if (ptr != startPtr + 1) // REM appears mid-line (should follow a colon)
{ {
System.out.println ("mid-line REM token"); System.out.println ("mid-line REM token");
// System.out.println (HexFormatter.format (buffer, startPtr, 10));
sublines.add (new SubLine (this, startPtr, (ptr - startPtr) - 1)); sublines.add (new SubLine (this, startPtr, (ptr - startPtr) - 1));
startPtr = ptr - 1; startPtr = ptr - 1;
} }

View File

@ -16,7 +16,6 @@ public class SubLine
int length; int length;
String[] nextVariables; String[] nextVariables;
String forVariable = ""; String forVariable = "";
String onExpression = "";
int assignEqualPos; // used for aligning the equals sign int assignEqualPos; // used for aligning the equals sign
byte[] buffer; byte[] buffer;
@ -150,14 +149,14 @@ public class SubLine
while (p < max && parent.buffer[p] != ApplesoftConstants.TOKEN_GOTO while (p < max && parent.buffer[p] != ApplesoftConstants.TOKEN_GOTO
&& parent.buffer[p] != ApplesoftConstants.TOKEN_GOSUB) && parent.buffer[p] != ApplesoftConstants.TOKEN_GOSUB)
{ {
if (Utility.isHighBitSet (parent.buffer[p])) // if (Utility.isHighBitSet (parent.buffer[p]))
{ // {
int val = parent.buffer[p] & 0x7F; // int val = parent.buffer[p] & 0x7F;
if (val < ApplesoftConstants.tokens.length) // if (val < ApplesoftConstants.tokens.length)
onExpression += " " + ApplesoftConstants.tokens[val]; // onExpression += " " + ApplesoftConstants.tokens[val];
} // }
else // else
onExpression += (char) (parent.buffer[p]); // onExpression += (char) (parent.buffer[p]);
p++; p++;
} }
@ -325,6 +324,7 @@ public class SubLine
{ {
int ptr = startPtr + 1; int ptr = startPtr + 1;
int max = startPtr + length; int max = startPtr + length;
while (ptr < max) while (ptr < max)
{ {
if (parent.buffer[ptr++] == token) if (parent.buffer[ptr++] == token)
@ -378,14 +378,21 @@ public class SubLine
while (ptr <= max) while (ptr <= max)
{ {
int c = buffer[ptr] & 0xFF; switch (buffer[ptr])
// System.out.printf ("%02X %s%n", c, (char) c); {
if (c == 0x08 && text.length () > 0) case Utility.ASCII_BACKSPACE:
text.deleteCharAt (text.length () - 1); if (text.length () > 0)
else if (c == 0x0D) text.deleteCharAt (text.length () - 1);
text.append ("\n"); break;
else
text.append ((char) c); case Utility.ASCII_CR:
text.append ("\n");
break;
default:
text.append ((char) buffer[ptr]); // do not mask with 0xFF
}
ptr++; ptr++;
} }
} }
@ -418,6 +425,7 @@ public class SubLine
System.arraycopy (buffer, startPtr + 1, buffer2, 0, buffer2.length); System.arraycopy (buffer, startPtr + 1, buffer2, 0, buffer2.length);
AssemblerProgram program = AssemblerProgram program =
new AssemblerProgram ("REM assembler", buffer2, getAddress () + 1); new AssemblerProgram ("REM assembler", buffer2, getAddress () + 1);
return program.getAssembler ().split ("\n"); return program.getAssembler ().split ("\n");
} }
@ -460,7 +468,7 @@ public class SubLine
} }
else if (Utility.isControlCharacter (b)) else if (Utility.isControlCharacter (b))
line.append (ApplesoftBasicProgram.basicPreferences.showCaret line.append (ApplesoftBasicProgram.basicPreferences.showCaret
? "^" + (char) (b + 64) : ""); ? "^" + (char) (b + 64) : ".");
else else
line.append ((char) b); line.append ((char) b);
} }

View File

@ -17,6 +17,8 @@ import java.util.zip.Checksum;
public class Utility public class Utility
// -----------------------------------------------------------------------------------// // -----------------------------------------------------------------------------------//
{ {
public static final byte ASCII_BACKSPACE = 0x08;
public static final byte ASCII_CR = 0x0D;
public static final byte ASCII_QUOTE = 0x22; public static final byte ASCII_QUOTE = 0x22;
public static final byte ASCII_DOLLAR = 0x24; public static final byte ASCII_DOLLAR = 0x24;
public static final byte ASCII_PERCENT = 0x25; public static final byte ASCII_PERCENT = 0x25;