Let's see if I can explain it better. The modifications I did was replace: "fd" -> "fd or fd->fd depending on the context" "fd = -1;" -> void vio_initialize(vio_fd *fd); "fd = open(file_name, mode)" -> int vio_open(struct TCCState *s, vio_fd *fd, const char *fn, int oflag); "pos = lseek(fd, offset, whence);" -> off_t vio_lseek(vio_fd fd, off_t offset, int whence); "size = read(fd, buf, count);" -> size_t vio_read(vio_fd fd, void *buf, size_t bytes); "close(fd);" -> int vio_close(vio_fd *fd);
And add a new API function "LIBTCCAPI void tcc_set_vio_module(TCCState *s, vio_module_t *vio_module)" that allow install a module that will handle the read io operations required by tcc. bin2c: is a utility used on one implementation of "vio_module". ------- /* virtual io */ struct vio_module_t; typedef struct vio_fd { int fd; void *vio_udata; struct vio_module_t *vio_module; } vio_fd; #define CALL_VIO_OPEN_FIRST 0x01 #define CALL_VIO_OPEN_LAST 0x02 typedef struct vio_module_t { void *user_data; struct TCCState *tcc_state; int call_vio_open_flags; /*CALL_VIO_OPEN_FIRST, CALL_VIO_OPEN_LAST, one or both */ int (*vio_open)(vio_fd *fd, const char *fn, int oflag) ; off_t (*vio_lseek)(vio_fd fd, off_t offset, int whence); size_t (*vio_read)(vio_fd fd, void *buf, size_t bytes); int (*vio_close)(vio_fd *fd); } vio_module_t; LIBTCCAPI void tcc_set_vio_module(TCCState *s, vio_module_t *vio_module){ s->vio_module = vio_module; vio_module->tcc_state = s; } void vio_initialize(vio_fd *fd) { fd->fd = -1; fd->vio_udata = NULL; fd->vio_module = NULL; } int vio_open(struct TCCState *s, vio_fd *fd, const char *fn, int oflag) { int rc; vio_initialize(fd); fd->vio_module = s->vio_module; if(s->vio_module && (s->vio_module->call_vio_open_flags & CALL_VIO_OPEN_FIRST)) { rc = s->vio_module->vio_open(fd, fn, oflag); if(rc >= 0) return rc; } fd->fd = open(fn, oflag); if(fd->fd < 0 && s->vio_module && (s->vio_module->call_vio_open_flags & CALL_VIO_OPEN_LAST)) { rc = s->vio_module->vio_open(fd, fn, oflag); if(rc >= 0) return rc; } //printf("vio_open = %d %s\n", fd->fd, fn); return fd->fd; } off_t vio_lseek(vio_fd fd, off_t offset, int whence) { if(fd.vio_udata) { return fd.vio_module->vio_lseek(fd, offset, whence); } return lseek(fd.fd, offset, whence); } size_t vio_read(vio_fd fd, void *buf, size_t bytes) { if(fd.vio_udata) { return fd.vio_module->vio_read(fd, buf, bytes); } return read(fd.fd, buf, bytes); } int vio_close(vio_fd *fd) { int rc = 0; if(fd->vio_udata){ fd->vio_module->vio_close(fd); } else rc = close(fd->fd); vio_initialize(fd); return rc; } On Sat, Jan 12, 2013 at 4:35 PM, grischka <gris...@gmx.de> wrote: > Domingo Alvarez Duarte wrote: > >> Added what I call virtual io to tinycc this way we can make a monolitic >> executable or library that contains all needed to compile programs, truly >> tinycc portable. >> >> [...] >> >> >> I hope this will improve the utility of tinycc. >> It's on mob:repository. >> >> Thanks in advance for any comments suggestions ! >> > > Can you make this work with all your extra files put in a subdirectory > > "contrib/<choose your name>" > > and with only the most minimal required change to our existing files? > > I suppose it could be three lines such as > > #ifdef TCC_CONTRIB_<WHATEVER> > # include "contrib/<whatever>/some.h" > #endif > > or maybe even less. > > --- grischka > > > > ______________________________**_________________ > Tinycc-devel mailing list > Tinycc-devel@nongnu.org > https://lists.nongnu.org/**mailman/listinfo/tinycc-devel<https://lists.nongnu.org/mailman/listinfo/tinycc-devel> >
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel