Elfutils fiddles fo fix striptofile.
[platform/upstream/rpm.git] / tools / utils.c
1 /* Needed for libelf */
2 #define _FILE_OFFSET_BITS 64
3
4 #include "system.h"
5
6 #include <stdarg.h>
7
8 #include "utils.h"
9
10 #include "debug.h"
11
12 static char *
13 my_stpcpy (char       *dest,
14            const char *src)
15 {
16   do
17     {
18       *dest++ = *src;
19     }
20   while (*src++ != '\0');
21
22   return dest - 1;
23 }
24
25
26 char *
27 strconcat (const char *string1, ...)
28 {
29   size_t          l;     
30   va_list args;
31   char    *s;
32   char    *concat;
33   char   *ptr;
34
35   l = 1 + strlen (string1);
36   va_start (args, string1);
37   s = va_arg (args, char*);
38   while (s)
39     {
40       l += strlen (s);
41       s = va_arg (args, char*);
42     }
43   va_end (args);
44
45   concat = malloc (sizeof (char) * l);
46   ptr = concat;
47
48   ptr = my_stpcpy (ptr, string1);
49   va_start (args, string1);
50   s = va_arg (args, char*);
51   while (s)
52     {
53       ptr = my_stpcpy (ptr, s);
54       s = va_arg (args, char*);
55     }
56   va_end (args);
57
58   return concat;
59 }
60
61 char *
62 path_basename (const char *filename)
63 {
64   char *slash;
65
66   slash = strrchr (filename, '/');
67   
68   if (slash)
69     return strdup (slash + 1);
70   else
71     return strdup (filename);
72 }
73
74 off_t
75 align_up (off_t offset, size_t alignment)
76 {
77   if (alignment == 0)
78     return offset;
79   return offset + (alignment - (offset % alignment)) % alignment;
80 }
81
82 int 
83 string_has_prefix (char *string, char *prefix)
84 {
85   while (*prefix != 0 && *string != 0 && *string == *prefix)
86     {
87       string++;
88       prefix++;
89     }
90   if (*prefix == 0)
91     return 1;
92   return 0;
93 }
94
95 /* Table computed with Mark Adler's makecrc.c utility.  */
96 static const unsigned int crc32_table[256] =
97 {
98   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
99   0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
100   0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
101   0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
102   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
103   0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
104   0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
105   0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
106   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
107   0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
108   0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
109   0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
110   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
111   0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
112   0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
113   0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
114   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
115   0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
116   0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
117   0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
118   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
119   0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
120   0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
121   0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
122   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
123   0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
124   0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
125   0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
126   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
127   0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
128   0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
129   0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
130   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
131   0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
132   0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
133   0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
134   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
135   0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
136   0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
137   0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
138   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
139   0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
140   0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
141   0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
142   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
143   0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
144   0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
145   0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
146   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
147   0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
148   0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
149   0x2d02ef8d
150 };
151
152 static unsigned int crc32 (unsigned int crc, unsigned char *buf, size_t len)
153 {
154   unsigned char *end;
155
156   crc = ~crc & 0xffffffff;
157   for (end = buf + len; buf < end; ++buf)
158     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
159   return ~crc & 0xffffffff;
160 }
161
162 unsigned int
163 crc32_file (const char *filename)
164 {
165   unsigned int crc = 0;
166   int fd;
167   char buffer[1024*8];
168   ssize_t count;
169   
170   fd = open (filename, O_RDONLY);
171   if (fd < 0)
172     return 0;
173
174   while ((count = read (fd, buffer, sizeof (buffer))) > 0)
175     crc = crc32 (crc, buffer, count);
176
177   close (fd);
178   
179   return crc;
180 }