gen-devlist.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Generate devlist.h and classlist.h from the PCI ID file.
  3.  *
  4.  * (c) 1999--2000 Martin Mares <mj@ucw.cz>
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #define MAX_NAME_SIZE 79
  9. static void
  10. pq(FILE *f, const char *c)
  11. {
  12. while (*c) {
  13. if (*c == '"')
  14. fprintf(f, "\"");
  15. else
  16. fputc(*c, f);
  17. c++;
  18. }
  19. }
  20. int
  21. main(void)
  22. {
  23. char line[1024], *c, *bra, vend[8];
  24. int vendors = 0;
  25. int mode = 0;
  26. int lino = 0;
  27. int vendor_len = 0;
  28. FILE *devf, *clsf;
  29. devf = fopen("devlist.h", "w");
  30. clsf = fopen("classlist.h", "w");
  31. if (!devf || !clsf) {
  32. fprintf(stderr, "Cannot create output file!n");
  33. return 1;
  34. }
  35. while (fgets(line, sizeof(line)-1, stdin)) {
  36. lino++;
  37. if ((c = strchr(line, 'n')))
  38. *c = 0;
  39. if (!line[0] || line[0] == '#')
  40. continue;
  41. if (line[1] == ' ') {
  42. if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') {
  43. vend[0] = line[2];
  44. vend[1] = line[3];
  45. vend[2] = 0;
  46. mode = 2;
  47. } else goto err;
  48. }
  49. else if (line[0] == 't') {
  50. if (line[1] == 't')
  51. continue;
  52. switch (mode) {
  53. case 1:
  54. if (strlen(line) > 5 && line[5] == ' ') {
  55. c = line + 5;
  56. while (*c == ' ')
  57. *c++ = 0;
  58. if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
  59. /* Too long, try cutting off long description */
  60. bra = strchr(c, '[');
  61. if (bra && bra > c && bra[-1] == ' ')
  62. bra[-1] = 0;
  63. if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
  64. fprintf(stderr, "Line %d: Device name too longn", lino);
  65. fprintf(stderr, "%sn", c);
  66. return 1;
  67. }
  68. }
  69. fprintf(devf, "tDEVICE(%s,%s,"", vend, line+1);
  70. pq(devf, c);
  71. fputs("")n", devf);
  72. } else goto err;
  73. break;
  74. case 2:
  75. if (strlen(line) > 3 && line[3] == ' ') {
  76. c = line + 3;
  77. while (*c == ' ')
  78. *c++ = 0;
  79. fprintf(clsf, "CLASS(%s%s, "%s")n", vend, line+1, c);
  80. } else goto err;
  81. break;
  82. default:
  83. goto err;
  84. }
  85. } else if (strlen(line) > 4 && line[4] == ' ') {
  86. c = line + 4;
  87. while (*c == ' ')
  88. *c++ = 0;
  89. if (vendors)
  90. fputs("ENDVENDOR()nn", devf);
  91. vendors++;
  92. strcpy(vend, line);
  93. vendor_len = strlen(c);
  94. if (vendor_len + 24 > MAX_NAME_SIZE) {
  95. fprintf(stderr, "Line %d: Vendor name too longn", lino);
  96. return 1;
  97. }
  98. fprintf(devf, "VENDOR(%s,"", vend);
  99. pq(devf, c);
  100. fputs("")n", devf);
  101. mode = 1;
  102. } else {
  103. err:
  104. fprintf(stderr, "Line %d: Syntax error in mode %d: %sn", lino, mode, line);
  105. return 1;
  106. }
  107. }
  108. fputs("ENDVENDOR()n
  109. n
  110. #undef VENDORn
  111. #undef DEVICEn
  112. #undef ENDVENDORn", devf);
  113. fputs("n#undef CLASSn", clsf);
  114. fclose(devf);
  115. fclose(clsf);
  116. return 0;
  117. }