help.c 2.9 KB

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