Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/fsext.h>
  6. #include <libc/bss.h>
  7. #include <libc/dosio.h>
  8.  
  9. static int num_fds;
  10. static __FSEXT_Function **func_list;
  11. static int tmp_ext=0xF000;
  12.  
  13. static void
  14. init(void)
  15. {
  16.   static int init_count = -1;
  17.   if (init_count == __bss_count)
  18.     return;
  19.   init_count = __bss_count;
  20.   num_fds = 0;
  21.   func_list = 0;
  22. }
  23.  
  24. int __FSEXT_alloc_fd(__FSEXT_Function *_function)
  25. {
  26.  int fd;
  27.  init();
  28.  fd=tmp_ext++;
  29.  __FSEXT_set_function(fd, _function);
  30.  return fd;
  31. }
  32.  
  33. int
  34. __FSEXT_set_function(int _fd, __FSEXT_Function *_function)
  35. {
  36.   init();
  37.  
  38.   if (_fd < 0)
  39.     return 1;
  40.  
  41.   if (num_fds <= _fd)
  42.   {
  43.     int old_fds = num_fds, i;
  44.     num_fds = (_fd+256) & ~255;
  45.     func_list = (__FSEXT_Function **)realloc(func_list, num_fds * sizeof(__FSEXT_Function *));
  46.     if (func_list == 0)
  47.       return 1;
  48.     for (i=old_fds; i<num_fds; i++)
  49.       func_list[i] = 0;
  50.   }
  51.   func_list[_fd] = _function;
  52.   return 0;
  53. }
  54.  
  55. __FSEXT_Function *
  56. __FSEXT_get_function(int _fd)
  57. {
  58.   init();
  59.   if (_fd < 0 || _fd >= num_fds)
  60.     return 0;
  61.   return func_list[_fd];
  62. }
  63.