From: Stan Cox <scox@redhat.com>
To: Frysk List <frysk@sourceware.org>
Subject: Use StringBuilder instead of PrintWriter for type display
Date: Fri, 07 Dec 2007 21:43:00 -0000 [thread overview]
Message-ID: <1197063360.10805.165.camel@multics.rdu.redhat.com> (raw)
This changes type display so it builds in a StringBuilder
instead of displaying a piece at a time. Most of the changes are
changing writer.print to stringBuilder.append. A printf style %s token
is used to support types like
"int (*ptr_arr) [4]" where (in this instance) the name and pointer
info have to be inserted a printf %s string is used. For instance
ArrayType would construct "int %s [4]" and then PointerType would
massage that to "int (*%s) [4] and if it is member of a struct
CompositeType would massage it to "int (*ptr_arr) [4]" (otherwise "int
(*) [4]). This allows removal of some instanceof checks and some
specialized code.
EvalCommands - Don't pass writer to toPrint
--- a/frysk-core/frysk/hpd/EvalCommands.java
+++ b/frysk-core/frysk/hpd/EvalCommands.java
@@ -71,8 +71,7 @@ abstract class EvalCommands extends
ParameterizedCommand {
static final Printer TYPE = new Printer() {
void print(Expression e, PrintWriter writer, Format format,
ByteBuffer memory) {
- e.getType().toPrint(writer, 0);
- writer.println();
+ writer.println(e.getType().toPrint());
}
};
static final Printer TREE = new Printer() {
ArrayType - Insert %s where name/ptr would go
--- a/frysk-core/frysk/value/ArrayType.java
+++ b/frysk-core/frysk/value/ArrayType.java
@@ -275,20 +275,17 @@ public class ArrayType
return noNullByte;
}
- public void toPrint(PrintWriter writer, String s, int indent) {
- type.toPrint(writer, indent);
- writer.print(" " + s);
+ public void toPrint(StringBuilder stringBuilder, int indent) {
+ type.toPrint(stringBuilder, indent);
+ stringBuilder.append(" ");
+ stringBuilder.append("%s");
for(int i = 0; i < this.dimension.length; i++) {
- writer.print("[");
- writer.print(dimension[i]);
- writer.print("]");
+ stringBuilder.append("[");
+ stringBuilder.append(dimension[i]);
+ stringBuilder.append("]");
}
}
- public void toPrint(PrintWriter writer, int indent) {
- this.toPrint(writer, "", indent);
- }
-
/* getALUs are double dispatch functions to determine
* the ArithmeticUnit for an operation between two types.
*/
CompositeType - Insert name for %s, remove some specialized code
--- a/frysk-core/frysk/value/CompositeType.java
+++ b/frysk-core/frysk/value/CompositeType.java
@@ -275,7 +275,7 @@ public abstract class CompositeType
writer.print("}");
}
- public void toPrint(PrintWriter writer, int indentation) {
+ public void toPrint(StringBuilder stringBuilder, int indentation) {
if (indentation == 0)
indentation = 2;
String indentPrefix = "";
@@ -283,10 +283,10 @@ public abstract class CompositeType
indentPrefix = indentPrefix + " ";
// {class,union,struct} NAME
- writer.print(getPrefix());
+ stringBuilder.append(getPrefix());
if (getName() != null && getName().length() > 0) {
- writer.print(" ");
- writer.print(getName());
+ stringBuilder.append(" ");
+ stringBuilder.append(getName());
}
// : public PARENT ...
boolean first = true;
@@ -298,57 +298,43 @@ public abstract class CompositeType
if (!member.inheritance)
break;
if (first) {
- writer.print(" : ");
+ stringBuilder.append(" : ");
first = false;
} else {
- writer.print(", ");
+ stringBuilder.append(", ");
}
if (member.access != null) {
- writer.print(member.access.toPrint());
- writer.print(" ");
+ stringBuilder.append(member.access.toPrint());
+ stringBuilder.append(" ");
}
- writer.print(member.type.getName());
+ stringBuilder.append(member.type.getName());
member = null;
}
// { content ... }
Access previousAccess = null;
- writer.print(" {\n");
+ stringBuilder.append(" {\n");
while (member != null) {
- boolean printName = true;
if (member.access != previousAccess) {
previousAccess = member.access;
if (member.access != null) {
- writer.print(" ");
- writer.print(member.access.toPrint());
- writer.print(":\n");
+ stringBuilder.append(" ");
+ stringBuilder.append(member.access.toPrint());
+ stringBuilder.append(":\n");
}
}
- writer.print(indentPrefix);
- if (member.type instanceof ArrayType) {
- // For handling int x[2]
- printName = false;
- ((ArrayType) member.type).toPrint(writer, member.name, indentation +
2);
- }
- else if (member.type instanceof PointerType) {
- // For handling int (*x)[2]
- printName = false;
- ((PointerType) member.type).toPrint(writer, " " + member.name,
- indentation + 2);
- }
- else
- member.type.toPrint (writer, indentation + 2);
- if (member.type instanceof frysk.value.FunctionType)
- printName = false;
- if (printName) {
- writer.print(" ");
- writer.print(member.name);
+ stringBuilder.append(indentPrefix);
+ member.type.toPrint (stringBuilder, indentation + 2);
+ if (! toPrintFormat(stringBuilder, member.name)) {
+ if (stringBuilder.charAt(stringBuilder.length() - 1) != '*')
+ stringBuilder.append(" ");
+ stringBuilder.append(member.name);
}
if (member.bitSize > 0) {
- writer.print(":");
- writer.print(member.bitSize);
+ stringBuilder.append(":");
+ stringBuilder.append(member.bitSize);
}
- writer.print(";\n");
+ stringBuilder.append(";\n");
// Advance
if (i.hasNext())
member = (DynamicMember)i.next();
@@ -356,8 +342,8 @@ public abstract class CompositeType
member = null;
}
for (int indent = 1; indent <= indentation - 2; indent++)
- writer.print(" ");
- writer.print("}");
+ stringBuilder.append(" ");
+ stringBuilder.append("}");
}
public Value member(Value var1, String member)
PointerType Simplify handling of "type (*x) [n]"
diff --git a/frysk-core/frysk/value/PointerType.java
b/frysk-core/frysk/value/PointerType.java
index b6e2f27..1c702fd 100644
--- a/frysk-core/frysk/value/PointerType.java
+++ b/frysk-core/frysk/value/PointerType.java
@@ -79,9 +79,14 @@ public class PointerType
void toPrint(PrintWriter writer, Location location, ByteBuffer
memory,
Format format, int indent) {
// Print type of pointer
- writer.print("(");
- this.toPrint(writer, 0);
- writer.print(") ");
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("(");
+ this.toPrint(stringBuilder, indent);
+ int percentIdx = stringBuilder.indexOf("%");
+ if (percentIdx >= 0)
+ stringBuilder.replace(percentIdx, percentIdx + 2, "");
+ stringBuilder.append(") ");
+ writer.print(stringBuilder);
try {
format.print(writer, location, this);
} catch (RuntimeException e) {
@@ -110,21 +115,20 @@ public class PointerType
}
}
- public void toPrint(PrintWriter writer, String s, int indent) {
+ public void toPrint(StringBuilder stringBuilder, int indent) {
// For handling int (*x)[2]
if (type instanceof ArrayType) {
- ((ArrayType)type).toPrint(writer, "(*" + s + ")", indent);
+ ((ArrayType)type).toPrint(stringBuilder, indent);
+ toPrintFormat(stringBuilder, "(*%s)");
}
else {
- type.toPrint(writer, indent);
- writer.print(" *" + s);
+ type.toPrint(stringBuilder, indent);
+ if (stringBuilder.charAt(stringBuilder.length() - 1) != '*')
+ stringBuilder.append(" ");
+ stringBuilder.append("*");
}
- }
+ }
- public void toPrint(PrintWriter writer, int indent) {
- this.toPrint(writer, "", indent);
- }
-
protected Type clone(IntegerType accessor) {
return new PointerType(getName(), order(), getSize(), type, accessor);
}
Type - Add toPrintFormat, sort of a poor man's printf
--- a/frysk-core/frysk/value/Type.java
+++ b/frysk-core/frysk/value/Type.java
@@ -112,16 +112,28 @@ public abstract class Type {
/**
* Print this Type after indenting INDENT spaces.
+ * @param stringBuilder TODO
*/
- public abstract void toPrint(PrintWriter writer, int indent);
+ public abstract void toPrint(StringBuilder stringBuilder, int
indent);
+
/**
* Print this Type to a StringBuffer and return the String.
*/
public final String toPrint() {
- StringWriter stringWriter = new StringWriter();
- PrintWriter writer = new PrintWriter(stringWriter);
- toPrint(writer, 0);
- return stringWriter.toString();
+ StringBuilder stringBuilder = new StringBuilder();
+ toPrint(stringBuilder, 0);
+ toPrintFormat(stringBuilder, "");
+ return stringBuilder.toString();
+ }
+
+ public boolean toPrintFormat(StringBuilder stringBuilder, String
string) {
+ int percentIdx = stringBuilder.indexOf("%");
+ if (percentIdx >= 0) {
+ stringBuilder.replace(percentIdx, percentIdx + 2, string);
+ return true;
+ }
+ else
+ return false;
}
/* getALUs are double dispatch functions to determine the
These just have writer -> stringBuilder changes
EnumType
FunctionType
TypeDecorator
TypeDef
UnknownType
Variable
VoidType
ArithmeticType
next reply other threads:[~2007-12-07 21:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-07 21:43 Stan Cox [this message]
2007-12-07 23:11 ` Andrew Cagney
2007-12-08 0:53 ` Andrew Cagney
2007-12-10 22:00 ` Stan Cox
2007-12-10 22:08 ` Stan Cox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1197063360.10805.165.camel@multics.rdu.redhat.com \
--to=scox@redhat.com \
--cc=frysk@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).