kern

annotate src/term.c @ 71:c7bd6ec7b946

changed test_proc to modify memory after the fork in order to try out copy-on-write, by pushing the result of getpid on the stack.
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 13 Oct 2011 05:22:35 +0300
parents 06172322fb76
children
rev   line source
nuclear@4 1 #include <ctype.h>
nuclear@1 2 #include "term.h"
nuclear@1 3 #include "vid.h"
nuclear@52 4 #include "intr.h"
nuclear@1 5
nuclear@2 6 static int bg, fg = LTGRAY;
nuclear@1 7 static int cursor_x, cursor_y;
nuclear@1 8
nuclear@2 9 /* sets the active text color and returns previous value */
nuclear@2 10 int set_text_color(int c)
nuclear@1 11 {
nuclear@2 12 int prev = fg;
nuclear@2 13
nuclear@1 14 if(c >= 0 && c < 16) {
nuclear@1 15 fg = c;
nuclear@1 16 }
nuclear@2 17 return prev;
nuclear@1 18 }
nuclear@1 19
nuclear@2 20 /* sets the active background color and returns the current value */
nuclear@2 21 int set_back_color(int c)
nuclear@1 22 {
nuclear@2 23 int prev = bg;
nuclear@2 24
nuclear@1 25 if(c >= 0 && c < 16) {
nuclear@1 26 bg = c;
nuclear@1 27 }
nuclear@2 28 return prev;
nuclear@1 29 }
nuclear@1 30
nuclear@2 31 /* output a single character, handles formatting, cursor advancement
nuclear@2 32 * and scrolling the screen when we reach the bottom.
nuclear@2 33 */
nuclear@1 34 int putchar(int c)
nuclear@1 35 {
nuclear@52 36 int istate = get_intr_state();
nuclear@52 37 disable_intr();
nuclear@52 38
nuclear@1 39 switch(c) {
nuclear@1 40 case '\n':
nuclear@1 41 cursor_y++;
nuclear@1 42
nuclear@1 43 case '\r':
nuclear@1 44 cursor_x = 0;
nuclear@1 45 break;
nuclear@1 46
nuclear@1 47 case '\b':
nuclear@1 48 cursor_x--;
nuclear@1 49 set_char(' ', cursor_x, cursor_y, fg, bg);
nuclear@1 50 break;
nuclear@1 51
nuclear@1 52 case '\t':
nuclear@1 53 cursor_x = ((cursor_x >> 3) + 1) << 3;
nuclear@1 54 break;
nuclear@1 55
nuclear@1 56 default:
nuclear@2 57 if(isprint(c)) {
nuclear@2 58 set_char(c, cursor_x, cursor_y, fg, bg);
nuclear@2 59 if(++cursor_x >= WIDTH) {
nuclear@2 60 cursor_x = 0;
nuclear@2 61 cursor_y++;
nuclear@2 62 }
nuclear@1 63 }
nuclear@1 64 }
nuclear@1 65
nuclear@1 66 if(cursor_y >= HEIGHT) {
nuclear@1 67 scroll_scr();
nuclear@1 68 cursor_y--;
nuclear@1 69 }
nuclear@2 70
nuclear@2 71 set_cursor(cursor_x, cursor_y);
nuclear@52 72
nuclear@52 73 set_intr_state(istate);
nuclear@1 74 return c;
nuclear@1 75 }