Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 2988aec7 in mainline for uspace/dist/src/bithenge/fat.bh


Ignore:
Timestamp:
2012-08-14T03:17:17Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
71b0d4d4
Parents:
1b6b76d
Message:

Bithenge: read FAT files/subdirs; self-recursion and more operators

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/dist/src/bithenge/fat.bh

    r1b6b76d r2988aec7  
    4444} <- bits_le <- known_length(1);
    4545
    46 transform fat_dir_entry(disk) = struct {
     46transform file_data(data, bits, fat, cluster_size, start) = (in.data) <- struct {
     47        .cluster <- (data[(start-2)*cluster_size, cluster_size]);
     48        .last_cluster_number <- switch (bits) {
     49                12: (488);       # 0x00000ff8
     50                16: (65528);     # 0x0000fff8
     51                32: (268435448); # 0x0ffffff8
     52        };
     53        .next <- (fat[start]);
     54        if (.next == 0 || .next >= .last_cluster_number) {
     55                .data <- (.cluster);
     56        } else {
     57                .rest <- file_data(data, bits, fat, cluster_size, .next);
     58                .data <- (.cluster ++ .rest);
     59        }
     60};
     61
     62transform fat_dir_entry(data, bits, fat, cluster_size, self_start, parent) = struct {
    4763        .filename <- known_length(8);
    4864        .extension <- known_length(3);
     
    5874        .start <- u16;
    5975        .size <- u32;
     76        .size_shown <- if (.size > 32) { (32) } else { (.size) };
     77
     78        if (.start != 0 && .start != self_start && .start != parent) {
     79                .data
     80                    <- if (.attrs.subdirectory) {
     81                        repeat { fat_dir_entry(data, bits, fat, cluster_size, .start, self_start) }
     82                    } else {
     83                        (in[0,.size_shown])
     84                    }
     85                    <- if (.size != 0) { (in[0,.size]) } else { (in) }
     86                    <- file_data(data, bits, fat, cluster_size, .start);
     87        }
    6088};
    6189
     
    112140        };
    113141
     142        .cluster_size <- (.super.sectors_per_cluster * .super.bytes_per_sector);
    114143        .first_root_sector <- (.super.num_reserved_sectors + .super.num_fats * .super.sectors_per_fat);
    115144        .first_data_sector <- (.first_root_sector +
     
    128157
    129158        .root <- partial(.first_root_sector * .super.bytes_per_sector) {
    130                 repeat(.super.num_root_entries) { fat_dir_entry(disk) } } <- (disk);
     159                repeat(.super.num_root_entries) {
     160                        fat_dir_entry(disk[.first_data_sector * .super.bytes_per_sector:],
     161                            .bits, .fats[0], .cluster_size, 0, 0)
     162                }
     163        } <- (disk);
    131164};
    132165
Note: See TracChangeset for help on using the changeset viewer.