-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
powerpc: Simplify and clean up the xmon terminal I/O
This factors out the common bits of arch/powerpc/xmon/start_*.c into a new nonstdio.c, and removes some stuff that was supposed to make xmon's I/O routines somewhat stdio-like but was never used. It also makes the parsing of the xmon= command line option common, so that ppc32 can now use xmon={off,on,early} also. Signed-off-by: Paul Mackerras <paulus@samba.org>
- Loading branch information
Paul Mackerras
committed
Nov 8, 2005
1 parent
3825ac0
commit fca5dcd
Showing
12 changed files
with
236 additions
and
729 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
/* | ||
* Copyright (C) 1996-2005 Paul Mackerras. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
#include <linux/string.h> | ||
#include <asm/time.h> | ||
#include "nonstdio.h" | ||
|
||
int xmon_putchar(int c) | ||
{ | ||
char ch = c; | ||
|
||
if (c == '\n') | ||
xmon_putchar('\r'); | ||
return xmon_write(&ch, 1) == 1? c: -1; | ||
} | ||
|
||
static char line[256]; | ||
static char *lineptr; | ||
static int lineleft; | ||
|
||
int xmon_expect(const char *str, unsigned long timeout) | ||
{ | ||
int c; | ||
unsigned long t0; | ||
|
||
/* assume 25MHz default timebase if tb_ticks_per_sec not set yet */ | ||
timeout *= tb_ticks_per_sec? tb_ticks_per_sec: 25000000; | ||
t0 = get_tbl(); | ||
do { | ||
lineptr = line; | ||
for (;;) { | ||
c = xmon_read_poll(); | ||
if (c == -1) { | ||
if (get_tbl() - t0 > timeout) | ||
return 0; | ||
continue; | ||
} | ||
if (c == '\n') | ||
break; | ||
if (c != '\r' && lineptr < &line[sizeof(line) - 1]) | ||
*lineptr++ = c; | ||
} | ||
*lineptr = 0; | ||
} while (strstr(line, str) == NULL); | ||
return 1; | ||
} | ||
|
||
int xmon_getchar(void) | ||
{ | ||
int c; | ||
|
||
if (lineleft == 0) { | ||
lineptr = line; | ||
for (;;) { | ||
c = xmon_readchar(); | ||
if (c == -1 || c == 4) | ||
break; | ||
if (c == '\r' || c == '\n') { | ||
*lineptr++ = '\n'; | ||
xmon_putchar('\n'); | ||
break; | ||
} | ||
switch (c) { | ||
case 0177: | ||
case '\b': | ||
if (lineptr > line) { | ||
xmon_putchar('\b'); | ||
xmon_putchar(' '); | ||
xmon_putchar('\b'); | ||
--lineptr; | ||
} | ||
break; | ||
case 'U' & 0x1F: | ||
while (lineptr > line) { | ||
xmon_putchar('\b'); | ||
xmon_putchar(' '); | ||
xmon_putchar('\b'); | ||
--lineptr; | ||
} | ||
break; | ||
default: | ||
if (lineptr >= &line[sizeof(line) - 1]) | ||
xmon_putchar('\a'); | ||
else { | ||
xmon_putchar(c); | ||
*lineptr++ = c; | ||
} | ||
} | ||
} | ||
lineleft = lineptr - line; | ||
lineptr = line; | ||
} | ||
if (lineleft == 0) | ||
return -1; | ||
--lineleft; | ||
return *lineptr++; | ||
} | ||
|
||
char *xmon_gets(char *str, int nb) | ||
{ | ||
char *p; | ||
int c; | ||
|
||
for (p = str; p < str + nb - 1; ) { | ||
c = xmon_getchar(); | ||
if (c == -1) { | ||
if (p == str) | ||
return NULL; | ||
break; | ||
} | ||
*p++ = c; | ||
if (c == '\n') | ||
break; | ||
} | ||
*p = 0; | ||
return str; | ||
} | ||
|
||
void xmon_printf(const char *format, ...) | ||
{ | ||
va_list args; | ||
int n; | ||
static char xmon_outbuf[1024]; | ||
|
||
va_start(args, format); | ||
n = vsnprintf(xmon_outbuf, sizeof(xmon_outbuf), format, args); | ||
va_end(args); | ||
xmon_write(xmon_outbuf, n); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,14 @@ | ||
typedef int FILE; | ||
extern FILE *xmon_stdin, *xmon_stdout; | ||
#define EOF (-1) | ||
#define stdin xmon_stdin | ||
#define stdout xmon_stdout | ||
|
||
#define printf xmon_printf | ||
#define fprintf xmon_fprintf | ||
#define fputs xmon_fputs | ||
#define fgets xmon_fgets | ||
#define putchar xmon_putchar | ||
#define getchar xmon_getchar | ||
#define putc xmon_putc | ||
#define getc xmon_getc | ||
#define fopen(n, m) NULL | ||
#define fflush(f) do {} while (0) | ||
#define fclose(f) do {} while (0) | ||
extern char *fgets(char *, int, void *); | ||
extern void xmon_printf(const char *, ...); | ||
extern void xmon_fprintf(void *, const char *, ...); | ||
extern void xmon_sprintf(char *, const char *, ...); | ||
|
||
#define perror(s) printf("%s: no files!\n", (s)) | ||
extern int xmon_putchar(int c); | ||
extern int xmon_getchar(void); | ||
extern char *xmon_gets(char *, int); | ||
extern void xmon_printf(const char *, ...); | ||
extern void xmon_map_scc(void); | ||
extern int xmon_expect(const char *str, unsigned long timeout); | ||
extern int xmon_write(void *ptr, int nb); | ||
extern int xmon_readchar(void); | ||
extern int xmon_read_poll(void); |
Oops, something went wrong.