help.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include <ctype.h>
  2. #include <system.h>
  3. #if __STDC__
  4. #include <stdarg.h>
  5. extern out(char *, ...);
  6. #else
  7. #include <varargs.h>
  8. #endif
  9. #define CODE_EXPANDER
  10. #include "em.h"
  11. #include "decl.h"
  12. extern int library;
  13. extern File *outfile;
  14. /* This file contains some routines called from the parser in 'pars.g' */
  15. question( str)
  16. char *str;
  17. /* Print : "if ( <str> ) {"
  18. */
  19. {
  20. register char c;
  21. int arg_nr;
  22. out( "if ( ");
  23. for ( c = *str++; c != '\0'; c= *str++)
  24. if ( c == '$' && isdigit( *str)) {
  25. arg_nr = *str++ - '0' - 1;
  26. out( "%s", C_instr_info->arg_id[arg_nr]);
  27. }
  28. else
  29. out( "%c", c);
  30. out( ") {\n");
  31. }
  32. extern arith cur_pos;
  33. extern int segment;
  34. print_call( str)
  35. char *str;
  36. /* Print 'str' and handle the $i's. Also count the number of text-bytes
  37. * that are generated, look for text?() and reloc?() calls.
  38. */
  39. {
  40. register char c;
  41. int arg_nr;
  42. extern int no_conversions;
  43. if ( strncmp( "text", str, 4) == 0 && isdigit( *(str+4)))
  44. cur_pos += *(str+4) - '0';
  45. else if ( strncmp( "reloc", str, 5) == 0 && isdigit( *(str+5)) &&
  46. segment == SEGTXT)
  47. cur_pos += *(str+5) - '0';
  48. for ( c = *str++; c != '\0'; c= *str++)
  49. if ( c == '$' && isdigit( *str)) {
  50. arg_nr = *str++ - '0' - 1;
  51. if ( no_conversions)
  52. out( "%s", C_instr_info->arg_id[arg_nr]);
  53. else
  54. out( "%s", C_instr_info->arg_conv[arg_nr]);
  55. }
  56. else
  57. out( "%c", c);
  58. out( ";\n");
  59. }
  60. header( instr)
  61. char *instr;
  62. {
  63. out( "void %s%s", instr, C_instr_info->header);
  64. def_admn( instr);
  65. }
  66. set_segment( seg)
  67. int seg;
  68. {
  69. switch ( seg) {
  70. case SEGTXT : out( "switchseg( SEGTXT);\n");
  71. break;
  72. case SEGBSS : out( "switchseg( SEGBSS);\n");
  73. out( "dump_label();\n");
  74. break;
  75. case SEGHOL : out( "switchseg( SEGHOL);\n");
  76. break;
  77. case SEGCON : out( "switchseg( SEGCON);\n");
  78. out( "dump_label();\n");
  79. break;
  80. case SEGROM : out( "switchseg( SEGROM);\n");
  81. out( "dump_label();\n");
  82. break;
  83. case UNKNOWN : break; /* dan niet! */
  84. }
  85. }
  86. #if __STDC__
  87. /*VARARGS*/
  88. out(char *fmt, ...)
  89. {
  90. va_list pvar;
  91. va_start(pvar, fmt);
  92. doprnt( outfile, fmt, pvar);
  93. va_end(pvar);
  94. }
  95. #else
  96. /*VARARGS*/
  97. out(va_alist)
  98. va_dcl
  99. {
  100. va_list pvar;
  101. char *fmt;
  102. va_start(pvar);
  103. fmt = va_arg(pvar, char *);
  104. doprnt( outfile, fmt, pvar);
  105. va_end(pvar);
  106. }
  107. #endif
  108. char *suffix( str, suf)
  109. char *str, *suf;
  110. {
  111. static char res[15];
  112. char *s, *strncpy(), *strcat();
  113. int strl, sufl, prefl;
  114. strl = strlen( str);
  115. sufl = strlen( suf);
  116. for ( s = str + strl; --s >= str && *s != '.';)
  117. ;
  118. if ( *s == '.')
  119. prefl = s - str;
  120. else
  121. prefl = strl;
  122. if ( prefl + sufl + 1 > 14 )
  123. prefl = 14 - 1 - sufl;
  124. strncpy( res, str, prefl);
  125. res[prefl] = '\0';
  126. s = strcat( res, ".");
  127. s = strcat( s, suf);
  128. return( s);
  129. }
  130. set_outfile( name)
  131. char *name;
  132. {
  133. if ( library) {
  134. name = suffix( name, "c");
  135. sys_close( outfile);
  136. if ( !sys_open( name, OP_WRITE, &outfile))
  137. fprint( STDERR, "!! can't create %s !!\n", name);
  138. file_header();
  139. }
  140. }
  141. file_header()
  142. {
  143. out( "#define CODE_EXPANDER\n");
  144. out( "#include \"mach.h\"\n");
  145. out( "#include \"back.h\"\n\n");
  146. out( "extern int B_holno, B_procno;\n\n");
  147. }