home *** CD-ROM | disk | FTP | other *** search
- /* atari.c */
-
- /* Author:
- * Guntram Blohm
- * Buchenstrasse 19
- * 7904 Erbach, West Germany
- * Tel. ++49-7305-6997
- * sorry - no regular network connection
- */
-
- /*
- * This file contains the 'standard' functions which are not supported
- * by Atari/Mark Williams, and some other TOS-only requirements.
- */
-
- #include "config.h"
- #include "vi.h"
-
- #if TOS
- #include <osbind.h>
-
- /* vi uses mode==0 only ... */
- int access(file, mode)
- char *file;
- {
- int fd=Fopen(file, 0);
- if (fd<0)
- return -1;
- Fclose(fd);
- return 0;
- }
-
- char *mktemp(template)
- char *template;
- {
- return template;
- }
-
- #ifndef __GNUC__
- char *getcwd(buf, size)
- char *buf;
- {
- if (size < 2 + 64)
- return (char *)0;
- buf[0] = Dgetdrv() + 'A';
- buf[1] = ':';
- Dgetpath(buf + 2, 0);
- return buf;
- }
- #endif
-
- /* read -- text mode, compress \r\n to \n
- * warning: might fail when maxlen==1 and at eol
- */
-
- int tread(fd, buf, maxlen)
- int fd;
- char *buf;
- int maxlen;
- {
- int i, j, nread=read(fd, buf, (unsigned)maxlen);
-
- if (nread && buf[nread-1]=='\r')
- { nread--;
- lseek(fd, -1l, 1);
- }
- for (i=j=0; j<nread; i++,j++)
- { if (buf[j]=='\r' && buf[j+1]=='\n')
- j++;
- buf[i]=buf[j];
- }
- return i;
- }
-
- int twrite(fd, buf, maxlen)
- int fd;
- char *buf;
- int maxlen;
- {
- int i, j, nwritten=0, hadnl=0;
- char writbuf[BLKSIZE];
-
- for (i=j=0; j<maxlen; )
- {
- if ((writbuf[i++]=buf[j++])=='\n')
- { writbuf[i-1]='\r';
- if (i<BLKSIZE)
- writbuf[i++]='\n';
- else
- hadnl=1;
- }
- if (i==BLKSIZE)
- {
- write(fd, writbuf, (unsigned)i);
- i=0;
- }
- if (hadnl)
- {
- writbuf[i++]='\n';
- hadnl=0;
- }
- }
- if (i)
- write(fd, writbuf, (unsigned)i);
- return j;
- }
-
-
- /* The "timer" variable is used as a shadow of the system's timer. Since the
- * system's timer can only be accessed in Supervisor mode, we are forced to
- * do a Supexec(gettime) to copy the system's timer in to the User-mode "timer"
- * variable.
- */
- static int timer;
- static gettime()
- {
- timer = *(long *)(0x4ba);
- }
-
- /* This function implements a read-with-timeout from the keyboard. */
- /*ARGSUSED*/
- int ttyread(buf, len, time)
- char *buf; /* where to store the gotten characters */
- int len; /* maximum number of characters to get -- ignored */
- int time; /* maximum time to allow for reading */
- {
- int pos=0;
- long l;
- long endtime;
-
- /* compute the ending time, in increments of 1/200th seconds */
- Supexec(gettime);
- endtime = time * 20 + timer;
-
- /* wait until time runs out, or we get a keystroke */
- while (!pos && (!time || timer < endtime))
- {
- if (Bconstat(2))
- {
- l = Bconin(2);
- buf[pos] = l;
- if (buf[pos++] == '\0')
- {
- buf[pos - 1] = '#';
- buf[pos++] = l >> 16;
- }
- }
- Supexec(gettime);
- }
- return pos;
- }
-
- /* This function writes characters to the screen */
- ttywrite(buf, len)
- char *buf;
- int len;
- {
- while (len--)
- Bconout(2, *buf++);
- }
- #endif
-