00001 /***************************************************************************** 00002 * 00003 * $RCSfile: file__io_8c-source.html,v $ 00004 * 00005 * File Stream API / VFS API Wrapper Functions 00006 * 00007 * 00008 * This program is Copyright (C) 03/2005 Matthias Prinke 00009 * <matthias.prinke@surfeu.de> and covered by GNU's GPL. 00010 * In particular, this program is free software and comes WITHOUT 00011 * ANY WARRANTY. 00012 * 00013 * $Author: mp $ 00014 * 00015 * $Date: 2007-10-08 20:40:32 $ 00016 * 00017 * $Revision: 1.1.2.1 $ 00018 * 00019 * $Log: file__io_8c-source.html,v $ 00019 * Revision 1.1.2.1 2007-10-08 20:40:32 mp 00019 * updated for gps4palm V0.9.5 beta 00019 * 00020 * Revision 1.3 2005-05-15 10:42:58 mp 00021 * modified fread() documentation 00022 * 00023 * Revision 1.2 2005/05/14 12:25:34 mp 00024 * added parameter fd to fread(), fclose(), feof(), rewind(), and fseek() 00025 * added return value to fopen() 00026 * 00027 * Revision 1.1 2005/05/13 18:36:12 mp 00028 * moved functions from MapForm, added fseek() 00029 * 00030 * 00031 ****************************************************************************/ 00032 #include <PalmOS.h> 00033 #include <Extensions/ExpansionMgr/VFSMgr.h> 00034 #include "file_io.h" 00035 #include "getdir.h" 00036 00037 00038 /****************************************************************************/ 00039 /** 00040 * \brief File Stream API / VFS API wrapper function. 00041 * 00042 * \param fd file descriptor (FS File Handle/VFS File Reference) 00043 * \param buf storage location for read data 00044 * \param size number of bytes to read 00045 * 00046 * \return number of items successfully read 00047 ****************************************************************************/ 00048 unsigned long fread(FileDescrType fd, void *buf, unsigned long size) 00049 { 00050 unsigned long x; 00051 if (fd.fr) 00052 VFSFileRead(fd.fr, size, buf, &x); 00053 else 00054 x = FileRead(fd.fh, buf, 1, size, NULL); 00055 return x; 00056 } 00057 00058 00059 /****************************************************************************/ 00060 /** 00061 * \brief File Stream API / VFS API wrapper function. 00062 ****************************************************************************/ 00063 FileDescrType fopen(UInt32 filecard, const char *filename, const char *dir, Err *err) 00064 { 00065 MemPtr pathName; 00066 UInt32 vfs_vol = filecard & ~VFS_FLAG; 00067 FileDescrType fd; 00068 00069 if (!(filecard & VFS_FLAG)) { 00070 fd.fh = FileOpen( filecard, /* card nr */ 00071 filename, 00072 'DATA', /* type */ 00073 'BOXR', /* creator */ 00074 fileModeReadOnly | fileModeAnyTypeCreator, /* mode */ 00075 err); /* err */ 00076 fd.fr = 0; 00077 } else { 00078 /* generate absolute file path */ 00079 pathName = MemPtrNew(StrLen(dir) + StrLen(filename) + 2); 00080 StrCopy(pathName, dir); 00081 StrCat(pathName, "/"); 00082 StrCat(pathName, filename); 00083 00084 *err = VFSFileOpen(vfs_vol, pathName, vfsModeRead, &fd.fr); 00085 fd.fh = 0; 00086 MemPtrFree(pathName); 00087 00088 } 00089 return fd; 00090 } 00091 00092 00093 /****************************************************************************/ 00094 /** 00095 * \brief File Stream API / VFS API wrapper function. 00096 ****************************************************************************/ 00097 void fclose(FileDescrType fd) 00098 { 00099 if (fd.fr) { 00100 VFSFileClose(fd.fr); 00101 fd.fr = 0; 00102 } else { 00103 FileClose(fd.fh); 00104 fd.fh = 0; 00105 } 00106 } 00107 00108 00109 /****************************************************************************/ 00110 /** 00111 * \brief File Stream API / VFS API wrapper function. 00112 * 00113 * \return non-zero if end-of-file is set 00114 ****************************************************************************/ 00115 int feof(FileDescrType fd) 00116 { 00117 if (fd.fr) 00118 return VFSFileEOF(fd.fr); 00119 else 00120 return FileEOF(fd.fh); 00121 } 00122 00123 00124 /****************************************************************************/ 00125 /** 00126 * \brief File Stream API / VFS API wrapper function. 00127 ****************************************************************************/ 00128 void rewind(FileDescrType fd) 00129 { 00130 if (fd.fr) 00131 VFSFileSeek(fd.fr, vfsOriginBeginning, 0); 00132 else 00133 FileSeek(fd.fh, 0, fileOriginBeginning); 00134 } 00135 00136 00137 /****************************************************************************/ 00138 /** 00139 * \brief File Stream API / VFS API wrapper function. 00140 ****************************************************************************/ 00141 int fseek(FileDescrType fd, long offset, int whence) 00142 { 00143 Err err; 00144 00145 if (fd.fr) { 00146 switch (whence) { 00147 case SEEK_SET: 00148 err = VFSFileSeek(fd.fr, vfsOriginBeginning, offset); 00149 break; 00150 00151 case SEEK_CUR: 00152 err = VFSFileSeek(fd.fr, vfsOriginCurrent, offset); 00153 break; 00154 00155 case SEEK_END: 00156 err = VFSFileSeek(fd.fr, vfsOriginEnd, offset); 00157 break; 00158 00159 default: 00160 return -1; 00161 } 00162 00163 return (err == errNone) ? 0 : -1; 00164 00165 } else { 00166 switch (whence) { 00167 case SEEK_SET: 00168 err = FileSeek(fd.fh, offset, fileOriginBeginning); 00169 break; 00170 00171 case SEEK_CUR: 00172 err = FileSeek(fd.fh, offset, fileOriginCurrent); 00173 break; 00174 00175 case SEEK_END: 00176 err = FileSeek(fd.fh, offset, fileOriginEnd); 00177 break; 00178 00179 default: 00180 return -1; 00181 } 00182 00183 return (err == 0) ? 0 : -1; 00184 00185 } 00186 00187 }