From c89bcc6a364ded67504e88db1bf71417250e2ea3 Mon Sep 17 00:00:00 2001
From: Yuchen Pei <me@ypei.me>
Date: Wed, 17 Jan 2018 17:02:33 +0100
Subject: checkpoint

- revised Keyboard to use String for int conversion
- almost finished String
---
 projects/12/KeyboardTest/Keyboard.jack |  30 +----
 projects/12/KeyboardTest/Keyboard.vm   | 199 +--------------------------------
 projects/12/MemoryTest/MemoryTest.out  |   2 -
 projects/12/String.jack                |  66 +++++++++++
 4 files changed, 69 insertions(+), 228 deletions(-)

(limited to 'projects')

diff --git a/projects/12/KeyboardTest/Keyboard.jack b/projects/12/KeyboardTest/Keyboard.jack
index 2aba72e..a35704a 100644
--- a/projects/12/KeyboardTest/Keyboard.jack
+++ b/projects/12/KeyboardTest/Keyboard.jack
@@ -89,37 +89,9 @@ class Keyboard {
      * entered text is detected). Also handles user backspaces. 
      */
     function int readInt(String message) {
-        var int n, i;
-        var char t;
         var String s;
-        var boolean neg, done;
         do Output.printString(message);
-        let n = 0;
-        let neg = false;
         let s = Keyboard.readLine("");
-        let i = 0;
-        if (s.charAt(0) = 45) {
-            let i = 1;
-            let neg = true;
-        }
-        let t = s.charAt(i);
-        if ((t < 48) | (t > 57)) {
-            do Sys.error(3);
-            do Output.printString("Keyboard.readInt: the input data is not number!");
-        }
-        let done = false;
-        while (~done) {
-            if ((s.charAt(i) > 47) & (s.charAt(i) < 58)) {
-                let n = n * 10 + (s.charAt(i) - 48);
-            } else {
-                let done = true;
-            }
-            let i = i + 1;
-            let done = done | (i + 1 > s.length());
-        }
-        if (neg) {
-            let n = - n;
-        }
-        return n;
+        return s.intValue();
     }
 }
diff --git a/projects/12/KeyboardTest/Keyboard.vm b/projects/12/KeyboardTest/Keyboard.vm
index bebd916..5dc3426 100644
--- a/projects/12/KeyboardTest/Keyboard.vm
+++ b/projects/12/KeyboardTest/Keyboard.vm
@@ -102,209 +102,14 @@ goto WHILE_EXP0
 label WHILE_END0
 push local 1
 return
-function Keyboard.readInt 6
+function Keyboard.readInt 1
 push argument 0
 call Output.printString 1
 pop temp 0
 push constant 0
-pop local 0
-push constant 0
-pop local 4
-push constant 0
 call String.new 1
 call Keyboard.readLine 1
-pop local 3
-push constant 0
-pop local 1
-push local 3
-push constant 0
-call String.charAt 2
-push constant 45
-eq
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
-push constant 1
-pop local 1
-push constant 0
-not
-pop local 4
-label IF_FALSE0
-push local 3
-push local 1
-call String.charAt 2
-pop local 2
-push local 2
-push constant 48
-lt
-push local 2
-push constant 57
-gt
-or
-if-goto IF_TRUE1
-goto IF_FALSE1
-label IF_TRUE1
-push constant 3
-call Sys.error 1
-pop temp 0
-push constant 47
-call String.new 1
-push constant 75
-call String.appendChar 2
-push constant 101
-call String.appendChar 2
-push constant 121
-call String.appendChar 2
-push constant 98
-call String.appendChar 2
-push constant 111
-call String.appendChar 2
-push constant 97
-call String.appendChar 2
-push constant 114
-call String.appendChar 2
-push constant 100
-call String.appendChar 2
-push constant 46
-call String.appendChar 2
-push constant 114
-call String.appendChar 2
-push constant 101
-call String.appendChar 2
-push constant 97
-call String.appendChar 2
-push constant 100
-call String.appendChar 2
-push constant 73
-call String.appendChar 2
-push constant 110
-call String.appendChar 2
-push constant 116
-call String.appendChar 2
-push constant 58
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 116
-call String.appendChar 2
-push constant 104
-call String.appendChar 2
-push constant 101
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 105
-call String.appendChar 2
-push constant 110
-call String.appendChar 2
-push constant 112
-call String.appendChar 2
-push constant 117
-call String.appendChar 2
-push constant 116
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 100
-call String.appendChar 2
-push constant 97
-call String.appendChar 2
-push constant 116
-call String.appendChar 2
-push constant 97
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 105
-call String.appendChar 2
-push constant 115
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 110
-call String.appendChar 2
-push constant 111
-call String.appendChar 2
-push constant 116
-call String.appendChar 2
-push constant 32
-call String.appendChar 2
-push constant 110
-call String.appendChar 2
-push constant 117
-call String.appendChar 2
-push constant 109
-call String.appendChar 2
-push constant 98
-call String.appendChar 2
-push constant 101
-call String.appendChar 2
-push constant 114
-call String.appendChar 2
-push constant 33
-call String.appendChar 2
-call Output.printString 1
-pop temp 0
-label IF_FALSE1
-push constant 0
-pop local 5
-label WHILE_EXP0
-push local 5
-not
-not
-if-goto WHILE_END0
-push local 3
-push local 1
-call String.charAt 2
-push constant 47
-gt
-push local 3
-push local 1
-call String.charAt 2
-push constant 58
-lt
-and
-if-goto IF_TRUE2
-goto IF_FALSE2
-label IF_TRUE2
-push local 0
-push constant 10
-call Math.multiply 2
-push local 3
-push local 1
-call String.charAt 2
-push constant 48
-sub
-add
-pop local 0
-goto IF_END2
-label IF_FALSE2
-push constant 0
-not
-pop local 5
-label IF_END2
-push local 1
-push constant 1
-add
-pop local 1
-push local 5
-push local 1
-push constant 1
-add
-push local 3
-call String.length 1
-gt
-or
-pop local 5
-goto WHILE_EXP0
-label WHILE_END0
-push local 4
-if-goto IF_TRUE3
-goto IF_FALSE3
-label IF_TRUE3
-push local 0
-neg
 pop local 0
-label IF_FALSE3
 push local 0
+call String.intValue 1
 return
diff --git a/projects/12/MemoryTest/MemoryTest.out b/projects/12/MemoryTest/MemoryTest.out
index 8259ed2..e69de29 100644
--- a/projects/12/MemoryTest/MemoryTest.out
+++ b/projects/12/MemoryTest/MemoryTest.out
@@ -1,2 +0,0 @@
-|RAM[8000]|RAM[8001]|RAM[8002]|RAM[8003]|RAM[8004]|RAM[8005]|
-|     333 |     334 |     222 |     122 |     100 |      10 |
diff --git a/projects/12/String.jack b/projects/12/String.jack
index 228d71c..2d5c440 100644
--- a/projects/12/String.jack
+++ b/projects/12/String.jack
@@ -11,39 +11,102 @@
  * string-oriented operations.
  */
 class String {
+    field int maxLen;
+    field int len;
+    field Array s;
 
     /** constructs a new empty string with a maximum length of maxLength
      *  and initial length of 0. */
     constructor String new(int maxLength) {
+        let s = new Array(maxLength);
+        let maxLen = maxLength;
+        let len = 0;
+        return this;
     }
 
     /** Disposes this string. */
     method void dispose() {
+        do s.dispose();
+        do Memory.deAlloc(this);
+        return;
     }
 
     /** Returns the current length of this string. */
     method int length() {
+        return len;
     }
 
     /** Returns the character at the j-th location of this string. */
     method char charAt(int j) {
+        if ((j < 0) | (j + 1 > len)){
+            Output.printString("String.charAt: index out of range!");
+            Sys.error(5);
+        }
+        return s[j];
     }
 
     /** Sets the character at the j-th location of this string to c. */
     method void setCharAt(int j, char c) {
+        let s[j] = c;
+        return;
     }
 
     /** Appends c to this string's end and returns this string. */
     method String appendChar(char c) {
+        if (len = maxLen) {
+            Output.printString("String.appendChar: reached max length!");
+            Sys.error(5);
+        }
+        let s[len] = c;
+        let len = len + 1;
+        return this;
     }
 
     /** Erases the last character from this string. */
     method void eraseLastChar() {
+        if (len = 0){
+            Output.printString("String.eraseLastChar: string is already empty!");
+            Sys.error(5);
+        }
+        let len = len - 1;
+        return;
     }
 
     /** Returns the integer value of this string, 
      *  until a non-digit character is detected. */
     method int intValue() {
+        var int n, i;
+        var char c;
+        var boolean neg, done;
+        let n = 0;
+        if (s[0] = 45) {
+            let i = 1;
+            let neg = true;
+        } else {
+            let i = 0;
+            let neg = false;
+        }
+        let c = s[i];
+        if ((t < 48) | (t > 57)) {
+            do Sys.error(3);
+            do Output.printString("String.intValue: the input data is not number!");
+        }
+        let done = false;
+        while ((~done) & (i < len)) {
+            let t = s[i];
+            if ((t > 47) & (t < 58)) {
+                let n = n * 10 + (t - 48);
+            } else {
+                let done = true;
+            }
+            let i = i + 1;
+        }
+        if (neg) {
+            return -n;
+        } else {
+            return n;
+        }
+
     }
 
     /** Sets this string to hold a representation of the given value. */
@@ -52,13 +115,16 @@ class String {
 
     /** Returns the new line character. */
     function char newLine() {
+        return 128;
     }
 
     /** Returns the backspace character. */
     function char backSpace() {
+        return 129;
     }
 
     /** Returns the double quote (") character. */
     function char doubleQuote() {
+        return 34;
     }
 }
-- 
cgit v1.2.3