summaryrefslogtreecommitdiffstats
path: root/baseline/source/susan/wccfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'baseline/source/susan/wccfile.c')
-rw-r--r--baseline/source/susan/wccfile.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/baseline/source/susan/wccfile.c b/baseline/source/susan/wccfile.c
new file mode 100644
index 0000000..42db3db
--- /dev/null
+++ b/baseline/source/susan/wccfile.c
@@ -0,0 +1,79 @@
1#include "wccfile.h"
2#define EOFX -1
3
4size_x susan_wccfread(void* ptr, size_x size, size_x count, struct wccFILE* stream)
5{
6 if ( susan_wccfeof( stream ) ) {
7 return EOFX;
8 }
9
10 unsigned i = stream->cur_pos, i2 = 0;
11 size_x number_of_chars_to_read =
12 stream->size - stream->cur_pos >= size * count ?
13 size * count : stream->size - stream->cur_pos;
14 _Pragma( "loopbound min 7220 max 7220" )
15 while (i < stream->cur_pos + number_of_chars_to_read) {
16 ((unsigned char*)ptr)[i2++] = stream->data[i++];
17 }
18 stream->cur_pos += number_of_chars_to_read;
19 return number_of_chars_to_read;
20}
21
22int susan_wccfgetc(struct wccFILE *stream)
23{
24 if ( susan_wccfeof( stream ) ) {
25 return EOFX;
26 } else {
27 return stream->data[stream->cur_pos++];
28 }
29}
30
31char *susan_wccfgets(char *str, int num, struct wccFILE *stream )
32{
33 if ( !stream || susan_wccfeof( stream ) || !str || num <= 0 ) {
34 return 0;
35 }
36
37 int pos = 0;
38 _Pragma( "loopbound min 58 max 58" )
39 while ( pos < num - 1 && !susan_wccfeof( stream ) ) {
40 str[pos] = stream->data[stream->cur_pos];
41 if ( str[pos] == '\n' ) {
42 break;
43 }
44
45 stream->cur_pos++;
46 pos++;
47 }
48 str[pos++] = '\0';
49
50 return str;
51}
52
53int susan_wccfseek(struct wccFILE* stream, long int offset, enum _Origin_ origin)
54{
55 if (origin == WCCSEEK_SET) {
56 stream->cur_pos = offset;
57 return 0;
58 } else if (origin == WCCSEEK_CUR) {
59 stream->cur_pos += offset;
60 return 0;
61 } else if (origin == WCCSEEK_END) {
62 stream->cur_pos = stream->size + offset;
63 return 0;
64 }
65 return -1;
66}
67
68
69int susan_wccfgetpos(struct wccFILE* stream, unsigned* position)
70{
71 *position = stream->cur_pos;
72 return 0;
73}
74
75
76int susan_wccfeof(struct wccFILE* stream)
77{
78 return stream->cur_pos == stream->size ? 1 : 0;
79}