/[pearpc]/src/io/prom/fs/hfsplus/blockiter.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/io/prom/fs/hfsplus/blockiter.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 3702 byte(s)
import upstream CVS
1 dpavlin 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 <klaus.halfmann@feri.de>
7     * Original work by 1996-1998 Robert Leslie <rob@mars.org>
8     * other work 2000 from Brad Boyer (flar@pants.nu)
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., 675 Mass Ave, Cambridge, MA 02139, USA.
23     *
24     */
25    
26     # ifdef HAVE_CONFIG_H
27     # include "config.h"
28     # endif
29    
30     # include <stdlib.h>
31     # include <stdio.h>
32     # include <string.h>
33     # include <time.h>
34     # include <errno.h>
35    
36     # include "libhfsp.h"
37     # include "blockiter.h"
38     # include "volume.h"
39     # include "record.h"
40     # include "btree.h"
41     # include "os.h"
42     # include "hfstime.h"
43    
44     /* Initialize iterator for a given fork */
45     void blockiter_init(blockiter* b, volume* vol, hfsp_fork_raw* f,
46     UInt8 forktype, UInt32 fileId)
47     {
48     b->vol = vol;
49     b->curr_block = 0;
50     b->block = 0;
51     b->max_block = f->total_blocks;
52     b->fileId = fileId;
53     b->index = 0;
54     b->file = f->extents;
55     b->e = f->extents;
56     b->forktype = forktype;
57     b->in_extent = 0;
58     }
59    
60     /* get next extent record when needed */
61     static int blockiter_next_extent(blockiter *b)
62     {
63     btree* extents_tree = volume_get_extents_tree(b->vol);
64     int err;
65    
66     b->index = 0;
67     if (b->in_extent) // already using extents record ?
68     {
69     err = record_next_extent(&b->er);
70     // Hope there is no need to check this ...
71     // if (b->er.key.start_block != b->curr_block)
72     // HFSP_ERROR(ENOENT,
73     // "Extents record inconistent");
74     }
75     else
76     {
77     err = record_init_file(&b->er, extents_tree, b->forktype,
78     b->fileId, b->curr_block);
79     b->in_extent = -1; // true
80     }
81     b->e = b->er.extent;
82     return err;
83     }
84    
85     /* find next block of the fork iterating over */
86     int blockiter_next(blockiter *b)
87     {
88     b->curr_block ++;
89     b->block ++;
90     if (b->curr_block >= b->max_block)
91     return -1; // end of Blocks, but no error
92     // in current part of extent ?
93     if (b->block >= b->e->block_count)
94     {
95     b->index++;
96     b->block = 0; // reset relative position
97     b->e++;
98     if (b -> index >= 8) // need to fetch another extent
99     {
100     if (blockiter_next_extent(b))
101     HFSP_ERROR(ENOENT, "Extends record not found.");
102     }
103     }
104     return 0;
105    
106     fail:
107     return -1;
108     }
109    
110     /* skip the indicated number of blocks */
111     int blockiter_skip(blockiter *b, UInt32 skip)
112     {
113     while (skip > 0)
114     {
115     // Skip to skip or end of current extent
116     UInt32 diff = b->e->block_count - b->block;
117     if (skip < diff)
118     {
119     diff = skip;
120     skip = 0;
121     }
122     else
123     skip -= diff;
124     b->curr_block += diff;
125     b->block += diff;
126     if (b->curr_block >= b->max_block)
127     return -1; // end of Blocks, but no error
128     if (b->block >= b->e->block_count)
129     {
130     b->index++;
131     b->block = 0; // reset relative position
132     b->e++;
133     if (b -> index >= 8) // need to fetch another extent
134     {
135     if (blockiter_next_extent(b))
136     HFSP_ERROR(ENOENT, "Extends record not found.");
137     }
138     }
139     } // we are here when skip was null, thats ok
140     return 0;
141     fail:
142     return -1;
143     }
144    

  ViewVC Help
Powered by ViewVC 1.1.26