File:  [Atari MiNT] / MiNT / src / console.c
Revision 1.1.1.5 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:58:49 2018 UTC (8 years, 1 month ago) by root
Branches: mint, MAIN
CVS tags: mint112, HEAD
MiNT 1.12

/*

Copyright 1990,1991,1992 Eric R. Smith.

Copyright 1993,1994 Atari Corporation.

All rights reserved.

*/



/* MiNT routines for doing console I/O */



#include "mint.h"



/*

 * These routines are what Cconout, Cauxout, etc. ultimately call.

 * They take an integer argument which is the user's file handle,

 * and do the translation to a file ptr (and return an appropriate error

 * message if necessary.

 * "mode" may be RAW, COOKED, ECHO, or COOKED|ECHO.

 * note that the user may not call them directly!

 */



long

file_instat(f)

	FILEPTR *f;

{

	long r;



	if (!f) {

		return EIHNDL;

	}

	r = 1;		/* default is to assume input waiting (e.g. TOS files)*/

	if (is_terminal(f))

		(void)tty_ioctl(f, FIONREAD, &r);

	else

		(void)(*f->dev->ioctl)(f, FIONREAD, &r);

	return r;

}



long

file_outstat(f)

	FILEPTR *f;

{

	long r;



	if (!f) {

		return EIHNDL;

	}

	r = 1;		/* default is to assume output OK (e.g. TOS files) */

	if (is_terminal(f))

		(void)tty_ioctl(f, FIONWRITE, &r);

	else

		(void)(*f->dev->ioctl)(f, FIONWRITE, &r);

	return r;

}



long

file_getchar(f, mode)

	FILEPTR *f;

	int mode;

{

	char c;

	long r;



	if (!f) {

		return EIHNDL;

	}

	if (is_terminal(f)) {

		return tty_getchar(f, mode);

	}

	r = (*f->dev->read)(f, &c, 1L);

	if (r != 1)

		return MiNTEOF;

	else

		return ((long)c) & 0xff;

}



long

file_putchar(f, c, mode)

	FILEPTR *f;

	long c;

	int mode;

{

	char ch;



	if (!f) {

		return EIHNDL;

	}

	if (is_terminal(f)) {

		return tty_putchar(f, c & 0x7fffffffL, mode);

	}

	ch = c & 0x00ff;

	return (*f->dev->write)(f, &ch, 1L);

}



/*

 * OK, here are the GEMDOS console I/O routines

 */



long ARGS_ON_STACK

c_conin()

{

	return file_getchar(curproc->handle[0], COOKED|ECHO);

}



long ARGS_ON_STACK

c_conout(c)

	int c;

{

	return file_putchar(curproc->handle[1], (long)c, COOKED);

}



long ARGS_ON_STACK

c_auxin()

{

	return file_getchar(curproc->handle[2], RAW);

}



long ARGS_ON_STACK

c_auxout(c)

	int c;

{

	return file_putchar(curproc->handle[2], (long)c, RAW);

}



long ARGS_ON_STACK

c_prnout(c)

	int c;

{

	return file_putchar(curproc->handle[3], (long)c, RAW);

}



long ARGS_ON_STACK

c_rawio(c)

	int c;

{

	long r;

	PROC *p = curproc;



	if (c == 0x00ff) {

		if (!file_instat(p->handle[0]))

			return 0;

		r = file_getchar(p->handle[0], RAW);

		if (r <= 0)

			return 0;

		return r;

	}

	else

		return file_putchar(p->handle[1], (long)c, RAW);

}



long ARGS_ON_STACK

c_rawcin()

{

	return file_getchar(curproc->handle[0], RAW);

}



long ARGS_ON_STACK

c_necin()

{

	return file_getchar(curproc->handle[0],COOKED|NOECHO);

}



long ARGS_ON_STACK

c_conws(str)

	const char *str;

{

	const char *p = str;

	long cnt = 0;



	while (*p++) cnt++;

	return f_write(1, cnt, str);

}



long ARGS_ON_STACK

c_conrs(buf)

	char *buf;

{

	long size, r;

	char *s;



	size = ((long)*buf) & 0xff;

	r = f_read(0, size, buf+2);

	if (r < 0) {

		buf[1] = 0;

		return r;

	}

/* if reading from a file, stop at first CR or LF encountered */

	s = buf+2;

	size = 0;

	while(r-- > 0) {

		if (*s == '\r' || *s == '\n')

			break;

		s++; size++;

	}

	buf[1] = (char)size;

	return 0;

}



long ARGS_ON_STACK

c_conis()

{

	return -(!!file_instat(curproc->handle[0]));

}



long ARGS_ON_STACK

c_conos()

{

	return -(!!file_outstat(curproc->handle[1]));

}



long ARGS_ON_STACK

c_prnos()

{

	return -(!!file_outstat(curproc->handle[3]));

}



long ARGS_ON_STACK

c_auxis()

{

	return -(!!file_instat(curproc->handle[2]));

}



long ARGS_ON_STACK

c_auxos()

{

	return -(!!file_outstat(curproc->handle[2]));

}



/* Extended GEMDOS routines */



long ARGS_ON_STACK

f_instat(h)

	int h;

{

	PROC *proc;

	int fh = h;



#if O_GLOBAL

	if (fh >= 100) {

		proc = rootproc;

		fh -= 100;

	} else

#endif

		proc = curproc;



	if (fh < MIN_HANDLE || fh >=MAX_OPEN) {

		DEBUG(("Finstat: bad handle %d", h));

		return EIHNDL;

	}

	return file_instat(proc->handle[fh]);

}



long ARGS_ON_STACK

f_outstat(h)

	int h;

{

	int fh = h;

	PROC *proc;

#if O_GLOBAL

	if (fh >= 100) {

		fh -= 100;

		proc = rootproc;

	} else

#endif

		proc = curproc;



	if (fh < MIN_HANDLE || fh >=MAX_OPEN) {

		DEBUG(("Foutstat: bad handle %d", h));

		return EIHNDL;

	}

	return file_outstat(proc->handle[fh]);

}



long ARGS_ON_STACK

f_getchar(h, mode)

	int h, mode;

{

	int fh = h;

	PROC *proc;



#if O_GLOBAL

	if (fh >= 100) {

		fh -= 100;

		proc = rootproc;

	} else

#endif

		proc = curproc;

	if (fh < MIN_HANDLE || fh >=MAX_OPEN) {

		DEBUG(("Fgetchar: bad handle %d", h));

		return EIHNDL;

	}

	return file_getchar(proc->handle[fh], mode);

}



long ARGS_ON_STACK

f_putchar(h, c, mode)

	int h;

	long c;

	int mode;

{

	int fh = h;

	PROC *proc;



#if O_GLOBAL

	if (fh >= 100) {

		fh -= 100;

		proc = rootproc;

	} else

#endif

		proc = curproc;



	if (fh < MIN_HANDLE || fh >=MAX_OPEN) {

		DEBUG(("Fputchar: bad handle %d", h));

		return EIHNDL;

	}

	return file_putchar(proc->handle[fh], c, mode);

}


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.