forked from jozip/cdirip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuffer.c
81 lines (65 loc) · 2.18 KB
/
buffer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "buffer.h"
int BufWrite (char *data, long data_size, struct buffer_s *buffer)
{
long write_length;
if (data_size > (buffer->size + (buffer->size - buffer->index - 1)))
return 0; // unimplemented
if (buffer->index + data_size < buffer->size) // 1 menos
{
memcpy ((buffer->ptr + buffer->index), data, data_size);
buffer->index += data_size;
}
else
{
write_length = buffer->size - buffer->index;
memcpy ((buffer->ptr + buffer->index), data, write_length);
fwrite (buffer->ptr, buffer->size, 1, buffer->file);
memcpy (buffer->ptr, data + write_length, data_size - write_length);
buffer->index = data_size - write_length;
}
return 1;
}
int BufWriteFlush (struct buffer_s *buffer)
{
fwrite (buffer->ptr, buffer->index, 1, buffer->file);
buffer->index = 0;
return 1;
}
int BufRead (char *data, long data_size, struct buffer_s *buffer, long filesize)
{
long read_length, max_length, pos;
if (data_size > (buffer->size + (buffer->size - buffer->index - 1)))
return 0; // unimplemented
if (filesize == 0) // no cuenta
{
max_length = buffer->size;
}
else
{
pos = ftell(buffer->file);
if (pos > filesize) max_length = 0;
else max_length = ((pos + buffer->size) > filesize) ? (filesize - pos) : buffer->size;
}
if (buffer->index == 0)
{
fread(buffer->ptr, max_length, 1, buffer->file);
}
if (buffer->index + data_size <= buffer->size)
{
memcpy (data, buffer->ptr + buffer->index, data_size);
buffer->index += data_size;
if (buffer->index >= buffer->size) buffer->index = 0;
}
else
{
read_length = buffer->size - buffer->index;
memcpy (data, buffer->ptr + buffer->index, read_length);
fread (buffer->ptr, max_length, 1, buffer->file);
memcpy (data + read_length, buffer->ptr, data_size - read_length);
buffer->index = data_size - read_length;
}
return 1;
}