static int do_output_char(unsigned char c, struct tty_struct *tty, int space) { int spaces; if (!space) return -1; switch (c) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) { if (space < 2) return -1; tty->canon_column = tty->column = 0; tty->ops->write(tty, "\r\n", 2); return 2; } tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) return 0; if (O_OCRNL(tty)) { c = '\n'; if (O_ONLRET(tty)) tty->canon_column = tty->column = 0; break; } tty->canon_column = tty->column = 0; break; case '\t': spaces = 8 - (tty->column & 7); if (O_TABDLY(tty) == XTABS) { if (space < spaces) return -1; tty->column += spaces; tty->ops->write(tty, " ", spaces); return spaces; } tty->column += spaces; break; case '\b': if (tty->column > 0) tty->column--; break; default: if (!iscntrl(c)) { if (O_OLCUC(tty)) c = toupper(c); if (!is_continuation(c, tty)) tty->column++; } break; } tty_put_char(tty, c); return 1; }
/* * opost_block --- to speed up block console writes, among other * things. */ static ssize_t opost_block(struct tty_struct * tty, const unsigned char * inbuf, unsigned int nr) { char buf[80]; int space; int i; char *cp; space = tty->driver.write_room(tty); if (!space) return 0; if (nr > space) nr = space; if (nr > sizeof(buf)) nr = sizeof(buf); nr -= copy_from_user(buf, inbuf, nr); if (!nr) return 0; for (i = 0, cp = buf; i < nr; i++, cp++) { switch (*cp) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) goto break_out; tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) goto break_out; if (O_OCRNL(tty)) { *cp = '\n'; if (O_ONLRET(tty)) tty->canon_column = tty->column = 0; break; } tty->canon_column = tty->column = 0; break; case '\t': goto break_out; case '\b': if (tty->column > 0) tty->column--; break; default: if (O_OLCUC(tty)) *cp = toupper(*cp); if (!iscntrl(*cp)) tty->column++; break; } } break_out: if (tty->driver.flush_chars) tty->driver.flush_chars(tty); i = tty->driver.write(tty, 0, buf, i); return i; }
/* * Perform OPOST processing. Returns -1 when the output device is * full and the character must be retried. */ static int opost(unsigned char c, struct tty_struct *tty) { int space, spaces; space = tty->driver.write_room(tty); if (!space) return -1; if (O_OPOST(tty)) { switch (c) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) { if (space < 2) return -1; tty->driver.put_char(tty, '\r'); tty->column = 0; } tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) return 0; if (O_OCRNL(tty)) { c = '\n'; if (O_ONLRET(tty)) tty->canon_column = tty->column = 0; break; } tty->canon_column = tty->column = 0; break; case '\t': spaces = 8 - (tty->column & 7); if (O_TABDLY(tty) == XTABS) { if (space < spaces) return -1; tty->column += spaces; tty->driver.write(tty, 0, " ", spaces); return 0; } tty->column += spaces; break; case '\b': if (tty->column > 0) tty->column--; break; default: if (O_OLCUC(tty)) c = toupper(c); if (!iscntrl(c)) tty->column++; break; } } tty->driver.put_char(tty, c); return 0; }
static ssize_t process_output_block(struct tty_struct *tty, const unsigned char *buf, unsigned int nr) { int space; int i; const unsigned char *cp; mutex_lock(&tty->output_lock); space = tty_write_room(tty); if (!space) { mutex_unlock(&tty->output_lock); return 0; } if (nr > space) nr = space; for (i = 0, cp = buf; i < nr; i++, cp++) { unsigned char c = *cp; switch (c) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) goto break_out; tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) goto break_out; if (O_OCRNL(tty)) goto break_out; tty->canon_column = tty->column = 0; break; case '\t': goto break_out; case '\b': if (tty->column > 0) tty->column--; break; default: if (!iscntrl(c)) { if (O_OLCUC(tty)) goto break_out; if (!is_continuation(c, tty)) tty->column++; } break; } } break_out: i = tty->ops->write(tty, buf, i); mutex_unlock(&tty->output_lock); return i; }
static int opost(unsigned char c, struct tty_struct *tty) { if (FULL(&tty->write_q)) return -1; if (O_OPOST(tty)) { switch (c) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) { if (LEFT(&tty->write_q) < 2) return -1; put_tty_queue('\r', &tty->write_q); tty->column = 0; } tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) return 0; if (O_OCRNL(tty)) { c = '\n'; if (O_ONLRET(tty)) tty->canon_column = tty->column = 0; break; } tty->canon_column = tty->column = 0; break; case '\t': if (O_TABDLY(tty) == XTABS) { if (LEFT(&tty->write_q) < 8) return -1; do put_tty_queue(' ', &tty->write_q); while (++tty->column % 8); return 0; } tty->column = (tty->column | 7) + 1; break; case '\b': if (tty->column > 0) tty->column--; break; default: if (O_OLCUC(tty)) c = toupper(c); if (!iscntrl(c)) tty->column++; break; } } put_tty_queue(c, &tty->write_q); return 0; }
static ssize_t opost_block(struct tty_struct * tty, const unsigned char * buf, unsigned int nr) { int space; int i; const unsigned char *cp; space = tty->driver->write_room(tty); if (!space) return 0; if (nr > space) nr = space; for (i = 0, cp = buf; i < nr; i++, cp++) { switch (*cp) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) goto break_out; tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) goto break_out; if (O_OCRNL(tty)) goto break_out; tty->canon_column = tty->column = 0; break; case '\t': goto break_out; case '\b': if (tty->column > 0) tty->column--; break; default: if (O_OLCUC(tty)) goto break_out; if (!iscntrl(*cp)) tty->column++; break; } } break_out: if (tty->driver->flush_chars) tty->driver->flush_chars(tty); i = tty->driver->write(tty, buf, i); return i; }