source: trunk/src/depend-gen.c @ 440

Last change on this file since 440 was 383, checked in by katerina, 10 years ago

Fix for ticket #281 (warnings from clang static analyzer).

File size: 8.6 KB
Line 
1#include <stdio.h>
2#include <string.h>
3
4/*  copyright (c) 2002 Rainer Wichmann
5 *  License: GNU Public License (GPL) version 2 or later
6 */
7
8/* gcc -O2 -Wall -o depend depend.c
9 */
10
11/*
12
13# redo if sources change
14#
15depend.dep: depend.c $(SOURCES)
16   $(CC) -o depend depend.c
17   for ff in $(SOURCES); do; \
18     depend -o depend.dep $ff; \
19   done
20   nsum=`sum depend.dep`; \
21   osum=`cat depend.sum`; \
22   if test "x$$osum" != "x$$nsum"; then \
23      echo $$nsum > depend.sum
24   fi
25
26# only updated if depencies change
27#
28depend.sum: depend.dep
29
30Makefile.in: depend.sum
31   for ff in $(SOURCES); do; \
32     depend -o Makefile.in $ff; \
33   done
34
35Makefile: Makefile.in
36
37*/
38
39unsigned int lzo_adler32(unsigned int adler, 
40                         const char *buf, unsigned int len);
41
42
43int main (int argc, char * argv[])
44{
45  FILE * fout = NULL;
46  FILE * ftmp = NULL;
47  FILE * fin  = NULL;
48
49  int    filep = 1;
50
51  char   name[1024];
52  char   base[1024];
53  char   tmpname[1024];
54  char   line[1024];
55  char   buffer[2048];
56  char   incdir[1024];
57  int    inclen = 0;
58  int    count = 2047;
59  int    len = 0;
60
61  unsigned int adler;
62
63  char * p;
64  char * q;
65
66  incdir[0] = '\0';
67
68  if (argc < 2)
69    {
70      fprintf(stderr, "depend-gen: Missing argument\n");
71      return 1;
72    }
73
74  if (argv[1][0] == '-' && argv[1][1] == 'h')
75    {
76      printf("Usage: depend-gen [-i includedir] -(o|t) outfile infile\n");
77      printf("        -o replaces, -t truncates\n");
78      return 0;
79    }
80
81  if (argv[1][0] == '-' && argv[1][1] == 'i')
82    {
83      if (argc < 3)
84        {
85          fprintf(stderr, "depend-gen: -i: Missing argument (includedir)\n");
86          return 1;
87        }
88      strncpy(incdir, argv[2], 1023);
89      incdir[1023] = '\0';
90      inclen = strlen(incdir);
91      argc -= 2; ++argv; ++argv;
92    }
93
94  if (argv[1][0] == '-' && 
95      (argv[1][1] == 'o' || argv[1][1] == 't' || argv[1][1] == 'c'))
96    {
97      if (argc < 3) 
98        {
99          fprintf(stderr, "depend-gen: -%c: Missing argument\n", argv[1][1]);
100          return 1;
101        }
102      if (argv[1][1] == 'o' || argv[1][1] == 'c')
103        fout = fopen(argv[2], "r+");
104      else
105        fout = fopen(argv[2], "w+");
106
107      if (!fout)
108        {
109          perror("depend-gen: fopen");
110          fprintf(stderr, "depend-gen [%d]: -%c %s: Could not open file\n", 
111                  __LINE__, argv[1][1], argv[2]);
112          return 1;
113        }
114      filep += 2;
115
116      if (argv[1][1] == 'c')
117        {
118          adler = lzo_adler32(0, NULL, 0);
119          while (NULL != fgets(line, 1023, fout))
120            {
121              adler = lzo_adler32(adler, line, strlen(line));
122            }
123          printf("%u\n", adler);
124          return 0;
125        }
126
127      if (argv[1][1] == 't')
128        ftmp = fout;
129      else
130        {
131          tmpname[0] = '\0';
132          if (strlen(argv[filep]) > 1029)
133            {
134              fprintf(stderr, "depend-gen: -%c %s: filename too long\n", 
135                      argv[1][1], argv[2]);
136              return 1;
137            }
138         
139         
140          strncat(tmpname, argv[filep], 1029);
141          strncat(tmpname, ".tmp", 1023);
142          ftmp = fopen(tmpname, "w");
143          if (!ftmp)
144            {
145              perror("depend-gen: fopen");
146              fprintf(stderr, "depend-gen [%d]: -%c %s: Could not open file\n", 
147                __LINE__, argv[1][1], tmpname);
148              return 1;
149            }
150        }
151         
152    }
153  else
154    {
155      fprintf(stderr, "depend-gen: no output file given (-(o|t) outfile)\n");
156      return 1;
157    }
158
159
160  if (argc < (filep+1))
161    {
162      fprintf(stderr, "depend-gen: missing argument (infile)\n");
163      return 1;
164    }
165  fin = fopen(argv[filep], "r");
166  if (!fin)
167    {
168      perror("depend-gen: fopen");
169      fprintf(stderr, "depend-gen [%d]: -%c %s: Could not open file\n", 
170        __LINE__, argv[1][1], argv[filep]);
171      return 1;
172    }
173
174  /* fast forward to dependencies start
175   */
176  do
177    {
178      if (NULL == fgets(line, 1023, fout))
179        break;
180      if (0 == strncmp(line, "# DO NOT DELETE THIS LINE", 25))
181        break;
182      fprintf(ftmp, "%s", line);
183    }
184  while (1 == 1);
185
186  if (argv[1][1] == 'o')
187    {
188      fprintf(ftmp, "# DO NOT DELETE THIS LINE\n");
189    }
190
191  strncpy(name, argv[filep], 1023);
192  p = name;
193  while (*p != '\0') ++p;
194  if (name[0] != '\0') --p;
195  if (*p == 'c') *p = 'o';
196
197  p = strrchr(name, '/');
198  if (p)
199    {
200      ++p;
201      len = strlen(p);
202    }
203
204  /* skip other dependencies
205   */
206  do
207    {
208      if (NULL == fgets(line, 1023, fout))
209        break;
210      if (p && 0 == strncmp(line, p, len))
211        break;
212      fprintf(ftmp, "%s", line);
213    }
214  while (1 == 1);
215
216  buffer[0] = '\0';
217
218  while (NULL != fgets(line, 1023, fin))
219    {
220      p = line;
221      while (*p != '\0' && (*p == ' ' || *p == '\t'))
222        ++p;
223      if (0 == strncmp(p, "#include", 8)) 
224        p += 8;
225      else
226        continue;
227      while (*p != '\0' && (*p == ' ' || *p == '\t'))
228        ++p;
229      if (*p != '"')
230        continue;
231      else
232        {
233          ++p;
234          q = p; 
235          ++q;
236          while (*q != '\0' && *q != '"')
237            ++q;
238          if (*q != '"')
239            continue;
240          *q = '\0';
241
242          /**************************************************
243           *
244           * EXCEPTIONS
245           *
246           **************************************************/
247          if (0 == strcmp(p, "sh_gpg_chksum.h") ||
248              0 == strcmp(p, "sh_gpg_fp.h"))
249            {
250              /* fprintf(stderr, "Excluding %s\n", p); */
251              continue;
252            }
253
254          len = strlen(p);
255          if (len > count)
256            {
257              /* graceful failure */
258              fprintf(fout, "# OVERFLOW: incomplete dependencies\n");
259              break;
260            }
261          if (incdir[0] != '\0')
262            {
263              if (0 == strcmp(p, "config.h") ||
264                  0 == strcmp(p, "config_xor.h") ||
265                  0 == strcmp(p, "internal.h") ||
266                  0 == strcmp(p, "sh_ks.h") ||
267                  0 == strcmp(p, "sh_ks_xor.h") ||
268                  0 == strcmp(p, "sh_MK.h"));      /* do nothing */
269              else
270                {
271                  strncat(buffer, incdir, count);
272                  count -= inclen;
273                }
274            }
275          strncat(buffer, p, count);
276          count -= len;
277          strncat(buffer, " ", count);
278          --count;
279        }
280    }
281
282  /* write the dependencies found
283   */
284  p = strrchr(argv[filep], '/');
285  if (p)
286    {
287      ++p;
288      strncpy(name, p, 1023);
289    }
290  else
291    strncpy(name, argv[filep], 1023);
292  name[1023] = '\0';
293
294  strcpy(base, "$(srcsrc)/");
295  strcat(base, name);
296
297  p = name;
298  while (*p != '\0') ++p;
299  if (name[0] != '\0') --p;
300  if (*p == 'c')
301    {
302      *p = 'o';
303      fprintf(ftmp, "%s: %s Makefile %s\n", name, base /* argv[filep] */, 
304              buffer);
305    }
306  else
307    {
308      fprintf(ftmp, "%s: Makefile %s\n", argv[filep], buffer);
309    }
310
311  /* more dependencies
312   */
313  do
314    {
315      if (NULL == fgets(line, 1023, fout))
316        break;
317      fprintf(ftmp, "%s", line);
318    }
319  while (1 == 1);
320
321  if (ftmp != NULL)
322    {
323      fclose(ftmp);
324    }
325  if (fout != NULL)
326    {
327      fclose(fout);
328    }
329  if (fin != NULL)
330    {
331      fclose(fin);
332    }
333
334  if (argv[1][1] == 'o')
335    {
336      if (0 != rename (tmpname, argv[2]))
337        {
338          perror("depend-gen: rename");
339          fprintf(stderr, "depend-gen: could not rename %s --> %s\n", 
340                  tmpname, argv[2]);
341          return 1;
342        }
343    }
344
345  return 0;
346}
347
348/* from the LZO real-time data compression library
349
350   Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
351   Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
352   Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
353   Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
354
355   The LZO library is free software; you can redistribute it and/or
356   modify it under the terms of the GNU General Public License as
357   published by the Free Software Foundation; either version 2 of
358   the License, or (at your option) any later version.
359
360   The LZO library is distributed in the hope that it will be useful,
361   but WITHOUT ANY WARRANTY; without even the implied warranty of
362   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
363   GNU General Public License for more details.
364
365   You should have received a copy of the GNU General Public License
366   along with the LZO library; see the file COPYING.
367   If not, write to the Free Software Foundation, Inc.,
368   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
369
370   Markus F.X.J. Oberhumer
371   <markus.oberhumer@jk.uni-linz.ac.at>
372   http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html
373*/
374/*
375 * NOTE:
376 *   the full LZO package can be found at
377 *   http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html
378 */
379
380#define LZO_BASE 65521u
381#define LZO_NMAX 5552
382
383#define LZO_DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
384#define LZO_DO2(buf,i)  LZO_DO1(buf,i); LZO_DO1(buf,i+1);
385#define LZO_DO4(buf,i)  LZO_DO2(buf,i); LZO_DO2(buf,i+2);
386#define LZO_DO8(buf,i)  LZO_DO4(buf,i); LZO_DO4(buf,i+4);
387#define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8);
388
389unsigned int lzo_adler32(unsigned int adler, const char *buf, unsigned int len)
390{
391    unsigned int s1 = adler & 0xffff;
392    unsigned int s2 = (adler >> 16) & 0xffff;
393    int k;
394
395    if (buf == NULL)
396        return 1;
397
398    while (len > 0)
399    {
400        k = len < LZO_NMAX ? (int) len : LZO_NMAX;
401        len -= k;
402        if (k >= 16) do
403        {
404            LZO_DO16(buf,0);
405            buf += 16;
406            k -= 16;
407        } while (k >= 16);
408        if (k != 0) do
409        {
410            s1 += *buf++;
411            s2 += s1;
412        } while (--k > 0);
413        s1 %= LZO_BASE;
414        s2 %= LZO_BASE;
415    }
416    return (s2 << 16) | s1;
417}
Note: See TracBrowser for help on using the repository browser.