zcov: / lib/Basic/BOut.c


Files: 1 Branches Taken: 46.2% 49 / 106
Generated: 2009-05-17 22:47 Branches Executed: 79.2% 84 / 106
Line Coverage: 59.2% 90 / 152


Programs: 1 Runs 371


       1                 : #include "klee/Internal/ADT/BOut.h"
       2                 : 
       3                 : #include <stdlib.h>
       4                 : #include <string.h>
       5                 : #include <stdio.h>
       6                 : 
       7                 : #define BOUT_MAGIC "BOUT\n"
       8                 : #define BOUT_MAGIC_SIZE 5
       9                 : #define BOUT_VERSION 2
      10                 : 
      11                 : /***/
      12                 : 
      13               23: static int read_uint32(FILE *f, unsigned *value_out) {
      14                 :   unsigned char data[4];
                        0: branch 0 not taken
                       23: branch 1 taken
      15               23:   if (fread(data, 4, 1, f)!=1)
      16                0:     return 0;
      17               23:   *value_out = (((((data[0]<<8) + data[1])<<8) + data[2])<<8) + data[3];
      18               23:   return 1;
      19                 : }
      20                 : 
      21             6019: static int write_uint32(FILE *f, unsigned value) {
      22                 :   unsigned char data[4];
      23             6019:   data[0] = value>>24;
      24             6019:   data[1] = value>>16;
      25             6019:   data[2] = value>> 8;
      26             6019:   data[3] = value>> 0;
      27             6019:   return fwrite(data, 1, 4, f)==4;
      28                 : }
      29                 : 
      30                8: static int read_string(FILE *f, char **value_out) {
      31                 :   unsigned len;
                        0: branch 1 not taken
                        8: branch 2 taken
      32                8:   if (!read_uint32(f, &len))
      33                0:     return 0;
      34                8:   *value_out = (char*) malloc(len+1);
                        0: branch 0 not taken
                        8: branch 1 taken
      35                8:   if (!*value_out)
      36                0:     return 0;
                        0: branch 0 not taken
                        8: branch 1 taken
      37               16:   if (fread(*value_out, len, 1, f)!=1)
      38                0:     return 0;
      39                8:   (*value_out)[len] = 0;
      40                8:   return 1;
      41                 : }
      42                 : 
      43             1859: static int write_string(FILE *f, const char *value) {
      44             1859:   unsigned len = strlen(value);
                        0: branch 1 not taken
                     1859: branch 2 taken
      45             1859:   if (!write_uint32(f, len))
      46                0:     return 0;
                        0: branch 1 not taken
                     1859: branch 2 taken
      47             1859:   if (fwrite(value, len, 1, f)!=1)
      48                0:     return 0;
      49             1859:   return 1;
      50                 : }
      51                 : 
      52                 : /***/
      53                 : 
      54                 : 
      55                2: unsigned bOut_getCurrentVersion() {
      56                2:   return BOUT_VERSION;
      57                 : }
      58                 : 
      59                 : 
      60                2: static int bOut_checkHeader(FILE *f) {
      61                 :   char header[BOUT_MAGIC_SIZE];
                        0: branch 0 not taken
                        2: branch 1 taken
      62                2:   if (fread(header, BOUT_MAGIC_SIZE, 1, f)!=1)
      63                0:     return 0;
                        0: branch 1 not taken
                        2: branch 2 taken
      64                2:   if (memcmp(header, BOUT_MAGIC, BOUT_MAGIC_SIZE))
      65                0:     return 0;
      66                2:   return 1;
      67                 : }
      68                 : 
      69                0: int bOut_isBOutFile(const char *path) {
      70                0:   FILE *f = fopen(path, "rb");
      71                 :   int res;
      72                 : 
                        0: branch 0 not taken
                        0: branch 1 not taken
      73                0:   if (!f)
      74                0:     return 0;
      75                0:   res = bOut_checkHeader(f);
      76                0:   fclose(f);
      77                 :   
      78                0:   return res;
      79                 : }
      80                 : 
      81                2: BOut *bOut_fromFile(const char *path) {
      82                2:   FILE *f = fopen(path, "rb");
      83                2:   BOut *res = 0;
      84                 :   unsigned i, version;
      85                 : 
                        2: branch 0 taken
                        0: branch 1 not taken
      86                2:   if (!f) 
      87                0:     goto error;
                        0: branch 1 not taken
                        2: branch 2 taken
      88                2:   if (!bOut_checkHeader(f)) 
      89                0:     goto error;
      90                 : 
      91                2:   res = (BOut*) calloc(1, sizeof(*res));
                        0: branch 0 not taken
                        2: branch 1 taken
      92                2:   if (!res) 
      93                0:     goto error;
      94                 : 
                        0: branch 1 not taken
                        2: branch 2 taken
      95                2:   if (!read_uint32(f, &version)) 
      96                0:     goto error;
      97                 :   
                        0: branch 1 not taken
                        2: branch 2 taken
      98                2:   if (version > bOut_getCurrentVersion())
      99                0:     goto error;
     100                 : 
     101                2:   res->version = version;
     102                 : 
                        0: branch 1 not taken
                        2: branch 2 taken
     103                2:   if (!read_uint32(f, &res->numArgs)) 
     104                0:     goto error;
     105                2:   res->args = (char**) calloc(res->numArgs, sizeof(*res->args));
                        0: branch 0 not taken
                        2: branch 1 taken
     106                2:   if (!res->args) 
     107                0:     goto error;
     108                 :   
                        3: branch 0 taken
                        2: branch 1 taken
     109                5:   for (i=0; i<res->numArgs; i++)
                        0: branch 1 not taken
                        3: branch 2 taken
     110                3:     if (!read_string(f, &res->args[i]))
     111                0:       goto error;
     112                 : 
                        2: branch 0 taken
                        0: branch 1 not taken
     113                2:   if (version >= 2) {
                        0: branch 1 not taken
                        2: branch 2 taken
     114                2:     if (!read_uint32(f, &res->symArgvs)) 
     115                0:       goto error;
                        0: branch 1 not taken
                        2: branch 2 taken
     116                2:     if (!read_uint32(f, &res->symArgvLen)) 
     117                0:       goto error;
     118                 :   }
     119                 : 
                        0: branch 1 not taken
                        2: branch 2 taken
     120                2:   if (!read_uint32(f, &res->numObjects))
     121                0:     goto error;
     122                2:   res->objects = (BOutObject*) calloc(res->numObjects, sizeof(*res->objects));
                        0: branch 0 not taken
                        2: branch 1 taken
     123                2:   if (!res->objects)
     124                0:     goto error;
                        5: branch 0 taken
                        2: branch 1 taken
     125                7:   for (i=0; i<res->numObjects; i++) {
     126                5:     BOutObject *o = &res->objects[i];
                        0: branch 1 not taken
                        5: branch 2 taken
     127                5:     if (!read_string(f, &o->name))
     128                0:       goto error;
                        0: branch 1 not taken
                        5: branch 2 taken
     129                5:     if (!read_uint32(f, &o->numBytes))
     130                0:       goto error;
     131                5:     o->bytes = (unsigned char*) malloc(o->numBytes);
                        0: branch 0 not taken
                        5: branch 1 taken
     132               10:     if (fread(o->bytes, o->numBytes, 1, f)!=1)
     133                0:       goto error;
     134                 :   }
     135                 : 
     136                2:   fclose(f);
     137                 : 
     138                2:   return res;
     139                0:  error:
                        0: branch 0 not taken
                        0: branch 1 not taken
     140                0:   if (res) {
                        0: branch 0 not taken
                        0: branch 1 not taken
     141                0:     if (res->args) {
                        0: branch 0 not taken
                        0: branch 1 not taken
     142                0:       for (i=0; i<res->numArgs; i++)
                        0: branch 0 not taken
                        0: branch 1 not taken
     143                0:         if (res->args[i])
     144                0:           free(res->args[i]);
     145                0:       free(res->args);
     146                 :     }
                        0: branch 0 not taken
                        0: branch 1 not taken
     147                0:     if (res->objects) {
                        0: branch 0 not taken
                        0: branch 1 not taken
     148                0:       for (i=0; i<res->numObjects; i++) {
     149                0:         BOutObject *bo = &res->objects[i];
                        0: branch 0 not taken
                        0: branch 1 not taken
     150                0:         if (bo->name)
     151                0:           free(bo->name);
                        0: branch 0 not taken
                        0: branch 1 not taken
     152                0:         if (bo->bytes)
     153                0:           free(bo->bytes);
     154                 :       }
     155                0:       free(res->objects);
     156                 :     }
     157                0:     free(res);
     158                 :   }
     159                 : 
                        0: branch 0 not taken
                        0: branch 1 not taken
     160                0:   if (f) fclose(f);
     161                 : 
     162                0:   return 0;
     163                 : }
     164                 : 
     165              663: int bOut_toFile(BOut *bo, const char *path) {
     166              663:   FILE *f = fopen(path, "wb");
     167                 :   unsigned i;
     168                 : 
                      663: branch 0 taken
                        0: branch 1 not taken
     169              663:   if (!f) 
     170                0:     goto error;
                        0: branch 1 not taken
                      663: branch 2 taken
     171              663:   if (fwrite(BOUT_MAGIC, strlen(BOUT_MAGIC), 1, f)!=1)
     172                0:     goto error;
                        0: branch 1 not taken
                      663: branch 2 taken
     173              663:   if (!write_uint32(f, BOUT_VERSION))
     174                0:     goto error;
     175                 :       
                        0: branch 1 not taken
                      663: branch 2 taken
     176              663:   if (!write_uint32(f, bo->numArgs))
     177                0:     goto error;
                     1014: branch 0 taken
                      663: branch 1 taken
     178             1677:   for (i=0; i<bo->numArgs; i++) {
                        0: branch 1 not taken
                     1014: branch 2 taken
     179             1014:     if (!write_string(f, bo->args[i]))
     180                0:       goto error;
     181                 :   }
     182                 : 
                        0: branch 1 not taken
                      663: branch 2 taken
     183              663:   if (!write_uint32(f, bo->symArgvs))
     184                0:     goto error;
                        0: branch 1 not taken
                      663: branch 2 taken
     185              663:   if (!write_uint32(f, bo->symArgvLen))
     186                0:     goto error;
     187                 :   
                        0: branch 1 not taken
                      663: branch 2 taken
     188              663:   if (!write_uint32(f, bo->numObjects))
     189                0:     goto error;
                      845: branch 0 taken
                      663: branch 1 taken
     190             1508:   for (i=0; i<bo->numObjects; i++) {
     191              845:     BOutObject *o = &bo->objects[i];
                        0: branch 1 not taken
                      845: branch 2 taken
     192              845:     if (!write_string(f, o->name))
     193                0:       goto error;
                        0: branch 1 not taken
                      845: branch 2 taken
     194              845:     if (!write_uint32(f, o->numBytes))
     195                0:       goto error;
                        0: branch 1 not taken
                      845: branch 2 taken
     196              845:     if (fwrite(o->bytes, o->numBytes, 1, f)!=1)
     197                0:       goto error;
     198                 :   }
     199                 : 
     200              663:   fclose(f);
     201                 : 
     202              663:   return 1;
     203                0:  error:
                        0: branch 0 not taken
                        0: branch 1 not taken
     204                0:   if (f) fclose(f);
     205                 :   
     206                0:   return 0;
     207                 : }
     208                 : 
     209                1: unsigned bOut_numBytes(BOut *bo) {
     210                1:   unsigned i, res = 0;
                        1: branch 0 taken
                        1: branch 1 taken
     211                2:   for (i=0; i<bo->numObjects; i++)
     212                1:     res += bo->objects[i].numBytes;
     213                1:   return res;
     214                 : }
     215                 : 
     216                2: void bOut_free(BOut *bo) {
     217                 :   unsigned i;
                        3: branch 0 taken
                        2: branch 1 taken
     218                5:   for (i=0; i<bo->numArgs; i++)
     219                3:     free(bo->args[i]);
     220                2:   free(bo->args);
                        5: branch 0 taken
                        2: branch 1 taken
     221                7:   for (i=0; i<bo->numObjects; i++) {
     222                5:     free(bo->objects[i].name);
     223                5:     free(bo->objects[i].bytes);
     224                 :   }
     225                2:   free(bo->objects);
     226                2:   free(bo);
     227                2: }

Generated: 2009-05-17 22:47 by zcov