All pastes #977520 Raw Edit

Stuff

public text v1 · immutable
·published 2008-04-08 21:49 UTC
rendered paste body
int fmsGetNextDirEntry(int *dirNum, char* mask, DirEntry* dirEntry, const int dir){

    if (mask == 0)
        mask = "*.*";

    DirEntry buf[16];

    int i = 0;
    unsigned short curSector = dir == 0 ? 19 : C_2_S(dir);
    int unread = 1;

    do {
        while (i < (*dirNum / 16)) {
            // assuming dir is 0 when we're in the root directory
            if (dir != 0) {
                unsigned short fatEntry = getFatEntry(S_2_C(curSector), FAT1);
                if (fatEntry == FAT_EOC) 
                    return ERR66;

                assert(fatEntry != FAT_BAD && fatEntry != 0); 

                curSector = C_2_S(fatEntry);
            } else {
                assert(curSector >= 19 && curSector <=32);
                // ok we're traversing the root directory
                // so curCluster is actually the sector number
                curSector++;
                if (curSector> 32) {
                    return ERR66;
                }   

                assert(curSector >= 19 && curSector <=32);
            }   
            i++;
            unread = 1;
        }   

        if (unread) {
            fmsReadSector(buf, curSector);
            unread = 0;
        }   


        DirEntry * e = &buf[*dirNum % 16];

        if (e->name[0] == 0)
            return ERR66;

        *dirEntry = *e; 

        (*dirNum)++;
    } while (dirEntry->attributes & LONGNAME 
            || !matches_mask(mask, dirEntry) || dirEntry->name[0] == 0xe5);

    assert(dirEntry->name[0] != 0xe5);

    return 0;
}