?login_element?

Subversion Repositories NedoOS

Rev

Rev 1154 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1154 alone 1
#include <stdio.h>
2
char *alloc(nbytes)
3
unsigned nbytes;
4
{
5
        struct _header *p, *q, *cp;
6
        int nunits;
7
        nunits = 1 + (nbytes + (sizeof (_base) - 1)) / sizeof (_base);
8
        if ((q = _allocp) == NULL) {
9
                _base._ptr = _allocp = q = &_base;
10
                _base._size = 0;
11
         }
12
        for (p = q -> _ptr; ; q = p, p = p -> _ptr) {
13
                if (p -> _size >= nunits) {
14
                        _allocp = q;
15
                        if (p -> _size == nunits)
16
                                _allocp->_ptr = p->_ptr;
17
                        else {
18
                                q = _allocp->_ptr = p + nunits;
19
                                q->_ptr = p->_ptr;
20
                                q->_size = p->_size - nunits;
21
                                p -> _size = nunits;
22
                         }
23
                        return p + 1;
24
                 }
25
                if (p == _allocp) {
26
                        if ((cp = sbrk(nunits * sizeof (_base))) == ERROR)
27
                                return NULL;
28
                        cp -> _size = nunits;
29
                        free(cp+1);     /* remember: pointer arithmetic! */
30
                        p = _allocp;
31
                }
32
         }
33
}
34
 
35
free(ap)
36
struct _header *ap;
37
{
38
        struct _header *p, *q;
39
 
40
        p = ap - 1;     /* No need for the cast when "ap" is a struct ptr */
41
 
42
        for (q = &_base; q->_ptr != &_base; q = q -> _ptr)
43
                if (p > q && p < q -> _ptr)
44
                        break;
45
 
46
        if (p + p -> _size == q -> _ptr) {
47
                p -> _size += q -> _ptr -> _size;
48
                p -> _ptr = q -> _ptr -> _ptr;
49
         }
50
        else p -> _ptr = q -> _ptr;
51
 
52
        if (q + q -> _size == p) {
53
                q -> _size += p -> _size;
54
                q -> _ptr = p -> _ptr;
55
         }
56
        else q -> _ptr = p;
57
 
58
        _allocp = q;
59
}
60
 
61
int fflush(fp)
62
FILE *fp;
63
{
64
        int i; char *p;
65
 
66
        if (fp <= 4) /*stdin, stdout, stderr?*/
67
                return OK;
68
        if (!(fp->_flags & _WRITE))
69
                return ERROR;
70
 
71
        if (fp->_nleft == (NSECTS * SECSIZ))
72
                return OK;
73
 
74
        i = NSECTS * SECSIZ - fp->_nleft;
75
        if (write(fp->_fd, fp->_buff, i) != i)
76
        {
77
                fp->_flags |= _ERR;
78
                return ERROR;
79
        }
80
 
81
        fp->_nleft = (NSECTS * SECSIZ);
82
        fp->_nextp = fp->_buff;
83
        return OK;
84
}
85
 
86
int fread(buf, size, count, fp)
87
char *buf;
88
unsigned size, count;
89
FILE *fp;
90
{
91
        int n_read, n_togo, cnt, i;
92
 
93
        n_togo = size * count;
94
        n_read = 0;
95
        if (fp->_flags & _EOF)
96
                return NULL;
97
 
98
        while (n_togo)
99
        {
100
                cnt = (n_togo <= fp->_nleft) ? n_togo : fp->_nleft; /* how many bytes we can get from buffer at once */
101
                movmem(fp->_nextp, buf, cnt); /* get them */
102
                fp->_nextp += cnt; /* source pointer */
103
                buf += cnt; /* destination pointer */
104
                fp->_nleft -= cnt; /* how many bytes remained loaded in buffer */
105
                n_togo -= cnt; /* how many bytes we still need */
106
                n_read += cnt;
107
                if (n_togo) /* we need more bytes */
108
                {
109
                        if ((cnt = read(fp->_fd, fp->_buff, NSECTS*SECSIZ)) <=0)
110
                        {
111
                                fp->_flags |= _EOF;
112
                                goto text_test;
113
                        }
114
                        fp->_nleft = cnt;
115
                        fp->_nextp = fp->_buff;
116
                }
117
        }
118
 text_test:
119
        if (fp->_flags & _TEXT)
120
        {
121
                i = min(n_read, SECSIZ);
122
                while (i--)
123
                        if (*(buf-i) == CPMEOF)
124
                        {
125
                                fp->_flags |= _EOF;
126
                                return (n_read - i);
127
                        }
128
        }
129
        return (n_read/size);
130
}
131
 
132
int fwrite(buf, size, count, fp)
133
char *buf;
134
unsigned size, count;
135
FILE *fp;
136
{
137
        int n_done, n_togo, cnt;
138
 
139
        n_togo = size * count;
140
        n_done = 0;
141
 
142
        if (fp->_flags & _ERR)
143
                return NULL;
144
 
145
        while (n_togo)
146
        {
147
                cnt = (n_togo <= fp->_nleft) ? n_togo : fp->_nleft;
148
                movmem(buf, fp->_nextp, cnt);
149
                fp->_nextp += cnt;
150
                buf += cnt;
151
                fp->_nleft -= cnt;
152
                n_togo -= cnt;
153
                n_done += cnt;
154
                if (n_togo)
155
                {
156
                        if ((cnt = write(fp->_fd, fp->_buff, NSECTS*SECSIZ)) <= 0)
157
                        {
158
                                fp->_flags |= _ERR;
159
                                return ERROR;
160
                        }
161
                        fp->_nleft = (NSECTS * SECSIZ);
162
                        fp->_nextp = fp->_buff;
163
                }
164
        }
165
        return (n_done/size);
166
}
167
 
168
unsigned strtouint(s)
169
char *s;
170
{
171
unsigned n;
172
char c;
173
n = 0;
174
while(c = *s++) {
175
        n = n*10;
176
        n += c-'0';
177
}
178
return n;
179
}
180
 
181
#define LOADBUFSZ 4096
182
char loadbuf[LOADBUFSZ];
183
FILE g_fpout;
184
int i;
185
int fd;
186
 
187
main(argc,argv)
188
char **argv;
189
{
190
FILE *fpin;
191
FILE *fpout;
192
unsigned size;
193
unsigned sizeremain;
194
unsigned sizetoread;
195
int parindex;
196
parindex = 3;
197
printf("Cut file. Usage: cut SIZE infile outfile1 outfile2...\n");
198
 
199
for (i = 0; i < argc; i++) printf("Arg #%d = %s\n",i,argv[i]);
200
if (argc < 4) return;
201
 
202
size = strtouint(argv[1]);
203
/*while(1);*/
204
 
205
/*fpout = fopen("myfile3.a","wb");*/
206
if ((fpin = alloc(sizeof(*fpin))) == NULL) return NULL;
207
fpin->_nextp = fpin->_buff;
208
/*fpout->_nleft = (NSECTS * SECSIZ);*/
209
/*fpout->_flags = _WRITE;*/
210
/*fpout->_fd = creat(argv[1]);*/
211
fpin->_nleft = 0;
212
fpin->_flags = _READ;
213
fpin->_fd = open(argv[2], 0);
214
 
215
while (1) {
216
 
217
        /*fp = fopen("ex.c","rb");*/
218
        if ((fpout = alloc(sizeof(*fpout))) == NULL) return NULL;
219
        fpout->_nextp = fpout->_buff;
220
        /*fp->_nleft = 0;*/
221
        /*fp->_fd = open(argv[2], 0);*/
222
        fpout->_nleft = (NSECTS * SECSIZ);
223
        fpout->_flags = _WRITE;
224
        fpout->_fd = creat(argv[parindex]);
225
 
226
        sizeremain = size;
227
        while (sizeremain) {
228
         sizetoread = sizeremain;
229
         if (sizetoread > LOADBUFSZ) sizetoread = LOADBUFSZ;
230
         i = fread(loadbuf, 1, sizetoread, fpin);
231
         sizeremain -= i;
232
         /*while (1);*/
233
         if (!i) break;
234
         fwrite(loadbuf, 1, i, fpout);
235
        }
236
 
237
        /*fclose(fpout);*/
238
        if (fflush(fpout) == ERROR) return ERROR;
239
        close(fpout->_fd);
240
        free(fpout);
241
 
242
        parindex++;
243
        if (parindex == argc) break;
244
 
245
}
246
 
247
/*fclose(fpin);*/
248
close(fpin->_fd);
249
free(fpin);
250
}