Annotation of qemu/roms/openbios/fs/hfsplus/hfsp_blockiter.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * libhfs - library for reading and writing Macintosh HFS volumes
                      3:  *
                      4:  * The iterator shown here iterates over the blocks of a fork.
                      5:  *
                      6:  * Copyright (C) 2000 Klaus Halfmann <[email protected]>
                      7:  * Original work by 1996-1998 Robert Leslie <[email protected]>
                      8:  * other work 2000 from Brad Boyer ([email protected])
                      9:  *
                     10:  * This program is free software; you can redistribute it and/or modify
                     11:  * it under the terms of the GNU General Public License as published by
                     12:  * the Free Software Foundation; either version 2 of the License, or
                     13:  * (at your option) any later version.
                     14:  *
                     15:  * This program is distributed in the hope that it will be useful,
                     16:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18:  * GNU General Public License for more details.
                     19:  *
                     20:  * You should have received a copy of the GNU General Public License
                     21:  * along with this program; if not, write to the Free Software
                     22:  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
                     23:  * MA 02110-1301, USA.
                     24:  *
                     25:  * $Id: blockiter.c,v 1.2 2000/10/17 05:58:46 hasi Exp $
                     26:  */
                     27: 
                     28: #include "config.h"
                     29: #include "libhfsp.h"
                     30: #include "blockiter.h"
                     31: #include "volume.h"
                     32: #include "record.h"
                     33: #include "btree.h"
                     34: #include "os.h"
                     35: #include "swab.h"
                     36: #include "hfstime.h"
                     37: 
                     38: /* Initialize iterator for a given fork */
                     39: void
                     40: blockiter_init(blockiter* b, volume* vol, hfsp_fork_raw* f,
                     41:                    UInt8 forktype, UInt32 fileId)
                     42: {
                     43:     b->vol         = vol;
                     44:     b->curr_block   = 0;
                     45:     b->block       = 0;
                     46:     b->max_block    = f->total_blocks;
                     47:     b->fileId      = fileId;
                     48:     b->index       = 0;
                     49:     b->file        = f->extents;
                     50:     b->e           = f->extents;
                     51:     b->forktype            = forktype;
                     52:     b->in_extent    = 0;
                     53: }
                     54: 
                     55: /* get next extent record when needed */
                     56: static int
                     57: blockiter_next_extent(blockiter *b)
                     58: {
                     59:     btree*  extents_tree = volume_get_extents_tree(b->vol);
                     60:     int            err;
                     61: 
                     62:     b->index = 0;
                     63:     if (b->in_extent) // already using extents record ?
                     64:     {
                     65:        err = record_next_extent(&b->er);
                     66:        // Hope there is no need to check this ...
                     67:        // if (b->er.key.start_block != b->curr_block)
                     68:        //     HFSP_ERROR(ENOENT,
                     69:        //      "Extents record inconistent");
                     70:     }
                     71:     else
                     72:     {
                     73:        err = record_init_file(&b->er, extents_tree, b->forktype,
                     74:                b->fileId, b->curr_block);
                     75:        b->in_extent = -1;  // true
                     76:     }
                     77:     b->e = b->er.extent;
                     78:     return err;
                     79: }
                     80: 
                     81: /* find next block of the fork iterating over */
                     82: int
                     83: blockiter_next(blockiter *b)
                     84: {
                     85:     b->curr_block ++;
                     86:     b->block ++;
                     87:     if (b->curr_block >= b->max_block)
                     88:        return -1; // end of Blocks, but no error
                     89:     // in current part of extent ?
                     90:     if (b->block >= b->e->block_count)
                     91:     {
                     92:        b->index++;
                     93:        b->block = 0;           // reset relative position
                     94:        b->e++;
                     95:        if (b -> index >= 8)    // need to fetch another extent
                     96:        {
                     97:            if (blockiter_next_extent(b))
                     98:                HFSP_ERROR(ENOENT, "Extends record not found.");
                     99:        }
                    100:     }
                    101:     return 0;
                    102: 
                    103:   fail:
                    104:     return -1;
                    105: }
                    106: 
                    107: /* skip the indicated number of blocks */
                    108: int
                    109: blockiter_skip(blockiter *b, UInt32 skip)
                    110: {
                    111:     while (skip > 0)
                    112:     {
                    113:        // Skip to skip or end of current extent
                    114:        UInt32 diff = b->e->block_count - b->block;
                    115:        if (skip < diff)
                    116:        {
                    117:            diff = skip;
                    118:            skip = 0;
                    119:        }
                    120:        else
                    121:            skip -= diff;
                    122:        b->curr_block += diff;
                    123:        b->block      += diff;
                    124:        if (b->curr_block >= b->max_block)
                    125:            return -1;  // end of Blocks, but no error
                    126:        if (b->block >= b->e->block_count)
                    127:        {
                    128:            b->index++;
                    129:            b->block = 0;               // reset relative position
                    130:            b->e++;
                    131:            if (b -> index >= 8)        // need to fetch another extent
                    132:            {
                    133:                if (blockiter_next_extent(b))
                    134:                    HFSP_ERROR(ENOENT, "Extends record not found.");
                    135:            }
                    136:        }
                    137:     } // we are here when skip was null, thats ok
                    138:     return 0;
                    139:   fail:
                    140:     return -1;
                    141: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.