home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / editors / elvis1_5.arj / ATARI.C < prev    next >
C/C++ Source or Header  |  1992-04-09  |  3KB  |  162 lines

  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
  162.