|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2792 (0xae8) Types: TextFile Notes: UNIX file Names: »inquire.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »unimenu/src/menu/inquire.c«
/* * @(#)inquire.c 1.1 15:34:52 4/6/85 * * input routines: inquire(), rd_line() * * inquire uses window calls to do output then does a line of input * rd_line is used to read a line of input in raw mode */ #include "defs.h" #include <sys/dir.h> extern int *Scrnbuf; extern int Runwin; extern int Top; extern int Ls; extern int Pcur; extern char Curdir[]; char *inquire(str) char *str; { static int buf[40]; int len; int line1; len = strlen(str); fillw(Scrnbuf + (SCR_WID * Top), SCR_WID * (SCR_LEN - Top), V_SPACE); bputattr(Scrnbuf, SCR_SIZ.word, Top + 2, 0, 1, len + 2, 0x70); bputstr(Scrnbuf, SCR_SIZ.word, Top + 2, 1, str); if ( Pcur ) { bputstr(Scrnbuf, SCR_SIZ.word, Top + 1, 1, "Current Directory: "); bputstr(Scrnbuf, SCR_SIZ.word, Top + 1, 20, Curdir); bputattr(Scrnbuf, SCR_SIZ.word, Top + 1, 0, 1, 20 + strlen(Curdir), 0x70); } if ( Ls ) ls_dir(".", Scrnbuf + ((Top + 4) * SCR_WID), Top + 4); if ( wr_blck(Scrnbuf, 0, 0, SCR_LEN, SCR_WID) ) { pcurs(24,1); printf(str); } else pcurs(Top + 3, len + 4); if ( rd_line(buf, 40) < 0 ) /* 40 is not arbitrary */ return (0); /* pcurs(24, 79); */ return (&buf[0]); } /* * rd_line(bufp, max) * a get line that does it's own processing of backspaces * newlines, etc., and does its own echoing. This * routine is used when the terminal is in RAW mode. * Newlines are put into the buffer. * * passed pointer to a buffer to put chars into * maximum number of chars. to read * returns number of chars read */ char KILL_CH = 0x15; /* ^u */ rd_line(bufp, maxline) char *bufp; int maxline; { int cnt = 0; char c; char *orig; static char *backup = "\b \b"; orig = bufp; to_raw(); while ( cnt < maxline ) { read(0, bufp, 1); c = *bufp; if ( (c == '\n') || (c == '\r') ) break; if ( c == '\b') { if ( cnt > 0 ) { write(1, backup, 3); bufp--; cnt--; } } else if ( c == KILL_CH ) { while ( cnt ) { bufp--; write(1, backup, 3); cnt--; } } else if ( c == '\033' ) /* treat as EOF */ { bufp = orig; cnt = -1; break; } else { write(1, bufp, 1); cnt++; bufp++; } } *bufp = '\0'; to_cooked(); return (cnt); } ls_dir(name, p, row) char *name; W2B *p; int row; { struct direct dir; int cnt = 0; int i; int fd; W2B *s; char *n; if ( row >= SCR_LEN ) return; if ( (fd = open(name, 0)) < 0 ) return; cnt = 0; while ( read(fd, &dir, sizeof(struct direct)) > 0 ) { if ( dir.d_ino == 0 || dir.d_name[0] == '.' ) continue; if ( ++cnt % 5 == 0 ) { if ( ++row >= SCR_LEN ) break; } fillw(p, 16, V_SPACE); for ( i = 0, s = p, n = dir.d_name; *n && i < 14; i++ ) { s->bytes.low = *n++; s->bytes.high = 0x07; s++; } p += 16; } close(fd); }