History

Merge commit 'v2.6.37-rc1' into kbuild/kbuild

Michal Marek committed 15 years ago

Commit 8990c1b2 parents 2979076 c8ddb2715045 files · +1541141 −1109449Browse files

Showing the changes to scripts/basic (3 of 15045 files). Show all

Unified · Split

3 files
  1. scripts/basic/Makefile +1 −1
  2. scripts/basic/docproc.c +131 −1
  3. scripts/basic/hash.c +0 −64
scripts/basic/Makefile+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 # fixdep: Used to generate dependency information during build process
1010 # docproc: Used in Documentation/DocBook
1111
12−hostprogs-y := fixdep docproc hash
12+hostprogs-y := fixdep docproc
1313 always := $(hostprogs-y)
1414
1515 # fixdep is needed to compile other host programs
scripts/basic/docproc.c+131−1
@@ -34,12 +34,14 @@ · 33 unmodified lines
3434 *
3535 */
3636
37+#define _GNU_SOURCE
3738 #include <stdio.h>
3839 #include <stdlib.h>
3940 #include <string.h>
4041 #include <ctype.h>
4142 #include <unistd.h>
4243 #include <limits.h>
44+#include <errno.h>
4345 #include <sys/types.h>
4446 #include <sys/wait.h>
4547
@@ -54,6 +56,7 @@ typedef void FILEONLY(char * file); · 8 unmodified lines
5456 FILEONLY *internalfunctions;
5557 FILEONLY *externalfunctions;
5658 FILEONLY *symbolsonly;
59+FILEONLY *findall;
5760
5861 typedef void FILELINE(char * file, char * line);
5962 FILELINE * singlefunctions;
@@ -65,12 +68,30 @@ FILELINE * docsection; · 5 unmodified lines
6568 #define KERNELDOCPATH "scripts/"
6669 #define KERNELDOC "kernel-doc"
6770 #define DOCBOOK "-docbook"
71+#define LIST "-list"
6872 #define FUNCTION "-function"
6973 #define NOFUNCTION "-nofunction"
7074 #define NODOCSECTIONS "-no-doc-sections"
7175
7276 static char *srctree, *kernsrctree;
7377
78+static char **all_list = NULL;
79+static int all_list_len = 0;
80+
81+static void consume_symbol(const char *sym)
82+{
83+ int i;
84+
85+ for (i = 0; i < all_list_len; i++) {
86+ if (!all_list[i])
87+ continue;
88+ if (strcmp(sym, all_list[i]))
89+ continue;
90+ all_list[i] = NULL;
91+ break;
92+ }
93+}
94+
7495 static void usage (void)
7596 {
7697 fprintf(stderr, "Usage: docproc {doc|depend} file\n");
@@ -248,6 +269,7 @@ static void docfunctions(char * filename, char * type) · 171 unmodified lines
248269 struct symfile * sym = &symfilelist[i];
249270 for (j=0; j < sym->symbolcnt; j++) {
250271 vec[idx++] = type;
272+ consume_symbol(sym->symbollist[j].name);
251273 vec[idx++] = sym->symbollist[j].name;
252274 }
253275 }
@@ -287,6 +309,11 @@ static void singfunc(char * filename, char * line) · 33 unmodified lines
287309 vec[idx++] = &line[i];
288310 }
289311 }
312+ for (i = 0; i < idx; i++) {
313+ if (strcmp(vec[i], FUNCTION))
314+ continue;
315+ consume_symbol(vec[i + 1]);
316+ }
290317 vec[idx++] = filename;
291318 vec[idx] = NULL;
292319 exec_kernel_doc(vec);
@@ -306,6 +333,13 @@ static void docsect(char *filename, char *line) · 13 unmodified lines
306333 if (*s == '\n')
307334 *s = '\0';
308335
336+ if (asprintf(&s, "DOC: %s", line) < 0) {
337+ perror("asprintf");
338+ exit(1);
339+ }
340+ consume_symbol(s);
341+ free(s);
342+
309343 vec[0] = KERNELDOC;
310344 vec[1] = DOCBOOK;
311345 vec[2] = FUNCTION;
@@ -315,6 +349,84 @@ static void docsect(char *filename, char *line) · 3 unmodified lines
315349 exec_kernel_doc(vec);
316350 }
317351
352+static void find_all_symbols(char *filename)
353+{
354+ char *vec[4]; /* kerneldoc -list file NULL */
355+ pid_t pid;
356+ int ret, i, count, start;
357+ char real_filename[PATH_MAX + 1];
358+ int pipefd[2];
359+ char *data, *str;
360+ size_t data_len = 0;
361+
362+ vec[0] = KERNELDOC;
363+ vec[1] = LIST;
364+ vec[2] = filename;
365+ vec[3] = NULL;
366+
367+ if (pipe(pipefd)) {
368+ perror("pipe");
369+ exit(1);
370+ }
371+
372+ switch (pid=fork()) {
373+ case -1:
374+ perror("fork");
375+ exit(1);
376+ case 0:
377+ close(pipefd[0]);
378+ dup2(pipefd[1], 1);
379+ memset(real_filename, 0, sizeof(real_filename));
380+ strncat(real_filename, kernsrctree, PATH_MAX);
381+ strncat(real_filename, "/" KERNELDOCPATH KERNELDOC,
382+ PATH_MAX - strlen(real_filename));
383+ execvp(real_filename, vec);
384+ fprintf(stderr, "exec ");
385+ perror(real_filename);
386+ exit(1);
387+ default:
388+ close(pipefd[1]);
389+ data = malloc(4096);
390+ do {
391+ while ((ret = read(pipefd[0],
392+ data + data_len,
393+ 4096)) > 0) {
394+ data_len += ret;
395+ data = realloc(data, data_len + 4096);
396+ }
397+ } while (ret == -EAGAIN);
398+ if (ret != 0) {
399+ perror("read");
400+ exit(1);
401+ }
402+ waitpid(pid, &ret ,0);
403+ }
404+ if (WIFEXITED(ret))
405+ exitstatus |= WEXITSTATUS(ret);
406+ else
407+ exitstatus = 0xff;
408+
409+ count = 0;
410+ /* poor man's strtok, but with counting */
411+ for (i = 0; i < data_len; i++) {
412+ if (data[i] == '\n') {
413+ count++;
414+ data[i] = '\0';
415+ }
416+ }
417+ start = all_list_len;
418+ all_list_len += count;
419+ all_list = realloc(all_list, sizeof(char *) * all_list_len);
420+ str = data;
421+ for (i = 0; i < data_len && start != all_list_len; i++) {
422+ if (data[i] == '\0') {
423+ all_list[start] = str;
424+ str = data + i + 1;
425+ start++;
426+ }
427+ }
428+}
429+
318430 /*
319431 * Parse file, calling action specific functions for:
320432 * 1) Lines containing !E
@@ -322,7 +434,8 @@ static void docsect(char *filename, char *line) · 1 unmodified line
322434 * 3) Lines containing !D
323435 * 4) Lines containing !F
324436 * 5) Lines containing !P
325− * 6) Default lines - lines not matching the above
437+ * 6) Lines containing !C
438+ * 7) Default lines - lines not matching the above
326439 */
327440 static void parse_file(FILE *infile)
328441 {
@@ -365,6 +478,12 @@ static void parse_file(FILE *infile) · 36 unmodified lines
365478 s++;
366479 docsection(line + 2, s);
367480 break;
481+ case 'C':
482+ while (*s && !isspace(*s)) s++;
483+ *s = '\0';
484+ if (findall)
485+ findall(line+2);
486+ break;
368487 default:
369488 defaultline(line);
370489 }
@@ -380,6 +499,7 @@ static void parse_file(FILE *infile) · 9 unmodified lines
380499 int main(int argc, char *argv[])
381500 {
382501 FILE * infile;
502+ int i;
383503
384504 srctree = getenv("SRCTREE");
385505 if (!srctree)
@@ -415,6 +535,7 @@ int main(int argc, char *argv[]) · 29 unmodified lines
415535 symbolsonly = find_export_symbols;
416536 singlefunctions = noaction2;
417537 docsection = noaction2;
538+ findall = find_all_symbols;
418539 parse_file(infile);
419540
420541 /* Rewind to start from beginning of file again */
@@ -425,8 +546,16 @@ int main(int argc, char *argv[]) · 4 unmodified lines
425546 symbolsonly = printline;
426547 singlefunctions = singfunc;
427548 docsection = docsect;
549+ findall = NULL;
428550
429551 parse_file(infile);
552+
553+ for (i = 0; i < all_list_len; i++) {
554+ if (!all_list[i])
555+ continue;
556+ fprintf(stderr, "Warning: didn't use docs for %s\n",
557+ all_list[i]);
558+ }
430559 }
431560 else if (strcmp("depend", argv[1]) == 0)
432561 {
@@ -439,6 +568,7 @@ int main(int argc, char *argv[]) · 6 unmodified lines
439568 symbolsonly = adddep;
440569 singlefunctions = adddep2;
441570 docsection = adddep2;
571+ findall = adddep;
442572 parse_file(infile);
443573 printf("\n");
444574 }
scripts/basic/hash.c+0−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com>
3− *
4− */
5−
6−#include <stdio.h>
7−#include <stdlib.h>
8−#include <string.h>
9−
10−#define DYNAMIC_DEBUG_HASH_BITS 6
11−
12−static const char *program;
13−
14−static void usage(void)
15−{
16− printf("Usage: %s <djb2|r5> <modname>\n", program);
17− exit(1);
18−}
19−
20−/* djb2 hashing algorithm by Dan Bernstein. From:
21− * http://www.cse.yorku.ca/~oz/hash.html
22− */
23−
24−static unsigned int djb2_hash(char *str)
25−{
26− unsigned long hash = 5381;
27− int c;
28−
29− c = *str;
30− while (c) {
31− hash = ((hash << 5) + hash) + c;
32− c = *++str;
33− }
34− return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
35−}
36−
37−static unsigned int r5_hash(char *str)
38−{
39− unsigned long hash = 0;
40− int c;
41−
42− c = *str;
43− while (c) {
44− hash = (hash + (c << 4) + (c >> 4)) * 11;
45− c = *++str;
46− }
47− return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
48−}
49−
50−int main(int argc, char *argv[])
51−{
52− program = argv[0];
53−
54− if (argc != 3)
55− usage();
56− if (!strcmp(argv[1], "djb2"))
57− printf("%d\n", djb2_hash(argv[2]));
58− else if (!strcmp(argv[1], "r5"))
59− printf("%d\n", r5_hash(argv[2]));
60− else
61− usage();
62− exit(0);
63−}
64−