Rewrote REPL Added NIL and comments to parser. Added T as a predefined constant. Added HELP, TRACE, ENABLE-DEBUG-AST special form. Fixed variable evaluation (shouldn't automatically eval it's value)
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
package edu.utexas.cs345.jdblisp;
 | 
						|
 | 
						|
import java.io.OutputStream;
 | 
						|
import java.io.PrintWriter;
 | 
						|
import java.util.HashMap;
 | 
						|
import java.util.Map;
 | 
						|
 | 
						|
/**
 | 
						|
 * HelpTopic
 | 
						|
 * @author Jonathan Bernard (jdbernard@gmail.com)
 | 
						|
 */
 | 
						|
public class HelpTopic {
 | 
						|
 | 
						|
    public static Map<String, HelpTopic> helpTopics;
 | 
						|
 | 
						|
    protected final String name;
 | 
						|
    protected final String shortDescription;
 | 
						|
    protected final String body;
 | 
						|
 | 
						|
    public HelpTopic(String name, String shortDescription, String body) {
 | 
						|
        this.name = name;
 | 
						|
        this.shortDescription = shortDescription;
 | 
						|
        this.body = body;
 | 
						|
    }
 | 
						|
 | 
						|
    public void print(OutputStream os) { print(os, 79); }
 | 
						|
 | 
						|
    public void print(OutputStream os, int wrapWidth) {
 | 
						|
        WrappedPrinter out = new WrappedPrinter(os, wrapWidth, true);
 | 
						|
        out.println(name);
 | 
						|
        out.println(shortDescription, "    ");
 | 
						|
        out.println();
 | 
						|
        out.println(body, "    ");
 | 
						|
    }
 | 
						|
 | 
						|
    class WrappedPrinter {
 | 
						|
 | 
						|
        private PrintWriter printer;
 | 
						|
        private int wrapWidth;
 | 
						|
        private int lastPrintedLineLength = 0;
 | 
						|
 | 
						|
        public WrappedPrinter(OutputStream os, int wrapWidth,
 | 
						|
        boolean autoflush) {
 | 
						|
            this(new PrintWriter(os, autoflush), wrapWidth);
 | 
						|
        }
 | 
						|
 | 
						|
        public WrappedPrinter(PrintWriter pw, int wrapWidth) {
 | 
						|
            this.printer = pw;
 | 
						|
            this.wrapWidth = wrapWidth;
 | 
						|
        }
 | 
						|
 | 
						|
        public void print(String message) { print(message, ""); }
 | 
						|
 | 
						|
        public void print(String message, String offset) {
 | 
						|
            int lastSpaceIdx = 0;
 | 
						|
            int curLineLength = 0;
 | 
						|
            int lineStartIdx = 0;
 | 
						|
            int i = 0;
 | 
						|
            int actualWidth = wrapWidth - offset.length();
 | 
						|
 | 
						|
            //message = message.replaceAll("[\n\r]", " ");
 | 
						|
 | 
						|
            // print initial offset if this is the beginning of the line
 | 
						|
            if (lastPrintedLineLength == 0) {
 | 
						|
                printer.print(offset);
 | 
						|
                curLineLength = offset.length();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            for (i = 0; i < message.length(); ++i) {
 | 
						|
 | 
						|
                curLineLength++;
 | 
						|
                if (message.charAt(i) == '\t') curLineLength += 7;
 | 
						|
 | 
						|
                // line has overflowed the prescribed width
 | 
						|
                if (curLineLength > actualWidth) {
 | 
						|
                    // print up to the last space before the overflow
 | 
						|
                    printer.println(message.substring(lineStartIdx, lastSpaceIdx));
 | 
						|
 | 
						|
                    // pick up the next line after said space
 | 
						|
                    lineStartIdx = lastSpaceIdx + 1;
 | 
						|
                    i = lastSpaceIdx;
 | 
						|
                    curLineLength = 0;
 | 
						|
 | 
						|
                    // print initial offset if there is still more to print
 | 
						|
                    if (lineStartIdx < message.length()) {
 | 
						|
                        printer.print(offset);
 | 
						|
                        curLineLength = offset.length();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                // see whitespace, update last space index
 | 
						|
                if (Character.isWhitespace(message.charAt(i))) lastSpaceIdx = i;
 | 
						|
            }
 | 
						|
 | 
						|
            // any left over, it will fit on one line
 | 
						|
            if (i - lineStartIdx > 1) {
 | 
						|
                String lastLine = message.substring(lineStartIdx);
 | 
						|
                printer.print(lastLine);
 | 
						|
                curLineLength += lastLine.length();
 | 
						|
            }
 | 
						|
 | 
						|
            // save back the new position
 | 
						|
            lastPrintedLineLength = curLineLength;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        public void println() { println("", ""); }
 | 
						|
 | 
						|
        public void println(String message) { println(message, ""); }
 | 
						|
 | 
						|
        public void println(String message, String offset) {
 | 
						|
 | 
						|
            print(message, offset);
 | 
						|
            printer.println();
 | 
						|
            lastPrintedLineLength = 0;
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |