|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 2742 (0xab6) Types: TextFile Names: »ttyio.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/micrognu/sys/osk/ttyio.c«
/* * sys/osk/ttyio.c by Robert A. Larson * * The functions in this file * negotiate with the operating system for * keyboard characters, and write characters to * the display in a barely buffered fashion. */ #include "def.h" #include <sgstat.h> #ifdef DPROMPT # include <varargs.h> # define S_RDY 2437 /* arbitrary user signal */ #endif #define NOBUF 512 /* Output buffer size. */ char obuf[NOBUF]; /* Output buffer. */ int nobuf; struct sgbuf oldtty, newtty; int nrow; /* Terminal size, rows. */ int ncol; /* Terminal size, columns. */ short ospeed; /* Terminal speed, for termlib.l */ #ifdef DPROMPT wakeup(signum) int signum; { /* ignore the signal */ } #endif /* * This function gets called once, to set up * the terminal channel. */ ttopen() { if(_gs_opt(0, &oldtty) == -1) panic("can't get options"); ospeed = oldtty.sg_baud; _strass(&newtty, &oldtty, sizeof(newtty)); /* newtty=oldtty; */ if(oldtty.sg_class == 0) { /* scf */ newtty.sg_backsp= newtty.sg_delete= newtty.sg_echo = newtty.sg_alf = newtty.sg_pause = newtty.sg_bspch = newtty.sg_dlnch = newtty.sg_eorch = newtty.sg_eofch = newtty.sg_rlnch = newtty.sg_dulnch= newtty.sg_psch = newtty.sg_kbich = newtty.sg_kbach = 0; #ifndef xon_xoff newtty.sg_xon = newtty.sg_xoff = 0; #endif if(_ss_opt(0, &newtty) == -1) panic("can't set options"); nrow = oldtty.sg_page == 0 ? NROW : oldtty.sg_page; } else { /* not scf, fake it */ nrow = NROW; } ncol = NCOL; #ifdef DPROMPT intercept(wakeup); /* ignore signals */ #endif } /* * This function gets called just * before we go back home to the shell. Put all of * the terminal parameters back. */ ttclose() { ttflush(); if(_ss_opt(0, &oldtty) == -1) panic("can't reset options"); } /* * Write character to the display. * Characters are buffered up, to make things * a little bit more efficient. */ ttputc(c) { if (nobuf >= NOBUF) ttflush(); obuf[nobuf++] = c; } /* * Flush output. */ ttflush() { if (nobuf != 0) { write(1, obuf, nobuf); nobuf = 0; } } /* * Read character from terminal. * All 8 bits are returned, so that you can use * a multi-national terminal. */ ttgetc() { char buf[1]; while (read(0, &buf[0], 1) != 1) ; return (buf[0] & 0xFF); } int typeahead() { return _gs_rdy(0) > 0; } panic(s) char *s; { _ss_opt(0, &oldtty); /* ignore errors */ fputs("Panic: ", stdout); /* avoid printf, don't load all that */ puts(s); exit(1); } #ifdef DPROMPT ttwait() { if(_gs_rdy(0) > 0) return FALSE; /* already something waiting */ _ss_ssig(0, S_RDY); /* wake me when you have something */ if(sleep(2)!=0) return FALSE; /* sleep interupted */ _ss_rel(0); return TRUE; } #endif