Changeset 9119d25 in mainline for uspace/srv/fs/fat/fat_ops.c
- Timestamp:
- 2007-12-05T22:45:41Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5832e9b
- Parents:
- 6364d3c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_ops.c
r6364d3c r9119d25 54 54 #define FAT_DENTRY_ERASED 0xe5 55 55 56 static int match_path_component(fat_dentry_t *dentry, unsigned index, 57 size_t len) 56 /** Compare one component of path to a directory entry. 57 * 58 * @param dentry Directory entry to compare the path component with. 59 * @param start Index into PLB where the path component starts. 60 * @param last Index of the last character of the path in PLB. 61 * 62 * @return Zero on failure or delta such that (index + delta) % 63 * PLB_SIZE points to a new path component in PLB. 64 */ 65 static unsigned match_path_component(fat_dentry_t *dentry, unsigned start, 66 unsigned last) 58 67 { 68 unsigned cur; /* current position in PLB */ 69 int pos; /* current position in dentry->name or dentry->ext */ 70 bool name_processed = false; 71 bool dot_processed = false; 72 bool ext_processed = false; 73 74 if (last < start) 75 last += PLB_SIZE; 76 for (pos = 0, cur = start; (cur <= last) && (PLB_GET_CHAR(cur) != '/'); 77 pos++, cur++) { 78 if (!name_processed) { 79 if ((pos == FAT_NAME_LEN - 1) || 80 (dentry->name[pos + 1] == FAT_PAD)) { 81 /* this is the last character in name */ 82 name_processed = true; 83 } 84 if (dentry->name[0] == FAT_PAD) { 85 /* name is empty */ 86 name_processed = true; 87 } else if ((pos == 0) && (dentry->name[pos] == 88 FAT_DENTRY_E5_ESC)) { 89 if (PLB_GET_CHAR(cur) == 0xe5) 90 continue; 91 else 92 return 0; /* character mismatch */ 93 } else { 94 if (PLB_GET_CHAR(cur) == dentry->name[pos]) 95 continue; 96 else 97 return 0; /* character mismatch */ 98 } 99 } 100 if (!dot_processed) { 101 dot_processed = true; 102 pos = -1; 103 if (PLB_GET_CHAR(cur) != '.') 104 return 0; 105 continue; 106 } 107 if (!ext_processed) { 108 if ((pos == FAT_EXT_LEN - 1) || 109 (dentry->ext[pos + 1] == FAT_PAD)) { 110 /* this is the last character in ext */ 111 ext_processed = true; 112 } 113 if (dentry->ext[0] == FAT_PAD) { 114 /* ext is empty; the match will fail */ 115 ext_processed = true; 116 } else if (PLB_GET_CHAR(cur) == dentry->ext[pos]) { 117 continue; 118 } else { 119 /* character mismatch */ 120 return 0; 121 } 122 } 123 return 0; /* extra characters in the component */ 124 } 125 if (ext_processed || (name_processed && dentry->ext[0] == FAT_PAD)) 126 return cur - start; 127 else 128 return 0; 59 129 } 60 130
Note:
See TracChangeset
for help on using the changeset viewer.