| /*************************************************************************/ |
| /* */ |
| /* Cepstral, LLC */ |
| /* Copyright (c) 2001 */ |
| /* All Rights Reserved. */ |
| /* */ |
| /* Permission is hereby granted, free of charge, to use and distribute */ |
| /* this software and its documentation without restriction, including */ |
| /* without limitation the rights to use, copy, modify, merge, publish, */ |
| /* distribute, sublicense, and/or sell copies of this work, and to */ |
| /* permit persons to whom this work is furnished to do so, subject to */ |
| /* the following conditions: */ |
| /* 1. The code must retain the above copyright notice, this list of */ |
| /* conditions and the following disclaimer. */ |
| /* 2. Any modifications must be clearly marked as such. */ |
| /* 3. Original authors' names are not deleted. */ |
| /* 4. The authors' names are not used to endorse or promote products */ |
| /* derived from this software without specific prior written */ |
| /* permission. */ |
| /* */ |
| /* CEPSTRAL, LLC AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL */ |
| /* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED */ |
| /* WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ |
| /* CEPSTRAL, LLC NOR THE CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, */ |
| /* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER */ |
| /* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION */ |
| /* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR */ |
| /* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ |
| /* */ |
| /*************************************************************************/ |
| /* Author: David Huggins-Daines <dhd@cepstral.com> */ |
| /* Date: August 2001 */ |
| /*************************************************************************/ |
| /* */ |
| /* File I/O wrappers for normal platforms. */ |
| /* Added support for urls (and libcurl) Nov 2011 (awb@cs.cmu.edu) */ |
| /* */ |
| /*************************************************************************/ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdarg.h> |
| #include "cst_file.h" |
| #include "cst_string.h" |
| #include "cst_error.h" |
| #include "cst_alloc.h" |
| |
| cst_file cst_fopen(const char *path, int mode) |
| { |
| char cmode[4]; |
| |
| if (cst_urlp(path)) |
| return cst_url_open(path); |
| else if ((mode & CST_OPEN_WRITE) && (mode & CST_OPEN_READ)) |
| strcpy(cmode, "r+"); |
| else if ((mode & CST_OPEN_APPEND) && (mode & CST_OPEN_READ)) |
| strcpy(cmode, "a+"); |
| else if (mode & CST_OPEN_WRITE) |
| strcpy(cmode, "w"); |
| else if (mode & CST_OPEN_APPEND) |
| strcpy(cmode, "a"); |
| else if (mode & CST_OPEN_READ) |
| strcpy(cmode, "r"); |
| |
| if (mode & CST_OPEN_BINARY) |
| strcat(cmode, "b"); |
| |
| return fopen(path, cmode); |
| } |
| |
| long cst_fwrite(cst_file fh, const void *buf, long size, long count) |
| { |
| return fwrite(buf, size, count, fh); |
| } |
| |
| long cst_fread(cst_file fh, void *buf, long size, long count) |
| { |
| return fread(buf, size, count, fh); |
| } |
| |
| long cst_filesize(cst_file fh) |
| { |
| /* FIXME: guaranteed to break on text files on Win32 */ |
| long pos, epos; |
| |
| pos = ftell(fh); |
| fseek(fh, 0, SEEK_END); |
| epos = ftell(fh); |
| fseek(fh, pos, SEEK_SET); |
| |
| return epos; |
| } |
| |
| int cst_fgetc(cst_file fh) |
| { |
| return fgetc(fh); |
| } |
| |
| long cst_ftell(cst_file fh) |
| { |
| return ftell(fh); |
| } |
| |
| long cst_fseek(cst_file fh, long pos, int whence) |
| { |
| int w = 0; |
| |
| if (whence == CST_SEEK_ABSOLUTE) |
| w = SEEK_SET; |
| else if (whence == CST_SEEK_RELATIVE) |
| w = SEEK_CUR; |
| else if (whence == CST_SEEK_ENDREL) |
| w = SEEK_END; |
| |
| fseek(fh, pos, w); |
| |
| return ftell(fh); |
| } |
| |
| int cst_fprintf(cst_file fh, const char *fmt, ...) |
| { |
| va_list args; |
| int rv; |
| |
| va_start(args, fmt); |
| rv = vfprintf(fh, fmt, args); |
| va_end(args); |
| |
| return rv; |
| } |
| |
| int cst_sprintf(char *s, const char *fmt, ...) |
| { |
| va_list args; |
| int rv; |
| |
| va_start(args, fmt); |
| rv = vsprintf(s, fmt, args); |
| va_end(args); |
| |
| return rv; |
| } |
| |
| int cst_fclose(cst_file fh) |
| { |
| return fclose(fh); |
| } |