]> git.friedersdorff.com Git - max/tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/fs/fat/MemFileSystem.h
Merge commit '28203e909e83b1ac6becb45a3eadae23b190df32' into master-core-pull
[max/tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / fs / fat / MemFileSystem.h
1 /* mbed Microcontroller Library - MemFileSystem
2  * Copyright (c) 2008, sford
3  */
4
5
6 #ifndef MBED_MEMFILESYSTEM_H
7 #define MBED_MEMFILESYSTEM_H
8
9 #include "FATFileSystem.h"
10
11 namespace mbed
12 {
13
14     class MemFileSystem : public FATFileSystem
15     {
16     public:
17     
18         // 2000 sectors, each 512 bytes (malloced as required)
19         char *sectors[2000];
20     
21         MemFileSystem(const char* name) : FATFileSystem(name) {
22             memset(sectors, 0, sizeof(sectors));
23         }
24     
25         virtual ~MemFileSystem() {
26             for(int i = 0; i < 2000; i++) {
27                 if(sectors[i]) {
28                     free(sectors[i]);
29                 }
30             }
31         }
32     
33         // read a sector in to the buffer, return 0 if ok
34         virtual int disk_read(char *buffer, int sector) {
35             if(sectors[sector] == 0) {
36                 // nothing allocated means sector is empty
37                 memset(buffer, 0, 512);
38             } else {
39                 memcpy(buffer, sectors[sector], 512);
40             }
41             return 0;
42         }
43     
44         // write a sector from the buffer, return 0 if ok
45         virtual int disk_write(const char *buffer, int sector) {
46             // if buffer is zero deallocate sector
47             char zero[512];
48             memset(zero, 0, 512);
49             if(memcmp(zero, buffer, 512)==0) {
50                 if(sectors[sector] != 0) {
51                     free(sectors[sector]);
52                     sectors[sector] = 0;
53                 }
54                 return 0;
55             }
56             // else allocate a sector if needed, and write
57             if(sectors[sector] == 0) {
58                 char *sec = (char*)malloc(512);
59                 if(sec==0) {
60                     return 1; // out of memory
61                 }
62                 sectors[sector] = sec;
63             }
64             memcpy(sectors[sector], buffer, 512);
65             return 0;
66         }
67     
68         // return the number of sectors
69         virtual int disk_sectors() {
70             return sizeof(sectors)/sizeof(sectors[0]);
71         }
72     
73     };
74
75 }
76
77 #endif