tcl2c++.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2. Netvideo version 3.1
  3. Written by Ron Frederick <frederick@parc.xerox.com>
  4. Simple hack to translate a Tcl/Tk init file into a C string.
  5. */
  6. /*
  7.  * Copyright (c) Xerox Corporation 1992. All rights reserved.
  8.  *  
  9.  * License is granted to copy, to use, and to make and to use derivative
  10.  * works for research and evaluation purposes, provided that Xerox is
  11.  * acknowledged in all documentation pertaining to any such copy or derivative
  12.  * work. Xerox grants no other licenses expressed or implied. The Xerox trade
  13.  * name should not be used in any advertising without its written permission.
  14.  *  
  15.  * XEROX CORPORATION MAKES NO REPRESENTATIONS CONCERNING EITHER THE
  16.  * MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS SOFTWARE
  17.  * FOR ANY PARTICULAR PURPOSE.  The software is provided "as is" without
  18.  * express or implied warranty of any kind.
  19.  *  
  20.  * These notices must be retained in any copies of any part of this software.
  21.  */
  22. #include <stdio.h>
  23. #include <string.h> /* strcasecmp() */
  24. #include <ctype.h>
  25. #include <stdlib.h>
  26. /*
  27.  * Define TCL2C_INT if your compiler has problems with long strings.
  28.  */
  29. #if defined(WIN32) || defined(_WIN32) || defined(__alpha__) || defined(__hpux) || defined( __APPLE__ )
  30. #define TCL2C_INT
  31. #endif
  32. #ifdef _WIN32
  33. #define strcasecmp _stricmp
  34. #endif
  35. /*XXX*/
  36. void put(int c)
  37. {
  38. #ifdef TCL2C_INT
  39. static int n;
  40. if ((++n % 20) == 0)
  41. printf("%u,n", c);
  42. else
  43. printf("%u,", c);
  44. /* printf("%u,%c", c, ((++n & 0xf) == 0) ? 'n' : ' '); */
  45. #else
  46. switch(c) {
  47. case '\':
  48. case '"':
  49. putchar('\');
  50. break;
  51. case 'n':
  52. printf("\n\");
  53. break;
  54. default:
  55. break;
  56. }
  57. printf("%c", c);
  58. #endif
  59. }
  60. void onefile(FILE* f, int skip_source)
  61. {
  62. int nl = 1;
  63. int skipping = 0;
  64. int c;
  65. int look_forward = 0;
  66. while (1) {
  67. if (!look_forward)
  68. c = getc(f);
  69. else
  70. look_forward = 0;
  71. if (c == EOF)
  72. /* Done */
  73. break; 
  74. switch (c) {
  75. case ' ':
  76. case 't':
  77. case 'f':
  78. if (nl || skipping)
  79. continue;
  80. break;
  81. case '#':
  82. /* 
  83.  * Some of TK scripts embed XBMs in them. We need 
  84.  * to keep the #define section there.
  85.  * XXX This is NOT mthread-safe!
  86.  */
  87. /* 
  88.  * Look ahead, read next 6 chars. If it's #define, 
  89.  * put the whole line; otherwise don't put anything.
  90.  * 
  91.  * We should put the read chars back, but this doesn't
  92.  * work on SunOS. So we have to do the trick below :( 
  93.  */
  94. if (nl) {
  95. look_forward = 1;
  96. if ((c = getc(f)) != 'd') goto next;
  97. if ((c = getc(f)) != 'e') goto next;
  98. if ((c = getc(f)) != 'f') goto next;
  99. if ((c = getc(f)) != 'i') goto next;
  100. if ((c = getc(f)) != 'n') goto next;
  101. if ((c = getc(f)) != 'e') goto next;
  102. /* Write '#define' and continue */
  103. nl = 0;
  104. put('#');
  105. put('d');
  106. put('e');
  107. put('f');
  108. put('i');
  109. put('n');
  110. put('e');
  111. look_forward = 0;
  112. continue;
  113. }
  114. next: 
  115. if (skipping)
  116. continue;
  117. if (nl) {
  118. skipping = 1;
  119. continue;
  120. }
  121. /* 
  122.  * Since we've looked forward and changed 'c', but we 
  123.  * do need to write a '#', do it here rather than 
  124.  * break and use the put() at the end.
  125.  */
  126. put('#');
  127. continue; 
  128. case 'n':
  129. if (skipping) {
  130. skipping = 0;
  131. nl = 1;
  132. continue;
  133. }
  134. nl = 1;
  135. break;
  136. case 'r':
  137.    /* If we're reading from stdio, we might see
  138.  * this (^M). GCC 3.3 doesn't like processing
  139.  * source containing this character, so strip
  140.  * it out.
  141.  */
  142. continue;
  143. case '\':
  144. if (skipping) {
  145. c = getc(f);
  146. continue;
  147. }
  148. break;
  149. case 's':
  150. if (skipping)
  151. continue;
  152. if (nl && skip_source) {
  153. /* skip 'source' lines */
  154. const char* targ = "source";
  155. const char* cp = targ + 1;
  156. while ((c = getc(f)) == *cp)
  157. ++cp;
  158. if (*cp == 0) {
  159. if (c == ' ' || c == 't') {
  160. skipping = 1;
  161. continue;
  162. }
  163. }
  164. for ( ; targ < cp; ++targ)
  165. put(*targ);
  166. }
  167. nl = 0;
  168. break;
  169. default:
  170. nl = 0;
  171. if (skipping)
  172. continue;
  173. break;
  174. }
  175. put(c);
  176. }
  177. }
  178. int main(int argc, char **argv)
  179. {
  180. int skip_source;
  181. const char* name;
  182. if (argc < 2) {
  183. fprintf(stderr, "Usage: tcl2c++ name [ file ... ]n");
  184. exit(1);
  185. }
  186. #ifdef TCL2C_INT
  187. printf("static char code[] = {n");
  188. #else
  189. printf("static char code[] = "");
  190. #endif
  191. name = argv[1];
  192. /*XXX tk hack */
  193. skip_source = (strcasecmp(name, "et_tk") == 0) ? 1 : 0;
  194. if (argc == 2)
  195. onefile(stdin, skip_source);
  196. else {
  197. for ( ; --argc >= 2; ++argv) {
  198. const char* filename = argv[2];
  199. FILE* f = fopen(filename, "r");
  200. if (f == 0) {
  201. perror(filename);
  202. exit(1);
  203. }
  204. onefile(f, skip_source);
  205. fclose(f);
  206. }
  207. }
  208. #ifdef TCL2C_INT
  209. printf("0 };n");
  210. #else
  211. printf("";n");
  212. #endif
  213. printf("#include "tclcl.h"n");
  214. printf("EmbeddedTcl %s(code);n", name);
  215. return (0);
  216. }