mktables.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. *
  4. * This product is part of the Amsterdam Compiler Kit.
  5. *
  6. * Permission to use, sell, duplicate or disclose this software must be
  7. * obtained in writing. Requests for such permissions may be sent to
  8. *
  9. * Dr. Andrew S. Tanenbaum
  10. * Wiskundig Seminarium
  11. * Vrije Universiteit
  12. * Postbox 7161
  13. * 1007 MC Amsterdam
  14. * The Netherlands
  15. *
  16. */
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. #ifndef NORCSID
  20. static char rcs_id[] = "$Header$" ;
  21. #endif
  22. char *fname = 0 ;
  23. char dname[200] ;
  24. char *tail ;
  25. FILE *intab ;
  26. FILE *dmach ;
  27. int index ;
  28. main(argc,argv) char **argv ; {
  29. register i ;
  30. start(argv[1]) ;
  31. for ( i=2 ; i<argc ; i++ ) {
  32. fname= argv[i] ;
  33. readm() ;
  34. }
  35. stop(argc>2) ;
  36. return 0 ;
  37. }
  38. start(dir) char *dir ; {
  39. tail= dname ;
  40. while ( *dir ) {
  41. *tail++ = *dir ++ ;
  42. }
  43. if ( tail!=dname ) *tail++= '/' ;
  44. index=0 ;
  45. intab= fopen("intable.c","w");
  46. dmach= fopen("dmach.c","w");
  47. if ( intab==NULL || dmach==NULL ) {
  48. fprintf(stderr,"Couln't create output file(s)\n");
  49. exit ( 1) ;
  50. }
  51. fprintf(dmach,"#include \"dmach.h\"\n\ndmach\tmassoc[] = {\n") ;
  52. fprintf(intab,"char intable[] = {\n") ;
  53. }
  54. stop(filled) {
  55. fprintf(dmach,"\t{\"\",\t-1\t}\n} ;\n") ;
  56. if ( !filled ) fprintf(intab,"\t0\n") ;
  57. fprintf(intab,"\n} ;\n") ;
  58. fclose(dmach); fclose(intab) ;
  59. }
  60. FILE *do_open(file) char *file ; {
  61. strcpy(tail,file) ;
  62. return fopen(dname,"r") ;
  63. }
  64. readm() {
  65. register int i ;
  66. register int token ;
  67. register FILE *in ;
  68. in=do_open(fname) ;
  69. if ( in==NULL ) {
  70. fprintf(stderr,"Cannot open %s\n",fname) ;
  71. return ;
  72. }
  73. i=0 ;
  74. fprintf(dmach,"\t{\"%s\",\t%d\t},\n",fname,index) ;
  75. fprintf(intab,"\n/* %s */\n\t",fname) ;
  76. for (;;) {
  77. token=getc(in) ;
  78. index++ ;
  79. if ( ++i == 10 ) {
  80. fprintf(intab,"\n\t") ;
  81. i=0 ;
  82. } else {
  83. fprintf(intab," ") ;
  84. }
  85. if ( !isascii(token) || !(isprint(token) || isspace(token)) ){
  86. if ( token!=EOF ) {
  87. fprintf(stderr,"warning: non-ascii in %s\n",fname) ;
  88. fprintf(intab,"%4d,",token) ;
  89. } else {
  90. fprintf(intab," 0,",token) ;
  91. break ;
  92. }
  93. } else if ( isprint(token) ) {
  94. switch ( token ) {
  95. case '\'': fprintf(intab,"'\\''") ; break ;
  96. case '\\': fprintf(intab,"'\\\\'") ; break ;
  97. default: fprintf(intab," '%c'",token) ; break ;
  98. }
  99. } else switch ( token ) {
  100. case '\n' : fprintf(intab,"'\\n'") ; break ;
  101. case '\t' : fprintf(intab,"'\\t'") ; break ;
  102. case '\r' : fprintf(intab,"'\\r'") ; break ;
  103. case '\f' : fprintf(intab,"'\\f'") ; break ;
  104. case ' ' : fprintf(intab," ' '") ; break ;
  105. default : fprintf(stderr,"warning: unrec. %d\n",
  106. token) ;
  107. fprintf(intab,"%4d",token) ;
  108. break ;
  109. }
  110. fprintf(intab,",") ;
  111. }
  112. fclose(in) ;
  113. }