ansi-to-src.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define ZF_LOGD(...)
  5. /**
  6. * Display a repr of the given string.
  7. *
  8. * This converts most \n\r\v\f\t codes,
  9. * defaults to \xHH (hex value).
  10. */
  11. char *repr(const char *data) {
  12. static char buffer[40960];
  13. char *cp;
  14. strcpy(buffer, data);
  15. cp = buffer;
  16. while (*cp != 0) {
  17. char c = *cp;
  18. if (c == ' ') {
  19. cp++;
  20. continue;
  21. };
  22. /* Ok, it's form-feed ('\f'), newline ('\n'), carriage return ('\r'),
  23. * horizontal tab ('\t'), and vertical tab ('\v') */
  24. if (strchr("\f\n\r\t\v\?", c) != NULL) {
  25. memmove(cp + 1, cp, strlen(cp) + 1);
  26. *cp = '\\';
  27. cp++;
  28. switch (c) {
  29. case '\f':
  30. *cp = 'f';
  31. cp++;
  32. break;
  33. case '\n':
  34. *cp = 'n';
  35. cp++;
  36. break;
  37. case '\r':
  38. *cp = 'r';
  39. cp++;
  40. break;
  41. case '\t':
  42. *cp = 't';
  43. cp++;
  44. break;
  45. case '\v':
  46. *cp = 'v';
  47. cp++;
  48. break;
  49. default:
  50. *cp = '?';
  51. cp++;
  52. break;
  53. }
  54. continue;
  55. }
  56. if (c == '\\') {
  57. memmove(cp, cp + 1, strlen(cp) + 1);
  58. *cp = '\\';
  59. cp += 2;
  60. continue;
  61. }
  62. if (c == '"') {
  63. memmove(cp, cp + 1, strlen(cp) + 1);
  64. *cp = '\\';
  65. cp += 2;
  66. continue;
  67. }
  68. if (strchr("[()]{}:;,.<>?!@#$%^&*", c) != NULL) {
  69. cp++;
  70. continue;
  71. }
  72. if (strchr("0123456789", c) != NULL) {
  73. cp++;
  74. continue;
  75. }
  76. if (strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", c) !=
  77. NULL) {
  78. cp++;
  79. continue;
  80. }
  81. // Ok, default to \xHH output.
  82. memmove(cp + 3, cp, strlen(cp) + 1);
  83. char buffer[10];
  84. sprintf(buffer, "\\x%02x", (int)c & 0xff);
  85. strncpy(cp, buffer, 4);
  86. cp += 4;
  87. continue;
  88. }
  89. return buffer;
  90. }
  91. int read_file(const char *filename) {
  92. FILE *fp;
  93. char buffer[10240];
  94. int read;
  95. fp = fopen(filename, "rb");
  96. if (fp == NULL) {
  97. ZF_LOGD("Failed to open %s", filename);
  98. return 0;
  99. }
  100. strcpy(buffer, filename);
  101. char *cp;
  102. if ((cp = strchr(buffer, '.')) != NULL) {
  103. *cp = 0;
  104. }
  105. cp = buffer;
  106. while (*cp != 0) {
  107. if (!isalpha(*cp))
  108. memmove(cp, cp + 1, strlen(cp));
  109. cp++;
  110. }
  111. printf("const char * %s[] = {\n", buffer);
  112. if ((read = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
  113. char *nl;
  114. buffer[read] = 0;
  115. cp = repr(buffer);
  116. int first = 1;
  117. while ((nl = strstr(cp, "\\r\\n")) != NULL) {
  118. strcpy(nl, "\"");
  119. if (!first) {
  120. printf(",\n");
  121. };
  122. first = 0;
  123. printf(" \"%s", cp);
  124. cp = nl + 4;
  125. }
  126. if (strlen(cp) > 0)
  127. printf(",\n \"%s\"\n", cp);
  128. else
  129. printf("\n");
  130. printf("};\n");
  131. };
  132. fclose(fp);
  133. return 1;
  134. }
  135. int main(int argc, char *argv[]) {
  136. read_file(argv[1]);
  137. return 0;
  138. }