op_fileio.c

Go to the documentation of this file.
00001 
00012 #include <unistd.h>
00013 
00014 #include "op_fileio.h"
00015 
00016 #include "op_libiberty.h"
00017 
00018 #include <errno.h>
00019 #include <string.h>
00020 #include <stdlib.h>
00021 
00022 static FILE * op_do_open_file(char const * name, char const * mode, int fatal)
00023 {
00024     FILE * fp;
00025 
00026     fp = fopen(name, mode);
00027 
00028     if (!fp) {
00029         if (fatal) {
00030             fprintf(stderr,"oprofiled:op_do_open_file: %s: %s",
00031                 name, strerror(errno));
00032             exit(EXIT_FAILURE);
00033         }
00034     }
00035 
00036     return fp;
00037 }
00038 
00039 
00040 FILE * op_try_open_file(char const * name, char const * mode)
00041 {
00042     return op_do_open_file(name, mode, 0);
00043 }
00044 
00045 
00046 FILE * op_open_file(char const * name, char const * mode)
00047 {
00048     return op_do_open_file(name, mode, 1);
00049 }
00050 
00051 
00052 void op_close_file(FILE * fp)
00053 {
00054     if (fclose(fp))
00055         perror("oprofiled:op_close_file: ");
00056 }
00057 
00058 
00059 void op_write_file(FILE * fp, void const * buf, size_t size)
00060 {
00061     size_t written;
00062 
00063     if (size == 0)
00064         return;
00065 
00066     written = fwrite(buf, size, 1, fp);
00067 
00068     if (written != 1) {
00069         fprintf(stderr,
00070             "oprofiled:op_write_file: wrote less than expected: %lu bytes.\n",
00071             (unsigned long)size);
00072         exit(EXIT_FAILURE);
00073     }
00074 }
00075 
00076 
00077 void op_write_u8(FILE * fp, u8 val)
00078 {
00079     op_write_file(fp, &val, sizeof(val));
00080 }
00081 
00082 
00083 void op_write_u32(FILE * fp, u32 val)
00084 {
00085     op_write_file(fp, &val, sizeof(val));
00086 }
00087 
00088 
00089 void op_write_u64(FILE * fp, u64 val)
00090 {
00091     op_write_file(fp, &val, sizeof(val));
00092 }
00093 
00094 
00095 u32 op_read_int_from_file(char const * filename, int fatal)
00096 {
00097     FILE * fp;
00098     u32 value;
00099 
00100     fp = fopen(filename, "r");
00101     if (fp == NULL) {
00102         if (!fatal)
00103             return (u32)-1;
00104         fprintf(stderr,
00105             "op_read_int_from_file: Failed to open %s, reason %s\n",
00106             filename, strerror(errno));
00107         exit(EXIT_FAILURE);
00108     }
00109 
00110     if (fscanf(fp, "%u", &value) != 1) {
00111         fclose(fp);
00112         if (!fatal)
00113             return (u32)-1;
00114         fprintf(stderr,
00115             "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
00116             filename);
00117         exit(EXIT_FAILURE);
00118     }
00119 
00120     fclose(fp);
00121 
00122     return value;
00123 }
00124 
00125 
00126 char * op_get_line(FILE * fp)
00127 {
00128     char * buf;
00129     char * cp;
00130     int c;
00131     size_t max = 512;
00132 
00133     buf = xmalloc(max);
00134     cp = buf;
00135 
00136     while (1) {
00137         switch (c = getc(fp)) {
00138             case EOF:
00139                 free(buf);
00140                 return NULL;
00141                 break;
00142 
00143             case '\n':
00144             case '\0':
00145                 *cp = '\0';
00146                 return buf;
00147                 break;
00148 
00149             default:
00150                 *cp = (char)c;
00151                 cp++;
00152                 if (((size_t)(cp - buf)) == max) {
00153                     buf = xrealloc(buf, max + 128);
00154                     cp = buf + max;
00155                     max += 128;
00156                 }
00157                 break;
00158         }
00159     }
00160 }
00161 
00162 
00163 /* FIXME the debug info stuff should be handled by binutils */
00164 unsigned long
00165 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
00166 {
00167     static const unsigned long crc32_table[256] =
00168     {
00169         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
00170         0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
00171         0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
00172         0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
00173         0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
00174         0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
00175         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
00176         0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
00177         0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
00178         0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
00179         0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
00180         0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
00181         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
00182         0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
00183         0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
00184         0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
00185         0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
00186         0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
00187         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
00188         0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
00189         0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
00190         0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
00191         0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
00192         0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
00193         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
00194         0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
00195         0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
00196         0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
00197         0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
00198         0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
00199         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
00200         0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
00201         0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
00202         0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
00203         0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
00204         0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
00205         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
00206         0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
00207         0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
00208         0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
00209         0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
00210         0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
00211         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
00212         0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
00213         0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
00214         0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
00215         0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
00216         0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
00217         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
00218         0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
00219         0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
00220         0x2d02ef8d
00221     };
00222     unsigned char * end;
00223 
00224     crc = ~crc & 0xffffffff;
00225     for (end = buf + len; buf < end; ++buf)
00226         crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
00227     return ~crc & 0xffffffff;
00228 }

Generated on 8 Nov 2012 for Oprofile by  doxygen 1.6.1