1
2
3
4
5
6
7
8
9#include <stdarg.h>
10#include "of1275.h"
11
12int (*prom)(void *args);
13
14phandle stdin;
15phandle stdout;
16phandle stderr;
17
18void printk(char *fmt, ...);
19
20extern void chrpboot(int a1, int a2, void *prom);
21extern int strlen(const char *s);
22
23void
24start(int a1, int a2, void *promptr)
25{
26 ofinit(promptr);
27 if (ofstdio(&stdin, &stdout, &stderr))
28 exit();
29 chrpboot(a1, a2, promptr);
30 for (;;)
31 exit();
32}
33
34int
35putc(int c, void *f)
36{
37 char ch = c;
38
39 if (c == '\n')
40 putc('\r', f);
41 return write(f, &ch, 1) == 1? c: -1;
42}
43
44int
45putchar(int c)
46{
47 return putc(c, stdout);
48}
49
50int
51fputs(char *str, void *f)
52{
53 int n = strlen(str);
54
55 return write(f, str, n) == n? 0: -1;
56}
57
58int
59readchar(void)
60{
61 char ch;
62
63 for (;;) {
64 switch (read(stdin, &ch, 1)) {
65 case 1:
66 return ch;
67 case -1:
68 printk("read(stdin) returned -1\r\n");
69 return -1;
70 }
71 }
72}
73
74static char line[256];
75static char *lineptr;
76static int lineleft;
77
78int
79getchar(void)
80{
81 int c;
82
83 if (lineleft == 0) {
84 lineptr = line;
85 for (;;) {
86 c = readchar();
87 if (c == -1 || c == 4)
88 break;
89 if (c == '\r' || c == '\n') {
90 *lineptr++ = '\n';
91 putchar('\n');
92 break;
93 }
94 switch (c) {
95 case 0177:
96 case '\b':
97 if (lineptr > line) {
98 putchar('\b');
99 putchar(' ');
100 putchar('\b');
101 --lineptr;
102 }
103 break;
104 case 'U' & 0x1F:
105 while (lineptr > line) {
106 putchar('\b');
107 putchar(' ');
108 putchar('\b');
109 --lineptr;
110 }
111 break;
112 default:
113 if (lineptr >= &line[sizeof(line) - 1])
114 putchar('\a');
115 else {
116 putchar(c);
117 *lineptr++ = c;
118 }
119 }
120 }
121 lineleft = lineptr - line;
122 lineptr = line;
123 }
124 if (lineleft == 0)
125 return -1;
126 --lineleft;
127 return *lineptr++;
128}
129
130extern int vsprintf(char *buf, const char *fmt, va_list args);
131static char sprint_buf[1024];
132
133void
134printk(char *fmt, ...)
135{
136 va_list args;
137 int n;
138
139 va_start(args, fmt);
140 n = vsprintf(sprint_buf, fmt, args);
141 va_end(args);
142 write(stdout, sprint_buf, n);
143}
144
145int
146printf(char *fmt, ...)
147{
148 va_list args;
149 int n;
150
151 va_start(args, fmt);
152 n = vsprintf(sprint_buf, fmt, args);
153 va_end(args);
154 write(stdout, sprint_buf, n);
155 return n;
156}
157