diff options
Diffstat (limited to 'Build/source/libs/pplib/pplib-src/src/util/utiliof.h')
-rw-r--r-- | Build/source/libs/pplib/pplib-src/src/util/utiliof.h | 673 |
1 files changed, 0 insertions, 673 deletions
diff --git a/Build/source/libs/pplib/pplib-src/src/util/utiliof.h b/Build/source/libs/pplib/pplib-src/src/util/utiliof.h deleted file mode 100644 index bad43a77374..00000000000 --- a/Build/source/libs/pplib/pplib-src/src/util/utiliof.h +++ /dev/null @@ -1,673 +0,0 @@ - -#ifndef UTIL_IOF_H -#define UTIL_IOF_H - -#include <stdio.h> // for FILE * -#include <errno.h> // for errno -#include <string.h> // for strerror() -#include <stdint.h> // for uintN_t - -#include "utildecl.h" -#include "utilnumber.h" - -/* handler call modes */ - -typedef enum { - IOFREAD = 0, /* read to buffer */ - IOFLOAD = 1, /* read all to buffer */ - IOFWRITE = 2, /* write buffer to the output */ - IOFFLUSH = 3, /* flush buffer to the output */ - IOFCLOSE = 4 /* (flush and) close */ -} iof_mode; - -/* return statuses */ - -typedef enum { - IOFEOF = -1, /* end of input */ - IOFEMPTY = -2, /* end of input buffer*/ - IOFFULL = -3, /* end of output buffer */ - IOFERR = -4 /* error */ -} iof_status; - -const char * iof_status_kind (iof_status status); - -/* iof_file */ - -typedef struct iof_file { - union { - FILE *iofh; // access via iof_file_get_fh / iof_file_set_fh (below) - union { - struct { uint8_t *buf, *pos, *end; }; - struct { const uint8_t *rbuf, *rpos, *rend; }; // to trick compiler warnings about cast discarding const - }; - }; - size_t *offset; - char *name; - size_t size; - int refcount; - int flags; -} iof_file; - -/* iof handler function */ - -typedef struct iof iof; -typedef size_t (*iof_handler) (iof *I, iof_mode mode); - -/* iof structure; keep 8N bytes */ - -#define IOF_MEMBERS \ - union { \ - struct { uint8_t *buf, *pos, *end; }; \ - struct { uint16_t *hbuf, *hpos, *hend; }; \ - struct { uint32_t *ibuf, *ipos, *iend; }; \ - struct { const uint8_t *rbuf, *rpos, *rend; }; \ - }; \ - size_t space; \ - iof_handler more; \ - union { void *link; iof *next; FILE *file; iof_file *iofile; }; \ - int flags; \ - int refcount - -/* - buf -- the beginning of buffer - pos -- the current position - end -- the end of buffer - space -- private space size, not always eq. (end - buf) - more -- handler function - next/file/iofile/link -- reader source or writer target - source -- source filter - flags -- private filter info - refcount -- refcount -*/ - -struct iof { - IOF_MEMBERS; -}; - -typedef void (*iof_dump_function) (const void *value, iof *O); - -/* flags */ - -#define IOF_ALLOC (1<<0) // iof is allocated -#define IOF_HEAP (1<<1) // iof taken from iof heap -#define IOF_BUFFER_ALLOC (1<<2) // buffer allocated -#define IOF_BUFFER_HEAP (1<<3) // buffer taken from iof heap - -#define IOF_SHORT (1<<4) // buffer uses 16bit integers -#define IOF_LONG (1<<5) // buffer uses 32bit integers - -#define IOF_TAIL (1<<6) // preserve reader tail -#define IOF_READER (1<<7) // is reader -#define IOF_WRITER (1<<8) // is writer - -#define IOF_DATA (1<<9) // binds some memory -#define IOF_FILE_HANDLE (1<<10) // links FILE * -#define IOF_FILE (1<<11) // links iof_file * -#define IOF_NEXT (1<<12) // links next iof * -#define IOF_CLOSE_FILE (1<<13) // close FILE * on free -#define IOF_REOPEN_FILE (1<<14) // close/reopen mode for iof_file -#define IOF_RECLOSE_FILE (1<<15) // ditto - -#define IOF_STOPPED (1<<16) // stopped - -// #define IOF_CUSTOM (1<<17) // first custom flag - -#define IOF_BUFSIZ (sizeof(iof) + BUFSIZ*sizeof(uint8_t)) - -/* -reading buffer -- all of buf, pos, end pointers are initialized to the beginning of the private buffer, - next call to a handler function moves the end pointer to bufer+space -writer -- buf and pos pointers initialized to the beginning of the buffer, end initialized to bufer+space - -Every call to handler returns size_t number of bytes -available (to write/read) or 0 if there is no more space. - -We usually align the data buffer just after the iof structure. -This is convenient, especially when a memory for the structure -and its buffer is to be allocated. In the case of growing output -buffers we used to check if the memory of the buffer is allocated -by the handler function using test (O->buf != (O+1)). We don't use -it any longer not to rely on little secrets. Now there is an explicit -IOF_BUFFER_ALLOC flag for that. IOF_ALLOC tells if the structure -itself is taken from malloc (not used so far). Assuming the buffer size -is way larger the sizeof(iof) -*/ - -/* initializers */ - -#define IOF_READER_INIT(handler, file, buffer, size, flags) \ - { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) }}, size, handler, { file }, (flags)|IOF_READER, 0 } - -#define IOF_WRITER_INIT(handler, file, buffer, size, flags) \ - { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) + size }}, size, handler, { file }, (flags)|IOF_WRITER, 0 } - -#define IOF_STRING_INIT(buffer, size) \ - { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) + size }}, size, NULL, { NULL }, 0|IOF_READER|IOF_DATA, 0 } - -#define IOF_STRING() IOF_STRING_INIT(0, 0) - -/* refcount */ - -#define iof_incref(I) (++(I)->refcount) -#define iof_decref(I) ((void)(--(I)->refcount <= 0 && iof_close(I))) -#define iof_unref(I) (--(I)->refcount) - -/* binding buffer of a given size */ - -#define iof_setup_reader(I, buffer, size) \ - ((I)->buf = (I)->pos = (I)->end = (uint8_t *)(buffer), \ - (I)->space = size, (I)->flags = 0|IOF_READER, (I)->refcount = 0) - -#define iof_setup_writer(O, buffer, size) \ - ((O)->buf = (O)->pos = (uint8_t *)(buffer), \ - (O)->end = (uint8_t *)(buffer) + size, \ - (O)->space = size, (O)->flags = 0|IOF_WRITER, (O)->refcount = 0) - -/* basics */ - -#define iof_space(I) ((I)->end - (I)->buf) -#define iof_left(I) ((I)->end - (I)->pos) -#define iof_size(I) ((I)->pos - (I)->buf) - -#define iof_input(I) ((I)->more ? (I)->more((I), IOFREAD) : 0lu) -#define iof_load(I) ((I)->more ? (I)->more((I), IOFLOAD) : 0lu) - -#define iof_output(O) ((O)->more ? (O)->more((O), IOFWRITE) : 0lu) -//#define iof_flush(O) ((O)->pos > (O)->buf && (O)->more ? (O)->more(O, IOFFLUSH) : 0lu) -// flush should be unconditional, because encoders emits EOD markers only on flush -#define iof_flush(O) ((O)->more ? (O)->more(O, IOFFLUSH) : 0lu) -#define iof_close(O) ((O)->more ? (O)->more(O, IOFCLOSE) : 0lu) - -#define iof_stop(F) ((void)(F->pos = F->end = F->buf, F->flags |= IOF_STOPPED)) - -/* -Rewriting reader tail to the beginning of new data portion; readers reacting on IOFREAD -mode must be aware of some not yet read data, but treat it necessary only if IOF_TAIL flag is set. -Parsers using iof input may protect not yet read data when there may be a need to put bytes -back to the stream. This is trivial when I->pos > I->buf, as we can make a move by --I->pos. -But when there is a need to put back more then one byte, we can protect the data tail, so that -realoder will rewrite it to the beginning of new data chunk. - - iof_tail(I) - internal, used by iof handlers at IOFREAD mode - iof_protect_tail(I) - used by parsers to ensure some bytes chunk in one piece - -*/ - -size_t iof_save_tail (iof *I); -#define iof_tail(I) (((I)->flags & IOF_TAIL) && (I)->pos < (I)->end ? iof_save_tail(I) : 0) - -size_t iof_input_save_tail (iof *I, size_t back); -#define iof_protect_tail(I, back, length) ((iof_left(I) >= (length) - (back)) ? 1 : (iof_input_save_tail(I, back) >= length - back)) - -//uint8_t * iof_tail_data (iof *I, size_t *ptail); -//#define iof_tail_free(data) util_free(data) - -/* panic */ - -// #define iof_panic(mess) return 0 -#ifndef iof_panic - #define iof_panic(mess) (fputs(mess, stderr), abort()) -#endif -//#define iof_memory_error() iof_panic(strerror(errno)) -#define iof_fwrite_error() iof_panic(strerror(errno)) - -/* generic helpers */ - -UTILAPI uint8_t * iof_copy_file_data (const char *filename, size_t *psize); -UTILAPI uint8_t * iof_copy_file_handle_data (FILE *file, size_t *psize); - -/* In the future we may need releasing file handle and restoring it from iofile->name, so access file handle via macros */ - -#define iof_file_get_fh(iofile) ((iofile)->iofh) -#define iof_file_set_fh(iofile, fh) ((iofile)->iofh = fh) -#define iof_file_get_file(iofile) (((iofile)->flags & IOF_DATA) ? NULL : iof_file_get_fh(iofile)) -FILE * iof_get_file (iof *F); - -/* basic iof_file interface */ - -iof_file * iof_file_new (FILE *file); -iof_file * iof_file_init (iof_file *iofile, FILE *file); - -iof_file * iof_file_rdata (const void *data, size_t size); -iof_file * iof_file_wdata (void *data, size_t size); - -iof_file * iof_file_rdata_init (iof_file *iofile, const void *data, size_t size); -iof_file * iof_file_wdata_init (iof_file *iofile, void *data, size_t size); - -iof_file * iof_file_reader_from_file_handle (iof_file *iofile, const char *filename, FILE *file, int preload, int closefile); -iof_file * iof_file_reader_from_file (iof_file *iofile, const char *filename, int preload); -iof_file * iof_file_reader_from_data (iof_file *iofile, const void *data, size_t size, int preload, int freedata); -//iof_file * iof_file_writer_from_file (iof_file *iofile, const char *filename); - -void * iof_copy_data (const void *data, size_t size); -#define iof_data_free(data) util_free(data) -#define iof_file_wdata_copy(data, size) iof_file_wdata(iof_copy_data(data, size), size) -#define iof_file_rdata_copy(data, size) iof_file_rdata(iof_copy_data(data, size), size) - -void iof_file_free (iof_file *iofile); - -#define iof_file_get_name(iofile) ((iofile)->name) -void iof_file_set_name (iof_file *iofile, const char *name); - -#define iof_file_incref(iofile) (++(iofile)->refcount) -#define iof_file_decref(iofile) ((void)(--(iofile)->refcount <= 0 && (iof_file_free(iofile), 0))) - -int iof_file_seek (iof_file *iofile, long offset, int whence); -long iof_file_tell (iof_file *iofile); -size_t iof_file_size (iof_file *iofile); -int iof_file_eof (iof_file *iofile); - -size_t iof_file_read (void *ptr, size_t size, size_t items, iof_file *iofile); -size_t iof_file_write (const void *ptr, size_t size, size_t items, iof_file *iofile); -size_t iof_file_ensure (iof_file *iofile, size_t bytes); -int iof_file_flush (iof_file *iofile); - -int iof_file_getc (iof_file *iofile); -int iof_file_putc (iof_file *iofile, int c); - -int iof_file_reclose_input (iof_file *iofile); -int iof_file_reopen_input (iof_file *iofile); - -#define iof_file_reopen(iofile) (((iofile)->flags & IOF_REOPEN_FILE) ? iof_file_reopen_input(iofile) : 1) -#define iof_file_reclose(iofile) (void)(((iofile)->flags & IOF_RECLOSE_FILE) ? iof_file_reclose_input(iofile) : 0) - -void iof_file_close_input (iof_file *iofile); - -/* wrappers of basic operations for iof */ - -int iof_reader_seek (iof *I, long offset, int whence); -int iof_reader_reseek (iof *I, long offset, int whence); -int iof_writer_seek (iof *I, long offset, int whence); -int iof_writer_reseek (iof *I, long offset, int whence); - -int iof_seek (iof *I, long offset, int whence); -int iof_reseek (iof *I, long offset, int whence); - -long iof_reader_tell (iof *I); -long iof_writer_tell (iof *I); -long iof_tell (iof *I); -size_t iof_fsize (iof *I); - -#define iof_setup_iofile(I, f) (iof_file_incref(f), (I)->iofile = f, (I)->flags |= IOF_FILE) -#define iof_setup_file(I, fh) ((I)->file = fh, (I)->flags |= IOF_FILE_HANDLE) -#define iof_setup_next(I, N) ((I)->next = N, iof_incref(N), (I)->flags |= IOF_NEXT) - -/* file handler reader and writer */ - -UTILAPI iof * iof_setup_file_handle_reader (iof *I, void *buffer, size_t space, FILE *f); -UTILAPI iof * iof_setup_file_handle_writer (iof *O, void *buffer, size_t space, FILE *f); - -/* file reader and writer */ - -UTILAPI iof * iof_setup_file_reader (iof *I, void *buffer, size_t space, const char *filename); -UTILAPI iof * iof_setup_file_writer (iof *O, void *buffer, size_t space, const char *filename); - -/* mem writer */ - -UTILAPI iof * iof_setup_buffer (iof *O, void *buffer, size_t space); -UTILAPI iof * iof_setup_buffermin (iof *O, void *buffer, size_t space, size_t min); - -UTILAPI iof * iof_buffer_create (size_t space); -#define iof_buffer_new() iof_buffer_create(BUFSIZ) - -/* custom handler */ - -UTILAPI iof * iof_reader (iof *I, void *link, iof_handler reader, const void *s, size_t bytes); -UTILAPI iof * iof_writer (iof *O, void *link, iof_handler writer, void *s, size_t bytes); - -/* stdout wrapper */ - -extern UTILAPI iof iof_stdout; -extern UTILAPI iof iof_stderr; - -/* simple string reader */ - -UTILAPI iof * iof_string_reader (iof *I, const void *s, size_t bytes); - -#define iof_string(I, s, bytes) \ - (((I)->rbuf = (I)->rpos = (const uint8_t *)s), ((I)->rend = (I)->rbuf + (bytes)), ((I)->flags |= IOF_DATA), (I)) - -/* dummies */ - -UTILAPI iof * iof_dummy (void *buffer, size_t space); -UTILAPI iof * iof_null (void *buffer, size_t space); - -/* checking available space */ - -#define iof_loadable(I) ((I)->pos < (I)->end || iof_load(I)) -#define iof_readable(I) ((I)->pos < (I)->end || iof_input(I)) -#define iof_writable(O) ((O)->pos < (O)->end || iof_output(O)) - -#define iof_hloadable iof_loadable -#define iof_iloadable iof_loadable - -#define iof_hreadable iof_readable -#define iof_ireadable iof_readable - -#define iof_hwritable iof_writable -#define iof_iwritable iof_writable - -/* ensure space to write several bytes (several means less then I->space) */ - -#define iof_ensure(O, n) ((O)->pos+(n)-1 < (O)->end || iof_output(O)) // iof_ensure(O, 1) eq iof_writable(O) -#define iof_hensure(O, n) ((O)->hpos+(n)-1 < (O)->hend || iof_output(O)) -#define iof_iensure(O, n) ((O)->ipos+(n)-1 < (O)->iend || iof_output(O)) - -/* reading */ - -UTILAPI int iof_getc (iof *I); -UTILAPI int iof_hgetc (iof *I); -UTILAPI int iof_igetc (iof *I); - -// UTILAPI int iof_cmp (iof *I, const char *s); -// UTILAPI int iof_cmpn (iof *I, const char *s, size_t bytes); - -UTILAPI iof_status iof_pass (iof *I, iof *O); -#define iof_hpass iof_pass -#define iof_ipass iof_pass - -/* readers helpers */ - -UTILAPI size_t iof_read (iof *I, void *s, size_t bytes); -UTILAPI size_t iof_hread (iof *I, void *s, size_t bytes); -UTILAPI size_t iof_iread (iof *I, void *s, size_t bytes); - -UTILAPI size_t iof_skip (iof *I, size_t bytes); -UTILAPI size_t iof_hskip (iof *I, size_t bytes); -UTILAPI size_t iof_iskip (iof *I, size_t bytes); - -/* get */ - -#define iof_pos(I) (*(I)->pos++) -#define iof_hpos(I) (*(I)->hpos++) -#define iof_ipos(I) (*(I)->ipos++) - -#define iof_get(I) (iof_readable(I) ? (int)(*(I)->pos++) : IOFEOF) -#define iof_hget(I) (iof_hreadable(I) ? (int)(*(I)->hpos++) : IOFEOF) -#define iof_iget(I) (iof_ireadable(I) ? (int)(*(I)->ipos++) : IOFEOF) - -#define iof_char(I) (iof_readable(I) ? (int)(*(I)->pos) : IOFEOF) -#define iof_hcurr(I) (iof_hreadable(I) ? (int)(*(I)->hpos) : IOFEOF) -#define iof_icurr(I) (iof_ireadable(I) ? (int)(*(I)->ipos) : IOFEOF) - -#define iof_next(I) (++(I)->pos, iof_char(I)) -#define iof_hnext(I) (++(I)->hpos, iof_hcurr(I)) -#define iof_inext(I) (++(I)->ipos, iof_icurr(I)) - -/* unget */ - -/* -If possible, we just move the position backward. If it is not possible to -move backward, we call iof_backup(I, c) that sets all pointers to the end of -a private backup space, then moves buf AND pos pointers backward and set c at -pos (==buf). We can backup characters as long as there is a private space. If -several calls to iof_backup() are followed by iof_get(), pos pointer -increases in normal way and so the use of another iof_unget() works just fine -by moving the position. Once we swallow all backup characters (when -pos==end), backup handler restores the previous pointers. - -Obviously we assume that the character provided to iof_unget() is always the -character just obtained from iof_get(). We CAN'T just overwrite the character -at a given position as the space we read may not be writable. - -When backup is in use, we can only get bytes until automatically restored. -*/ - -/* backup */ - -/* -#define iof_uses_backup(I) ((I)->more == iof_unget_handler) - -#define iof_save(I, B) \ - ((B)->buf = (I)->buf, (B)->pos = (I)->pos, (B)->end = (I)->end, (B)->space = (I)->space, \ - (B)->link = I->link, (B)->more = (I)->more, (B)->flags = (I)->flags) -#define iof_restore(B, I) iof_save(I, B) - -#define iof_unget(I, c) \ - ((void)(c == (uint8_t)c ? ((I)->pos > (I)->buf ? --(I)->pos : iof_backup(I, c)) : 0) -int iof_backup (iof *I, int c); -*/ - -/* writing */ - -UTILAPI size_t iof_write_file_handle (iof *O, FILE *file); -UTILAPI size_t iof_write_file (iof *O, const char *filename); -UTILAPI size_t iof_write_iofile (iof *O, iof_file *iofile, int savepos); - -UTILAPI int iof_putc (iof *O, int u); -UTILAPI int iof_hputc (iof *O, int u); -UTILAPI int iof_iputc (iof *O, int u); - -UTILAPI size_t iof_write (iof *O, const void *data, size_t size); -UTILAPI size_t iof_hwrite (iof *O, const void *data, size_t size); -UTILAPI size_t iof_iwrite (iof *O, const void *data, size_t size); - -UTILAPI iof_status iof_puts (iof *O, const void *data); -UTILAPI size_t iof_put_string (iof *O, const void *data); -UTILAPI size_t iof_putfs (iof *O, const char *format, ...); -UTILAPI size_t iof_repc (iof *O, char c, size_t bytes); - -#define iof_putl(O, s) iof_write(O, "" s, sizeof(s)-1) -//#define iof_putl iof_puts - -#define iof_set(O, c) (*(O)->pos++ = (uint8_t)(c)) -#define iof_set2(O, c1, c2) (iof_set(O, c1), iof_set(O, c2)) -#define iof_set3(O, c1, c2, c3) (iof_set(O, c1), iof_set(O, c2), iof_set(O, c3)) -#define iof_set4(O, c1, c2, c3, c4) (iof_set(O, c1), iof_set(O, c2), iof_set(O, c3), iof_set(O, c4)) -#define iof_set5(O, c1, c2, c3, c4, c5) (iof_set(O, c1), iof_set(O, c2), iof_set(O, c3), iof_set(O, c4), iof_set(O, c5)) - -#define iof_hset(O, c) (*(O)->hpos++ = (uint16_t)(c)) -#define iof_iset(O, c) (*(O)->ipos++ = (uint32_t)(c)) - -#define iof_put(O, c) ((void)iof_ensure(O, 1), iof_set(O, c)) -#define iof_put2(O, c1, c2) ((void)iof_ensure(O, 2), iof_set2(O, c1, c2)) -#define iof_put3(O, c1, c2, c3) ((void)iof_ensure(O, 3), iof_set3(O, c1, c2, c3)) -#define iof_put4(O, c1, c2, c3, c4) ((void)iof_ensure(O, 4), iof_set4(O, c1, c2, c3, c4)) -#define iof_put5(O, c1, c2, c3, c4, c5) ((void)iof_ensure(O, 5), iof_set5(O, c1, c2, c3, c4, c5)) - -#define iof_hput(O, c) ((void)iof_hensure(O, 1), iof_hset(O, c)) -#define iof_iput(O, c) ((void)iof_iensure(O, 1), iof_iset(O, c)) - -#define iof_put_uc_hex(O, c) iof_put2(O, base16_uc_digit1(c), base16_uc_digit2(c)) -#define iof_put_lc_hex(O, c) iof_put2(O, base16_lc_digit1(c), base16_lc_digit2(c)) -#define iof_set_uc_hex(O, c) iof_set2(O, base16_uc_digit1(c), base16_uc_digit2(c)) -#define iof_set_lc_hex(O, c) iof_set2(O, base16_lc_digit1(c), base16_lc_digit2(c)) -#define iof_put_hex iof_put_uc_hex -#define iof_set_hex iof_set_uc_hex - -/* number from iof; return 1 on success, 0 otherwise */ - -#define iof_scan_sign(I, c, sign) _scan_sign(c, sign, iof_next(I)) -#define iof_scan_integer(I, c, number) _scan_integer(c, number, iof_next(I)) -#define iof_scan_radix(I, c, number, radix) _scan_radix(c, number, radix, iof_next(I)) -#define iof_read_integer(I, c, number) _read_integer(c, number, iof_next(I)) -#define iof_read_radix(I, c, number, radix) _read_radix(c, number, radix, iof_next(I)) - -#define iof_scan_decimal(I, c, number) _scan_decimal(c, number, iof_next(I)) -#define iof_scan_fraction(I, c, number, exponent10) _scan_fraction(c, number, exponent10, iof_next(I)) -#define iof_scan_exponent10(I, c, exponent10) _scan_exponent10(c, exponent10, iof_next(I)) - -UTILAPI int iof_get_int32 (iof *I, int32_t *number); -UTILAPI int iof_get_slong (iof *I, long *number); -UTILAPI int iof_get_int64 (iof *I, int64_t *number); - -UTILAPI int iof_get_uint32 (iof *I, uint32_t *number); -UTILAPI int iof_get_ulong (iof *I, unsigned long *number); -UTILAPI int iof_get_usize (iof *I, size_t *number); -UTILAPI int iof_get_uint64 (iof *I, uint64_t *number); - -UTILAPI int iof_get_int32_radix (iof *I, int32_t *number, int radix); -UTILAPI int iof_get_slong_radix (iof *I, long *number, int radix); -UTILAPI int iof_get_int64_radix (iof *I, int64_t *number, int radix); - -UTILAPI int iof_get_uint32_radix (iof *I, uint32_t *number, int radix); -UTILAPI int iof_get_ulong_radix (iof *I, unsigned long *number, int radix); -UTILAPI int iof_get_usize_radix (iof *I, size_t *number, int radix); -UTILAPI int iof_get_uint64_radix (iof *I, uint64_t *number, int radix); - -#if defined(INTLW_IS_INT64) -# define iof_get_intlw(I, number) iof_get_int64(I, number) -# define iof_get_uintlw(I, number) iof_get_uint64(I, number) -# define iof_get_intlw_radix(I, number, radix) iof_get_int64_radix(I, number, radix) -# define iof_get_uintlw_radix(I, number, radix) iof_get_uint64_radix(I, number, radix) -#elif defined(INTLW_IS_LONG) -# define iof_get_intlw(I, number) iof_get_slong(I, number) -# define iof_get_uintlw(I, number) iof_get_ulong(I, number) -# define iof_get_intlw_radix(I, number, radix) iof_get_slong_radix(I, number, radix) -# define iof_get_uintlw_radix(I, number, radix) iof_get_ulong_radix(I, number, radix) -#endif - -UTILAPI int iof_get_roman (iof *I, uint16_t *number); - -UTILAPI int iof_get_double (iof *I, double *number); -UTILAPI int iof_get_float (iof *I, float *number); - -UTILAPI int iof_conv_double (iof *I, double *number); -UTILAPI int iof_conv_float (iof *I, float *number); - -/* number to iof; return a number of written bytes */ - -UTILAPI size_t iof_put_int32 (iof *O, int32_t number); -UTILAPI size_t iof_put_slong (iof *O, long number); -UTILAPI size_t iof_put_int64 (iof *O, int64_t number); - -UTILAPI size_t iof_put_uint32 (iof *O, uint32_t number); -UTILAPI size_t iof_put_ulong (iof *O, unsigned long number); -UTILAPI size_t iof_put_usize (iof *O, size_t number); -UTILAPI size_t iof_put_uint64 (iof *O, uint64_t number); - -UTILAPI size_t iof_put_int32_radix (iof *O, int32_t number, int radix, int uc); -UTILAPI size_t iof_put_slong_radix (iof *O, long number, int radix, int uc); -UTILAPI size_t iof_put_int64_radix (iof *O, int64_t number, int radix, int uc); - -UTILAPI size_t iof_put_uint32_radix (iof *O, uint32_t number, int radix, int uc); -UTILAPI size_t iof_put_ulong_radix (iof *O, unsigned long number, int radix, int uc); -UTILAPI size_t iof_put_usize_radix (iof *O, size_t number, int radix, int uc); -UTILAPI size_t iof_put_uint64_radix (iof *O, uint64_t number, int radix, int uc); - -#if defined(INTLW_IS_INT64) -# define iof_put_intlw(O, number) iof_put_int64(O, number) -# define iof_put_uintlw(O, number) iof_put_uint64(O, number) -# define iof_put_intlw_radix(O, number, radix, uc) iof_put_int64_radix(O, number, radix, uc) -# define iof_put_uintlw_radix(O, number, radix, uc) iof_put_uint64_radix(O, number, radix, uc) -#elif defined(INTLW_IS_LONG) -# define iof_put_intlw(O, number) iof_put_slong(O, number) -# define iof_put_uintlw(O, number) iof_put_ulong(O, number) -# define iof_put_intlw_radix(O, number, radix, uc) iof_put_slong_radix(O, number, radix, uc) -# define iof_put_uintlw_radix(O, number, radix, uc) iof_put_ulong_radix(O, number, radix, uc) -#endif - -UTILAPI size_t iof_put_roman (iof *O, uint16_t number, int uc); - -UTILAPI size_t iof_put_double(iof *O, double number, int digits); -UTILAPI size_t iof_put_float(iof *O, float number, int digits); - -/* common helpers for binary parsers */ - -UTILAPI int iof_get_be_uint2 (iof *I, uint32_t *pnumber); -UTILAPI int iof_get_be_uint3 (iof *I, uint32_t *pnumber); -UTILAPI int iof_get_be_uint4 (iof *I, uint32_t *pnumber); - -UTILAPI int iof_get_le_uint2 (iof *I, uint32_t *pnumber); -UTILAPI int iof_get_le_uint3 (iof *I, uint32_t *pnumber); -UTILAPI int iof_get_le_uint4 (iof *I, uint32_t *pnumber); - -// iof_set() and iof_put() suite casts arguments to uint8_t, so we don't need &0xff mask - -#define iof_set_be_uint1(O, u) iof_set(O, u) -#define iof_set_be_uint2(O, u) iof_set2(O, (u)>>8, u) -#define iof_set_be_uint3(O, u) iof_set3(O, (u)>>16, (u)>>8, u) -#define iof_set_be_uint4(O, u) iof_set4(O, (u)>>24, (u)>>16, (u)>>8, u) - -#define iof_set_le_uint1(O, u) iof_set(O, u) -#define iof_set_le_uint2(O, u) iof_set2(O, u, (u)>>8) -#define iof_set_le_uint3(O, u) iof_set3(O, u, (u)>>8, (u)>>16) -#define iof_set_le_uint4(O, u) iof_set4(O, u, (u)>>8, (u)>>16, (u)>>24) - -#define iof_put_be_uint1(O, u) iof_put(O, u) -#define iof_put_be_uint2(O, u) iof_put2(O, (u)>>8, u) -#define iof_put_be_uint3(O, u) iof_put3(O, (u)>>16, (u)>>8, u) -#define iof_put_be_uint4(O, u) iof_put4(O, (u)>>24, (u)>>16, (u)>>8, u) - -#define iof_put_le_uint1(O, u) iof_put(O, u) -#define iof_put_le_uint2(O, u) iof_put2(O, u, (u)>>8) -#define iof_put_le_uint3(O, u) iof_put3(O, u, (u)>>8, (u)>>16) -#define iof_put_le_uint4(O, u) iof_put4(O, u, (u)>>8, (u)>>16, (u)>>24) - -/* buffer results */ - -#define iof_reader_result(I, size) ((size = (size_t)iof_left(I)), (I)->pos) -#define iof_writer_result(I, size) ((size = (size_t)iof_size(I)), (I)->buf) -#define iof_result(I, size) (((I)->flags & IOF_READER) ? iof_reader_result(I, size) : iof_writer_result(I, size)) - -uint8_t * iof_file_input_data (iof_file *iofile, size_t *psize, int *isnew); -//uint8_t * iof_file_reader_data (iof_file *iofile, size_t *size); -//uint8_t * iof_file_writer_data (iof_file *iofile, size_t *size); - -uint8_t * iof_reader_data (iof *I, size_t *psize); -uint8_t * iof_writer_data (iof *O, size_t *psize); -size_t iof_reader_to_file_handle (iof *I, FILE *file); -size_t iof_reader_to_file (iof *I, const char *filename); - -#define iof_loaded(I) ((I)->end = (I)->pos, (I)->pos = (I)->buf, iof_left(I)) - -#define iof_data_to_file_handle(data, size, file) fwrite(data, sizeof(uint8_t), size, file) -UTILAPI size_t iof_data_to_file (const void *data, size_t size, const char *filename); - -UTILAPI size_t iof_result_to_file_handle (iof *F, FILE *file); -UTILAPI size_t iof_result_to_file (iof *F, const char *filename); -UTILAPI void iof_debug (iof *I, const char *filename); - -/* common filters allocator */ - -void iof_filters_init (void); -void iof_filters_free (void); - -iof * iof_filter_reader_new (iof_handler handler, size_t statesize, void **pstate); -#define iof_filter_reader(handler, statesize, pstate) iof_filter_reader_new(handler, statesize, (void **)(pstate)) -iof * iof_filter_reader_with_buffer_new (iof_handler handler, size_t statesize, void **pstate, void *buffer, size_t buffersize); -#define iof_filter_reader_with_buffer(handler, statesize, pstate, buffer, buffersize) iof_filter_reader_with_buffer_new(handler, statesize, (void **)(pstate), buffer, buffersize) -iof * iof_filter_writer_new (iof_handler handler, size_t statesize, void **pstate); -#define iof_filter_writer(handler, statesize, pstate) iof_filter_writer_new(handler, statesize, (void **)(pstate)) -iof * iof_filter_writer_with_buffer_new (iof_handler handler, size_t statesize, void **pstate, void *buffer, size_t buffersize); -#define iof_filter_writer_with_buffer(handler, statesize, pstate, buffer, buffersize) iof_filter_writer_with_buffer_new(handler, statesize, (void **)(pstate), buffer, buffersize) - -#define iof_filter_state(statetype, F) (statetype)((void *)((F) + 1)) - -void iof_free (iof *F); -void iof_discard (iof *F); - -size_t iof_resize_buffer_to (iof *O, size_t space); -#define iof_resize_buffer(O) iof_resize_buffer_to(O, (O)->space << 1) - -size_t iof_decoder_retval (iof *I, const char *type, iof_status status); -size_t iof_encoder_retval (iof *O, const char *type, iof_status status); - -/* filters */ - -iof * iof_filter_file_handle_reader (FILE *file); -iof * iof_filter_file_handle_writer (FILE *file); - -iof * iof_filter_iofile_reader (iof_file *iofile, size_t offset); -iof * iof_filter_iofile_writer (iof_file *iofile, size_t offset); - -iof * iof_filter_file_reader (const char *filename); -iof * iof_filter_file_writer (const char *filename); - -iof * iof_filter_string_reader (const void *s, size_t length); -iof * iof_filter_string_writer (const void *s, size_t length); - -iof * iof_filter_buffer_writer (size_t size); - -iof * iof_filter_stream_reader (FILE *file, size_t offset, size_t length); -iof * iof_filter_stream_coreader (iof_file *iofile, size_t offset, size_t length); - -iof * iof_filter_stream_writer (FILE *file); -iof * iof_filter_stream_cowriter (iof_file *iofile, size_t offset); - -FILE * iof_filter_file_reader_source (iof *I, size_t *poffset, size_t *plength); -iof_file * iof_filter_file_coreader_source (iof *I, size_t *poffset, size_t *plength); -iof * iof_filter_reader_replacement (iof *P, iof_handler handler, size_t statesize, void **pstate); -#define iof_filter_reader_replace(P, handler, statesize, pstate) iof_filter_reader_replacement(P, handler, statesize, (void **)(pstate)) - -#endif
\ No newline at end of file |