Changeset 9119d25 in mainline for uspace/srv/fs/fat/fat_ops.c


Ignore:
Timestamp:
2007-12-05T22:45:41Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5832e9b
Parents:
6364d3c
Message:

FAT work.
Foundation for FAT dentry comparison function.
Beware of looking at the diff or risk loosing sanity.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_ops.c

    r6364d3c r9119d25  
    5454#define FAT_DENTRY_ERASED       0xe5
    5555
    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 */
     65static unsigned match_path_component(fat_dentry_t *dentry, unsigned start,
     66    unsigned last)
    5867{
     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;
    59129}
    60130
Note: See TracChangeset for help on using the changeset viewer.