LCOV - lcov.info - ept/core/desktopfile.h

LTP GCOV extension - code coverage report
Current view: | directory - ept/core - desktopfile.h
Test: | lcov.info
Date: | 2008-08-14 |  | Instrumented lines: | 77
Code covered: | 75.3 % |  | Executed lines: | 58

           1                 : /// -*- C++ -*- (c) 2006, 2007 Petr Rockai <me@mornfall.net>
           2                 :
           3                 : #include <iostream>
           4                 : #include <string>
           5                 : #include <map>
           6                 :
           7                 : #ifndef EPT_CORE_DESKTOPFILE_H
           8                 : #define EPT_CORE_DESKTOPFILE_H
           9                 :
          10                 : namespace ept {
          11                 : namespace core {
          12                 : namespace desktop {
          13                 :
          14              32 : struct File {
          15           13540 :     struct Entry {
          16                 :         std::string key;
          17                 :         std::string value;
          18                 :     };
          19                 :     typedef std::map< std::string, Entry > EntryMap;
          20                 :
          21             144 :     struct Group {
          22                 :         std::string name;
          23                 :         EntryMap entries;
          24              88 :         Entry &entry( std::string k ) { return entries[ k ]; }
          25                 :     };
          26                 :
          27                 :     typedef std::map< std::string, Group > GroupMap;
          28                 :     GroupMap groups;
          29              16 :     Group &group( std::string k ) { return groups[ k ]; }
          30                 : };
          31                 :
          32            1228 : inline std::istream &operator >>( std::istream &i, File::Entry &e )
          33                 : {
          34            1228 :     std::string spaces = ""; char c; bool started = false;
          35                 :
          36            1228 :     e.key = "";
          37                 :     // read key
          38           16056 :     while ( i.peek() != EOF ) {
          39           14820 :         c = i.get();
          40           14820 :         if ( !started && c == '\n' )
          41               8 :             return i >> e;
          42           14812 :         if ( isspace( c ) ) {
          43               0 :             spaces += c;
          44               0 :             continue;
          45                 :         }
          46           14812 :         if ( !started && c == '#' ) {
          47               0 :             while ( i.peek() != EOF && i.get() != '\n' )
          48                 :                 ; // read till eol
          49               0 :             return i >> e; // restart reading
          50                 :         }
          51           14812 :         started = true;
          52           14812 :         if ( c == '=' )
          53            1212 :             break;
          54           13600 :         e.key += spaces;
          55           13600 :         e.key += c;
          56           13600 :         spaces = "";
          57                 :     }
          58                 :     // std::cerr << "read key: " << e.key << std::endl;
          59                 :
          60            1220 :     started = false;
          61            1220 :     bool backslash = false;
          62                 :     // read value
          63           37496 :     while ( i.peek() != EOF ) {
          64           36268 :         c = i.get();
          65           36268 :         if ( c == '\n' ) {
          66            1212 :             if ( backslash )
          67               0 :                 e.value += '\\';
          68            1212 :             return i;
          69                 :         }
          70           35056 :         if ( !started && isspace( c ) )
          71               0 :             continue;
          72           35056 :         started = true;
          73           35056 :         if ( backslash ) { // interpret escape sequences
          74               0 :             if ( c == '\\' ) e.value += '\\';
          75               0 :             else if ( c == 'n' ) e.value += '\n';
          76               0 :             else if ( c == 't' ) e.value += '\t';
          77               0 :             else if ( c == 'r' ) e.value += '\r';
          78               0 :             else if ( c == 's' ) e.value += ' ';
          79               0 :             else { e.value += '\\'; e.value += c; }
          80               0 :             backslash = false;
          81               0 :             continue;
          82                 :         }
          83           35056 :         if ( c == '\\' ) {
          84               0 :             backslash = true;
          85               0 :             continue;
          86                 :         }
          87           35056 :         e.value += c;
          88                 :     }
          89               8 :     return i;
          90                 : }
          91                 :
          92              16 : inline std::istream &operator >>( std::istream &i, File::Group &g )
          93                 : {
          94              16 :     bool started = false; char c;
          95              16 :     g.name = "";
          96             256 :     while ( i.peek() != EOF ) {
          97             240 :         c = i.get();
          98             240 :         if ( !started && isspace( c ) )
          99               0 :             continue;
         100             240 :         if ( !started && c == '#' ) {
         101               0 :             while( i.peek() != EOF && i.get() != '\n' )
         102                 :                 ; // read till eol
         103               0 :             return i >> g; // restart reading
         104                 :         }
         105             240 :         if ( !started && c == '[' ) {
         106              16 :             started = true;
         107              16 :             continue;
         108                 :         }
         109             224 :         if ( started && c == ']' ) {
         110              16 :             while( i.peek() != EOF && i.get() != '\n' )
         111                 :                 ; // read till eol
         112              16 :             break;
         113                 :         }
         114             208 :         g.name += c;
         115                 :     }
         116            1236 :     while ( i.peek() != EOF ) {
         117            1220 :         File::Entry e;
         118            1220 :         i >> e;
         119            1220 :         g.entries[ e.key ] = e;
         120                 :     }
         121              16 :     return i;
         122                 : }
         123                 :
         124              16 : inline std::istream &operator >>( std::istream &i, File &f )
         125                 : {
         126              32 :     while ( i.peek() != EOF ) {
         127              16 :         File::Group g;
         128              16 :         i >> g;
         129              16 :         f.groups[ g.name ] = g;
         130                 :     }
         131              16 :     return i;
         132                 : }
         133                 :
         134                 : }
         135                 : }
         136                 : }
         137                 :
         138                 : #endif

Generated by: LTP GCOV extension version 1.6