home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
254b.lha
/
AMXLISP_v2.0
/
interface-src
/
asstuff.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-05-09
|
5KB
|
264 lines
/* asstuff.c - Amiga specific routines */
#include "xlisp.h"
#ifndef MANX
#define agetc getc /* Not sure if this will work in all cases (fnf) */
#define aputc putc /* Not sure if this will work in all cases (fnf) */
#endif
#define LBSIZE 200
/* external routines */
extern double ran();
/* external variables */
extern LVAL s_unbound,true;
extern int prompt;
extern int errno;
/* line buffer variables */
static char lbuf[LBSIZE];
static int lpos[LBSIZE];
static int lindex;
static int lcount;
static int lposition;
#define NEW 1006
static long xlispwindow;
extern FILE *tfp;
/* osinit - initialize */
osinit(banner)
char *banner;
{
/* rouaix extern int Enable_Abort; */
/* Enable_Abort = 0; Turn off ^C interrupt in case it's on */
xlispwindow = Open("RAW:1/1/639/199/Xlisp by David Betz", NEW);
while (*banner != '\000') {
xputc (*banner++);
}
xputc ('\n');
lposition = 0;
lindex = 0;
lcount = 0;
}
osfinish ()
{
Close (xlispwindow);
}
/* osrand - return a random number between 0 and n-1 */
int osrand(n)
int n;
{
n = (int)(ran() * (double)n);
return (n < 0 ? -n : n);
}
/* oscheck - check for control characters during execution */
oscheck()
{
int ch;
if (ch = xcheck())
switch (ch) {
case '\002': osflush(); xlbreak("BREAK",s_unbound); break;
case '\004': osflush(); xltoplevel(); break;
}
}
/* osflush - flush the input line buffer */
osflush()
{
lindex = lcount = 0;
}
/* xgetc - get a character from the terminal without echo */
static int xgetc()
{
char ch;
Read (xlispwindow, &ch, 1);
return (ch & 0xFF);
}
/* xputc - put a character to the terminal */
static xputc(ch)
int ch;
{
char chout;
chout = ch;
Write (xlispwindow, &chout, 1L);
}
/* xcheck - check for a character */
static int xcheck()
{
if (WaitForChar (xlispwindow, 0L) == 0L)
return (0);
return (xgetc() & 0xFF);
}
double ran () /* Just punt for now, not in Manx C; FIXME!!*/
{
static long seed = 654321;
long lval;
double dval;
seed *= ((8 * (123456) - 3));
lval = seed & 0xFFFF;
dval = ((double) lval) / ((double) (0x10000));
return (dval);
}
/* ADDED FOR V2.0 */
/* osclose - close a file */
int osclose(fp)
FILE *fp;
{
return (fclose(fp));
}
/* ostputc - put a character to the terminal */
ostputc(ch)
int ch;
{
/* check for control characters */
oscheck();
/* output the character */
if (ch == '\n') {
xputc('\r'); xputc('\n');
lposition = 0;
}
else {
xputc(ch);
lposition++;
}
/* output the character to the transcript file */
if (tfp)
osaputc(ch,tfp);
}
/* ostgetc - get a character from the terminal */
int ostgetc()
{
int ch;
/* check for a buffered character */
if (lcount--)
return (lbuf[lindex++]);
/* get an input line */
for (lcount = 0; ; )
switch (ch = xgetc()) {
case '\r':
lbuf[lcount++] = '\n';
xputc('\r'); xputc('\n'); lposition = 0;
if (tfp)
for (lindex = 0; lindex < lcount; ++lindex)
osaputc(lbuf[lindex],tfp);
lindex = 0; lcount--;
return (lbuf[lindex++]);
case '\010':
case '\177':
if (lcount) {
lcount--;
while (lposition > lpos[lcount]) {
xputc('\010'); xputc(' '); xputc('\010');
lposition--;
}
}
break;
case '\032':
xflush();
return (EOF);
default:
if (ch == '\t' || (ch >= 0x20 && ch < 0x7F)) {
lbuf[lcount] = ch;
lpos[lcount] = lposition;
if (ch == '\t')
do {
xputc(' ');
} while (++lposition & 7);
else {
xputc(ch); lposition++;
}
lcount++;
}
else {
xflush();
switch (ch) {
case '\003': xltoplevel(); /* control-c */
case '\007': xlcleanup(); /* control-g */
case '\020': xlcontinue(); /* control-p */
case '\032': return (EOF); /* control-z */
default: return (ch);
}
}
}
}
/* xflush - flush the input line buffer */
static xflush()
{
ostputc('\n');
osflush();
}
/* osaopen - open an ascii file */
FILE *osaopen(name,mode)
char *name,*mode;
{
return (fopen(name,mode));
}
/* oserror - print an error message */
oserror(msg)
char *msg;
{
printf("error: %s\n",msg);
}
/* xsystem - the built-in function 'system' */
LVAL xsystem()
{
char *str;
int result;
/* get the command string */
str = getstring(xlgastring());
xllastarg();
result = Execute(str,0L,xlispwindow);
return (cvfixnum((FIXTYPE)result));
}
/* osagetc - get a character from an ascii file */
int osagetc(fp)
FILE *fp;
{
return (getc(fp));
}
/* osaputc - put a character to an ascii file */
int osaputc(ch,fp)
int ch; FILE *fp;
{
return (putc(ch,fp));
}
/* ossymbols - lookup important symbols */
ossymbols()
{
}