00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <glib.h>
00023 #include <glib/gprintf.h>
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027
00028 #include "vfs.h"
00029
00045 int vfs_fputc(int c, VFSFile *stream)
00046 {
00047 unsigned char uc = (unsigned char) c;
00048
00049 if (!vfs_fwrite(&uc, 1, 1, stream)) {
00050 return EOF;
00051 }
00052
00053 return uc;
00054 }
00055
00064 char *vfs_fgets(char *s, int n, VFSFile *stream)
00065 {
00066 int c;
00067 register char *p;
00068
00069 if (n <= 0) return NULL;
00070
00071 p = s;
00072
00073 while (--n) {
00074 if ((c = vfs_getc(stream))== EOF) {
00075 break;
00076 }
00077 if ((*p++ = c) == '\n') {
00078 break;
00079 }
00080 }
00081 if (p > s) {
00082 *p = 0;
00083 return s;
00084 }
00085
00086 return NULL;
00087 }
00088
00096 int vfs_fputs(const char *s, VFSFile *stream)
00097 {
00098 gsize n = strlen(s);
00099
00100 return ((vfs_fwrite(s, 1, n, stream) == n) ? n : EOF);
00101 }
00102
00111 int vfs_vfprintf(VFSFile *stream, char const *format, va_list args)
00112 {
00113 char *string;
00114 int rv = g_vasprintf(&string, format, args);
00115 if (rv < 0) return rv;
00116 rv = vfs_fputs(string, stream);
00117 g_free(string);
00118 return rv;
00119 }
00120
00129 int vfs_fprintf(VFSFile *stream, char const *format, ...)
00130 {
00131 va_list arg;
00132 int rv;
00133
00134 va_start(arg, format);
00135 rv = vfs_vfprintf(stream, format, arg);
00136 va_end(arg);
00137
00138 return rv;
00139 }
00140
00150 void vfs_file_get_contents (const char * filename, void * * buf, int64_t * size)
00151 {
00152 * buf = NULL;
00153 * size = 0;
00154
00155 VFSFile *fd;
00156 gsize filled_size = 0, buf_size = 4096;
00157 unsigned char * ptr;
00158
00159 if ((fd = vfs_fopen(filename, "rb")) == NULL)
00160 return;
00161
00162 if ((* size = vfs_fsize (fd)) >= 0)
00163 {
00164 * buf = g_malloc (* size);
00165 * size = vfs_fread (* buf, 1, * size, fd);
00166 goto close_handle;
00167 }
00168
00169 if ((*buf = g_malloc(buf_size)) == NULL)
00170 goto close_handle;
00171
00172 ptr = *buf;
00173 while (TRUE) {
00174 gsize read_size = vfs_fread(ptr, 1, buf_size - filled_size, fd);
00175 if (read_size == 0) break;
00176
00177 filled_size += read_size;
00178 ptr += read_size;
00179
00180 if (filled_size == buf_size) {
00181 buf_size += 4096;
00182
00183 *buf = g_realloc(*buf, buf_size);
00184
00185 if (*buf == NULL)
00186 goto close_handle;
00187
00188 ptr = (unsigned char *) (* buf) + filled_size;
00189 }
00190 }
00191
00192 *size = filled_size;
00193
00194 close_handle:
00195 vfs_fclose(fd);
00196 }
00197
00198
00207 bool_t vfs_fget_le16(uint16_t *value, VFSFile *stream)
00208 {
00209 uint16_t tmp;
00210 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00211 return FALSE;
00212 *value = GUINT16_FROM_LE(tmp);
00213 return TRUE;
00214 }
00215
00223 bool_t vfs_fget_le32(uint32_t *value, VFSFile *stream)
00224 {
00225 uint32_t tmp;
00226 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00227 return FALSE;
00228 *value = GUINT32_FROM_LE(tmp);
00229 return TRUE;
00230 }
00231
00239 bool_t vfs_fget_le64(uint64_t *value, VFSFile *stream)
00240 {
00241 uint64_t tmp;
00242 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00243 return FALSE;
00244 *value = GUINT64_FROM_LE(tmp);
00245 return TRUE;
00246 }
00247
00248
00256 bool_t vfs_fget_be16(uint16_t *value, VFSFile *stream)
00257 {
00258 uint16_t tmp;
00259 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00260 return FALSE;
00261 *value = GUINT16_FROM_BE(tmp);
00262 return TRUE;
00263 }
00264
00272 bool_t vfs_fget_be32(uint32_t *value, VFSFile *stream)
00273 {
00274 uint32_t tmp;
00275 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00276 return FALSE;
00277 *value = GUINT32_FROM_BE(tmp);
00278 return TRUE;
00279 }
00280
00288 bool_t vfs_fget_be64(uint64_t *value, VFSFile *stream)
00289 {
00290 uint64_t tmp;
00291 if (vfs_fread(&tmp, sizeof(tmp), 1, stream) != 1)
00292 return FALSE;
00293 *value = GUINT64_FROM_BE(tmp);
00294 return TRUE;
00295 }
00296
00305 bool_t vfs_fput_le16(uint16_t value, VFSFile *stream)
00306 {
00307 uint16_t tmp = GUINT16_TO_LE(value);
00308 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00309 }
00310
00319 bool_t vfs_fput_le32(uint32_t value, VFSFile *stream)
00320 {
00321 uint32_t tmp = GUINT32_TO_LE(value);
00322 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00323 }
00324
00333 bool_t vfs_fput_le64(uint64_t value, VFSFile *stream)
00334 {
00335 uint64_t tmp = GUINT64_TO_LE(value);
00336 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00337 }
00338
00347 bool_t vfs_fput_be16(uint16_t value, VFSFile *stream)
00348 {
00349 uint16_t tmp = GUINT16_TO_BE(value);
00350 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00351 }
00352
00361 bool_t vfs_fput_be32(uint32_t value, VFSFile *stream)
00362 {
00363 uint32_t tmp = GUINT32_TO_BE(value);
00364 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00365 }
00366
00375 bool_t vfs_fput_be64(uint64_t value, VFSFile *stream)
00376 {
00377 uint64_t tmp = GUINT64_TO_BE(value);
00378 return vfs_fwrite(&tmp, sizeof(tmp), 1, stream) == 1;
00379 }