00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "vfs.h"
00017 #include <string.h>
00018 #include <stdlib.h>
00019 #include <glib/gprintf.h>
00035 gint vfs_fputc(gint c, VFSFile *stream)
00036 {
00037 guchar uc = (guchar) c;
00038
00039 if (!vfs_fwrite(&uc, 1, 1, stream)) {
00040 return EOF;
00041 }
00042
00043 return uc;
00044 }
00045
00054 gchar *vfs_fgets(gchar *s, gint n, VFSFile *stream)
00055 {
00056 gint c;
00057 register gchar *p;
00058
00059 if (n <= 0) return NULL;
00060
00061 p = s;
00062
00063 while (--n) {
00064 if ((c = vfs_getc(stream))== EOF) {
00065 break;
00066 }
00067 if ((*p++ = c) == '\n') {
00068 break;
00069 }
00070 }
00071 if (p > s) {
00072 *p = 0;
00073 return s;
00074 }
00075
00076 return NULL;
00077 }
00078
00086 gint vfs_fputs(const gchar *s, VFSFile *stream)
00087 {
00088 gsize n = strlen(s);
00089
00090 return ((vfs_fwrite(s, 1, n, stream) == n) ? n : EOF);
00091 }
00092
00101 gint vfs_vfprintf(VFSFile *stream, gchar const *format, va_list args)
00102 {
00103 gchar *string;
00104 gint rv = g_vasprintf(&string, format, args);
00105 if (rv < 0) return rv;
00106 rv = vfs_fputs(string, stream);
00107 g_free(string);
00108 return rv;
00109 }
00110
00119 gint vfs_fprintf(VFSFile *stream, gchar const *format, ...)
00120 {
00121 va_list arg;
00122 gint rv;
00123
00124 va_start(arg, format);
00125 rv = vfs_vfprintf(stream, format, arg);
00126 va_end(arg);
00127
00128 return rv;
00129 }
00130
00140 void vfs_file_get_contents (const gchar * filename, void * * buf, gint64 * size)
00141 {
00142 * buf = NULL;
00143 * size = 0;
00144
00145 VFSFile *fd;
00146 gsize filled_size = 0, buf_size = 4096;
00147 guchar * ptr;
00148
00149 if ((fd = vfs_fopen(filename, "rb")) == NULL)
00150 return;
00151
00152 if ((* size = vfs_fsize (fd)) >= 0)
00153 {
00154 * buf = g_malloc (* size);
00155 * size = vfs_fread (* buf, 1, * size, fd);
00156 goto close_handle;
00157 }
00158
00159 if ((*buf = g_malloc(buf_size)) == NULL)
00160 goto close_handle;
00161
00162 ptr = *buf;
00163 while (TRUE) {
00164 gsize read_size = vfs_fread(ptr, 1, buf_size - filled_size, fd);
00165 if (read_size == 0) break;
00166
00167 filled_size += read_size;
00168 ptr += read_size;
00169
00170 if (filled_size == buf_size) {
00171 buf_size += 4096;
00172
00173 *buf = g_realloc(*buf, buf_size);
00174
00175 if (*buf == NULL)
00176 goto close_handle;
00177
00178 ptr = *buf + filled_size;
00179 }
00180 }
00181
00182 *size = filled_size;
00183
00184 close_handle:
00185 vfs_fclose(fd);
00186 }
00187
00188
00197 gboolean vfs_fget_le16(guint16 *value, VFSFile *stream)
00198 {
00199 guint16 tmp;
00200 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00201 return FALSE;
00202 *value = GUINT16_FROM_LE(tmp);
00203 return TRUE;
00204 }
00205
00213 gboolean vfs_fget_le32(guint32 *value, VFSFile *stream)
00214 {
00215 guint32 tmp;
00216 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00217 return FALSE;
00218 *value = GUINT32_FROM_LE(tmp);
00219 return TRUE;
00220 }
00221
00229 gboolean vfs_fget_le64(guint64 *value, VFSFile *stream)
00230 {
00231 guint64 tmp;
00232 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00233 return FALSE;
00234 *value = GUINT64_FROM_LE(tmp);
00235 return TRUE;
00236 }
00237
00238
00246 gboolean vfs_fget_be16(guint16 *value, VFSFile *stream)
00247 {
00248 guint16 tmp;
00249 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00250 return FALSE;
00251 *value = GUINT16_FROM_BE(tmp);
00252 return TRUE;
00253 }
00254
00262 gboolean vfs_fget_be32(guint32 *value, VFSFile *stream)
00263 {
00264 guint32 tmp;
00265 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00266 return FALSE;
00267 *value = GUINT32_FROM_BE(tmp);
00268 return TRUE;
00269 }
00270
00278 gboolean vfs_fget_be64(guint64 *value, VFSFile *stream)
00279 {
00280 guint64 tmp;
00281 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00282 return FALSE;
00283 *value = GUINT64_FROM_BE(tmp);
00284 return TRUE;
00285 }
00286
00295 gboolean vfs_fput_le16(guint16 value, VFSFile *stream)
00296 {
00297 guint16 tmp = GUINT16_TO_LE(value);
00298 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00299 }
00300
00309 gboolean vfs_fput_le32(guint32 value, VFSFile *stream)
00310 {
00311 guint32 tmp = GUINT32_TO_LE(value);
00312 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00313 }
00314
00323 gboolean vfs_fput_le64(guint64 value, VFSFile *stream)
00324 {
00325 guint64 tmp = GUINT64_TO_LE(value);
00326 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00327 }
00328
00337 gboolean vfs_fput_be16(guint16 value, VFSFile *stream)
00338 {
00339 guint16 tmp = GUINT16_TO_BE(value);
00340 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00341 }
00342
00351 gboolean vfs_fput_be32(guint32 value, VFSFile *stream)
00352 {
00353 guint32 tmp = GUINT32_TO_BE(value);
00354 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00355 }
00356
00365 gboolean vfs_fput_be64(guint64 value, VFSFile *stream)
00366 {
00367 guint64 tmp = GUINT64_TO_BE(value);
00368 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00369 }