Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

Committer:
jmarkel44
Date:
Tue Jan 24 19:05:33 2017 +0000
Revision:
0:61364762ee0e
Port from IAR to Nucleo-F412 board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:61364762ee0e 1 /** @file mfs.cpp */
jmarkel44 0:61364762ee0e 2 /*CPP**************************************************************************
jmarkel44 0:61364762ee0e 3 * FILENAME : mfs.cpp *
jmarkel44 0:61364762ee0e 4 * *
jmarkel44 0:61364762ee0e 5 * DESCRIPTION : *
jmarkel44 0:61364762ee0e 6 * mFS file system implementation for mBED with external I2C EEEPROM. *
jmarkel44 0:61364762ee0e 7 * *
jmarkel44 0:61364762ee0e 8 * AUTHOR : Olli Vanhoja START DATE : 2011-02-21 *
jmarkel44 0:61364762ee0e 9 *****************************************************************************/
jmarkel44 0:61364762ee0e 10
jmarkel44 0:61364762ee0e 11 #include "mbed.h"
jmarkel44 0:61364762ee0e 12 #include "mfs.h"
jmarkel44 0:61364762ee0e 13 #include "i2c_eeprom.h"
jmarkel44 0:61364762ee0e 14
jmarkel44 0:61364762ee0e 15 #define BLOCK_LLEN 2 /**< Block number link length in bytes */
jmarkel44 0:61364762ee0e 16 #define RB 1+2*BLOCK_LLEN /**< Reseved bytes per block (1 attrb B, 2 B for next/prev pointers */
jmarkel44 0:61364762ee0e 17 #define MFS_I2C_SPEED 100000 /**< I2C bus speed in Hz */
jmarkel44 0:61364762ee0e 18 #define DEBUG /**< Adds extra safety in reading and writing */
jmarkel44 0:61364762ee0e 19
jmarkel44 0:61364762ee0e 20 mfs::mfs(int i2c_address)
jmarkel44 0:61364762ee0e 21 {
jmarkel44 0:61364762ee0e 22 mem = new i2c_eeprom(i2c_address, MFS_I2C_SPEED);
jmarkel44 0:61364762ee0e 23 }
jmarkel44 0:61364762ee0e 24
jmarkel44 0:61364762ee0e 25 char mfs::read(char *data, uint32_t block, uint32_t byte, uint32_t n)
jmarkel44 0:61364762ee0e 26 {
jmarkel44 0:61364762ee0e 27 // Faster reading without DEBUG mode
jmarkel44 0:61364762ee0e 28 #ifdef DEBUG
jmarkel44 0:61364762ee0e 29 if ((byte+n-1 >= BS))
jmarkel44 0:61364762ee0e 30 return 1;
jmarkel44 0:61364762ee0e 31 #endif
jmarkel44 0:61364762ee0e 32 mem->read(BS*block+byte, n, data);
jmarkel44 0:61364762ee0e 33
jmarkel44 0:61364762ee0e 34 return 0;
jmarkel44 0:61364762ee0e 35 }
jmarkel44 0:61364762ee0e 36
jmarkel44 0:61364762ee0e 37 char mfs::write(char *data, uint32_t block, uint32_t byte, uint32_t n)
jmarkel44 0:61364762ee0e 38 {
jmarkel44 0:61364762ee0e 39 // Faster writing without DEBUG mode
jmarkel44 0:61364762ee0e 40 #ifdef DEBUG
jmarkel44 0:61364762ee0e 41 if (byte+n >= BS)
jmarkel44 0:61364762ee0e 42 return 1;
jmarkel44 0:61364762ee0e 43 #endif
jmarkel44 0:61364762ee0e 44 mem->write(data, BS*block+byte, n);
jmarkel44 0:61364762ee0e 45
jmarkel44 0:61364762ee0e 46 return 0;
jmarkel44 0:61364762ee0e 47 }
jmarkel44 0:61364762ee0e 48
jmarkel44 0:61364762ee0e 49 char mfs::getNextFreeBlock(uint32_t *blockOut)
jmarkel44 0:61364762ee0e 50 {
jmarkel44 0:61364762ee0e 51 // Locate free block by seeking EERPOM
jmarkel44 0:61364762ee0e 52 char cFlags[1];
jmarkel44 0:61364762ee0e 53
jmarkel44 0:61364762ee0e 54 for (*blockOut=0; *blockOut < BC; (*blockOut)++)
jmarkel44 0:61364762ee0e 55 {
jmarkel44 0:61364762ee0e 56 read(cFlags, *blockOut, 0, 1);
jmarkel44 0:61364762ee0e 57 if (cFlags[0] == 0x04)
jmarkel44 0:61364762ee0e 58 break;
jmarkel44 0:61364762ee0e 59 if (*blockOut >= BC-1)
jmarkel44 0:61364762ee0e 60 return 1;
jmarkel44 0:61364762ee0e 61 }
jmarkel44 0:61364762ee0e 62
jmarkel44 0:61364762ee0e 63 return 0;
jmarkel44 0:61364762ee0e 64 }
jmarkel44 0:61364762ee0e 65
jmarkel44 0:61364762ee0e 66 char mfs::findNextFile(uint32_t block, char *filenameOut, uint32_t *blockOut)
jmarkel44 0:61364762ee0e 67 {
jmarkel44 0:61364762ee0e 68 uint32_t i=block;
jmarkel44 0:61364762ee0e 69 char cFlags[1];
jmarkel44 0:61364762ee0e 70
jmarkel44 0:61364762ee0e 71 while (i < BC)
jmarkel44 0:61364762ee0e 72 {
jmarkel44 0:61364762ee0e 73 read(cFlags, i, 0, 1);
jmarkel44 0:61364762ee0e 74
jmarkel44 0:61364762ee0e 75 if ((cFlags[0] & 0x8C) == 0x8C)
jmarkel44 0:61364762ee0e 76 break; // File found
jmarkel44 0:61364762ee0e 77 else
jmarkel44 0:61364762ee0e 78 i++;
jmarkel44 0:61364762ee0e 79 }
jmarkel44 0:61364762ee0e 80
jmarkel44 0:61364762ee0e 81 if(i == BC)
jmarkel44 0:61364762ee0e 82 {
jmarkel44 0:61364762ee0e 83 strcpy(filenameOut, "");
jmarkel44 0:61364762ee0e 84 return 1; // Empty fs
jmarkel44 0:61364762ee0e 85 }
jmarkel44 0:61364762ee0e 86
jmarkel44 0:61364762ee0e 87 // Read filename
jmarkel44 0:61364762ee0e 88 read(filenameOut, i, RB, FILENAME_LENGTH);
jmarkel44 0:61364762ee0e 89 *blockOut = i; // Return block number
jmarkel44 0:61364762ee0e 90 return 0;
jmarkel44 0:61364762ee0e 91 }
jmarkel44 0:61364762ee0e 92
jmarkel44 0:61364762ee0e 93 char mfs::getFirstBlockOfFile(char filename[FILENAME_LENGTH], uint32_t *blockOut)
jmarkel44 0:61364762ee0e 94 {
jmarkel44 0:61364762ee0e 95 *blockOut=0;
jmarkel44 0:61364762ee0e 96 char tmpFilename[FILENAME_LENGTH]="";
jmarkel44 0:61364762ee0e 97
jmarkel44 0:61364762ee0e 98 while (1)
jmarkel44 0:61364762ee0e 99 {
jmarkel44 0:61364762ee0e 100 if (findNextFile(*blockOut, tmpFilename, blockOut) == 0)
jmarkel44 0:61364762ee0e 101 {
jmarkel44 0:61364762ee0e 102 if(strcmp(tmpFilename, filename) == 0)
jmarkel44 0:61364762ee0e 103 return 0; // File exists
jmarkel44 0:61364762ee0e 104 }
jmarkel44 0:61364762ee0e 105 else return 1; // File doesn't exist
jmarkel44 0:61364762ee0e 106 (*blockOut)++;
jmarkel44 0:61364762ee0e 107 }
jmarkel44 0:61364762ee0e 108 }
jmarkel44 0:61364762ee0e 109
jmarkel44 0:61364762ee0e 110 char mfs::createFile(char filename[FILENAME_LENGTH])
jmarkel44 0:61364762ee0e 111 {
jmarkel44 0:61364762ee0e 112 char tmpFilename[FILENAME_LENGTH];
jmarkel44 0:61364762ee0e 113 uint32_t n;
jmarkel44 0:61364762ee0e 114 uint32_t fb;
jmarkel44 0:61364762ee0e 115
jmarkel44 0:61364762ee0e 116 for (n=0; n < BC; n++)
jmarkel44 0:61364762ee0e 117 {
jmarkel44 0:61364762ee0e 118 if(findNextFile(n, tmpFilename, &n) == 0)
jmarkel44 0:61364762ee0e 119 {
jmarkel44 0:61364762ee0e 120 if(strcmp(tmpFilename, filename) == 0)
jmarkel44 0:61364762ee0e 121 return 1; // File exist
jmarkel44 0:61364762ee0e 122 }
jmarkel44 0:61364762ee0e 123 else break; // We already reached the edge of the universe
jmarkel44 0:61364762ee0e 124 n++;
jmarkel44 0:61364762ee0e 125 }
jmarkel44 0:61364762ee0e 126
jmarkel44 0:61364762ee0e 127 if(getNextFreeBlock(&fb) != 0)
jmarkel44 0:61364762ee0e 128 return 2; // Out of space
jmarkel44 0:61364762ee0e 129
jmarkel44 0:61364762ee0e 130 char cData[RB+FILENAME_LENGTH+1];
jmarkel44 0:61364762ee0e 131 cData[0] = '\xCC'; // Necessary flags for a file
jmarkel44 0:61364762ee0e 132 cData[1] = '\0'; // No more blocks yet
jmarkel44 0:61364762ee0e 133 cData[2] = '\0';
jmarkel44 0:61364762ee0e 134 cData[3] = '\0'; // First block so there is no prev blocks
jmarkel44 0:61364762ee0e 135 cData[4] = '\0';
jmarkel44 0:61364762ee0e 136 cData[RB+FILENAME_LENGTH] = mEOF; // Set EOF at the begining
jmarkel44 0:61364762ee0e 137
jmarkel44 0:61364762ee0e 138 for (char i=0; i < FILENAME_LENGTH; i++)
jmarkel44 0:61364762ee0e 139 cData[RB+i] = filename[i];
jmarkel44 0:61364762ee0e 140
jmarkel44 0:61364762ee0e 141 // Create file
jmarkel44 0:61364762ee0e 142 write(cData, fb, 0, RB+FILENAME_LENGTH+1);
jmarkel44 0:61364762ee0e 143
jmarkel44 0:61364762ee0e 144 return 0;
jmarkel44 0:61364762ee0e 145 }
jmarkel44 0:61364762ee0e 146
jmarkel44 0:61364762ee0e 147 char mfs::removeFile(char filename[FILENAME_LENGTH])
jmarkel44 0:61364762ee0e 148 {
jmarkel44 0:61364762ee0e 149 uint32_t block;
jmarkel44 0:61364762ee0e 150 char cData[RB-BLOCK_LLEN];
jmarkel44 0:61364762ee0e 151 char cDataNew[RB] = {'\x04', '\0', '\0', '\0', '\0'};
jmarkel44 0:61364762ee0e 152 uint32_t i=0;
jmarkel44 0:61364762ee0e 153
jmarkel44 0:61364762ee0e 154 // Check if file exists
jmarkel44 0:61364762ee0e 155 if (getFirstBlockOfFile(filename, &block) != 0)
jmarkel44 0:61364762ee0e 156 return 1; // File not found
jmarkel44 0:61364762ee0e 157
jmarkel44 0:61364762ee0e 158 read(cData, block, 0, RB-BLOCK_LLEN);
jmarkel44 0:61364762ee0e 159
jmarkel44 0:61364762ee0e 160 // Check credentials
jmarkel44 0:61364762ee0e 161 if (((cData[0] & 0x01)|((cData[0] & 0x10) >> 3)|((cData[0] & 0x20) >> 3) & 0x04) != 0)
jmarkel44 0:61364762ee0e 162 return 2; // RO file
jmarkel44 0:61364762ee0e 163
jmarkel44 0:61364762ee0e 164 // Clear blocks reserved by the file
jmarkel44 0:61364762ee0e 165 while(1)
jmarkel44 0:61364762ee0e 166 {
jmarkel44 0:61364762ee0e 167 write(cDataNew, block, 0, RB);
jmarkel44 0:61364762ee0e 168 if ((cData[0] & 0x4C) == 0x4C)
jmarkel44 0:61364762ee0e 169 break; // End of file found
jmarkel44 0:61364762ee0e 170 else block = (uint32_t)(cData[1])<<8|cData[2]; // Set next block number
jmarkel44 0:61364762ee0e 171 i++;
jmarkel44 0:61364762ee0e 172 if (i > BC)
jmarkel44 0:61364762ee0e 173 return 1; // fs is corrupted
jmarkel44 0:61364762ee0e 174 read(cData, block, 0, RB-BLOCK_LLEN);
jmarkel44 0:61364762ee0e 175 }
jmarkel44 0:61364762ee0e 176
jmarkel44 0:61364762ee0e 177 return 0; // Everything went better than expected
jmarkel44 0:61364762ee0e 178 }
jmarkel44 0:61364762ee0e 179
jmarkel44 0:61364762ee0e 180 char mfs::renameFile(char oldFilename[FILENAME_LENGTH], char newFilename[FILENAME_LENGTH])
jmarkel44 0:61364762ee0e 181 {
jmarkel44 0:61364762ee0e 182 uint32_t block;
jmarkel44 0:61364762ee0e 183 char cData[1];
jmarkel44 0:61364762ee0e 184
jmarkel44 0:61364762ee0e 185 // Check if file exists
jmarkel44 0:61364762ee0e 186 if (getFirstBlockOfFile(oldFilename, &block) != 0)
jmarkel44 0:61364762ee0e 187 return 1; // File not found
jmarkel44 0:61364762ee0e 188
jmarkel44 0:61364762ee0e 189 // Check credentials
jmarkel44 0:61364762ee0e 190 read(cData, block, 0, 1);
jmarkel44 0:61364762ee0e 191 char flags = (cData[0] & 0x01)|((cData[0] & 0x10) >> 3)|((cData[0] & 0x20) >> 3);
jmarkel44 0:61364762ee0e 192 if ((flags & 0x04) != 0)
jmarkel44 0:61364762ee0e 193 return 2; // RO file
jmarkel44 0:61364762ee0e 194
jmarkel44 0:61364762ee0e 195 write(newFilename, block, RB, FILENAME_LENGTH);
jmarkel44 0:61364762ee0e 196
jmarkel44 0:61364762ee0e 197 return 0; // Everything went better than expected
jmarkel44 0:61364762ee0e 198 }
jmarkel44 0:61364762ee0e 199
jmarkel44 0:61364762ee0e 200 char mfs::setFileFlags(char *flags, char filename[FILENAME_LENGTH])
jmarkel44 0:61364762ee0e 201 {
jmarkel44 0:61364762ee0e 202 /* RO|HIDDEN|LOCK *
jmarkel44 0:61364762ee0e 203 * H L */
jmarkel44 0:61364762ee0e 204
jmarkel44 0:61364762ee0e 205 uint32_t n;
jmarkel44 0:61364762ee0e 206 char cData[1] = {'\0'};
jmarkel44 0:61364762ee0e 207 char cFlags;
jmarkel44 0:61364762ee0e 208
jmarkel44 0:61364762ee0e 209 // Check if file exists
jmarkel44 0:61364762ee0e 210 if (getFirstBlockOfFile(filename, &n) != 0)
jmarkel44 0:61364762ee0e 211 return 1; // File not found
jmarkel44 0:61364762ee0e 212
jmarkel44 0:61364762ee0e 213 read(cData, n, 0, 1);
jmarkel44 0:61364762ee0e 214 cFlags = ((flags[0] & 0x01)|((flags[0] & 0x02) << 3)|((flags[0] & 0x04) << 3));
jmarkel44 0:61364762ee0e 215 cData[0] = cData[0] & (~0x31) | cFlags;
jmarkel44 0:61364762ee0e 216 write(cData, n, 0, 1);
jmarkel44 0:61364762ee0e 217
jmarkel44 0:61364762ee0e 218 return 0;
jmarkel44 0:61364762ee0e 219 }
jmarkel44 0:61364762ee0e 220
jmarkel44 0:61364762ee0e 221 char mfs::getFileFlags(char *flags, char filename[FILENAME_LENGTH])
jmarkel44 0:61364762ee0e 222 {
jmarkel44 0:61364762ee0e 223 /* RO|HIDDEN|LOCK *
jmarkel44 0:61364762ee0e 224 * H L */
jmarkel44 0:61364762ee0e 225
jmarkel44 0:61364762ee0e 226 uint32_t n;
jmarkel44 0:61364762ee0e 227 char cData[1] = {'\0'};
jmarkel44 0:61364762ee0e 228
jmarkel44 0:61364762ee0e 229 // Check if file exists
jmarkel44 0:61364762ee0e 230 if (getFirstBlockOfFile(filename, &n) != 0)
jmarkel44 0:61364762ee0e 231 return 1; // File not found
jmarkel44 0:61364762ee0e 232
jmarkel44 0:61364762ee0e 233 read(cData, n, 0, 1);
jmarkel44 0:61364762ee0e 234 flags[0] = (cData[0] & 0x01)|((cData[0] & 0x10) >> 3)|((cData[0] & 0x20) >> 3);
jmarkel44 0:61364762ee0e 235
jmarkel44 0:61364762ee0e 236 return 0;
jmarkel44 0:61364762ee0e 237 }
jmarkel44 0:61364762ee0e 238
jmarkel44 0:61364762ee0e 239 // Return number of free blocks
jmarkel44 0:61364762ee0e 240 uint32_t mfs::free()
jmarkel44 0:61364762ee0e 241 {
jmarkel44 0:61364762ee0e 242 uint32_t blocks=0;
jmarkel44 0:61364762ee0e 243 uint32_t r;
jmarkel44 0:61364762ee0e 244 char cFlags[1];
jmarkel44 0:61364762ee0e 245
jmarkel44 0:61364762ee0e 246 for (r=0; r < BC; r++)
jmarkel44 0:61364762ee0e 247 {
jmarkel44 0:61364762ee0e 248 read(cFlags, r, 0, 1);
jmarkel44 0:61364762ee0e 249 if (cFlags[0] == 0x04)
jmarkel44 0:61364762ee0e 250 blocks++;
jmarkel44 0:61364762ee0e 251 if (r >= BC-1)
jmarkel44 0:61364762ee0e 252 return blocks;
jmarkel44 0:61364762ee0e 253 }
jmarkel44 0:61364762ee0e 254
jmarkel44 0:61364762ee0e 255 return 0;
jmarkel44 0:61364762ee0e 256 }
jmarkel44 0:61364762ee0e 257
jmarkel44 0:61364762ee0e 258 uint32_t mfs::mkfs(bool createLabel)
jmarkel44 0:61364762ee0e 259 {
jmarkel44 0:61364762ee0e 260 uint32_t iAddr = 0;
jmarkel44 0:61364762ee0e 261 uint32_t i = 0;
jmarkel44 0:61364762ee0e 262 uint32_t bad = 0; // For counting bad block headers
jmarkel44 0:61364762ee0e 263 char cFlags[RB] = {'\0', '\0', '\0', '\0', '\0'}, o[1];
jmarkel44 0:61364762ee0e 264
jmarkel44 0:61364762ee0e 265 if (createLabel == true)
jmarkel44 0:61364762ee0e 266 {
jmarkel44 0:61364762ee0e 267 // Write Volume label
jmarkel44 0:61364762ee0e 268 cFlags[0] = '\x0E';
jmarkel44 0:61364762ee0e 269 mem->write(cFlags, iAddr, RB);
jmarkel44 0:61364762ee0e 270 iAddr = BS;
jmarkel44 0:61364762ee0e 271 i = 1;
jmarkel44 0:61364762ee0e 272 }
jmarkel44 0:61364762ee0e 273
jmarkel44 0:61364762ee0e 274 cFlags[0] = '\x04';
jmarkel44 0:61364762ee0e 275 for (; i < BC; i++)
jmarkel44 0:61364762ee0e 276 {
jmarkel44 0:61364762ee0e 277 mem->write(cFlags, iAddr, RB);
jmarkel44 0:61364762ee0e 278 mem->read(iAddr, 1, o);
jmarkel44 0:61364762ee0e 279 if (o[0] != cFlags[0])
jmarkel44 0:61364762ee0e 280 bad++;
jmarkel44 0:61364762ee0e 281 iAddr += BS;
jmarkel44 0:61364762ee0e 282 }
jmarkel44 0:61364762ee0e 283
jmarkel44 0:61364762ee0e 284 return bad;
jmarkel44 0:61364762ee0e 285 }
jmarkel44 0:61364762ee0e 286
jmarkel44 0:61364762ee0e 287 file::file(mfs *fs_ref, char filename[FILENAME_LENGTH], FileOpenMode operation)
jmarkel44 0:61364762ee0e 288 {
jmarkel44 0:61364762ee0e 289 fMode = operation;
jmarkel44 0:61364762ee0e 290
jmarkel44 0:61364762ee0e 291 fs = fs_ref; // Don't forget this :)
jmarkel44 0:61364762ee0e 292
jmarkel44 0:61364762ee0e 293 uint32_t n;
jmarkel44 0:61364762ee0e 294 char cData[1] = {'\0'};
jmarkel44 0:61364762ee0e 295
jmarkel44 0:61364762ee0e 296 // Check if file exists
jmarkel44 0:61364762ee0e 297 if (fs->getFirstBlockOfFile(filename, &n) != 0)
jmarkel44 0:61364762ee0e 298 error("Oops, file \"%s\" not found! n=0x%X", filename, n); // File not found
jmarkel44 0:61364762ee0e 299
jmarkel44 0:61364762ee0e 300 fs->read(cData, n, 0, 1);
jmarkel44 0:61364762ee0e 301 char flags = (cData[0] & 0x01)|((cData[0] & 0x10) >> 3)|((cData[0] & 0x20) >> 3);
jmarkel44 0:61364762ee0e 302
jmarkel44 0:61364762ee0e 303 if ((fMode != RO) && ((flags & 0x04) != 0))
jmarkel44 0:61364762ee0e 304 error("Oops, cant open in RW mode!");
jmarkel44 0:61364762ee0e 305
jmarkel44 0:61364762ee0e 306 // Store FBOF number
jmarkel44 0:61364762ee0e 307 firstBlock = n;
jmarkel44 0:61364762ee0e 308 currBlock = n;
jmarkel44 0:61364762ee0e 309 blockPos = RB+FILENAME_LENGTH; // skip flags + pointers + filename
jmarkel44 0:61364762ee0e 310 byteCount = 0; // First byte of the file
jmarkel44 0:61364762ee0e 311
jmarkel44 0:61364762ee0e 312 // Initialize buffer
jmarkel44 0:61364762ee0e 313 for (unsigned int i=0; i < BUF; i++)
jmarkel44 0:61364762ee0e 314 buffer[i] = '\0';
jmarkel44 0:61364762ee0e 315 bufPos = 0;
jmarkel44 0:61364762ee0e 316 }
jmarkel44 0:61364762ee0e 317
jmarkel44 0:61364762ee0e 318 file::~file()
jmarkel44 0:61364762ee0e 319 {
jmarkel44 0:61364762ee0e 320 flush();
jmarkel44 0:61364762ee0e 321 }
jmarkel44 0:61364762ee0e 322
jmarkel44 0:61364762ee0e 323 char file::getBlockLink(BlockLinkType linkSelection, uint32_t *blockOut)
jmarkel44 0:61364762ee0e 324 {
jmarkel44 0:61364762ee0e 325 char cData[1+BLOCK_LLEN];
jmarkel44 0:61364762ee0e 326
jmarkel44 0:61364762ee0e 327 if (linkSelection == NEXT)
jmarkel44 0:61364762ee0e 328 {
jmarkel44 0:61364762ee0e 329 // Fetch link to next block
jmarkel44 0:61364762ee0e 330 fs->read(cData, currBlock, 0, 1+BLOCK_LLEN);
jmarkel44 0:61364762ee0e 331 if ((cData[0] & 0x40) == 0)
jmarkel44 0:61364762ee0e 332 {
jmarkel44 0:61364762ee0e 333 *blockOut = ((uint32_t)(cData[1])) << 8; // Hbyte of next block link
jmarkel44 0:61364762ee0e 334 *blockOut |= (uint32_t)cData[2]; // Lbyte of next block link
jmarkel44 0:61364762ee0e 335 return 0;
jmarkel44 0:61364762ee0e 336 } else return 1; // Already at last block
jmarkel44 0:61364762ee0e 337 } else if (linkSelection == PREV)
jmarkel44 0:61364762ee0e 338 {
jmarkel44 0:61364762ee0e 339 if (currBlock != firstBlock)
jmarkel44 0:61364762ee0e 340 {
jmarkel44 0:61364762ee0e 341 fs->read(cData, currBlock, 1+BLOCK_LLEN, BLOCK_LLEN);
jmarkel44 0:61364762ee0e 342 *blockOut = ((uint32_t)(cData[0])) << 8; // Hbyte of next block link
jmarkel44 0:61364762ee0e 343 *blockOut |= (uint32_t)cData[1]; // Lbyte of next block link
jmarkel44 0:61364762ee0e 344 return 0;
jmarkel44 0:61364762ee0e 345 } else return 1; // Already at first block
jmarkel44 0:61364762ee0e 346 }
jmarkel44 0:61364762ee0e 347
jmarkel44 0:61364762ee0e 348 return 0;
jmarkel44 0:61364762ee0e 349 }
jmarkel44 0:61364762ee0e 350
jmarkel44 0:61364762ee0e 351 char file::removeFollowingBlocks(uint32_t block)
jmarkel44 0:61364762ee0e 352 {
jmarkel44 0:61364762ee0e 353 char cData[RB-BLOCK_LLEN];
jmarkel44 0:61364762ee0e 354 char cDataNew[RB] = {'\x04', '\0', '\0', '\0', '\0'};
jmarkel44 0:61364762ee0e 355 uint32_t i=0;
jmarkel44 0:61364762ee0e 356
jmarkel44 0:61364762ee0e 357 while(1)
jmarkel44 0:61364762ee0e 358 {
jmarkel44 0:61364762ee0e 359 fs->read(cData, block, 0, RB-BLOCK_LLEN);
jmarkel44 0:61364762ee0e 360 fs->write(cDataNew, block, 0, RB);
jmarkel44 0:61364762ee0e 361 if ((cData[0] & 0x4C) == 0x4C)
jmarkel44 0:61364762ee0e 362 break; // End of file found
jmarkel44 0:61364762ee0e 363 else block = (uint32_t)(cData[0])<<8|cData[1]; // Set next block number
jmarkel44 0:61364762ee0e 364 i++;
jmarkel44 0:61364762ee0e 365 if (i > BC)
jmarkel44 0:61364762ee0e 366 return 1; // fs is corrupted
jmarkel44 0:61364762ee0e 367 }
jmarkel44 0:61364762ee0e 368
jmarkel44 0:61364762ee0e 369 return 0;
jmarkel44 0:61364762ee0e 370 }
jmarkel44 0:61364762ee0e 371
jmarkel44 0:61364762ee0e 372 void file::rewind()
jmarkel44 0:61364762ee0e 373 {
jmarkel44 0:61364762ee0e 374 flush();
jmarkel44 0:61364762ee0e 375 currBlock = firstBlock;
jmarkel44 0:61364762ee0e 376 blockPos = RB+FILENAME_LENGTH; // skip flags & pointers + filename
jmarkel44 0:61364762ee0e 377 byteCount = 0;
jmarkel44 0:61364762ee0e 378 }
jmarkel44 0:61364762ee0e 379
jmarkel44 0:61364762ee0e 380 char file::rewind(uint32_t n)
jmarkel44 0:61364762ee0e 381 {
jmarkel44 0:61364762ee0e 382 uint32_t i;
jmarkel44 0:61364762ee0e 383 uint32_t block;
jmarkel44 0:61364762ee0e 384 uint32_t varBlockOffset;
jmarkel44 0:61364762ee0e 385
jmarkel44 0:61364762ee0e 386 flush(); // Check if flush is needed
jmarkel44 0:61364762ee0e 387
jmarkel44 0:61364762ee0e 388 for (i=0; i < n; i++)
jmarkel44 0:61364762ee0e 389 {
jmarkel44 0:61364762ee0e 390 blockPos--;
jmarkel44 0:61364762ee0e 391 byteCount--;
jmarkel44 0:61364762ee0e 392
jmarkel44 0:61364762ee0e 393 // Change Block?
jmarkel44 0:61364762ee0e 394 if (blockPos == firstBlock)
jmarkel44 0:61364762ee0e 395 varBlockOffset = RB+FILENAME_LENGTH;
jmarkel44 0:61364762ee0e 396 else
jmarkel44 0:61364762ee0e 397 varBlockOffset = RB;
jmarkel44 0:61364762ee0e 398 if ((blockPos < varBlockOffset) && (currBlock > firstBlock))
jmarkel44 0:61364762ee0e 399 {
jmarkel44 0:61364762ee0e 400 // Fetch link to previous block
jmarkel44 0:61364762ee0e 401 if(getBlockLink(PREV, &block) == 0)
jmarkel44 0:61364762ee0e 402 {
jmarkel44 0:61364762ee0e 403 currBlock = block;
jmarkel44 0:61364762ee0e 404 blockPos = BS-1; // blockPos should be set at the end of block
jmarkel44 0:61364762ee0e 405 } else {
jmarkel44 0:61364762ee0e 406 blockPos++;
jmarkel44 0:61364762ee0e 407 byteCount++;
jmarkel44 0:61364762ee0e 408 return 1; // This is the first block and byte
jmarkel44 0:61364762ee0e 409 }
jmarkel44 0:61364762ee0e 410 }
jmarkel44 0:61364762ee0e 411 }
jmarkel44 0:61364762ee0e 412
jmarkel44 0:61364762ee0e 413 return 0; // OK
jmarkel44 0:61364762ee0e 414 }
jmarkel44 0:61364762ee0e 415
jmarkel44 0:61364762ee0e 416 char file::forward()
jmarkel44 0:61364762ee0e 417 {
jmarkel44 0:61364762ee0e 418 return forward(1);
jmarkel44 0:61364762ee0e 419 }
jmarkel44 0:61364762ee0e 420
jmarkel44 0:61364762ee0e 421 char file::forward(uint32_t n)
jmarkel44 0:61364762ee0e 422 {
jmarkel44 0:61364762ee0e 423 uint32_t i;
jmarkel44 0:61364762ee0e 424 uint32_t block; // Next block number
jmarkel44 0:61364762ee0e 425 char cData[1];
jmarkel44 0:61364762ee0e 426
jmarkel44 0:61364762ee0e 427 flush(); // Check if flush is needed
jmarkel44 0:61364762ee0e 428
jmarkel44 0:61364762ee0e 429 for (i=0; i < n; i++)
jmarkel44 0:61364762ee0e 430 {
jmarkel44 0:61364762ee0e 431 // If this is empty file EOF will be at first byte
jmarkel44 0:61364762ee0e 432 fs->read(cData, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 433 if (cData[0] == mEOF)
jmarkel44 0:61364762ee0e 434 {
jmarkel44 0:61364762ee0e 435 return 1;
jmarkel44 0:61364762ee0e 436 }
jmarkel44 0:61364762ee0e 437
jmarkel44 0:61364762ee0e 438 blockPos++;
jmarkel44 0:61364762ee0e 439 byteCount++;
jmarkel44 0:61364762ee0e 440
jmarkel44 0:61364762ee0e 441 // Change Block?
jmarkel44 0:61364762ee0e 442 if (blockPos >= BS)
jmarkel44 0:61364762ee0e 443 {
jmarkel44 0:61364762ee0e 444 // Fetch link to next block
jmarkel44 0:61364762ee0e 445 if (getBlockLink(NEXT, &block) == 0)
jmarkel44 0:61364762ee0e 446 {
jmarkel44 0:61364762ee0e 447 currBlock = block;
jmarkel44 0:61364762ee0e 448 blockPos = RB; // Reset block position offset
jmarkel44 0:61364762ee0e 449 } else {
jmarkel44 0:61364762ee0e 450 blockPos--;
jmarkel44 0:61364762ee0e 451 byteCount--;
jmarkel44 0:61364762ee0e 452 return 1; // This is the last block & byte
jmarkel44 0:61364762ee0e 453 }
jmarkel44 0:61364762ee0e 454 }
jmarkel44 0:61364762ee0e 455 fs->read(cData, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 456 if (cData[0] == mEOF)
jmarkel44 0:61364762ee0e 457 {
jmarkel44 0:61364762ee0e 458 rewind(1); // Get back to the byte before EOF
jmarkel44 0:61364762ee0e 459 return 1;
jmarkel44 0:61364762ee0e 460 }
jmarkel44 0:61364762ee0e 461 }
jmarkel44 0:61364762ee0e 462
jmarkel44 0:61364762ee0e 463 return 0; // OK
jmarkel44 0:61364762ee0e 464 }
jmarkel44 0:61364762ee0e 465
jmarkel44 0:61364762ee0e 466 char file::seek(uint32_t byte)
jmarkel44 0:61364762ee0e 467 {
jmarkel44 0:61364762ee0e 468 if (byte > byteCount)
jmarkel44 0:61364762ee0e 469 return forward(byte-byteCount);
jmarkel44 0:61364762ee0e 470 else if (byte < byteCount)
jmarkel44 0:61364762ee0e 471 return rewind(byteCount-byte);
jmarkel44 0:61364762ee0e 472 else return 0;
jmarkel44 0:61364762ee0e 473 }
jmarkel44 0:61364762ee0e 474
jmarkel44 0:61364762ee0e 475 // Respects mEOF and automatically sets '\0' at the end of string
jmarkel44 0:61364762ee0e 476 void file::read(char *data, uint32_t n)
jmarkel44 0:61364762ee0e 477 {
jmarkel44 0:61364762ee0e 478 uint32_t i;
jmarkel44 0:61364762ee0e 479 uint32_t block;
jmarkel44 0:61364762ee0e 480 char cData[1];
jmarkel44 0:61364762ee0e 481
jmarkel44 0:61364762ee0e 482 if( flush() != 0 ) {
jmarkel44 0:61364762ee0e 483 printf("(%s:%d): flush failed\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 484 }
jmarkel44 0:61364762ee0e 485
jmarkel44 0:61364762ee0e 486 for (i=0; i < n; i++)
jmarkel44 0:61364762ee0e 487 {
jmarkel44 0:61364762ee0e 488 // Change block?
jmarkel44 0:61364762ee0e 489 if (blockPos >= BS-1)
jmarkel44 0:61364762ee0e 490 {
jmarkel44 0:61364762ee0e 491 // printf("(%s:%d): pos=%d, BS-1=%d\r\n", __func__, __LINE__, blockPos, BS-1);
jmarkel44 0:61364762ee0e 492 // Fetch link to next block
jmarkel44 0:61364762ee0e 493 if (getBlockLink(NEXT, &block) == 0)
jmarkel44 0:61364762ee0e 494 {
jmarkel44 0:61364762ee0e 495 currBlock = block;
jmarkel44 0:61364762ee0e 496 blockPos = RB; // Reset block position offset
jmarkel44 0:61364762ee0e 497 } else goto stop;
jmarkel44 0:61364762ee0e 498 }
jmarkel44 0:61364762ee0e 499
jmarkel44 0:61364762ee0e 500 // Read data
jmarkel44 0:61364762ee0e 501
jmarkel44 0:61364762ee0e 502 fs->read(cData, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 503 if (cData[0] == mEOF)
jmarkel44 0:61364762ee0e 504 {
jmarkel44 0:61364762ee0e 505 // printf("(%s:%d): Found EOF: currBlock=%d, blockPos=%d\r\n", __func__, __LINE__, currBlock, blockPos);
jmarkel44 0:61364762ee0e 506 stop:
jmarkel44 0:61364762ee0e 507 data[i]='\0';
jmarkel44 0:61364762ee0e 508 return;
jmarkel44 0:61364762ee0e 509 } else {
jmarkel44 0:61364762ee0e 510 data[i] = cData[0];
jmarkel44 0:61364762ee0e 511 // printf("(%s:%d): blk=%d, pos=%d, char=%c\r\n", __func__, __LINE__, currBlock, blockPos, data[i]);
jmarkel44 0:61364762ee0e 512 blockPos++;
jmarkel44 0:61364762ee0e 513 byteCount++;
jmarkel44 0:61364762ee0e 514 }
jmarkel44 0:61364762ee0e 515 }
jmarkel44 0:61364762ee0e 516 if (data[n-1] != '\0') {
jmarkel44 0:61364762ee0e 517 printf("(%s:%d): Adding NULL\r\n", __func__, __LINE__ );
jmarkel44 0:61364762ee0e 518 data[n-1] = '\0';
jmarkel44 0:61364762ee0e 519 }
jmarkel44 0:61364762ee0e 520 }
jmarkel44 0:61364762ee0e 521
jmarkel44 0:61364762ee0e 522 // Ignores mEOF and doesn't set '\0' markings
jmarkel44 0:61364762ee0e 523 void file::readBin(char *data, uint32_t n)
jmarkel44 0:61364762ee0e 524 {
jmarkel44 0:61364762ee0e 525 uint32_t i;
jmarkel44 0:61364762ee0e 526 uint32_t block;
jmarkel44 0:61364762ee0e 527 char cData[1];
jmarkel44 0:61364762ee0e 528
jmarkel44 0:61364762ee0e 529 for (i=0; i < n; i++)
jmarkel44 0:61364762ee0e 530 {
jmarkel44 0:61364762ee0e 531 // Change block?
jmarkel44 0:61364762ee0e 532 if (blockPos == BS-1)
jmarkel44 0:61364762ee0e 533 {
jmarkel44 0:61364762ee0e 534 // Fetch link to next block
jmarkel44 0:61364762ee0e 535 if (getBlockLink(NEXT, &block) == 0)
jmarkel44 0:61364762ee0e 536 {
jmarkel44 0:61364762ee0e 537 currBlock = block;
jmarkel44 0:61364762ee0e 538 blockPos = RB; // Reset block position offset
jmarkel44 0:61364762ee0e 539 } else return;
jmarkel44 0:61364762ee0e 540 }
jmarkel44 0:61364762ee0e 541
jmarkel44 0:61364762ee0e 542 // Read data
jmarkel44 0:61364762ee0e 543 fs->read(cData, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 544 data[i] = cData[0];
jmarkel44 0:61364762ee0e 545
jmarkel44 0:61364762ee0e 546 blockPos++;
jmarkel44 0:61364762ee0e 547 byteCount++;
jmarkel44 0:61364762ee0e 548 }
jmarkel44 0:61364762ee0e 549 }
jmarkel44 0:61364762ee0e 550
jmarkel44 0:61364762ee0e 551 // Always binary
jmarkel44 0:61364762ee0e 552 char file::write(char *data, uint32_t n)
jmarkel44 0:61364762ee0e 553 {
jmarkel44 0:61364762ee0e 554 if (fMode == RO) return 1;
jmarkel44 0:61364762ee0e 555
jmarkel44 0:61364762ee0e 556 for (uint32_t i=0; i < n; i++)
jmarkel44 0:61364762ee0e 557 {
jmarkel44 0:61364762ee0e 558 // write to the buffer
jmarkel44 0:61364762ee0e 559 buffer[bufPos] = data[i];
jmarkel44 0:61364762ee0e 560 bufPos++;
jmarkel44 0:61364762ee0e 561
jmarkel44 0:61364762ee0e 562 // If the buffer is full then flush
jmarkel44 0:61364762ee0e 563 if(bufPos == BUF)
jmarkel44 0:61364762ee0e 564 {
jmarkel44 0:61364762ee0e 565 printf("(%s:%d): flushing buffer: bufPos=%d\r\n", __func__, __LINE__, bufPos);
jmarkel44 0:61364762ee0e 566 if(flush() != 0);
jmarkel44 0:61364762ee0e 567 return 1; // Flush failed
jmarkel44 0:61364762ee0e 568 }
jmarkel44 0:61364762ee0e 569 }
jmarkel44 0:61364762ee0e 570
jmarkel44 0:61364762ee0e 571 return 0;
jmarkel44 0:61364762ee0e 572 }
jmarkel44 0:61364762ee0e 573
jmarkel44 0:61364762ee0e 574 char file::flush()
jmarkel44 0:61364762ee0e 575 {
jmarkel44 0:61364762ee0e 576 char cData[RB], cDataOB[RB-BLOCK_LLEN], c[1];
jmarkel44 0:61364762ee0e 577 uint32_t nextFree;
jmarkel44 0:61364762ee0e 578 uint32_t i;
jmarkel44 0:61364762ee0e 579 uint32_t leftSpaceEOF;
jmarkel44 0:61364762ee0e 580
jmarkel44 0:61364762ee0e 581 bool destructiveFlag = false; // Set this true if there is any data to be removed
jmarkel44 0:61364762ee0e 582 uint32_t destructiveBlock=0; // First block to be removed by DWRITE
jmarkel44 0:61364762ee0e 583
jmarkel44 0:61364762ee0e 584 static bool fEOFow = false; /* END of file found while appending (and overwritten).
jmarkel44 0:61364762ee0e 585 Must be static because we don't want to found many EOF's. */
jmarkel44 0:61364762ee0e 586
jmarkel44 0:61364762ee0e 587
jmarkel44 0:61364762ee0e 588 if (bufPos == 0) return 0; // File up-to date
jmarkel44 0:61364762ee0e 589 if (fMode == RO) return 1;
jmarkel44 0:61364762ee0e 590
jmarkel44 0:61364762ee0e 591 for (i=0; i <= bufPos; i++)
jmarkel44 0:61364762ee0e 592 {
jmarkel44 0:61364762ee0e 593 if( blockPos == 255 )
jmarkel44 0:61364762ee0e 594 {
jmarkel44 0:61364762ee0e 595 // printf("%s:%d:\r\n",__func__, __LINE__);
jmarkel44 0:61364762ee0e 596 }
jmarkel44 0:61364762ee0e 597
jmarkel44 0:61364762ee0e 598 // Change Block?
jmarkel44 0:61364762ee0e 599 if ((bufPos - i) == 1)
jmarkel44 0:61364762ee0e 600 leftSpaceEOF = 1;
jmarkel44 0:61364762ee0e 601 else
jmarkel44 0:61364762ee0e 602 leftSpaceEOF = 0;
jmarkel44 0:61364762ee0e 603 if (blockPos+1 >= BS-leftSpaceEOF)
jmarkel44 0:61364762ee0e 604 {
jmarkel44 0:61364762ee0e 605 // printf("(%s:%d): fetching unused block: currBlock=%d, blockPos=%d, bufPos=%d\r\n", __func__, __LINE__, currBlock, blockPos, bufPos );
jmarkel44 0:61364762ee0e 606 // Fetch new unused block number
jmarkel44 0:61364762ee0e 607 if(fs->getNextFreeBlock(&nextFree) != 0)
jmarkel44 0:61364762ee0e 608 return 2; // No free space left
jmarkel44 0:61364762ee0e 609
jmarkel44 0:61364762ee0e 610 // Read flags from current block
jmarkel44 0:61364762ee0e 611 fs->read(cDataOB, currBlock, 0, RB-BLOCK_LLEN);
jmarkel44 0:61364762ee0e 612
jmarkel44 0:61364762ee0e 613 /* If destructive write is set then check if there is something
jmarkel44 0:61364762ee0e 614 to be marked for removal */
jmarkel44 0:61364762ee0e 615 if (((cDataOB[0] & 0x40) != 0x40) && (fMode == DWRITE))
jmarkel44 0:61364762ee0e 616 {
jmarkel44 0:61364762ee0e 617 destructiveFlag = true;
jmarkel44 0:61364762ee0e 618 destructiveBlock = (uint32_t)cDataOB[1]<<8|cDataOB[2];
jmarkel44 0:61364762ee0e 619 // printf("(%s:%d): destructive flag set: currBlock=%d, blockPos=%d, bufPos=%d\r\n", __func__, __LINE__, currBlock, blockPos, bufPos );
jmarkel44 0:61364762ee0e 620 goto allocate_new_block;
jmarkel44 0:61364762ee0e 621 } else if ((cDataOB[0] & 0x40) != 0x40) // fMode == AWRITE
jmarkel44 0:61364762ee0e 622 {
jmarkel44 0:61364762ee0e 623 // Update current block info
jmarkel44 0:61364762ee0e 624 currBlock = (uint32_t)cDataOB[1]<<8|cDataOB[2];
jmarkel44 0:61364762ee0e 625 blockPos = RB; // Reset block position offset
jmarkel44 0:61364762ee0e 626 // printf("(%s:%d): resetting block position: currBlock=%d, blockPos=%d, bufPos=%d\r\n", __func__, __LINE__, currBlock, blockPos, bufPos );
jmarkel44 0:61364762ee0e 627 } else // There is no block to append so we allocate a new one
jmarkel44 0:61364762ee0e 628 {
jmarkel44 0:61364762ee0e 629 allocate_new_block:
jmarkel44 0:61364762ee0e 630 // Allocate new block for use
jmarkel44 0:61364762ee0e 631 cData[0] = 0x4C; // New flags
jmarkel44 0:61364762ee0e 632 cData[1] = '\0'; // Hbyte of Next Block link
jmarkel44 0:61364762ee0e 633 cData[2] = '\0'; // Lbyte of Next Block link
jmarkel44 0:61364762ee0e 634 cData[3] = (char)((currBlock & 0xff00) >> 8); // Hbyte of Prev Block link
jmarkel44 0:61364762ee0e 635 cData[4] = (char)(currBlock & 0x00ff); // Lbyte of Prev Block link
jmarkel44 0:61364762ee0e 636 fs->write(cData, nextFree, 0, RB); // Update Block Data
jmarkel44 0:61364762ee0e 637
jmarkel44 0:61364762ee0e 638 // Link old block with new block
jmarkel44 0:61364762ee0e 639 cDataOB[0] &= ~0x40; // Clear LBOF flag if set
jmarkel44 0:61364762ee0e 640 cDataOB[1] = (char)((nextFree & 0xff00) >> 8); // Hbyte of Next Block link
jmarkel44 0:61364762ee0e 641 cDataOB[2] = (char)(nextFree & 0x00ff); // Lbyte of Next Block link
jmarkel44 0:61364762ee0e 642 fs->write(cDataOB, currBlock, 0, RB-BLOCK_LLEN); // Update Block Data
jmarkel44 0:61364762ee0e 643
jmarkel44 0:61364762ee0e 644 // Update current block info
jmarkel44 0:61364762ee0e 645 currBlock = nextFree;
jmarkel44 0:61364762ee0e 646 blockPos = RB; // Reset block position offset
jmarkel44 0:61364762ee0e 647
jmarkel44 0:61364762ee0e 648 // printf("(%s:%d): allocating new block: currBlock=%d, blockPos=%d, bufPos=%d\r\n", __func__, __LINE__, currBlock, blockPos, bufPos );
jmarkel44 0:61364762ee0e 649 }
jmarkel44 0:61364762ee0e 650 }
jmarkel44 0:61364762ee0e 651
jmarkel44 0:61364762ee0e 652 if (fMode == AWRITE) // Check if EOF is here
jmarkel44 0:61364762ee0e 653 {
jmarkel44 0:61364762ee0e 654 fs->read(c, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 655 if ((c[0] == mEOF) && (fEOFow == false))
jmarkel44 0:61364762ee0e 656 fEOFow = true;
jmarkel44 0:61364762ee0e 657 }
jmarkel44 0:61364762ee0e 658
jmarkel44 0:61364762ee0e 659 // Write file
jmarkel44 0:61364762ee0e 660 c[0]=buffer[i];
jmarkel44 0:61364762ee0e 661 fs->write(c, currBlock, blockPos, 1);
jmarkel44 0:61364762ee0e 662 // printf("(%s:%d): blk=%d, pos=%d, char=%c\r\n", __func__, __LINE__, currBlock, blockPos, c[0] );
jmarkel44 0:61364762ee0e 663 blockPos++;
jmarkel44 0:61364762ee0e 664 byteCount++;
jmarkel44 0:61364762ee0e 665
jmarkel44 0:61364762ee0e 666 // For fail safe, write EOF now
jmarkel44 0:61364762ee0e 667 if ((fMode == DWRITE)||(fEOFow == true))
jmarkel44 0:61364762ee0e 668 {
jmarkel44 0:61364762ee0e 669 char fs_data[] = { mEOF };
jmarkel44 0:61364762ee0e 670 fs->write(fs_data, currBlock, blockPos, 1); // Write mEOF
jmarkel44 0:61364762ee0e 671 // printf("(%s:%d): Writing EOF, blk=%d, pos=%d, char=0x%x\r\n", __func__, __LINE__, currBlock, blockPos, fs_data[0] );
jmarkel44 0:61364762ee0e 672 }
jmarkel44 0:61364762ee0e 673 }
jmarkel44 0:61364762ee0e 674
jmarkel44 0:61364762ee0e 675 bufPos = 0; // Reset buffer position counter
jmarkel44 0:61364762ee0e 676
jmarkel44 0:61364762ee0e 677 /* If destructive write flag is set
jmarkel44 0:61364762ee0e 678 and there is data to be removed then remove data now */
jmarkel44 0:61364762ee0e 679 if (destructiveFlag == true) {
jmarkel44 0:61364762ee0e 680 if(removeFollowingBlocks(destructiveBlock) != 0) {
jmarkel44 0:61364762ee0e 681 return 3;
jmarkel44 0:61364762ee0e 682 }
jmarkel44 0:61364762ee0e 683 }
jmarkel44 0:61364762ee0e 684
jmarkel44 0:61364762ee0e 685 return 0;
jmarkel44 0:61364762ee0e 686 }