"Fossies" - the Fresh Open Source Software Archive 
Member "qdiff-0.9.1/trotfile.cc" (21 Oct 2008, 3562 Bytes) of package /linux/privat/old/qdiff-0.9.1.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 /*GPL*START*
2 *
3 * Copyright (C) 1998 by Johannes Overmann <overmann@iname.com>
4 * Copyright (C) 2008 by Tong Sun <suntong001@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 * *GPL*END*/
20
21 #include "trotfile.h"
22 #include <sys/stat.h>
23 #include <unistd.h>
24
25
26 TROTFile::TROTFile(const char *filename, int num_buf, int buf_size)
27 :numbuf(num_buf), bufsize(buf_size), bufbits(0), bufmask(0), nummask(0),
28 offmask(0), off(new int[numbuf]),
29 buf(new uchar *[numbuf]), _size(0), fname(filename), file(0)
30 {
31 bool nonreg = false;
32
33 // check numbuf and bufsize
34 if((!isPowerOf2(numbuf)) || (!isPowerOf2(bufsize)))
35 fatalError("numbuf and bufsize must be powers of two!\n");
36
37 // calc masks
38 bufmask = bufsize-1;
39 offmask = ~bufmask;
40 bufbits = intLog2(bufsize);
41 nummask = numbuf-1;
42
43 // get file existance, type and _size
44 struct stat a;
45 if(stat(filename, &a))
46 userError("file '%s' does not exist!\n", filename);
47 if(!S_ISREG(a.st_mode)) {
48 userWarning("'%s' is not a regular file\n", filename);
49 nonreg = true;
50 }
51 _size = a.st_size;
52
53 // open file
54 file = fopen(filename, "rb");
55 if(file==0)
56 userError("error while opening file '%s' for reading!\n", filename);
57
58 if(nonreg) {
59 // get size of nonregular file
60 int s;
61 char tmp;
62
63 for(s=1; s>0; s<<=1) {
64 if((fseek(file, s , SEEK_SET)!=0)||(fread(&tmp, 1, 1, file)!=1)) break;
65 }
66 if(s<=0)
67 userError("file '%s' has zero size or is too large\n", filename);
68
69 int lo = s/2;
70 int hi = s;
71 while((lo+1) < hi) {
72 s = (lo+hi)/2;
73 if((fseek(file, s, SEEK_SET)!=0)||(fread(&tmp, 1, 1, file)!=1)) {
74 hi = s;
75 } else {
76 lo = s;
77 }
78 }
79 rewind(file);
80
81 _size = hi;
82 userWarning("assuming size %d (%.1fk, %0.1fm) for file '%s'\n",
83 _size, double(_size)/1024.0, double(_size)/1024.0/1024.0,
84 filename);
85 }
86
87 // alloc buffers
88 for(int i=0; i<numbuf; i++) {
89 buf[i] = new uchar[bufsize];
90 off[i] = -1; // invalidate buffer
91 }
92
93
94 }
95
96
97 TROTFile::~TROTFile() {
98 fclose(file);
99 for(int i=0; i<numbuf; i++)
100 delete[] buf[i];
101 delete[] off;
102 delete[] buf;
103 }
104
105
106 int TROTFile::intLog2(int i) const {
107 if(i<=0) fatalError("IntLog2: i must be >0! (was %d)", i);
108 int r;
109 for(r=0; i!=1; r++, i>>=1) ;
110 return r;
111 }
112
113
114 bool TROTFile::isPowerOf2(int i) const {
115 if(i<=0) return false;
116 for(; (i&1)==0; i>>=1) ;
117 if(i==1) return true;
118 else return false;
119 }
120
121
122 void TROTFile::loadBuf(int offset, int buffer) {
123 if(fseek(file, offset, SEEK_SET))
124 fatalError("LoadBuf: fseek failed!\n");
125 int len = bufsize;
126 if(offset==(_size&offmask)) len = _size & bufmask;
127 int r = fread(buf[buffer], 1, len, file);
128 if(r != len)
129 fatalError("LoadBuf: fread failed!\n");
130 off[buffer] = offset;
131 }
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147