LTP GCOV extension - code coverage report
Current view: directory - src/libutil - serialise.cc
Test: app.info
Date: 2008-11-20 Instrumented lines: 69
Code covered: 97.1 % Executed lines: 67

       1                 : #include "serialise.hh"
       2                 : #include "util.hh"
       3                 : 
       4                 : #include <cstring>
       5                 : 
       6                 : 
       7                 : namespace nix {
       8                 : 
       9                 : 
      10            8301 : void FdSink::operator () (const unsigned char * data, unsigned int len)
      11                 : {
      12            8301 :     writeFull(fd, data, len);
      13            8301 : }
      14                 : 
      15                 : 
      16            8686 : void FdSource::operator () (unsigned char * data, unsigned int len)
      17                 : {
      18            8686 :     readFull(fd, data, len);
      19            8594 : }
      20                 : 
      21                 : 
      22           43881 : void writePadding(unsigned int len, Sink & sink)
      23                 : {
      24           43881 :     if (len % 8) {
      25                 :         unsigned char zero[8];
      26           32871 :         memset(zero, 0, sizeof(zero));
      27           32871 :         sink(zero, 8 - (len % 8));
      28                 :     }
      29           43881 : }
      30                 : 
      31                 : 
      32           46924 : void writeInt(unsigned int n, Sink & sink)
      33                 : {
      34                 :     unsigned char buf[8];
      35           46924 :     memset(buf, 0, sizeof(buf));
      36           46924 :     buf[0] = n & 0xff;
      37           46924 :     buf[1] = (n >> 8) & 0xff;
      38           46924 :     buf[2] = (n >> 16) & 0xff;
      39           46924 :     buf[3] = (n >> 24) & 0xff;
      40           46924 :     sink(buf, sizeof(buf));
      41           46924 : }
      42                 : 
      43                 : 
      44               6 : void writeLongLong(unsigned long long n, Sink & sink)
      45                 : {
      46                 :     unsigned char buf[8];
      47               6 :     buf[0] = n & 0xff;
      48               6 :     buf[1] = (n >> 8) & 0xff;
      49               6 :     buf[2] = (n >> 16) & 0xff;
      50               6 :     buf[3] = (n >> 24) & 0xff;
      51               6 :     buf[4] = (n >> 32) & 0xff;
      52               6 :     buf[5] = (n >> 40) & 0xff;
      53               6 :     buf[6] = (n >> 48) & 0xff;
      54               6 :     buf[7] = (n >> 56) & 0xff;
      55               6 :     sink(buf, sizeof(buf));
      56               6 : }
      57                 : 
      58                 : 
      59           38224 : void writeString(const string & s, Sink & sink)
      60                 : {
      61           38224 :     unsigned int len = s.length();
      62           38224 :     writeInt(len, sink);
      63           38224 :     sink((const unsigned char *) s.c_str(), len);
      64           38224 :     writePadding(len, sink);
      65           38224 : }
      66                 : 
      67                 : 
      68             139 : void writeStringSet(const StringSet & ss, Sink & sink)
      69                 : {
      70             139 :     writeInt(ss.size(), sink);
      71             347 :     for (StringSet::iterator i = ss.begin(); i != ss.end(); ++i)
      72             208 :         writeString(*i, sink);
      73             139 : }
      74                 : 
      75                 : 
      76            2465 : void readPadding(unsigned int len, Source & source)
      77                 : {
      78            2465 :     if (len % 8) {
      79                 :         unsigned char zero[8];
      80            2187 :         unsigned int n = 8 - (len % 8);
      81            2187 :         source(zero, n);
      82           11265 :         for (unsigned int i = 0; i < n; i++)
      83            9078 :             if (zero[i]) throw Error("non-zero padding");
      84                 :     }
      85            2465 : }
      86                 : 
      87                 : 
      88            5599 : unsigned int readInt(Source & source)
      89                 : {
      90                 :     unsigned char buf[8];
      91            5599 :     source(buf, sizeof(buf));
      92            5507 :     if (buf[4] || buf[5] || buf[6] || buf[7])
      93               0 :         throw Error("implementation cannot deal with > 32-bit integers");
      94                 :     return
      95                 :         buf[0] |
      96                 :         (buf[1] << 8) |
      97                 :         (buf[2] << 16) |
      98            5507 :         (buf[3] << 24);
      99                 : }
     100                 : 
     101                 : 
     102               6 : unsigned long long readLongLong(Source & source)
     103                 : {
     104                 :     unsigned char buf[8];
     105               6 :     source(buf, sizeof(buf));
     106                 :     return
     107                 :         ((unsigned long long) buf[0]) |
     108                 :         ((unsigned long long) buf[1] << 8) |
     109                 :         ((unsigned long long) buf[2] << 16) |
     110                 :         ((unsigned long long) buf[3] << 24) |
     111                 :         ((unsigned long long) buf[4] << 32) |
     112                 :         ((unsigned long long) buf[5] << 40) |
     113                 :         ((unsigned long long) buf[6] << 48) |
     114               6 :         ((unsigned long long) buf[7] << 56);
     115                 : }
     116                 : 
     117                 : 
     118            2332 : string readString(Source & source)
     119                 : {
     120            2332 :     unsigned int len = readInt(source);
     121            2332 :     unsigned char * buf = new unsigned char[len];
     122            2332 :     AutoDeleteArray<unsigned char> d(buf);
     123            2332 :     source(buf, len);
     124            2332 :     readPadding(len, source);
     125            2332 :     return string((char *) buf, len);
     126                 : }
     127                 : 
     128                 :  
     129             139 : StringSet readStringSet(Source & source)
     130                 : {
     131             139 :     unsigned int count = readInt(source);
     132             139 :     StringSet ss;
     133             139 :     while (count--)
     134             208 :         ss.insert(readString(source));
     135               0 :     return ss;
     136                 : }
     137                 : 
     138                 : 
     139                 : }

Generated by: LTP GCOV extension version 1.6