"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