Mcucpp
82 строки · 1.3 Кб
1
2#include <filesystem/findnodelister.h>
3
4namespace Mcucpp
5{
6namespace Fs
7{
8FindNodeLister::FindNodeLister(IFsDriver &driver)
9:_filePath(nullptr),
10_driver(driver),
11_found(false),
12_pathMatched(false),
13_foundEntry(nullptr)
14{
15
16}
17
18bool FindNodeLister::Find(const uint8_t *filePath, FileSystemEntry *foundEntry)
19{
20if(foundEntry == nullptr || filePath == nullptr)
21{
22return false;
23}
24_filePath = filePath;
25_currentNode = _driver.RootDirectory();
26_found = false;
27_pathMatched = false;
28_foundEntry = foundEntry;
29do
30{
31if(!_driver.ListDirectory(_currentNode, *this))
32{
33return false;
34}
35if(!_pathMatched)
36{
37return false;
38}
39}while(!_found);
40return true;
41}
42
43bool FindNodeLister::DirectoryEntry(const FileSystemEntry &entry)
44{
45if(PathElementMatch(entry.Name()))
46{
47_currentNode = entry.Node();
48_pathMatched = true;
49*_foundEntry = entry;
50return false;
51}
52else
53{
54_pathMatched = false;
55}
56return true;
57}
58
59bool FindNodeLister::PathElementMatch(const uint8_t *name)
60{
61const uint8_t *pathPtr = _filePath;
62while(*pathPtr == PathDelim)
63{
64pathPtr++;
65}
66
67do
68{
69if(*pathPtr == PathDelim)
70{
71_filePath = pathPtr;
72return true;
73}
74if(*pathPtr == 0)
75{
76_found = true;
77return true;
78}
79}while(*pathPtr++ == *name++);
80return false;
81}
82
83}}