/* This is implementation of input/output routines similar to stdio. purpose of this library is to hide differences between OSes (Mac OS don't have stdio!) and allow general streams to strings etc. */ #ifndef XIO1_H #define XIO1_H 1 #include #ifdef __cplusplus extern "C" { #endif #define XIO_FAILED NULL struct xio_filestruct { void *data; int (*fputc) (int c, struct xio_filestruct * f); int (*fputs) (const char *s, struct xio_filestruct * f); int (*fgetc) (struct xio_filestruct * f); int (*fungetc) (int c, struct xio_filestruct * f); int (*xeof) (struct xio_filestruct * f); int (*fclose) (struct xio_filestruct * f); int (*flush) (struct xio_filestruct * f); }; typedef struct xio_filestruct *xio_file; #define xio_puts(s,f) (f)->fputs((s),(f)) #define xio_putc(s,f) (f)->fputc((s),(f)) #define xio_getc(f) (f)->fgetc((f)) #define xio_ungetc(s,f) (f)->fungetc((s),(f)) #define xio_feof(f) (f)->xeof((f)) #define xio_close(f) (f)->fclose((f)) #define xio_flush(f) if ((f)->flush!=NULL) (f)->flush((f)) /* Standard stdio maps. These defines says, that filenames are strings and path is separated by slash or backslash (windoze, dog) the main I/O routines are in the xstdio file */ #ifdef USE_STDIO /* Ugly hack because of unknown problems w/ va_list in v*print* in plan9 */ #ifdef _plan9_ #define va_list char * #endif #include typedef char *xio_path; typedef CONST char *xio_constpath; typedef char xio_pathdata[4096]; extern char *xio_appdir; /*Where application binary is */ extern char *xio_homedir; #ifdef _WIN32 #define XIO_PATHSEP '\\' #define XIO_PATHSEPSTR "\\" #define XIO_EMPTYPATH ".\\" /*Should be also call to currentdir function */ #else #ifdef DJGPP #define XIO_PATHSEP '\\' #define XIO_PATHSEPSTR "\\" #define XIO_EMPTYPATH ".\\" /*Should be also call to currentdir function */ #else #define XIO_PATHSEP '/' #define XIO_PATHSEPSTR "/" #define XIO_EMPTYPATH "./" /*Should be also call to currentdir function */ #endif #endif #define XIO_EOF EOF #define xio_addfname(destination, dirrectory, filename) \ {strcpy(destination,dirrectory);if (strlen(dirrectory)&&destination[strlen(destination)-1]!=XIO_PATHSEP) strcat(destination,XIO_PATHSEPSTR);strcat(destination,filename);} #define xio_addextension(destination,extension) strcat(destination,extension) #ifdef _plan9_ #define xio_errorstring() errstr #else #define xio_errorstring() strerror(errno) #endif /*plan9 */ char *xio_fixpath(CONST char *name); #endif /*USE_STDIO */ xio_file xio_ropen(xio_constpath name); xio_file xio_wopen(xio_constpath name); xio_file xio_strropen(CONST char *c); xio_file xio_strwopen(void); char *xio_getstring(xio_file f); xio_path xio_getdirectory(xio_constpath name); xio_path xio_getfilename(CONST char *base, CONST char *extension); xio_file xio_getrandomexample(xio_path name); xio_file xio_getcatalog(CONST char *name); xio_file xio_gethelp(void); xio_file xio_gettutorial(CONST char *name, xio_path result); /*look trought directory with examples, choose one file, open it (and return *descriptor+put name into name parameter*/ int xio_exist(xio_constpath name); int xio_getfiles(xio_constpath path, char ***names, char ***dirs, int *nnames, int *ndirs); void xio_init(CONST char *c); void xio_uninit(void); #ifdef __cplusplus } #endif #endif