home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / perl-5.003-base.tgz / perl-5.003-base.tar / fsf / perl / ext / FileHandle / FileHandle.xs < prev    next >
Text File  |  1996-02-12  |  3KB  |  178 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include <stdio.h>
  5.  
  6. typedef int SysRet;
  7. typedef FILE * InputStream;
  8. typedef FILE * OutputStream;
  9.  
  10. static int
  11. not_here(s)
  12. char *s;
  13. {
  14.     croak("FileHandle::%s not implemented on this architecture", s);
  15.     return -1;
  16. }
  17.  
  18. static bool
  19. constant(name, pval)
  20. char *name;
  21. IV *pval;
  22. {
  23.     switch (*name) {
  24.     case '_':
  25.     if (strEQ(name, "_IOFBF"))
  26. #ifdef _IOFBF
  27.         { *pval = _IOFBF; return TRUE; }
  28. #else
  29.         return FALSE;
  30. #endif
  31.     if (strEQ(name, "_IOLBF"))
  32. #ifdef _IOLBF
  33.         { *pval = _IOLBF; return TRUE; }
  34. #else
  35.         return FALSE;
  36. #endif
  37.     if (strEQ(name, "_IONBF"))
  38. #ifdef _IONBF
  39.         { *pval = _IONBF; return TRUE; }
  40. #else
  41.         return FALSE;
  42. #endif
  43.     break;
  44.     }
  45.  
  46.     return FALSE;
  47. }
  48.  
  49.  
  50. MODULE = FileHandle    PACKAGE = FileHandle    PREFIX = f
  51.  
  52. SV *
  53. constant(name)
  54.     char *        name
  55.     CODE:
  56.     IV i;
  57.     if (constant(name, &i))
  58.         RETVAL = newSViv(i);
  59.     else
  60.         RETVAL = &sv_undef;
  61.     OUTPUT:
  62.     RETVAL
  63.  
  64. SV *
  65. fgetpos(handle)
  66.     InputStream    handle
  67.     CODE:
  68. #ifdef HAS_FGETPOS
  69.     if (handle) {
  70.         Fpos_t pos;
  71.         fgetpos(handle, &pos);
  72.         ST(0) = sv_2mortal(newSVpv((char*)&pos, sizeof(Fpos_t)));
  73.     }
  74.     else {
  75.         ST(0) = &sv_undef;
  76.         errno = EINVAL;
  77.     }
  78. #else
  79.     ST(0) = (SV *) not_here("fgetpos");
  80. #endif
  81.  
  82. SysRet
  83. fsetpos(handle, pos)
  84.     InputStream    handle
  85.     SV *        pos
  86.     CODE:
  87. #ifdef HAS_FSETPOS
  88.     if (handle)
  89.         RETVAL = fsetpos(handle, (Fpos_t*)SvPVX(pos));
  90.     else {
  91.         RETVAL = -1;
  92.         errno = EINVAL;
  93.     }
  94. #else
  95.         RETVAL = (SysRet) not_here("fsetpos");
  96. #endif
  97.     OUTPUT:
  98.     RETVAL
  99.  
  100. int
  101. ungetc(handle, c)
  102.     InputStream    handle
  103.     int        c
  104.     CODE:
  105.     if (handle)
  106.         RETVAL = ungetc(c, handle);
  107.     else {
  108.         RETVAL = -1;
  109.         errno = EINVAL;
  110.     }
  111.     OUTPUT:
  112.     RETVAL
  113.  
  114. OutputStream
  115. new_tmpfile(packname = "FileHandle")
  116.     char *        packname
  117.     CODE:
  118.     RETVAL = tmpfile();
  119.     OUTPUT:
  120.     RETVAL
  121.  
  122. int
  123. ferror(handle)
  124.     InputStream    handle
  125.     CODE:
  126.     if (handle)
  127.         RETVAL = ferror(handle);
  128.     else {
  129.         RETVAL = -1;
  130.         errno = EINVAL;
  131.     }
  132.     OUTPUT:
  133.     RETVAL
  134.  
  135. SysRet
  136. fflush(handle)
  137.     OutputStream    handle
  138.     CODE:
  139.     if (handle)
  140.         RETVAL = fflush(handle);
  141.     else {
  142.         RETVAL = -1;
  143.         errno = EINVAL;
  144.     }
  145.     OUTPUT:
  146.     RETVAL
  147.  
  148. void
  149. setbuf(handle, buf)
  150.     OutputStream    handle
  151.     char *        buf = SvPOK(ST(1)) ? sv_grow(ST(1), BUFSIZ) : 0;
  152.     CODE:
  153.     if (handle)
  154.         setbuf(handle, buf);
  155.  
  156.  
  157.  
  158. SysRet
  159. setvbuf(handle, buf, type, size)
  160.     OutputStream    handle
  161.     char *        buf = SvPOK(ST(1)) ? sv_grow(ST(1), SvIV(ST(3))) : 0;
  162.     int        type
  163.     int        size
  164.     CODE:
  165. #ifdef _IOFBF   /* Should be HAS_SETVBUF once Configure tests for that */
  166.     if (handle)
  167.         RETVAL = setvbuf(handle, buf, type, size);
  168.     else {
  169.         RETVAL = -1;
  170.         errno = EINVAL;
  171.     }
  172. #else
  173.         RETVAL = (SysRet) not_here("setvbuf");
  174. #endif /* _IOFBF */
  175.     OUTPUT:
  176.     RETVAL
  177.  
  178.