|
|
1.1 ! root 1: /* atari.c */ ! 2: ! 3: /* Author: ! 4: * Guntram Blohm ! 5: * Buchenstrasse 19 ! 6: * 7904 Erbach, West Germany ! 7: * Tel. ++49-7305-6997 ! 8: * sorry - no regular network connection ! 9: */ ! 10: ! 11: /* ! 12: * This file contains the 'standard' functions which are not supported ! 13: * by Atari/Mark Williams, and some other TOS-only requirements. ! 14: */ ! 15: ! 16: #include "config.h" ! 17: #include "vi.h" ! 18: ! 19: #if TOS ! 20: #include <osbind.h> ! 21: ! 22: /* vi uses mode==0 only ... */ ! 23: int access(file, mode) ! 24: char *file; ! 25: { ! 26: int fd=Fopen(file, 0); ! 27: if (fd<0) ! 28: return -1; ! 29: Fclose(fd); ! 30: return 0; ! 31: } ! 32: ! 33: char *mktemp(template) ! 34: char *template; ! 35: { ! 36: return template; ! 37: } ! 38: ! 39: #ifndef __GNUC__ ! 40: char *getcwd(buf, size) ! 41: char *buf; ! 42: { ! 43: if (size < 2 + 64) ! 44: return (char *)0; ! 45: buf[0] = Dgetdrv() + 'A'; ! 46: buf[1] = ':'; ! 47: Dgetpath(buf + 2, 0); ! 48: return buf; ! 49: } ! 50: #endif ! 51: ! 52: /* read -- text mode, compress \r\n to \n ! 53: * warning: might fail when maxlen==1 and at eol ! 54: */ ! 55: ! 56: int tread(fd, buf, maxlen) ! 57: int fd; ! 58: char *buf; ! 59: int maxlen; ! 60: { ! 61: int i, j, nread=read(fd, buf, (unsigned)maxlen); ! 62: ! 63: if (nread && buf[nread-1]=='\r') ! 64: { nread--; ! 65: lseek(fd, -1l, 1); ! 66: } ! 67: for (i=j=0; j<nread; i++,j++) ! 68: { if (buf[j]=='\r' && buf[j+1]=='\n') ! 69: j++; ! 70: buf[i]=buf[j]; ! 71: } ! 72: return i; ! 73: } ! 74: ! 75: int twrite(fd, buf, maxlen) ! 76: int fd; ! 77: char *buf; ! 78: int maxlen; ! 79: { ! 80: int i, j, nwritten=0, hadnl=0; ! 81: char writbuf[BLKSIZE]; ! 82: ! 83: for (i=j=0; j<maxlen; ) ! 84: { ! 85: if ((writbuf[i++]=buf[j++])=='\n') ! 86: { writbuf[i-1]='\r'; ! 87: if (i<BLKSIZE) ! 88: writbuf[i++]='\n'; ! 89: else ! 90: hadnl=1; ! 91: } ! 92: if (i==BLKSIZE) ! 93: { ! 94: write(fd, writbuf, (unsigned)i); ! 95: i=0; ! 96: } ! 97: if (hadnl) ! 98: { ! 99: writbuf[i++]='\n'; ! 100: hadnl=0; ! 101: } ! 102: } ! 103: if (i) ! 104: write(fd, writbuf, (unsigned)i); ! 105: return j; ! 106: } ! 107: ! 108: ! 109: /* The "timer" variable is used as a shadow of the system's timer. Since the ! 110: * system's timer can only be accessed in Supervisor mode, we are forced to ! 111: * do a Supexec(gettime) to copy the system's timer in to the User-mode "timer" ! 112: * variable. ! 113: */ ! 114: static int timer; ! 115: static gettime() ! 116: { ! 117: timer = *(long *)(0x4ba); ! 118: } ! 119: ! 120: /* This function implements a read-with-timeout from the keyboard. */ ! 121: /*ARGSUSED*/ ! 122: int ttyread(buf, len, time) ! 123: char *buf; /* where to store the gotten characters */ ! 124: int len; /* maximum number of characters to get -- ignored */ ! 125: int time; /* maximum time to allow for reading */ ! 126: { ! 127: int pos=0; ! 128: long l; ! 129: long endtime; ! 130: ! 131: /* compute the ending time, in increments of 1/200th seconds */ ! 132: Supexec(gettime); ! 133: endtime = time * 20 + timer; ! 134: ! 135: /* wait until time runs out, or we get a keystroke */ ! 136: while (!pos && (!time || timer < endtime)) ! 137: { ! 138: if (Bconstat(2)) ! 139: { ! 140: l = Bconin(2); ! 141: buf[pos] = l; ! 142: if (buf[pos++] == '\0') ! 143: { ! 144: buf[pos - 1] = '#'; ! 145: buf[pos++] = l >> 16; ! 146: } ! 147: } ! 148: Supexec(gettime); ! 149: } ! 150: return pos; ! 151: } ! 152: ! 153: /* This function writes characters to the screen */ ! 154: ttywrite(buf, len) ! 155: char *buf; ! 156: int len; ! 157: { ! 158: while (len--) ! 159: Bconout(2, *buf++); ! 160: } ! 161: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.