Subversion Repositories Kolibri OS

Rev

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

  1. #include "stdio.h"
  2. #include "string.h"
  3. FILE* fopen(const char* filename, const char *mode)
  4. {
  5.         FILE* res;
  6.         int imode;
  7.         imode=0;
  8.         if (*mode=='r')
  9.         {
  10.                 imode=FILE_OPEN_READ;    
  11.                 mode++;
  12.         }else if (*mode=='w')
  13.         {
  14.                 imode=FILE_OPEN_WRITE;
  15.                 mode++;
  16.         }else if (*mode=='a')
  17.         {
  18.                 imode=FILE_OPEN_APPEND;
  19.                 mode++;
  20.         }else
  21.                 return 0;
  22.         if (*mode=='t')
  23.         {
  24.                 imode|=FILE_OPEN_TEXT;
  25.                 mode++;
  26.         }else if (*mode=='b')
  27.                 mode++;
  28.         if (*mode=='+')
  29.         {
  30.                 imode|=FILE_OPEN_PLUS;
  31.                 mode++;
  32.         }
  33.         if (*mode!=0)
  34.                 return 0;
  35.         res=malloc(sizeof(FILE));
  36.         res->buffer=0;
  37.         res->buffersize=0;
  38.         res->filesize=0;
  39.         res->filepos=0;
  40.         res->filename=0;
  41.         res->mode=imode;
  42. //check if file exists
  43.         res=_msys_read_file(filename,0,0,0,&res->filesize);
  44.         if (res==5)
  45.         {
  46.           if ((imode & 3) == FILE_OPEN_READ)
  47.           {
  48.             free(res);
  49.             return 0;
  50.           }
  51.           res=_msys_write_file(filename,0,0);
  52.           if (res!=0)
  53.           {
  54.             free(res);
  55.             return 0;
  56.           }
  57.           res->filesize=0;
  58.         }
  59.         if (imode & 3==FILE_OPEN_WRITE)
  60.         {
  61.                 res->buffersize=512;
  62.                 res->buffer=malloc(res->buffersize);
  63.                 if (res->buffer=0)
  64.                 {
  65.                         free(res);
  66.                         return 0;
  67.                 }
  68.                 res->filesize=0;
  69.         }else
  70.         {
  71.                 res->buffersize=(res->filesize & (~511))+512;
  72.                 res->buffer=malloc(res->buffersize);
  73.                 if (res->buffer==0)
  74.                 {
  75.                         free(res);
  76.                         return 0;
  77.                 }
  78.                 res=_msys_read_file(filename,0,res->filesize,res->buffer,0);
  79.                 if (res!=0)
  80.                 {
  81.                         free(res->buffer);
  82.                         free(res);
  83.                 }
  84.                 if (imode & 3==FILE_OPEN_APPEND)
  85.                         res->filepos=res->filesize;
  86.         }
  87.         res->filename=strdup(filename);
  88.         return res;
  89. }
  90.