changeset 53:4c6bb312f729

add
author mir3636
date Tue, 12 Feb 2019 02:01:38 +0900
parents 8be23dffcd3f
children cf325c78edc1
files paper/src/console.cbc paper/src/consoleinit.c
diffstat 2 files changed, 92 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/console.cbc	Tue Feb 12 02:01:38 2019 +0900
@@ -0,0 +1,79 @@
+__code cbc_consoleread2 ()
+{   
+    struct inode *ip = proc->cbc_arg.cbc_console_arg.ip;
+    __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next;
+    if (input.r == input.w) {
+        if (proc->killed) {
+            release(&input.lock);
+            ilock(ip);
+            goto next(-1);
+        }
+        goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2);
+    }
+    goto cbc_consoleread1();
+}
+
+__code cbc_consoleread1 ()
+{   
+    int cont = 1;
+    int n = proc->cbc_arg.cbc_console_arg.n;
+    int target = proc->cbc_arg.cbc_console_arg.target;
+    char* dst = proc->cbc_arg.cbc_console_arg.dst;
+    struct inode *ip = proc->cbc_arg.cbc_console_arg.ip;
+    __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next;
+    
+    int c = input.buf[input.r++ % INPUT_BUF];
+    
+    if (c == C('D')) {  // EOF
+        if (n < target) {
+            // Save ^D for next time, to make sure
+            // caller gets a 0-byte result.
+            input.r--;
+        }
+        cont = 0;
+    }
+    
+    *dst++ = c;
+    --n;
+    
+    if (c == '\n') {
+        cont = 0;
+    }
+    
+    if (cont == 1) {
+        if (n > 0) {
+            proc->cbc_arg.cbc_console_arg.n = n; 
+            proc->cbc_arg.cbc_console_arg.target = target;
+            proc->cbc_arg.cbc_console_arg.dst = dst;
+            proc->cbc_arg.cbc_console_arg.ip = ip;
+            proc->cbc_arg.cbc_console_arg.next = next;
+            goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2);
+        }
+    }
+    
+    release(&input.lock);
+    ilock(ip);
+    
+    goto next(target - n);
+}
+
+__code cbc_consoleread (struct inode *ip, char *dst, int n, __code(*next)(int ret))
+{   
+    uint target;
+    
+    iunlock(ip);
+    
+    target = n;
+    acquire(&input.lock);
+    
+    if (n > 0) {
+        proc->cbc_arg.cbc_console_arg.n = n;
+        proc->cbc_arg.cbc_console_arg.target = target;
+        proc->cbc_arg.cbc_console_arg.dst = dst;
+        proc->cbc_arg.cbc_console_arg.ip = ip;
+        proc->cbc_arg.cbc_console_arg.next = next;
+        goto cbc_consoleread2();
+    }        
+    goto cbc_consoleread1();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/consoleinit.c	Tue Feb 12 02:01:38 2019 +0900
@@ -0,0 +1,13 @@
+void consoleinit (void)
+{
+    initlock(&cons.lock, "console");
+    initlock(&input.lock, "input");
+
+    devsw[CONSOLE].write = consolewrite;
+    devsw[CONSOLE].read = consoleread;
+    cbc_devsw[CONSOLE].write = cbc_consolewrite;
+    cbc_devsw[CONSOLE].read = cbc_consoleread;
+
+    cons.locking = 1;
+}
+