int main() { sample_buffer_init(sb, 3); assert(sample_buffer_avg(sb) == 0); sample_buffer_write(sb, 10); sample_buffer_write(sb, 10); sample_buffer_write(sb, 10); sample_buffer_write(sb, 10); sample_buffer_write(sb, 1000); sample_buffer_write(sb, 2000); sample_buffer_write(sb, 4000); dump_sb(sb); assert(sample_buffer_avg(sb) == 2333); sample_buffer_init(sb, 8); assert(sample_buffer_avg(sb) == 0); sample_buffer_write(sb, 100); sample_buffer_write(sb, 200); sample_buffer_write(sb, 150); sample_buffer_write(sb, 6000); sample_buffer_write(sb, 8000); dump_sb(sb); assert(sample_buffer_avg_recent(sb, 4000) == 8000); assert(sample_buffer_avg_recent(sb, 8000) == 8000); assert(sample_buffer_avg_recent(sb, 8001) == 7000); assert(sample_buffer_avg_recent(sb, 14010) == 4716); return 0; }
int main(int argc, char* argv[]) { int opt; const char* spec = NULL; bool sb_only = false; bool used_sectors = false; printf("dumpexfat %s\n", VERSION); while ((opt = getopt(argc, argv, "suV")) != -1) { switch (opt) { case 's': sb_only = true; break; case 'u': used_sectors = true; break; case 'V': puts("Copyright (C) 2011-2016 Andrew Nayenko"); return 0; default: usage(argv[0]); } } if (argc - optind != 1) usage(argv[0]); spec = argv[optind]; if (sb_only) return dump_sb(spec); return dump_full(spec, used_sectors); }
// Mount an e2fs filesystem on the given partition. // Return 0 if successful. // static int e2fs_mount(partition_t *part, e2fs_desc_t *e2fs) { int sb_block = 1; cyg_uint32 sb_buf[E2FS_MIN_BLOCK_SIZE/sizeof(cyg_uint32)]; struct e2fs_super_block *sb = (struct e2fs_super_block *)sb_buf; e2fs->part = part; if (!PARTITION_READ(part, sb_block*(E2FS_MIN_BLOCK_SIZE/SECTOR_SIZE), (cyg_uint32 *)sb, E2FS_MIN_BLOCK_SIZE/SECTOR_SIZE)) return -1; if (SWAB_LE16(sb->magic) != E2FS_SUPER_MAGIC) { diag_printf("ext2_mount: bad magic 0x%x\n", SWAB_LE16(sb->magic)); return -1; } // save some stuff for easy access e2fs->blocksize = E2FS_BLOCK_SIZE(sb); e2fs->nr_ind_blocks = (e2fs)->blocksize / sizeof(cyg_uint32); e2fs->nr_dind_blocks = e2fs->nr_ind_blocks * ((e2fs)->blocksize / sizeof(cyg_uint32)); e2fs->nr_tind_blocks = e2fs->nr_dind_blocks * ((e2fs)->blocksize / sizeof(cyg_uint32)); e2fs->blocks_per_group = SWAB_LE32(sb->blocks_per_group); e2fs->ngroups = (SWAB_LE32(sb->blocks_count) + e2fs->blocks_per_group - 1) / e2fs->blocks_per_group; e2fs->inodes_per_group = SWAB_LE32(sb->inodes_per_group); // Find the group descriptors which follow superblock e2fs->gdesc_block = ((sb_block * E2FS_MIN_BLOCK_SIZE) / e2fs->blocksize) + 1; e2fs->gdesc_first = 0; // cache group 0 initially if (!PARTITION_READ(part, E2FS_BLOCK_TO_SECTOR(e2fs,e2fs->gdesc_block), (cyg_uint32 *)e2fs->gdesc_cache, 1)) return -1; #if DEBUG_E2FS > 1 diag_printf("E2FS superblock:\n"); diag_printf(" [%d] inodes\n", SWAB_LE32(sb->inodes_count)); diag_printf(" [%d] blocks\n", SWAB_LE32(sb->blocks_count)); diag_printf(" [%d] blocksize\n", e2fs->blocksize); diag_printf(" [%d] blocks per group\n", e2fs->blocks_per_group); diag_printf(" [%d] ngroups\n", e2fs->ngroups); #endif #if DEBUG_E2FS > 4 dump_sb(sb); #endif return 0; }