305 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 
 | 
						|
 * io.c for mdb
 | 
						|
 * all the i/o is here
 | 
						|
 * NB: Printf()
 | 
						|
 */
 | 
						|
#include "mdb.h"
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <string.h>
 | 
						|
#include <sys/types.h>
 | 
						|
#include "proto.h"
 | 
						|
 | 
						|
#define OUTBUFSIZE	512
 | 
						|
#define PAGESIZE	24
 | 
						|
 | 
						|
PRIVATE int forceupper = FALSE;
 | 
						|
PRIVATE int someupper = FALSE;
 | 
						|
PRIVATE int stringcount = 0;
 | 
						|
PRIVATE char *string_ptr = NULL;	/* stringptr ambiguous at 8th char */
 | 
						|
PRIVATE char *stringstart = NULL;
 | 
						|
 | 
						|
PRIVATE char outbuf[OUTBUFSIZE];
 | 
						|
PRIVATE FILE *cmdfile = stdin;
 | 
						|
PRIVATE FILE *outfile = stdout;
 | 
						|
PRIVATE FILE *logfile;
 | 
						|
PRIVATE int lineno;
 | 
						|
 | 
						|
_PROTOTYPE( int _doprnt, (const char *format, va_list ap, FILE *stream ));
 | 
						|
 | 
						|
PUBLIC char *get_cmd(cbuf, csize)
 | 
						|
char *cbuf;
 | 
						|
int csize;
 | 
						|
{
 | 
						|
char *r;
 | 
						|
 | 
						|
  fflush(stdout);
 | 
						|
  if( cmdfile == stdin && outfile == stdout )
 | 
						|
	printf("* ");
 | 
						|
  r = fgets(cbuf, csize, cmdfile);
 | 
						|
  if ( r == NULL && cmdfile != stdin ) {
 | 
						|
	cmdfile = stdin;
 | 
						|
	return get_cmd(cbuf, csize);
 | 
						|
  }
 | 
						|
 | 
						|
  if ( logfile != NULL ) { 
 | 
						|
	fprintf( logfile, "%s", cbuf );		
 | 
						|
	lineno++;
 | 
						|
  }
 | 
						|
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void openin(s)
 | 
						|
char *s;
 | 
						|
{
 | 
						|
char *t;
 | 
						|
 | 
						|
  if ((t = strchr(s,'\n')) != NULL) *t = '\0';
 | 
						|
  if ((t = strchr(s,' ')) != NULL) *t = '\0';
 | 
						|
  cmdfile = fopen(s,"r");
 | 
						|
  if (cmdfile == NULL) {
 | 
						|
	Printf("Cannot open %s for input\n",s);
 | 
						|
	cmdfile = stdin; 
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* Special version of printf 
 | 
						|
 * really sprintf()
 | 
						|
 * from MINIX library
 | 
						|
 * followed by outstr()
 | 
						|
 */
 | 
						|
PUBLIC int Printf(const char *format, ...)
 | 
						|
{
 | 
						|
	va_list ap;
 | 
						|
	int retval;
 | 
						|
	FILE tmp_stream;
 | 
						|
 | 
						|
	va_start(ap, format);
 | 
						|
 | 
						|
	tmp_stream._fd     = -1;
 | 
						|
	tmp_stream._flags  = _IOWRITE + _IONBF + _IOWRITING;
 | 
						|
	tmp_stream._buf    = (unsigned char *) outbuf;
 | 
						|
	tmp_stream._ptr    = (unsigned char *) outbuf;
 | 
						|
	tmp_stream._count  = 512;
 | 
						|
 | 
						|
	retval = _doprnt(format, ap, &tmp_stream);
 | 
						|
	putc('\0',&tmp_stream);
 | 
						|
 | 
						|
	va_end(ap);
 | 
						|
 | 
						|
        outstr(outbuf);
 | 
						|
 | 
						|
	return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* 
 | 
						|
 * Set logging options 
 | 
						|
 */
 | 
						|
PUBLIC void logging( c, name )
 | 
						|
int c;
 | 
						|
char *name;
 | 
						|
{
 | 
						|
char *t;
 | 
						|
 | 
						|
  if ( c == 'q' && logfile != NULL ) {
 | 
						|
	fclose(logfile);
 | 
						|
	return;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((t = strchr(name,'\n')) != NULL) *t = '\0';
 | 
						|
  if ((t = strchr(name,' ' )) != NULL) *t = '\0';
 | 
						|
  if ( logfile != NULL ) fclose(logfile);
 | 
						|
 
 | 
						|
  if ( strlen(name) > 0 ) {
 | 
						|
	logfile = fopen(name,"w");
 | 
						|
 | 
						|
	if (logfile == NULL) {
 | 
						|
		Printf("Cannot open %s for output\n",name);
 | 
						|
		return; 
 | 
						|
	}
 | 
						|
 | 
						|
	/* Close standard output file for L */
 | 
						|
  	if ( c == 'L' ) {
 | 
						|
		fclose(outfile);
 | 
						|
		outfile = NULL;
 | 
						|
  	}
 | 
						|
  }
 | 
						|
  else 
 | 
						|
  /* Reset */
 | 
						|
  {
 | 
						|
	if ( logfile != NULL ) fclose(logfile);
 | 
						|
	outfile = stdout;
 | 
						|
	outbyte('\n');
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/* Output system error string */
 | 
						|
PUBLIC void do_error(m)
 | 
						|
char *m;
 | 
						|
{
 | 
						|
    outstr(m);
 | 
						|
    outstr(": ");
 | 
						|
    outstr(strerror(errno));   
 | 
						|
    outstr("\n");
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void closestring()
 | 
						|
{
 | 
						|
/* close string device */
 | 
						|
 | 
						|
    stringcount = 0;
 | 
						|
    stringstart = string_ptr = NULL;
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC int mytolower(ch)
 | 
						|
int ch;
 | 
						|
{
 | 
						|
/* convert char to lower case */
 | 
						|
 | 
						|
    if (ch >= 'A' && ch <= 'Z')
 | 
						|
	ch += 'a' - 'A';
 | 
						|
    return ch;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
PUBLIC void openstring(string)
 | 
						|
char *string;
 | 
						|
{
 | 
						|
/* open string device */
 | 
						|
 | 
						|
    stringcount = 0;
 | 
						|
    stringstart = string_ptr = string;
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outbyte(byte)
 | 
						|
int byte;
 | 
						|
{
 | 
						|
/* print char to currently open output devices */
 | 
						|
 | 
						|
    if (forceupper && byte >= 'a' && byte <= 'z')
 | 
						|
	byte += 'A' - 'a';
 | 
						|
    if (string_ptr != NULL)
 | 
						|
    {
 | 
						|
	if ((*string_ptr++ = byte) == '\t')
 | 
						|
	    stringcount = 8 * (stringcount / 8 + 1);
 | 
						|
	else
 | 
						|
	    ++stringcount;
 | 
						|
    }
 | 
						|
    else 
 | 
						|
    {
 | 
						|
	if ( paging && byte == '\n' ) {
 | 
						|
		lineno++;		
 | 
						|
		if ( lineno >= PAGESIZE) {
 | 
						|
			if ( cmdfile == stdin ) {
 | 
						|
			     printf("\nMore...any key to continue");
 | 
						|
			     fgets( outbuf, OUTBUFSIZE-1, cmdfile );
 | 
						|
		     	}
 | 
						|
		}
 | 
						|
		lineno = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	if ( outfile != NULL )  
 | 
						|
		putc(byte,outfile);
 | 
						|
	/* Do not log CR */
 | 
						|
	if ( logfile != NULL && byte != '\r' ) 	
 | 
						|
		putc(byte,logfile); 
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
PUBLIC void outcomma()
 | 
						|
{
 | 
						|
/* print comma */
 | 
						|
 | 
						|
    outbyte(',');
 | 
						|
}
 | 
						|
 | 
						|
PRIVATE char hexdigits[] = "0123456789ABCDEF";
 | 
						|
PUBLIC void outh4(num)
 | 
						|
unsigned num;
 | 
						|
{
 | 
						|
/* print 4 bits hex */
 | 
						|
 | 
						|
    outbyte(hexdigits[num % 16]);
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outh8(num)
 | 
						|
unsigned num;
 | 
						|
{
 | 
						|
/* print 8 bits hex */
 | 
						|
 | 
						|
    outh4(num / 16);
 | 
						|
    outh4(num);
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outh16(num)
 | 
						|
unsigned num;
 | 
						|
{
 | 
						|
/* print 16 bits hex */
 | 
						|
 | 
						|
    outh8(num / 256);
 | 
						|
    outh8(num);
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outh32(num)
 | 
						|
unsigned num;
 | 
						|
{
 | 
						|
/* print 32 bits hex */
 | 
						|
 | 
						|
    outh16((u16_t) (num >> 16));
 | 
						|
    outh16((u16_t) num);
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outspace()
 | 
						|
{
 | 
						|
/* print space */
 | 
						|
 | 
						|
    outbyte(' ');
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outstr(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
/* print string */
 | 
						|
 | 
						|
    while (*s)
 | 
						|
	outbyte(*s++);
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outtab()
 | 
						|
{
 | 
						|
/* print tab */
 | 
						|
 | 
						|
    outbyte('\t');
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC void outustr(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
/* print string, perhaps converting case to upper */
 | 
						|
 | 
						|
    forceupper = someupper;
 | 
						|
    while (*s)
 | 
						|
	outbyte(*s++);
 | 
						|
    forceupper = FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
PUBLIC int stringpos()
 | 
						|
{
 | 
						|
/* return current offset of string device */
 | 
						|
 | 
						|
    return string_ptr - stringstart;
 | 
						|
}
 | 
						|
 | 
						|
PUBLIC int stringtab()
 | 
						|
{
 | 
						|
/* return current "tab" spot of string device */
 | 
						|
 | 
						|
    return stringcount;
 | 
						|
}
 | 
						|
 |