home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-19.28-src.tgz / tar.out / fsf / emacs / unixlib / src / files.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  75 lines

  1. #include "amiga.h"
  2. #include "files.h"
  3. #include <string.h>
  4.  
  5. /* Unix low-level IO emulation */
  6. /* --------------------------- */
  7.  
  8. /* First, fd definition & allocation */
  9.  
  10. static struct fileinfo *files;
  11. static int max_files;
  12. #define FILE_STEP 10        /* Nb of file descriptors to allocate at once */
  13.  
  14. int _alloc_fd(void *userinfo, int flags,
  15.   ULONG (*__regargs select_start)(void *userinfo, int rd, int wr),
  16.   void (*__regargs select_poll)(void *userinfo, int *rd, int *wr),
  17.   int (*__regargs read)(void *userinfo, void *buffer, unsigned int length),
  18.   int (*__regargs write)(void *userinfo, void *buffer, unsigned int length),
  19.   int (*__regargs lseek)(void *userinfo, long rpos, int mode),
  20.   int (*__regargs close)(void *userinfo, int internal),
  21.   int (*__regargs ioctl)(void *userinfo, int request, void *data)
  22. )
  23. {
  24.   int fd;
  25.  
  26.   for (fd = 0; fd < max_files; fd++)
  27.       if (!files[fd].userinfo)
  28.     {
  29.       files[fd].userinfo = (void *)1;
  30.       break;
  31.     }
  32.   if (fd == max_files)
  33.     {
  34.       struct fileinfo *newfiles;
  35.       int i;
  36.  
  37.       /* Increase files array by FILE_STEP */
  38.       max_files += FILE_STEP;
  39.       newfiles = (struct fileinfo *)malloc(max_files * sizeof(struct fileinfo));
  40.       if (!newfiles)
  41.     {
  42.       errno = ENOMEM;
  43.       return -1;
  44.     }
  45.       memcpy(newfiles, files, (max_files - FILE_STEP) * sizeof(struct fileinfo));
  46.       if (files) free(files);
  47.       files = newfiles;
  48.       for (i = max_files - FILE_STEP; i < max_files; i++) files[i].userinfo = 0;
  49.     }
  50.   files[fd].userinfo = userinfo;
  51.   files[fd].flags = flags;
  52.   files[fd].select_start = select_start;
  53.   files[fd].select_poll = select_poll;
  54.   files[fd].read = read;
  55.   files[fd].write = write;
  56.   files[fd].lseek = lseek;
  57.   files[fd].close = close;
  58.   files[fd].ioctl = ioctl;
  59.   return fd;
  60. }
  61.  
  62. void _free_fd(int fd)
  63. {
  64.   if (0 <= fd && fd < max_files) files[fd].userinfo = 0;
  65. }
  66.  
  67. struct fileinfo *_find_fd(int fd)
  68. {
  69.   if (0 <= fd && fd < max_files && files[fd].userinfo) return &files[fd];
  70.   errno = EBADF;
  71.   return 0;
  72. }
  73.  
  74. int _last_fd(void) { return max_files; }
  75.