sorthelp.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5. #include <bdlib/src/String.h>
  6. #include <bdlib/src/Stream.h>
  7. typedef struct {
  8. int leaf;
  9. int hub;
  10. bd::String* name;
  11. bd::String* txt;
  12. } cmds;
  13. cmds cmdlist[900];
  14. int cmdi = 0;
  15. int skipline (const char *line, int *skip) {
  16. static int multi = 0;
  17. if ((!strncmp(line, "//", 2))) {
  18. (*skip)++;
  19. } else if ( (strstr(line, "/*")) && (strstr(line, "*/")) ) {
  20. multi = 0;
  21. (*skip)++;
  22. } else if ( (strstr(line, "/*")) ) {
  23. (*skip)++;
  24. multi = 1;
  25. } else if ( (strstr(line, "*/")) ) {
  26. multi = 0;
  27. } else {
  28. if (!multi) (*skip) = 0;
  29. }
  30. return (*skip);
  31. }
  32. int my_cmp (const cmds *c1, const cmds *c2)
  33. {
  34. return c1->name->compare(*(c2->name));
  35. }
  36. int parse_help(const bd::String& infile, const bd::String& outfile) {
  37. bd::Stream in, out;
  38. bd::String buffer, ifdef, my_buf, fulllist;
  39. int skip = 0, i = 0, leaf = 0, hub = 0;
  40. in.loadFile(infile);
  41. printf("Sorting help file '%s'", infile.c_str());
  42. while (in.tell() < in.length()) {
  43. buffer = in.getline().chomp();
  44. if ((skipline(buffer.c_str(), &skip))) continue;
  45. if (buffer[0] == ':') { //New cmd
  46. ++buffer;
  47. ifdef = newsplit(buffer, ':');
  48. if (ifdef.length()) {
  49. if (ifdef == "leaf")
  50. leaf++;
  51. else if (ifdef == "hub")
  52. hub++;
  53. }
  54. /* finish last command */
  55. if (my_buf.length()) {
  56. cmdlist[cmdi].txt = new bd::String(my_buf);
  57. ++i;
  58. ++cmdi;
  59. my_buf.clear();
  60. }
  61. /* move on to next cmd now */
  62. if (buffer != "end") { /* NEXT CMD */
  63. printf(".");
  64. cmdlist[cmdi].leaf = leaf;
  65. cmdlist[cmdi].hub = hub;
  66. hub = leaf = 0;
  67. for (i = 0; i < cmdi; i++ ) { /* Eliminate duplicates */
  68. if (cmdlist[i].name && *(cmdlist[i].name) == buffer) {
  69. printf("\b[%s]", buffer.c_str());
  70. --cmdi;
  71. continue;
  72. }
  73. }
  74. cmdlist[cmdi].name = new bd::String(buffer);
  75. } else { /* END */
  76. break;
  77. }
  78. } else { /* CMD HELP INFO */
  79. my_buf += buffer + "{NEWLINE}";
  80. }
  81. }
  82. qsort(cmdlist, cmdi, sizeof(cmds), (int (*)(const void *, const void *)) &my_cmp);
  83. bd::String buf;
  84. for (i = 0; i < cmdi; i++ ) {
  85. fulllist += *(cmdlist[i].name) + " ";
  86. out << ":";
  87. if (cmdlist[i].leaf) out << "leaf";
  88. else if (cmdlist[i].hub) out << "hub";
  89. out << buf.printf(":%s\n", cmdlist[i].name->c_str());
  90. out << cmdlist[i].txt->sub("{NEWLINE}", "\n");
  91. }
  92. out << "::end\n";
  93. out.writeFile(outfile);
  94. printf(" Success\n");
  95. printf("Sorted (%d): %s\n", cmdi, fulllist.c_str());
  96. return 0;
  97. }
  98. int main(int argc, char **argv) {
  99. if (argc < 3) return 1;
  100. bd::String in(argv[1]), out(argv[2]);
  101. return parse_help(in, out);
  102. }