#include "wccfile.h" #define EOFX -1 size_x susan_wccfread(void* ptr, size_x size, size_x count, struct wccFILE* stream) { if ( susan_wccfeof( stream ) ) { return EOFX; } unsigned i = stream->cur_pos, i2 = 0; size_x number_of_chars_to_read = stream->size - stream->cur_pos >= size * count ? size * count : stream->size - stream->cur_pos; _Pragma( "loopbound min 7220 max 7220" ) while (i < stream->cur_pos + number_of_chars_to_read) { ((unsigned char*)ptr)[i2++] = stream->data[i++]; } stream->cur_pos += number_of_chars_to_read; return number_of_chars_to_read; } int susan_wccfgetc(struct wccFILE *stream) { if ( susan_wccfeof( stream ) ) { return EOFX; } else { return stream->data[stream->cur_pos++]; } } char *susan_wccfgets(char *str, int num, struct wccFILE *stream ) { if ( !stream || susan_wccfeof( stream ) || !str || num <= 0 ) { return 0; } int pos = 0; _Pragma( "loopbound min 58 max 58" ) while ( pos < num - 1 && !susan_wccfeof( stream ) ) { str[pos] = stream->data[stream->cur_pos]; if ( str[pos] == '\n' ) { break; } stream->cur_pos++; pos++; } str[pos++] = '\0'; return str; } int susan_wccfseek(struct wccFILE* stream, long int offset, enum _Origin_ origin) { if (origin == WCCSEEK_SET) { stream->cur_pos = offset; return 0; } else if (origin == WCCSEEK_CUR) { stream->cur_pos += offset; return 0; } else if (origin == WCCSEEK_END) { stream->cur_pos = stream->size + offset; return 0; } return -1; } int susan_wccfgetpos(struct wccFILE* stream, unsigned* position) { *position = stream->cur_pos; return 0; } int susan_wccfeof(struct wccFILE* stream) { return stream->cur_pos == stream->size ? 1 : 0; }