home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / gcc / newgccstart.lha / source.lha / libm / openclose.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-14  |  2.7 KB  |  155 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #ifdef __GNUC__
  4. #include <inline/exec.h>
  5. #include <dos/dos.h>
  6. #include <inline/dos.h>
  7. #endif
  8. #ifndef __GNUC__
  9. #include <clib/exec_protos.h>
  10. #include <clib/dos_protos.h>
  11. #endif
  12. #include <exec/lists.h>
  13. #include <exec/nodes.h>
  14. #include <exec/memory.h>
  15.  
  16. struct filenode
  17. {
  18.   struct MinNode node; /* Nicht für stdin, stdout, stderr */
  19.   FILE FILE;
  20. };
  21.  
  22. extern struct MinList __filelist;
  23. extern void chkabort(void);
  24.  
  25. FILE *fopen(const char *filename,const char *mode)
  26. {
  27.   struct filenode *node;
  28.   BPTR file;
  29.   LONG openmode,accessmode;
  30.   int append=0,plus=1;
  31.   chkabort();
  32.   SetIoErr(0);
  33.   switch(mode[0])
  34.   {
  35.     case 'r':
  36.       openmode=MODE_OLDFILE;
  37.       accessmode=MODE_OLDFILE;
  38.       break;
  39.     case 'w':
  40.       openmode=MODE_NEWFILE;
  41.       accessmode=MODE_NEWFILE;
  42.       break;
  43.     case 'a':
  44.       openmode=MODE_READWRITE;
  45.       accessmode=MODE_NEWFILE;
  46.       append=1;
  47.       break;
  48.     default:
  49.       return NULL;
  50.   }
  51.   if(mode[1]=='b')
  52.     plus=2;
  53.   switch(mode[plus])
  54.   {
  55.     case '+':
  56.       accessmode=MODE_NEWFILE;
  57.       if(mode[plus+1])
  58.     return NULL;
  59.       break;
  60.     case '\0':
  61.       break;
  62.     default:
  63.       return NULL;
  64.   }
  65.   node=(struct filenode *)AllocVec(sizeof(struct filenode),MEMF_PUBLIC);
  66.   if(node!=NULL)
  67.   {
  68.     SetIoErr(0);
  69.     file=Open(filename,openmode);
  70.     if(file!=NULL)
  71.     {
  72.       if(ChangeMode(CHANGE_FH,file,accessmode))
  73.       {
  74.     node->FILE.file=file;
  75.     node->FILE.error=0;
  76.     node->FILE.uc=0;
  77.     if(append)
  78.       Seek(file,0,OFFSET_END);
  79.     if(!IoErr())
  80.     { AddHead((struct List *)&__filelist,(struct Node *)&node->node);
  81.       return &node->FILE; }
  82.     else
  83.       errno=IoErr();
  84.       }
  85.       else
  86.     errno=IoErr();
  87.       Close(file);
  88.     }
  89.     else
  90.       errno=IoErr();
  91.     FreeVec(node);
  92.   }
  93.   else
  94.     errno=ENOMEM;
  95.   return NULL;
  96. }
  97.  
  98. int fclose(FILE *stream)
  99. {
  100.   ULONG retval=0;
  101.   struct filenode *node;
  102.   chkabort();
  103.   node=(struct filenode *)((struct MinNode *)stream-1);
  104.   Remove((struct Node *)&node->node);
  105.   SetIoErr(0);
  106.   Flush(node->FILE.file)?0:EOF;
  107.   if(IoErr())
  108.   { errno=IoErr();
  109.     retval=errno; }
  110.   Close(node->FILE.file);
  111.   FreeVec(node);
  112.   return retval;
  113. }
  114.  
  115. void __exitio(void)
  116. {
  117.   struct MinNode *node;
  118.   while((node=__filelist.mlh_Head)->mln_Succ!=NULL)
  119.     fclose(&((struct filenode *)node)->FILE);
  120. }
  121.  
  122. int fgetc(FILE *stream)
  123. {
  124.   int retval;
  125.   chkabort();
  126.   SetIoErr(0);
  127.   retval=FGetC(stream->file);
  128.   stream->error=IoErr();
  129.   stream->uc=0;
  130.   return retval;
  131. }
  132.  
  133. int fputc(int c,FILE *stream)
  134. {
  135.   int retval;
  136.   chkabort();
  137.   SetIoErr(0);
  138.   retval=FPutC(stream->file,c);
  139.   stream->error=IoErr();
  140.   stream->uc=0;
  141.   return retval;
  142. }
  143.  
  144. int ungetc(int c,FILE *stream)
  145. {
  146.   int retval;
  147.   chkabort();
  148.   if(stream->uc)
  149.     return EOF;
  150.   retval=UnGetC(stream->file,c);
  151.   stream->error=0;
  152.   stream->uc=1;
  153.   return retval;
  154. }
  155.