Subversion Repositories Kolibri OS

Rev

Rev 300 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
324 serge 1
 
2
#include 
3
#include 
4
#include "kolibc.h"
300 serge 5
6
 
324 serge 7
extern int __appcwdlen;
8
300 serge 9
 
324 serge 10
{
11
    int prev_is_slash=0;
12
    int len=0, depth=0, i;
300 serge 13
    char* buff;
14
    char c;
324 serge 15
300 serge 16
 
324 serge 17
18
 
19
    strncpy(buff, __appcwd, __appcwdlen);
20
21
 
22
    { buff[0] = '\0';
23
      len=0;
24
    }
25
    else
26
    {
27
      prev_is_slash = 1;
28
      buff[len] = 0;
29
      for(i=0; buff[i]; i++)
30
        if(buff[i] == '/' && i < len-1) depth++;
31
    }
300 serge 32
324 serge 33
 
34
    {
35
      switch (c)
36
      {
37
38
 
39
          if((*path == '.')&&
40
             (*path+1)== '/')
41
          { if(!depth)
42
            {  free(buff);
43
               return 0;
44
            };
45
            buff[len-1] = 0;
46
            len = strrchr(buff, '/') + 1 - buff;
47
            buff[len] = 0;
48
            depth--;
49
            path +=2;
50
            prev_is_slash = 1;
51
            continue;
52
          }
53
          if(*path == '/')
54
          {
55
            path++;
56
            prev_is_slash = 1;
57
            continue;
58
          }
59
          buff[len++] = c;
60
          continue;
61
62
 
63
          prev_is_slash = 1;
64
          buff[len++] = c;
65
          continue;
66
67
 
68
          prev_is_slash = 0;
69
          buff[len++] = c;
70
          continue;
71
        };
72
    };
73
    buff[len]= '\0';
300 serge 74
    return buff;
75
}
76
77
 
78
{
79
    FILEINFO fileinfo;
324 serge 80
        FILE* res;
81
    char *path;
300 serge 82
        int err;
324 serge 83
        int imode;
84
    size_t bytes;
85
300 serge 86
 
324 serge 87
    if (*mode=='r')
88
    {
89
      imode=FILE_OPEN_READ;
90
       mode++;
91
    }
92
    else
93
    if (*mode=='w')
94
    {
95
      imode=FILE_OPEN_WRITE;
96
       mode++;
97
    }
98
    else
99
    if (*mode=='a')
100
    {
101
      imode=FILE_OPEN_APPEND;
102
      mode++;
103
    }
104
    else
105
      return 0;
106
    if (*mode=='t')
107
    {
108
      imode|=FILE_OPEN_TEXT;
109
      mode++;
110
    }
111
    else
112
    if (*mode=='b')
113
      mode++;
114
    if (*mode=='+')
115
    {
116
       imode|=FILE_OPEN_PLUS;
117
       mode++;
118
    }
119
    if (*mode!=0)
120
       return 0;
121
122
 
123
    err=get_fileinfo(path, &fileinfo);
300 serge 124
    if(err)
125
    {
126
      if ((imode & 7)== 0)
127
      { free(path);
128
        return 0;
129
      };
130
  //    err=_msys_create_file(path);
131
      if (err)
132
      {  free(path);
133
         return 0;
134
      }
135
      fileinfo.size=0;
136
    };
137
324 serge 138
 
139
    if(!res)
140
    { free(path);
141
      return 0;
142
    };
143
144
 
145
    res->stream=res->buffer;
146
    res->strpos=0;
147
    res->remain=8192;
148
    res->buffersize=8192;
149
    res->filesize=fileinfo.size;
300 serge 150
    res->filename=path;
151
    res->mode=imode;
152
324 serge 153
 
300 serge 154
    { size_t bytes;
155
      res->strpos= res->filesize & 8191;
324 serge 156
      if (res->strpos)    //not align
300 serge 157
      {
158
        res->filepos=res->filesize & -8192; // align buffer
324 serge 159
        res->remain=8192-res->strpos;
160
        err=read_file(res->filename,res->buffer,
300 serge 161
                      res->filesize,res->remain,&bytes);
162
        res->stream=res->buffer+res->strpos;
163
      };
324 serge 164
    }
165
    else
300 serge 166
    { size_t bytes;
167
168
 
324 serge 169
                    0,8192,&bytes);
170
       res->filepos=0;
171
    };
300 serge 172
    return res;
324 serge 173
}
300 serge 174
324 serge 175
 
176
{
177
  return handle->filesize;
178
179
 
180